X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ce6a641bebc8e3e3ef14b624aa67d1dca1e8310e..67b53c1cb06988394c35a6e965c99b72b67fe1be:/lib/dvb/demux.cpp diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index c8e71173..b6143ddf 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -25,7 +25,7 @@ #else #include -// #define HAVE_ADD_PID +#define HAVE_ADD_PID #ifdef HAVE_ADD_PID #define DMX_ADD_PID _IO('o', 51) @@ -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) @@ -135,12 +144,15 @@ RESULT eDVBDemux::getSTC(pts_t &pts, int num) if (ioctl(fd, DMX_GET_STC, &stc) < 0) { + eDebug("DMX_GET_STC failed!"); ::close(fd); return -1; } pts = stc.stc; + eDebug("DMX_GET_STC - %lld", pts); + ::close(fd); return 0; } @@ -282,6 +294,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: @@ -290,7 +408,7 @@ public: void saveTimingInformation(const std::string &filename); protected: - void filterRecordData(const unsigned char *data, int len); + int filterRecordData(const unsigned char *data, int len, size_t ¤t_span_remaining); private: eMPEGStreamParserTS m_ts_parser; eMPEGStreamInformation m_stream_info; @@ -299,7 +417,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; } @@ -314,11 +432,13 @@ void eDVBRecordFileThread::saveTimingInformation(const std::string &filename) m_stream_info.save(filename.c_str()); } -void eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len) +int eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len, size_t ¤t_span_remaining) { m_ts_parser.parseData(m_current_offset, data, len); m_current_offset += len; + + return len; } DEFINE_REF(eDVBTSRecorder); @@ -328,6 +448,7 @@ eDVBTSRecorder::eDVBTSRecorder(eDVBDemux *demux): m_demux(demux) m_running = 0; m_target_fd = -1; m_thread = new eDVBRecordFileThread(); + CONNECT(m_thread->m_event, eDVBTSRecorder::filepushEvent); #ifndef HAVE_ADD_PID m_demux->m_dvr_busy = 1; #endif @@ -379,7 +500,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; @@ -462,6 +583,7 @@ RESULT eDVBTSRecorder::stop() m_thread->stop(); close(m_source_fd); + m_source_fd = -1; if (m_target_filename != "") m_thread->saveTimingInformation(m_target_filename + ".ap"); @@ -510,10 +632,10 @@ RESULT eDVBTSRecorder::startPID(int pid) } m_pids[pid] = fd; #else - eDebug("add pid: %08x", pid); if (::ioctl(m_source_fd, DMX_ADD_PID, pid)) perror("DMX_ADD_PID"); - eDebug("ok"); + else + m_pids[pid] = 1; #endif return 0; } @@ -523,9 +645,22 @@ void eDVBTSRecorder::stopPID(int pid) #ifndef HAVE_ADD_PID if (m_pids[pid] != -1) ::close(m_pids[pid]); - m_pids[pid] = -1; #else - if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid)) - perror("DMX_REMOVE_PID"); + if (m_pids[pid] != -1) + { + if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid)) + perror("DMX_REMOVE_PID"); + } #endif + m_pids[pid] = -1; +} + +void eDVBTSRecorder::filepushEvent(int event) +{ + switch (event) + { + case eFilePushThread::evtWriteError: + m_event(eventWriteError); + break; + } }