cache movie filelengths in .meta file, by luke_s
[enigma2.git] / lib / service / servicedvb.cpp
index 57b094f29559cb85091b02cc86aae9c437a6da42..dcd7017c97ab427b3257557d0b4a02690d57caab 100644 (file)
@@ -96,7 +96,7 @@ int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const
        return false;
 }
 
-static void PutToDict(ePyObject &dict, const char*key, long value)
+static void PutToDictAsStr(ePyObject &dict, const char*key, long value)
 {
        ePyObject item = PyString_FromFormat("%d", value);
        if (item)
@@ -109,6 +109,7 @@ static void PutToDict(ePyObject &dict, const char*key, long value)
                eDebug("could not create PyObject for %s", key);
 }
 
+extern void PutToDict(ePyObject &dict, const char*key, long value);  // defined in dvb/frontend.cpp
 extern void PutToDict(ePyObject &dict, const char*key, ePyObject item); // defined in dvb/frontend.cpp
 extern void PutToDict(ePyObject &dict, const char*key, const char *value); // defined in dvb/frontend.cpp
 
@@ -116,9 +117,9 @@ void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &fe
 {
        const char *tmp=0;
        PutToDict(dict, "type", "Satellite");
-       PutToDict(dict, "frequency", feparm.frequency);
-       PutToDict(dict, "symbolrate", feparm.symbol_rate);
-       PutToDict(dict, "orbital position", feparm.orbital_position);
+       PutToDictAsStr(dict, "frequency", feparm.frequency);
+       PutToDictAsStr(dict, "symbolrate", feparm.symbol_rate);
+       PutToDictAsStr(dict, "orbital position", feparm.orbital_position);
        switch (feparm.inversion)
        {
                case eDVBFrontendParametersSatellite::Inversion::On: tmp="ON"; break;
@@ -190,7 +191,7 @@ void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &fe
 void PutTerrestrialDataToDict(ePyObject &dict, eDVBFrontendParametersTerrestrial &feparm)
 {
        PutToDict(dict, "type", "Terrestrial");
-       PutToDict(dict, "frequency", feparm.frequency);
+       PutToDictAsStr(dict, "frequency", feparm.frequency);
        const char *tmp=0;
        switch (feparm.bandwidth)
        {
@@ -274,8 +275,8 @@ void PutCableDataToDict(ePyObject &dict, eDVBFrontendParametersCable &feparm)
 {
        const char *tmp=0;
        PutToDict(dict, "type", "Cable");
-       PutToDict(dict, "frequency", feparm.frequency);
-       PutToDict(dict, "symbolrate", feparm.symbol_rate);
+       PutToDictAsStr(dict, "frequency", feparm.frequency);
+       PutToDictAsStr(dict, "symbolrate", feparm.symbol_rate);
        switch (feparm.modulation)
        {
        case eDVBFrontendParametersCable::Modulation::QAM16: tmp="QAM16"; break;
@@ -535,14 +536,25 @@ int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref)
        
        eDVBTSTools tstools;
        
+       struct stat s;
+       stat(ref.path.c_str(), &s);
+
        if (tstools.openFile(ref.path.c_str()))
                return 0;
 
+                       /* check if cached data is still valid */
+       if (m_parser.m_data_ok && (s.st_size == m_parser.m_filesize) && (m_parser.m_length))
+               return m_parser.m_length / 90000;
+
+                       /* otherwise, re-calc length and update meta file */
        pts_t len;
        if (tstools.calcLen(len))
                return 0;
 
-       return len / 90000;
+       m_parser.m_length = len;
+       m_parser.m_filesize = s.st_size;
+       m_parser.updateMeta(ref.path);
+       return m_parser.m_length / 90000;
 }
 
 int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w)
@@ -1043,7 +1055,6 @@ RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServ
 eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): 
        m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0)
 {
-       memset(&m_videoEventData, 0, sizeof(struct iTSMPEGDecoder::videoEvent));
        m_is_primary = 1;
        m_is_pvr = !m_reference.path.empty();
        
@@ -1574,20 +1585,6 @@ 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;
@@ -1604,44 +1601,30 @@ int eDVBServicePlay::getInfo(int w)
 
        switch (w)
        {
-#if HAVE_DVB_API_VERSION >= 3
        case sVideoHeight:
-               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged)
-                       return m_videoEventData.height;
-               else
-                       return readMpegProc("yres", !m_is_primary);
+               if (m_decoder)
+                       return m_decoder->getVideoHeight();
+               break;
        case sVideoWidth:
-               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventSizeChanged)
-                       return m_videoEventData.width;
-               else
-                       return readMpegProc("xres", !m_is_primary);
+               if (m_decoder)
+                       return m_decoder->getVideoWidth();
+               break;
        case sFrameRate:
-               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventFrameRateChanged)
-                       return m_videoEventData.framerate;
-               else
-                       return readMpegProc("framerate", !m_is_primary);
+               if (m_decoder)
+                       return m_decoder->getVideoFrameRate();
+               break;
        case sProgressive:
-               if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventProgressiveChanged)
-                       return m_videoEventData.progressive;
-               return readMpegProc("progressive", !m_is_primary);
-#else
-#warning "FIXMEE implement sFrameRate, sProgressive, sVideoHeight, sVideoWidth for old DVB API"
-#endif
+               if (m_decoder)
+                       return m_decoder->getVideoProgressive();
+               break;
        case sAspect:
        {
-               int val;
-#if HAVE_DVB_API_VERSION >= 3
-               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"
-#endif
+               int aspect = -1;
+               if (m_decoder)
+                       aspect = m_decoder->getVideoAspect();
                if (no_program_info)
-                       return -1; 
-               else if (!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
+                       break;
+               else if (aspect == -1 && !program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
                {
                        ePtr<eServiceEvent> evt;
                        if (!m_event_handler.getEvent(evt, 0))
@@ -1678,7 +1661,9 @@ int eDVBServicePlay::getInfo(int w)
                                }
                        }
                }
-               return -1;
+               else
+                       return aspect;
+               break;
        }
        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;
@@ -1695,8 +1680,9 @@ int eDVBServicePlay::getInfo(int w)
        case sServiceref: return resIsString;
        case sDVBState: return m_tune_state;
        default:
-               return -1;
+               break;
        }
+       return -1;
 }
 
 std::string eDVBServicePlay::getInfoString(int w)
@@ -2997,7 +2983,6 @@ 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_event((iPlayableService*)this, evVideoSizeChanged);
@@ -3033,7 +3018,7 @@ PyObject *eDVBServicePlay::getStreamingData()
        {
                uint8_t demux_id;
                if (!demux->getCADemuxID(demux_id))
-                       PutToDict(r, "demux", PyInt_FromLong(demux_id));
+                       PutToDict(r, "demux", demux_id);
        }
 
        return r;