Support scrambled playback.
[vuplus_dvbapp] / lib / service / servicedvbrecord.h
1 #ifndef __servicedvbrecord_h
2 #define __servicedvbrecord_h
3
4 #include <lib/service/iservice.h>
5 #include <lib/dvb/idvb.h>
6
7 #include <lib/dvb/pmt.h>
8 #include <lib/dvb/eit.h>
9 #include <set>
10
11 #include <lib/service/servicedvb.h>
12
13 class eDVBServiceRecord: public eDVBServiceBase,
14         public iRecordableService, 
15         public iStreamableService,
16         public iSubserviceList,
17         public Object
18 {
19         DECLARE_REF(eDVBServiceRecord);
20 public:
21         eDVBServicePMTHandler::serviceType m_serviceType;
22
23         RESULT connectEvent(const Slot2<void,iRecordableService*,int> &event, ePtr<eConnection> &connection);
24         RESULT prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id, const char *name, const char *descr, const char *tags, bool descramble, bool recordecm);
25         RESULT prepareStreaming();
26         RESULT start(bool simulate=false);
27         RESULT stop();
28         RESULT stream(ePtr<iStreamableService> &ptr);
29         RESULT getError(int &error) { error = m_error; return 0; }
30         RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
31         RESULT subServices(ePtr<iSubserviceList> &ptr);
32         RESULT getServiceType(int &serviceType) { serviceType = m_serviceType; return 0; };
33
34                 // iStreamableService
35         PyObject *getStreamingData();
36
37                 // iSubserviceList
38         int getNumberOfSubservices();
39         RESULT getSubservice(eServiceReference &subservice, unsigned int n);
40
41 protected:
42         ePtr<iDVBDemux> m_decode_demux;
43         ePtr<iTSMPEGDecoder> m_decoder;
44
45 private:
46         enum { stateIdle, statePrepared, stateRecording };
47         bool m_simulate;
48         int m_state, m_want_record;
49         bool m_record_ecm;
50         bool m_descramble;
51         bool m_pvr_descramble;
52         bool m_is_stream_client;
53         friend class eServiceFactoryDVB;
54         eDVBServiceRecord(const eServiceReferenceDVB &ref, bool isstreamclient = false);
55         
56         eDVBServiceEITHandler m_event_handler;
57         
58         eServiceReferenceDVB m_ref;
59         
60         ePtr<iDVBTSRecorder> m_record;
61         ePtr<eConnection> m_con_record_event;
62         
63         int m_recording, m_tuned, m_error;
64         std::set<int> m_pids_active;
65         std::string m_filename;
66
67         std::map<int,pts_t> m_event_timestamps;
68         int m_target_fd;
69         int m_streaming;
70         int m_last_event_id;
71         
72         int doPrepare();
73         int doRecord();
74         void updateDecoder();
75
76                         /* events */
77         void serviceEvent(int event);
78         Signal2<void,iRecordableService*,int> m_event;
79         
80                         /* recorder events */
81         void recordEvent(int event);
82
83                         /* eit updates */
84         void gotNewEvent();
85         void saveCutlist();
86 };
87
88 #endif