eb4f59380c1762931b92fb729a383e959c354d0c
[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
162         bool m_pmt_ready;
163         bool m_ca_disabled;
164 public:
165         eDVBServicePMTHandler();
166         ~eDVBServicePMTHandler();
167 #endif
168
169 #ifdef SWIG
170 private:
171         eDVBServicePMTHandler();
172 public:
173 #endif
174
175         enum
176         {
177                 eventNoResources,  // a requested resource couldn't be allocated
178                 eventTuneFailed,   // tune failed
179                 eventNoPAT,        // no pat could be received (timeout)
180                 eventNoPATEntry,   // no pat entry for the corresponding SID could be found
181                 eventNoPMT,        // no pmt could be received (timeout)
182                 eventNewProgramInfo, // we just received a PMT
183                 eventTuned,        // a channel was sucessfully (re-)tuned in, you may start additional filters now
184                 
185                 eventPreStart,     // before start filepush thread
186                 eventSOF,          // seek pre start
187                 eventEOF,          // a file playback did end
188                 
189                 eventHBBTVInfo, /* HBBTV information was detected in the AIT */
190                 
191                 eventMisconfiguration, // a channel was not found in any list, or no frontend was found which could provide this channel
192                 eventNoDiskSpace,  // no disk space available
193         };
194 #ifndef SWIG
195         Signal1<void,int> serviceEvent;
196
197         struct videoStream
198         {
199                 int pid;
200                 int component_tag;
201                 enum { vtMPEG2, vtMPEG4_H264, vtMPEG1, vtMPEG4_Part2, vtVC1, vtVC1_SM, vtH265_HEVC };
202                 int type;
203         };
204         
205         struct audioStream
206         {
207                 int pid,
208                     rdsPid; // hack for some radio services which transmit radiotext on different pid (i.e. harmony fm, HIT RADIO FFH, ...)
209                 enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM, atDTSHD, atDDP  };
210                 int type; // mpeg2, ac3, dts, ...
211                 
212                 int component_tag;
213                 std::string language_code; /* iso-639, if available. */
214         };
215
216         struct subtitleStream
217         {
218                 int pid;
219                 int subtitling_type;    /*  see ETSI EN 300 468 table 26 component_type
220                                                                         when stream_content is 0x03
221                                                                         0x10..0x13, 0x20..0x23 is used for dvb subtitles
222                                                                         0x01 is used for teletext subtitles */
223                 union
224                 {
225                         int composition_page_id;  // used for dvb subtitles
226                         int teletext_page_number;  // used for teletext subtitles
227                 };
228                 union
229                 {
230                         int ancillary_page_id;  // used for dvb subtitles
231                         int teletext_magazine_number;  // used for teletext subtitles
232                 };
233                 std::string language_code;
234                 bool operator<(const subtitleStream &s) const
235                 {
236                         if (pid != s.pid)
237                                 return pid < s.pid;
238                         if (teletext_page_number != s.teletext_page_number)
239                                 return teletext_page_number < s.teletext_page_number;
240                         return teletext_magazine_number < s.teletext_magazine_number;
241                 }
242         };
243
244         struct program
245         {
246                 struct capid_pair
247                 {
248                         uint16_t caid;
249                         int capid;
250                         bool operator< (const struct capid_pair &t) const { return t.caid < caid; }
251                 };
252                 std::vector<videoStream> videoStreams;
253                 std::vector<audioStream> audioStreams;
254                 int defaultAudioStream;
255                 std::vector<subtitleStream> subtitleStreams;
256                 std::list<capid_pair> caids;
257                 int pcrPid;
258                 int pmtPid;
259                 int textPid;
260                 int aitPid;
261                 int pmtVersion;
262                 bool isCached;
263                 bool isCrypted() { return !caids.empty(); }
264                 PyObject *createPythonObject();
265         };
266
267         int getProgramInfo(program &program);
268         int getDataDemux(ePtr<iDVBDemux> &demux);
269         int getDecodeDemux(ePtr<iDVBDemux> &demux);
270         PyObject *getCaIds(bool pair=false); // caid / ecmpid pair
271         PyObject *getHbbTVApplications(void); 
272         
273         int getPVRChannel(ePtr<iDVBPVRChannel> &pvr_channel);
274         int getServiceReference(eServiceReferenceDVB &service) { service = m_reference; return 0; }
275         int getService(ePtr<eDVBService> &service) { service = m_service; return 0; }
276         int getPMT(ePtr<eTable<ProgramMapSection> > &ptr) { return m_PMT.getCurrent(ptr); }
277         int getChannel(eUsePtr<iDVBChannel> &channel);
278         void resetCachedProgram() { m_have_cached_program = false; }
279         void sendEventNoPatEntry();
280
281         void getHBBTVUrl(std::string &ret) { ret = m_HBBTVUrl; }
282         void getDemuxID(int &id) { id = mDemuxId; }
283         void setCaDisable(bool disable) { m_ca_disabled = disable; }
284
285         /* deprecated interface */
286         int tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0);
287
288         /* new interface */
289         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);
290
291         void free();
292         void addCaHandler();
293         void removeCaHandler();
294 private:
295         bool m_have_cached_program;
296         program m_cached_program;
297         bool m_isstreamclient;
298 #endif
299 };
300
301 #endif