X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/baa16fc905456459dad4ff1ffae87601e2d2ef4a..97909d42012ca026c51d2e7b882ce55eb0acffab:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 57b094f2..dcd7017c 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -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 &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 &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 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;