b15c95bfe9a7d29f8be1505ce823c8086c7a9c66
[vuplus_dvbapp] / lib / dvb / pmt.h
1 #ifndef __lib_dvb_dvbmid_h
2 #define __lib_dvb_dvbmid_h
3
4 #ifndef SWIG
5 #include <map>
6 #include <lib/base/buffer.h>
7 #include <lib/dvb/idvb.h>
8 #include <lib/dvb/dvb.h>
9 #include <lib/dvb/idemux.h>
10 #include <lib/dvb/esection.h>
11 #include <lib/python/python.h>
12 #include <lib/python/connections.h>
13 #include <dvbsi++/program_map_section.h>
14 #include <dvbsi++/program_association_section.h>
15
16 #include <sys/socket.h>
17 #include <sys/types.h>
18 #include <sys/un.h>
19 #include <unistd.h>
20 #include <fcntl.h>
21
22 class eDVBCAService;
23 class eDVBScan;
24
25 #include <dvbsi++/application_information_section.h>
26 class OCSection : public LongCrcSection
27 {
28 protected:
29         void *data;
30
31 public:
32         OCSection(const uint8_t * const buffer)
33         : LongCrcSection(buffer)
34         {
35                 data = malloc(getSectionLength());
36                 memcpy(data, buffer, getSectionLength());
37         }
38         ~OCSection()
39         {
40                 free(data);
41         }
42         void *getData() { return data; }
43 };
44
45 struct channel_data: public Object
46 {
47         ePtr<eDVBChannel> m_channel;
48         ePtr<eConnection> m_stateChangedConn;
49         int m_prevChannelState;
50         int m_dataDemux;
51 };
52
53 // TODO .. put all static stuff into a 'eDVBCAServiceHandler class'
54
55 typedef std::map<eServiceReferenceDVB, eDVBCAService*> CAServiceMap;
56 typedef std::map<iDVBChannel*, channel_data*> ChannelMap;
57
58 class eDVBCAService: public Object
59 {
60         eIOBuffer m_buffer;
61         ePtr<eSocketNotifier> m_sn;
62         eServiceReferenceDVB m_service;
63         uint8_t m_used_demux[32];
64         unsigned int m_prev_build_hash;
65
66         int m_sock, m_clilen; 
67         struct sockaddr_un m_servaddr;
68         unsigned int m_sendstate;
69         unsigned char m_capmt[2048];
70         ePtr<eTimer> m_retryTimer;
71         void sendCAPMT();
72         void Connect();
73         void socketCB(int what);
74
75         static void DVBChannelAdded(eDVBChannel*);
76         static void DVBChannelStateChanged(iDVBChannel*);
77         static CAServiceMap exist;
78         static ChannelMap exist_channels;
79         static ePtr<eConnection> m_chanAddedConn;
80         static channel_data *getChannelData(eDVBChannelID &chid);
81
82         eDVBCAService();
83         ~eDVBCAService();
84 public:
85         static void registerChannelCallback(eDVBResourceManager *res_mgr);
86         static RESULT register_service( const eServiceReferenceDVB &ref, int demux_nums[2], eDVBCAService *&caservice );
87         static RESULT unregister_service( const eServiceReferenceDVB &ref, int demux_nums[2], eTable<ProgramMapSection> *ptr );
88         void buildCAPMT(eTable<ProgramMapSection> *ptr);
89 };
90
91 #endif
92
93 #include <list>
94 #include <string>
95 class HbbTVApplicationInfo
96 {
97 public:
98         int m_OrgId;
99         int m_AppId;
100         int m_ControlCode;
101         short m_ProfileCode;
102         std::string m_HbbTVUrl;
103         std::string m_ApplicationName;
104 public:
105         HbbTVApplicationInfo(int controlCode, int orgid, int appid, std::string hbbtvUrl, std::string applicationName, int profileCode)
106                 : m_ControlCode(controlCode), m_HbbTVUrl(hbbtvUrl), m_ApplicationName(applicationName), m_OrgId(orgid), 
107                   m_AppId(appid), m_ProfileCode(profileCode)
108         {}
109 };
110 typedef std::list<HbbTVApplicationInfo *> HbbTVApplicationInfoList;
111 typedef HbbTVApplicationInfoList::iterator HbbTVApplicationInfoListIterator;
112 typedef HbbTVApplicationInfoList::const_iterator HbbTVApplicationInfoListConstIterator;
113
114 class eDVBServicePMTHandler: public Object
115 {
116 #ifndef SWIG
117         friend class eDVBCAService;
118         eServiceReferenceDVB m_reference;
119         ePtr<eDVBService> m_service;
120
121         int m_last_channel_state;
122         eDVBCAService *m_ca_servicePtr;
123         ePtr<eDVBScan> m_dvb_scan; // for sdt scan
124
125         eAUTable<eTable<ProgramMapSection> > m_PMT;
126         eAUTable<eTable<ProgramAssociationSection> > m_PAT;
127
128         eUsePtr<iDVBChannel> m_channel;
129         eUsePtr<iDVBPVRChannel> m_pvr_channel;
130         ePtr<eDVBResourceManager> m_resourceManager;
131         ePtr<iDVBDemux> m_demux, m_pvr_demux_tmp;
132
133         void channelStateChanged(iDVBChannel *);
134         ePtr<eConnection> m_channelStateChanged_connection;
135         void channelEvent(iDVBChannel *, int event);
136         ePtr<eConnection> m_channelEvent_connection;
137         void SDTScanEvent(int);
138         ePtr<eConnection> m_scan_event_connection;
139
140         eAUTable<eTable<ApplicationInformationSection> > m_AIT;
141         eAUTable<eTable<OCSection> > m_OC;
142
143         void PMTready(int error);
144         void PATready(int error);
145         
146         int m_pmt_pid;
147         
148         void AITready(int error);
149         void OCready(int error);
150         int m_dsmcc_pid;
151         int m_ait_pid;
152         HbbTVApplicationInfoList m_HbbTVApplications;
153         std::string m_HBBTVUrl;
154         std::string m_ApplicationName;
155         unsigned char m_AITData[4096];
156         
157         int m_use_decode_demux;
158         uint8_t m_decode_demux_num;
159         ePtr<eTimer> m_no_pat_entry_delay;
160         uint8_t mDemuxId;
161 public:
162         eDVBServicePMTHandler();
163         ~eDVBServicePMTHandler();
164 #endif
165
166 #ifdef SWIG
167 private:
168         eDVBServicePMTHandler();
169 public:
170 #endif
171
172         enum
173         {
174                 eventNoResources,  // a requested resource couldn't be allocated
175                 eventTuneFailed,   // tune failed
176                 eventNoPAT,        // no pat could be received (timeout)
177                 eventNoPATEntry,   // no pat entry for the corresponding SID could be found
178                 eventNoPMT,        // no pmt could be received (timeout)
179                 eventNewProgramInfo, // we just received a PMT
180                 eventTuned,        // a channel was sucessfully (re-)tuned in, you may start additional filters now
181                 
182                 eventPreStart,     // before start filepush thread
183                 eventSOF,          // seek pre start
184                 eventEOF,          // a file playback did end
185                 
186                 eventHBBTVInfo, /* HBBTV information was detected in the AIT */
187                 
188                 eventMisconfiguration, // a channel was not found in any list, or no frontend was found which could provide this channel
189         };
190 #ifndef SWIG
191         Signal1<void,int> serviceEvent;
192
193         struct videoStream
194         {
195                 int pid;
196                 int component_tag;
197                 enum { vtMPEG2, vtMPEG4_H264, vtMPEG1, vtMPEG4_Part2, vtVC1, vtVC1_SM, vtH265_HEVC };
198                 int type;
199         };
200         
201         struct audioStream
202         {
203                 int pid,
204                     rdsPid; // hack for some radio services which transmit radiotext on different pid (i.e. harmony fm, HIT RADIO FFH, ...)
205                 enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM, atDTSHD, atDDP  };
206                 int type; // mpeg2, ac3, dts, ...
207                 
208                 int component_tag;
209                 std::string language_code; /* iso-639, if available. */
210         };
211
212         struct subtitleStream
213         {
214                 int pid;
215                 int subtitling_type;    /*  see ETSI EN 300 468 table 26 component_type
216                                                                         when stream_content is 0x03
217                                                                         0x10..0x13, 0x20..0x23 is used for dvb subtitles
218                                                                         0x01 is used for teletext subtitles */
219                 union
220                 {
221                         int composition_page_id;  // used for dvb subtitles
222                         int teletext_page_number;  // used for teletext subtitles
223                 };
224                 union
225                 {
226                         int ancillary_page_id;  // used for dvb subtitles
227                         int teletext_magazine_number;  // used for teletext subtitles
228                 };
229                 std::string language_code;
230                 bool operator<(const subtitleStream &s) const
231                 {
232                         if (pid != s.pid)
233                                 return pid < s.pid;
234                         if (teletext_page_number != s.teletext_page_number)
235                                 return teletext_page_number < s.teletext_page_number;
236                         return teletext_magazine_number < s.teletext_magazine_number;
237                 }
238         };
239
240         struct program
241         {
242                 struct capid_pair
243                 {
244                         uint16_t caid;
245                         int capid;
246                         bool operator< (const struct capid_pair &t) const { return t.caid < caid; }
247                 };
248                 std::vector<videoStream> videoStreams;
249                 std::vector<audioStream> audioStreams;
250                 int defaultAudioStream;
251                 std::vector<subtitleStream> subtitleStreams;
252                 std::list<capid_pair> caids;
253                 int pcrPid;
254                 int pmtPid;
255                 int textPid;
256                 int aitPid;
257                 bool isCrypted() { return !caids.empty(); }
258                 PyObject *createPythonObject();
259         };
260
261         int getProgramInfo(program &program);
262         int getDataDemux(ePtr<iDVBDemux> &demux);
263         int getDecodeDemux(ePtr<iDVBDemux> &demux);
264         PyObject *getCaIds(bool pair=false); // caid / ecmpid pair
265         PyObject *getHbbTVApplications(void); 
266         
267         int getPVRChannel(ePtr<iDVBPVRChannel> &pvr_channel);
268         int getServiceReference(eServiceReferenceDVB &service) { service = m_reference; return 0; }
269         int getService(ePtr<eDVBService> &service) { service = m_service; return 0; }
270         int getPMT(ePtr<eTable<ProgramMapSection> > &ptr) { return m_PMT.getCurrent(ptr); }
271         int getChannel(eUsePtr<iDVBChannel> &channel);
272         void resetCachedProgram() { m_have_cached_program = false; }
273         void sendEventNoPatEntry();
274
275         void getHBBTVUrl(std::string &ret) { ret = m_HBBTVUrl; }
276         void getDemuxID(int &id) { id = mDemuxId; }
277
278         /* deprecated interface */
279         int tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0);
280
281         /* new interface */
282         int tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr<iTsSource> &, const char *streaminfo_file, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0, bool isstreamclient=false);
283
284         void free();
285 private:
286         bool m_have_cached_program;
287         program m_cached_program;
288         bool m_isstreamclient;
289 #endif
290 };
291
292 #endif