X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/4c2cba9ccb6f754aac9378e2fc2c7b546e6d589c..a9f7393e1d00eb89b8282aae0ddc4f6da33d9ca1:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index e04caa00..eac4554d 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -982,7 +983,7 @@ int eDVBChannelFilePush::filterRecordData(const unsigned char *_data, int len, s // eDebug("filterRecordData, size=%d (mod 188=%d), first byte is %02x", len, len %188, data[0]); unsigned char *d = data; - while ((d = (unsigned char*)memmem(d, data + len - d, "\x00\x00\x01", 3))) + while ((d + 3 < data + len) && (d = (unsigned char*)memmem(d, data + len - d, "\x00\x00\x01", 3))) { int offset = d - data; int ts_offset = offset - offset % 188; /* offset to the start of TS packet */ @@ -1499,6 +1500,61 @@ RESULT eDVBChannel::setCIRouting(const eDVBCIRouting &routing) return -1; } +void eDVBChannel::SDTready(int result) +{ + ePyObject args = PyTuple_New(2), ret; + bool ok=false; + if (!result) + { + for (std::vector::const_iterator i = m_SDT->getSections().begin(); i != m_SDT->getSections().end(); ++i) + { + ok = true; + PyTuple_SET_ITEM(args, 0, PyInt_FromLong((*i)->getTransportStreamId())); + PyTuple_SET_ITEM(args, 1, PyInt_FromLong((*i)->getOriginalNetworkId())); + break; + } + } + if (!ok) + { + PyTuple_SET_ITEM(args, 0, Py_None); + PyTuple_SET_ITEM(args, 1, Py_None); + Py_INCREF(Py_None); + Py_INCREF(Py_None); + } + ret = PyObject_CallObject(m_tsid_onid_callback, args); + if (ret) + Py_DECREF(ret); + Py_DECREF(args); + Py_DECREF(m_tsid_onid_callback); + m_tsid_onid_callback = ePyObject(); + m_tsid_onid_demux = 0; + m_SDT = 0; +} + +RESULT eDVBChannel::requestTsidOnid(ePyObject callback) +{ + if (PyCallable_Check(callback)) + { + if (!getDemux(m_tsid_onid_demux, 0)) + { + m_SDT = new eTable; + CONNECT(m_SDT->tableReady, eDVBChannel::SDTready); + if (m_SDT->start(m_tsid_onid_demux, eDVBSDTSpec())) + { + m_tsid_onid_demux = 0; + m_SDT = 0; + } + else + { + Py_INCREF(callback); + m_tsid_onid_callback = callback; + return 0; + } + } + } + return -1; +} + RESULT eDVBChannel::getDemux(ePtr &demux, int cap) { ePtr &our_demux = (cap & capDecode) ? m_decoder_demux : m_demux;