fix warning
[enigma2.git] / lib / dvb / demux.cpp
index 73e0443291772fee99c4d6ba025c48a30dcc6160..f277468d248b89d0e700a29c17693d81c6e0a011 100644 (file)
 
 #else
 #include <linux/dvb/dmx.h>
+
+#define HAVE_ADD_PID
+
+#ifdef HAVE_ADD_PID
+#define DMX_ADD_PID              _IO('o', 51)
+#define DMX_REMOVE_PID           _IO('o', 52)
+
+typedef enum {
+       DMX_TAP_TS = 0,
+       DMX_TAP_PES = DMX_PES_OTHER, /* for backward binary compat. */
+} dmx_tap_type_t;
+
+#endif
+
 #endif
 
 #include "crc32.h"
@@ -102,9 +116,9 @@ RESULT eDVBDemux::createTSRecorder(ePtr<iDVBTSRecorder> &recorder)
        return 0;
 }
 
-RESULT eDVBDemux::getMPEGDecoder(ePtr<iTSMPEGDecoder> &decoder)
+RESULT eDVBDemux::getMPEGDecoder(ePtr<iTSMPEGDecoder> &decoder, int primary)
 {
-       decoder = new eTSMPEGDecoder(this, 0);
+       decoder = new eTSMPEGDecoder(this, primary ? 0 : 1);
        return 0;
 }
 
@@ -273,6 +287,8 @@ class eDVBRecordFileThread: public eFilePushThread
 public:
        eDVBRecordFileThread();
        void setTimingPID(int pid);
+       
+       void saveTimingInformation(const std::string &filename);
 protected:
        void filterRecordData(const unsigned char *data, int len);
 private:
@@ -293,6 +309,11 @@ void eDVBRecordFileThread::setTimingPID(int pid)
        m_ts_parser.setPid(pid);
 }
 
+void eDVBRecordFileThread::saveTimingInformation(const std::string &filename)
+{
+       m_stream_info.save(filename.c_str());
+}
+
 void eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len)
 {
        m_ts_parser.parseData(m_current_offset, data, len);
@@ -307,14 +328,18 @@ eDVBTSRecorder::eDVBTSRecorder(eDVBDemux *demux): m_demux(demux)
        m_running = 0;
        m_target_fd = -1;
        m_thread = new eDVBRecordFileThread();
+#ifndef HAVE_ADD_PID
        m_demux->m_dvr_busy = 1;
+#endif
 }
 
 eDVBTSRecorder::~eDVBTSRecorder()
 {
        stop();
        delete m_thread;
+#ifndef HAVE_ADD_PID
        m_demux->m_dvr_busy = 0;
+#endif
 }
 
 RESULT eDVBTSRecorder::start()
@@ -324,8 +349,9 @@ RESULT eDVBTSRecorder::start()
        
        if (m_target_fd == -1)
                return -2;
-               
+
        char filename[128];
+#ifndef HAVE_ADD_PID
 #if HAVE_DVB_API_VERSION < 3
        snprintf(filename, 128, "/dev/dvb/card%d/dvr%d", m_demux->adapter, m_demux->demux);
 #else
@@ -338,6 +364,36 @@ RESULT eDVBTSRecorder::start()
                eDebug("FAILED to open dvr (%s) in ts recoder (%m)", filename);
                return -3;
        }
+#else
+       snprintf(filename, 128, "/dev/dvb/adapter%d/demux%d", m_demux->adapter, m_demux->demux);
+
+       m_source_fd = ::open(filename, O_RDONLY);
+       
+       if (m_source_fd < 0)
+       {
+               eDebug("FAILED to open demux (%s) in ts recoder (%m)", filename);
+               return -3;
+       }
+       
+       ::ioctl(m_source_fd, DMX_SET_BUFFER_SIZE, 1024*1024);
+
+       dmx_pes_filter_params flt;
+       flt.pes_type = (dmx_pes_type_t)DMX_TAP_TS;
+       flt.pid     = (__u16)-1;
+       flt.input   = DMX_IN_FRONTEND;
+       flt.output  = DMX_OUT_TAP;
+       flt.flags   = 0;
+       int res = ::ioctl(m_source_fd, DMX_SET_PES_FILTER, &flt);
+       if (res)
+       {
+               eDebug("DMX_SET_PES_FILTER: %m");
+               ::close(m_source_fd);
+               return -3;
+       }
+       
+       ::ioctl(m_source_fd, DMX_START);
+       
+#endif
        
        m_thread->start(m_source_fd, m_target_fd);
        m_running = 1;
@@ -385,6 +441,12 @@ RESULT eDVBTSRecorder::setTargetFD(int fd)
        return 0;
 }
 
+RESULT eDVBTSRecorder::setTargetFilename(const char *filename)
+{
+       m_target_filename = filename;
+       return 0;
+}
+
 RESULT eDVBTSRecorder::setBoundary(off_t max)
 {
        return -1; // not yet implemented
@@ -400,6 +462,10 @@ 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");
        
        return 0;
 }
@@ -412,6 +478,7 @@ RESULT eDVBTSRecorder::connectEvent(const Slot1<void,int> &event, ePtr<eConnecti
 
 RESULT eDVBTSRecorder::startPID(int pid)
 {
+#ifndef HAVE_ADD_PID
        int fd = m_demux->openDemux();
        if (fd < 0)
        {
@@ -443,13 +510,26 @@ RESULT eDVBTSRecorder::startPID(int pid)
                return -1;
        }
        m_pids[pid] = fd;
-
+#else
+       if (::ioctl(m_source_fd, DMX_ADD_PID, pid))
+               perror("DMX_ADD_PID");
+       else
+               m_pids[pid] = 1;
+#endif
        return 0;
 }
 
 void eDVBTSRecorder::stopPID(int pid)
 {
+#ifndef HAVE_ADD_PID
        if (m_pids[pid] != -1)
                ::close(m_pids[pid]);
+#else
+       if (m_pids[pid] != -1)
+       {
+               if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid))
+                       perror("DMX_REMOVE_PID");
+       }
+#endif
        m_pids[pid] = -1;
 }