aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2008-11-24 22:04:28 +0100
committerghost <andreas.monzner@multimedia-labs.de>2008-11-24 22:04:28 +0100
commit08d4f4729ac8c417f767628ef521dc71f232cf98 (patch)
tree6670152cd65a041b4e2329196d1dd499fb94aa36 /lib/dvb
parent14cf6c3b6887b94bcdd65ee251207d9309e2ae24 (diff)
downloadenigma2-08d4f4729ac8c417f767628ef521dc71f232cf98.tar.gz
enigma2-08d4f4729ac8c417f767628ef521dc71f232cf98.zip
add possibility to request tsid/onid for iDVBChannel
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/dvb.cpp53
-rw-r--r--lib/dvb/dvb.h11
-rw-r--r--lib/dvb/idvb.h1
3 files changed, 65 insertions, 0 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 66ec1d2d..fd509d5d 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -4,6 +4,7 @@
#include <lib/dvb/dvb.h>
#include <lib/dvb/pmt.h>
#include <lib/dvb/sec.h>
+#include <lib/dvb/specs.h>
#include <errno.h>
#include <sys/types.h>
@@ -1499,6 +1500,58 @@ RESULT eDVBChannel::setCIRouting(const eDVBCIRouting &routing)
return -1;
}
+void eDVBChannel::SDTready(int result)
+{
+ ePyObject args = PyTuple_New(2);
+ bool ok=false;
+ if (!result)
+ {
+ for (std::vector<ServiceDescriptionSection*>::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);
+ }
+ PyObject_CallObject(m_tsid_onid_callback, args);
+ 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<ServiceDescriptionSection>;
+ CONNECT(m_SDT->tableReady, eDVBChannel::SDTready);
+ if (m_SDT->start(m_tsid_onid_demux, eDVBSDTSpec()))
+ {
+ m_tsid_onid_demux = 0;
+ m_SDT = 0;
+ }
+ else
+ {
+ m_tsid_onid_callback = callback;
+ return 0;
+ }
+ }
+ }
+ return -1;
+}
+
RESULT eDVBChannel::getDemux(ePtr<iDVBDemux> &demux, int cap)
{
ePtr<eDVBAllocatedDemux> &our_demux = (cap & capDecode) ? m_decoder_demux : m_demux;
diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h
index 13556c26..fa1801db 100644
--- a/lib/dvb/dvb.h
+++ b/lib/dvb/dvb.h
@@ -10,8 +10,11 @@
#include <lib/dvb/demux.h>
#include <lib/dvb/frontend.h>
#include <lib/dvb/tstools.h>
+#include <lib/dvb/esection.h>
#include <connection.h>
+#include <dvbsi++/service_description_section.h>
+
class eDVBChannel;
/* we do NOT handle resource conflicts here. instead, the allocateChannel
@@ -259,6 +262,8 @@ public:
RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode);
int getUseCount() { return m_use_count; }
+
+ RESULT requestTsidOnid(ePyObject callback);
private:
ePtr<eDVBAllocatedFrontend> m_frontend;
ePtr<eDVBAllocatedDemux> m_demux, m_decoder_demux;
@@ -299,6 +304,12 @@ private:
oRefCount m_use_count;
void AddUse();
void ReleaseUse();
+
+ /* for tsid/onid read */
+ ePyObject m_tsid_onid_callback;
+ ePtr<iDVBDemux> m_tsid_onid_demux;
+ ePtr<eTable<ServiceDescriptionSection> > m_SDT;
+ void SDTready(int err);
};
#endif // SWIG
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index cda05894..5fc633aa 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -504,6 +504,7 @@ class iDVBChannel: public iObject
public:
/* direct frontend access for raw channels and/or status inquiries. */
virtual SWIG_VOID(RESULT) getFrontend(ePtr<iDVBFrontend> &SWIG_OUTPUT)=0;
+ virtual RESULT requestTsidOnid(SWIG_PYOBJECT(ePyObject) callback) { return -1; }
#ifndef SWIG
enum
{