From: Felix Domke Date: Fri, 12 May 2006 15:37:35 +0000 (+0000) Subject: add PES reader X-Git-Tag: 2.6.0~3442 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/d80bb0a6b9862171d9901b6b19347b5e9f6279cd add PES reader --- diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index f277468d..ca9736ce 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -108,6 +108,15 @@ RESULT eDVBDemux::createSectionReader(eMainloop *context, ePtr &reader) +{ + RESULT res; + reader = new eDVBPESReader(this, context, res); + if (res) + reader = 0; + return res; +} + RESULT eDVBDemux::createTSRecorder(ePtr &recorder) { if (m_dvr_busy) @@ -282,6 +291,100 @@ RESULT eDVBSectionReader::connectRead(const Slot1 &r, ePtropenDemux(); + + if (m_fd >= 0) + { + m_notifier = new eSocketNotifier(context, m_fd, eSocketNotifier::Read, false); + CONNECT(m_notifier->activated, eDVBPESReader::data); + res = 0; + } else + { + perror(filename); + res = errno; + } +} + +DEFINE_REF(eDVBPESReader) + +eDVBPESReader::~eDVBPESReader() +{ + if (m_notifier) + delete m_notifier; + if (m_fd >= 0) + ::close(m_fd); +} + +RESULT eDVBPESReader::start(int pid) +{ + RESULT res; + if (m_fd < 0) + return -ENODEV; + + m_notifier->start(); + +#if HAVE_DVB_API_VERSION < 3 + dmxPesFilterParams flt; + + flt.pesType = DMX_PES_OTHER; +#else + dmx_pes_filter_params flt; + + flt.pes_type = DMX_PES_OTHER; +#endif + + flt.pid = pid; + flt.input = DMX_IN_FRONTEND; + flt.output = DMX_OUT_TAP; + + flt.flags = DMX_IMMEDIATE_START; + + res = ::ioctl(m_fd, DMX_SET_PES_FILTER, &flt); + if (!res) + m_active = 1; + return res; +} + +RESULT eDVBPESReader::stop() +{ + if (!m_active) + return -1; + + m_active=0; + ::ioctl(m_fd, DMX_STOP); + m_notifier->stop(); + + return 0; +} + +RESULT eDVBPESReader::connectRead(const Slot2 &r, ePtr &conn) +{ + conn = new eConnection(this, m_read.connect(r)); + return 0; +} + class eDVBRecordFileThread: public eFilePushThread { public: diff --git a/lib/dvb/demux.h b/lib/dvb/demux.h index b14dfd26..ee731ef8 100644 --- a/lib/dvb/demux.h +++ b/lib/dvb/demux.h @@ -18,6 +18,7 @@ public: RESULT setSourcePVR(int pvrnum); RESULT createSectionReader(eMainloop *context, ePtr &reader); + RESULT createPESReader(eMainloop *context, ePtr &reader); RESULT createTSRecorder(ePtr &recorder); RESULT getMPEGDecoder(ePtr &reader, int primary); RESULT getSTC(pts_t &pts, int num); @@ -31,6 +32,7 @@ private: int m_dvr_busy; friend class eDVBSectionReader; + friend class eDVBPESReader; friend class eDVBAudio; friend class eDVBVideo; friend class eDVBPCR; @@ -62,6 +64,24 @@ public: RESULT connectRead(const Slot1 &read, ePtr &conn); }; +class eDVBPESReader: public iDVBPESReader, public Object +{ + DECLARE_REF(eDVBPESReader); +private: + int m_fd; + Signal2 m_read; + ePtr m_demux; + int m_active; + void data(int); + eSocketNotifier *m_notifier; +public: + eDVBPESReader(eDVBDemux *demux, eMainloop *context, RESULT &res); + virtual ~eDVBPESReader(); + RESULT start(int pid); + RESULT stop(); + RESULT connectRead(const Slot2 &read, ePtr &conn); +}; + class eDVBRecordFileThread; class eDVBTSRecorder: public iDVBTSRecorder, public Object diff --git a/lib/dvb/idemux.h b/lib/dvb/idemux.h index 85119925..b04ad000 100644 --- a/lib/dvb/idemux.h +++ b/lib/dvb/idemux.h @@ -53,6 +53,15 @@ public: virtual ~iDVBSectionReader() { }; }; +class iDVBPESReader: public iObject +{ +public: + virtual RESULT start(int pid)=0; + virtual RESULT stop()=0; + virtual RESULT connectRead(const Slot2 &read, ePtr &conn)=0; + virtual ~iDVBPESReader() { }; +}; + /* records a given set of pids into a file descriptor. */ /* the FD must not be modified between start() and stop() ! */ class iDVBTSRecorder: public iObject diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 0326c60f..06080429 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -552,6 +552,7 @@ public: }; class iDVBSectionReader; +class iDVBPESReader; class iDVBTSRecorder; class iTSMPEGDecoder; @@ -559,6 +560,7 @@ class iDVBDemux: public iObject { public: virtual RESULT createSectionReader(eMainloop *context, ePtr &reader)=0; + virtual RESULT createPESReader(eMainloop *context, ePtr &reader)=0; virtual RESULT createTSRecorder(ePtr &recorder)=0; virtual RESULT getMPEGDecoder(ePtr &reader, int primary=1)=0; virtual RESULT getSTC(pts_t &pts, int num=0)=0;