Merge branch 'master' of /home/tmbinc/enigma2-git into tmbinc/FixTimingBugs
[enigma2.git] / lib / dvb / demux.cpp
index a0f1c326a9522f768afa375a2a92dbb37194ba5b..918ecec6bf6dca4c0a1b9ef33541e7ff97d437eb 100644 (file)
@@ -402,15 +402,18 @@ class eDVBRecordFileThread: public eFilePushThread
 {
 public:
        eDVBRecordFileThread();
-       void setTimingPID(int pid);
+       void setTimingPID(int pid, int type);
        
-       void saveTimingInformation(const std::string &filename);
+       void startSaveMetaInformation(const std::string &filename);
+       void stopSaveMetaInformation();
+       int getLastPTS(pts_t &pts);
 protected:
        int filterRecordData(const unsigned char *data, int len, size_t &current_span_remaining);
 private:
        eMPEGStreamParserTS m_ts_parser;
        eMPEGStreamInformation m_stream_info;
        off_t m_current_offset;
+       pts_t m_last_pcr; /* very approximate.. */
        int m_pid;
 };
 
@@ -420,14 +423,24 @@ eDVBRecordFileThread::eDVBRecordFileThread()
        m_current_offset = 0;
 }
 
-void eDVBRecordFileThread::setTimingPID(int pid)
+void eDVBRecordFileThread::setTimingPID(int pid, int type)
 {
-       m_ts_parser.setPid(pid);
+       m_ts_parser.setPid(pid, type);
 }
 
-void eDVBRecordFileThread::saveTimingInformation(const std::string &filename)
+void eDVBRecordFileThread::startSaveMetaInformation(const std::string &filename)
 {
-       m_stream_info.save(filename.c_str());
+       m_stream_info.startSave(filename.c_str());
+}
+
+void eDVBRecordFileThread::stopSaveMetaInformation()
+{
+       m_stream_info.stopSave();
+}
+
+int eDVBRecordFileThread::getLastPTS(pts_t &pts)
+{
+       return m_ts_parser.getLastPTS(pts);
 }
 
 int eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len, size_t &current_span_remaining)
@@ -513,6 +526,9 @@ RESULT eDVBTSRecorder::start()
        ::ioctl(m_source_fd, DMX_START);
        
 #endif
+
+       if (m_target_filename != "")
+               m_thread->startSaveMetaInformation(m_target_filename);
        
        m_thread->start(m_source_fd, m_target_fd);
        m_running = 1;
@@ -546,11 +562,11 @@ RESULT eDVBTSRecorder::removePID(int pid)
        return 0;
 }
 
-RESULT eDVBTSRecorder::setTimingPID(int pid)
+RESULT eDVBTSRecorder::setTimingPID(int pid, int type)
 {
        if (m_running)
                return -1;
-       m_thread->setTimingPID(pid);
+       m_thread->setTimingPID(pid, type);
        return 0;
 }
 
@@ -583,12 +599,23 @@ RESULT eDVBTSRecorder::stop()
        close(m_source_fd);
        m_source_fd = -1;
        
-       if (m_target_filename != "")
-               m_thread->saveTimingInformation(m_target_filename + ".ap");
+       m_thread->stopSaveMetaInformation();
        
        return 0;
 }
 
+RESULT eDVBTSRecorder::getCurrentPCR(pts_t &pcr)
+{
+       if (!m_running)
+               return 0;
+       if (!m_thread)
+               return 0;
+               /* XXX: we need a lock here */
+
+                       /* we don't filter PCR data, so just use the last received PTS, which is not accurate, but better than nothing */
+       return m_thread->getLastPTS(pcr);
+}
+
 RESULT eDVBTSRecorder::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn)
 {
        conn = new eConnection(this, m_event.connect(event));