fix saving of nameservers
[enigma2.git] / lib / service / servicedvb.cpp
index 478fecfe4ccd300a4494afc70692d4c849958af2..2f98ed6b1e9d15b0f7a4ce114d088daf6d8820ed 100644 (file)
@@ -412,7 +412,7 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref
                return -1;
 }
 
-int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate)
 {
        if (ref.flags & eServiceReference::isGroup)
        {
@@ -453,7 +453,7 @@ int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref
                                { 2, 1, 3 }  // -T -S -C
                        };
                        ((const eServiceReferenceDVB&)*it).getChannelID(chid);
-                       int tmp=res->canAllocateChannel(chid, chid_ignore);
+                       int tmp=res->canAllocateChannel(chid, chid_ignore, simulate);
                        switch(tmp)
                        {
                                case 0:
@@ -1065,7 +1065,9 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv
        
        m_tune_state = -1;
 
-       CONNECT(m_subtitle_sync_timer.timeout, eDVBServicePlay::checkSubtitleTiming);
+       m_subtitle_sync_timer = eTimer::create(eApp);
+
+       CONNECT(m_subtitle_sync_timer->timeout, eDVBServicePlay::checkSubtitleTiming);
 }
 
 eDVBServicePlay::~eDVBServicePlay()
@@ -1569,46 +1571,67 @@ RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
        return m_event_handler.getEvent(evt, nownext);
 }
 
+static int readMpegProc(char *str, int decoder)
+{
+       int val = -1;
+       char tmp[64];
+       sprintf(tmp, "/proc/stb/vmpeg/%d/%s", decoder, str);
+       FILE *f = fopen(tmp, "r");
+       if (f)
+       {
+               fscanf(f, "%x", &val);
+               fclose(f);
+       }
+       return val;
+}
+
 int eDVBServicePlay::getInfo(int w)
 {
        eDVBServicePMTHandler::program program;
-       
+
        if (w == sCAIDs)
                return resIsPyObject;
 
        eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
-       
+
        int no_program_info = 0;
-       
+
        if (h.getProgramInfo(program))
                no_program_info = 1;
-       
+
        switch (w)
        {
 #if HAVE_DVB_API_VERSION >= 3
        case sVideoHeight:
-               if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
+               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged)
                        return m_videoEventData.height;
-               return -1;
+               else
+                       return readMpegProc("yres", !m_is_primary);
        case sVideoWidth:
-               if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
+               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged)
                        return m_videoEventData.width;
-               return -1;
+               else
+                       return readMpegProc("xres", !m_is_primary);
        case sFrameRate:
-               if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
+               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventFrameRateChanged)
                        return m_videoEventData.framerate;
-               return -1;
+               else
+                       return readMpegProc("framerate", !m_is_primary);
        case sProgressive:
-               if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
+               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventProgressiveChanged)
                        return m_videoEventData.progressive;
-               return -1;
+               return readMpegProc("progressive", !m_is_primary);
 #else
 #warning "FIXMEE implement sFrameRate, sProgressive, sVideoHeight, sVideoWidth for old DVB API"
 #endif
        case sAspect:
+       {
+               int val;
 #if HAVE_DVB_API_VERSION >= 3
-               if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
+               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged)
                        return m_videoEventData.aspect == VIDEO_FORMAT_4_3 ? 1 : 3;
+               else if ((val=readMpegProc("aspect", !m_is_primary)) != -1)
+                       return val;
                else
 #else
 #warning "FIXMEE implement sAspect for old DVB API"
@@ -1653,6 +1676,7 @@ int eDVBServicePlay::getInfo(int w)
                        }
                }
                return -1;
+       }
        case sIsCrypted: if (no_program_info) return -1; return program.isCrypted();
        case sVideoPID: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
        case sVideoType: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type;
@@ -2904,7 +2928,7 @@ void eDVBServicePlay::checkSubtitleTiming()
                } else
                {
                        eDebug("start subtitle delay %d", diff / 90);
-                       m_subtitle_sync_timer.start(diff / 90, 1);
+                       m_subtitle_sync_timer->start(diff / 90, 1);
                        break;
                }
        }
@@ -2961,23 +2985,20 @@ void eDVBServicePlay::setPCMDelay(int delay)
 
 void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
 {
+       memcpy(&m_videoEventData, &event, sizeof(event));
        switch(event.type) {
                case iTSMPEGDecoder::videoEvent::eventSizeChanged:
-                       m_videoEventData.aspect = event.aspect;
-                       m_videoEventData.height = event.height;
-                       m_videoEventData.width = event.width;
                        m_event((iPlayableService*)this, evVideoSizeChanged);
                        break;
                case iTSMPEGDecoder::videoEvent::eventFrameRateChanged:
-                       m_videoEventData.framerate = event.framerate;
                        m_event((iPlayableService*)this, evVideoFramerateChanged);
                        break;
                case iTSMPEGDecoder::videoEvent::eventProgressiveChanged:
-                       m_videoEventData.progressive = event.progressive;
                        m_event((iPlayableService*)this, evVideoProgressiveChanged);
                        break;
+               default:
+                       break;
        }
-       m_videoEventData.type = event.type;
 }
 
 RESULT eDVBServicePlay::stream(ePtr<iStreamableService> &ptr)