X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/19b37ace32489ada16dbc4c88b74907064d9c292..97909d42012ca026c51d2e7b882ce55eb0acffab:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 2f98ed6b..dcd7017c 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -31,8 +31,6 @@ #error no byte order defined! #endif -#define TSPATH "/media/hdd" - class eStaticServiceDVBInformation: public iStaticServiceInformation { DECLARE_REF(eStaticServiceDVBInformation); @@ -98,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) @@ -111,15 +109,17 @@ 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, const char *value); +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 void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &feparm) { 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; @@ -174,17 +174,14 @@ void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &fe case eDVBFrontendParametersSatellite::RollOff::alpha_0_20: tmp="0.20"; break; } PutToDict(dict, "roll off", tmp); - if (feparm.modulation == eDVBFrontendParametersSatellite::Modulation::M8PSK) + switch(feparm.pilot) { - switch(feparm.pilot) - { - case eDVBFrontendParametersSatellite::Pilot::On: tmp="ON"; break; - case eDVBFrontendParametersSatellite::Pilot::Off: tmp="OFF"; break; - default: - case eDVBFrontendParametersSatellite::Pilot::Unknown: tmp="AUTO"; break; - } - PutToDict(dict, "pilot", tmp); + case eDVBFrontendParametersSatellite::Pilot::On: tmp="ON"; break; + case eDVBFrontendParametersSatellite::Pilot::Off: tmp="OFF"; break; + default: + case eDVBFrontendParametersSatellite::Pilot::Unknown: tmp="AUTO"; break; } + PutToDict(dict, "pilot", tmp); tmp="DVB-S2"; break; } @@ -194,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) { @@ -278,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; @@ -539,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) @@ -1047,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(); @@ -1497,9 +1504,16 @@ RESULT eDVBServicePlay::timeshift(ePtr &ptr) { if (!m_timeshift_enabled) { - /* we need enough diskspace */ + /* query config path */ + std::string tspath; + if(ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1){ + eDebug("could not query ts path from config"); + return -4; + } + tspath.append("/"); + /* we need enough diskspace */ struct statfs fs; - if (statfs(TSPATH "/.", &fs) < 0) + if (statfs(tspath.c_str(), &fs) < 0) { eDebug("statfs failed!"); return -2; @@ -1571,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; @@ -1601,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)) @@ -1675,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; @@ -1692,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) @@ -2038,8 +2027,6 @@ PyObject *eDVBServiceBase::getTransponderData(bool original) eDVBFrontendParametersSatellite osat; if (!feparm->getDVBS(osat)) { - void PutToDict(ePyObject &, const char*, long); - void PutToDict(ePyObject &, const char*, const char*); PutToDict(ret, "orbital_position", osat.orbital_position); const char *tmp = "UNKNOWN"; switch(osat.polarisation) @@ -2117,12 +2104,23 @@ RESULT eDVBServicePlay::startTimeshift() if (!m_record) return -3; - char templ[]=TSPATH "/timeshift.XXXXXX"; + std::string tspath; + if(ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1){ + eDebug("could not query ts path"); + return -5; + } + tspath.append("/timeshift.XXXXXX"); + char* templ; + templ = new char[tspath.length() + 1]; + strcpy(templ, tspath.c_str()); + m_timeshift_fd = mkstemp(templ); - m_timeshift_file = templ; - + m_timeshift_file = std::string(templ); + eDebug("recording to %s", templ); - + + delete [] templ; + if (m_timeshift_fd < 0) { m_record = 0; @@ -2184,8 +2182,8 @@ PyObject *eDVBServicePlay::getCutList() for (std::multiset::iterator i(m_cue_entries.begin()); i != m_cue_entries.end(); ++i) { ePyObject tuple = PyTuple_New(2); - PyTuple_SetItem(tuple, 0, PyLong_FromLongLong(i->where)); - PyTuple_SetItem(tuple, 1, PyInt_FromLong(i->what)); + PyTuple_SET_ITEM(tuple, 0, PyLong_FromLongLong(i->where)); + PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(i->what)); PyList_Append(list, tuple); Py_DECREF(tuple); } @@ -2985,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); @@ -3012,18 +3009,16 @@ PyObject *eDVBServicePlay::getStreamingData() eDVBServicePMTHandler::program program; if (m_service_handler.getProgramInfo(program)) { - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } - PyObject *r = program.createPythonObject(); + ePyObject r = program.createPythonObject(); ePtr demux; if (!m_service_handler.getDataDemux(demux)) { uint8_t demux_id; - demux->getCADemuxID(demux_id); - - PyDict_SetItemString(r, "demux", PyInt_FromLong(demux_id)); + if (!demux->getCADemuxID(demux_id)) + PutToDict(r, "demux", demux_id); } return r;