4 #include <lib/dvb/idvb.h>
5 #include <lib/dvb/idemux.h>
6 #include <lib/dvb/pvrparse.h>
7 #include <lib/base/filepush.h>
9 class eDVBDemux: public iDVBDemux
11 DECLARE_REF(eDVBDemux);
16 eDVBDemux(int adapter, int demux);
19 RESULT setSourceFrontend(int fenum);
20 int getSource() { return source; }
21 RESULT setSourcePVR(int pvrnum);
23 RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader);
24 RESULT createPESReader(eMainloop *context, ePtr<iDVBPESReader> &reader);
25 RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder);
26 RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader, int primary);
27 RESULT getSTC(pts_t &pts, int num);
28 RESULT getCADemuxID(uint8_t &id) { id = demux; return 0; }
30 RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn);
31 int openDVR(int flags);
33 int getRefCount() { return ref; }
35 int adapter, demux, source;
38 friend class eDVBSectionReader;
39 friend class eDVBPESReader;
40 friend class eDVBAudio;
41 friend class eDVBVideo;
43 friend class eDVBTText;
44 friend class eDVBTSRecorder;
45 friend class eDVBCAService;
46 Signal1<void, int> m_event;
51 class eDVBSectionReader: public iDVBSectionReader, public Object
53 DECLARE_REF(eDVBSectionReader);
55 Signal1<void, const __u8*> read;
56 ePtr<eDVBDemux> demux;
60 ePtr<eSocketNotifier> notifier;
62 eDVBSectionReader(eDVBDemux *demux, eMainloop *context, RESULT &res);
63 virtual ~eDVBSectionReader();
64 RESULT setBufferSize(int size);
65 RESULT start(const eDVBSectionFilterMask &mask);
67 RESULT connectRead(const Slot1<void,const __u8*> &read, ePtr<eConnection> &conn);
70 class eDVBPESReader: public iDVBPESReader, public Object
72 DECLARE_REF(eDVBPESReader);
74 Signal2<void, const __u8*, int> m_read;
75 ePtr<eDVBDemux> m_demux;
78 ePtr<eSocketNotifier> m_notifier;
80 eDVBPESReader(eDVBDemux *demux, eMainloop *context, RESULT &res);
81 virtual ~eDVBPESReader();
82 RESULT setBufferSize(int size);
83 RESULT start(int pid);
85 RESULT connectRead(const Slot2<void,const __u8*, int> &read, ePtr<eConnection> &conn);
88 class eDVBRecordFileThread: public eFilePushThread
91 eDVBRecordFileThread();
92 void setTimingPID(int pid, int type);
94 void startSaveMetaInformation(const std::string &filename);
95 void stopSaveMetaInformation();
96 void enableAccessPoints(bool enable);
97 int getLastPTS(pts_t &pts);
99 int filterRecordData(const unsigned char *data, int len, size_t ¤t_span_remaining);
101 eMPEGStreamParserTS m_ts_parser;
102 eMPEGStreamInformation m_stream_info;
103 off_t m_current_offset;
104 pts_t m_last_pcr; /* very approximate.. */
108 class eDVBTSRecorder: public iDVBTSRecorder, public Object
110 DECLARE_REF(eDVBTSRecorder);
112 eDVBTSRecorder(eDVBDemux *demux);
115 RESULT setBufferSize(int size);
117 RESULT addPID(int pid);
118 RESULT removePID(int pid);
120 RESULT setTimingPID(int pid, int type);
122 RESULT setTargetFD(int fd);
123 RESULT setTargetFilename(const char *filename);
124 RESULT enableAccessPoints(bool enable);
125 RESULT setBoundary(off_t max);
126 RESULT setTimeshift(bool enable);
130 RESULT getCurrentPCR(pts_t &pcr);
132 RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn);
134 RESULT startPID(int pid);
135 void stopPID(int pid);
137 eDVBRecordFileThread *m_thread;
138 void filepushEvent(int event);
140 std::map<int,int> m_pids;
141 Signal1<void,int> m_event;
143 ePtr<eDVBDemux> m_demux;
145 int m_running, m_target_fd, m_source_fd;
146 std::string m_target_filename;