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)
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;
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)
{
{
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;
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)
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();
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;
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))
}
}
}
- 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;
case sServiceref: return resIsString;
case sDVBState: return m_tune_state;
default:
- return -1;
+ break;
}
+ return -1;
}
std::string eDVBServicePlay::getInfoString(int w)
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)
for (std::multiset<struct cueEntry>::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);
}
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);
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<iDVBDemux> 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;