X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/53cccbdf7f4b485d295689d6ce9fd77a01694602..fa4ce6edf7d5ab9852a2ee3c5bea0b32fd704465:/lib/dvb/demux.cpp diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index b4204924..0fbd6fbd 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,112 @@ RESULT eDVBSectionReader::connectRead(const Slot1 &r, ePtropenDemux(); + + if (m_fd >= 0) + { + ::ioctl(m_fd, DMX_SET_BUFFER_SIZE, 64*1024); + ::fcntl(m_fd, F_SETFL, O_NONBLOCK); + 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) + eWarning("PES filter: DMX_SET_PES_FILTER - %m"); + 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: @@ -299,7 +414,7 @@ private: }; eDVBRecordFileThread::eDVBRecordFileThread() - : m_ts_parser(m_stream_info) + :eFilePushThread(IOPRIO_CLASS_RT, 7), m_ts_parser(m_stream_info) { m_current_offset = 0; } @@ -379,7 +494,7 @@ RESULT eDVBTSRecorder::start() dmx_pes_filter_params flt; flt.pes_type = (dmx_pes_type_t)DMX_TAP_TS; - flt.pid = 0x1234; /* FIXME */ + flt.pid = (__u16)-1; flt.input = DMX_IN_FRONTEND; flt.output = DMX_OUT_TAP; flt.flags = 0;