OSDN Git Service

stop using trunk directory in rectool
[rec10/rec10-git.git] / tstools / DtsEdit / src / gpac / mpegts.h
1 /*\r
2  *                      GPAC - Multimedia Framework C SDK\r
3  *\r
4  *                      Authors: Walid B.H - Jean Le Feuvre\r
5  *    Copyright (c)2006-200X ENST - All rights reserved\r
6  *\r
7  *  This file is part of GPAC / MPEG2-TS sub-project\r
8  *\r
9  *  GPAC is free software; you can redistribute it and/or modify\r
10  *  it under the terms of the GNU Lesser General Public License as published by\r
11  *  the Free Software Foundation; either version 2, or (at your option)\r
12  *  any later version.\r
13  *   \r
14  *  GPAC is distributed in the hope that it will be useful,\r
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
17  *  GNU Lesser General Public License for more details.\r
18  *   \r
19  *  You should have received a copy of the GNU Lesser General Public\r
20  *  License along with this library; see the file COPYING.  If not, write to\r
21  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. \r
22  *\r
23  */\r
24 \r
25 \r
26 #ifndef _GF_MPEG_TS_H_\r
27 #define _GF_MPEG_TS_H_\r
28 \r
29 #include <gpac/list.h>\r
30 #include <gpac/internal/odf_dev.h>\r
31 \r
32 typedef struct tag_m2ts_demux GF_M2TS_Demuxer;\r
33 typedef struct tag_m2ts_es GF_M2TS_ES;\r
34 typedef struct tag_m2ts_section_es GF_M2TS_SECTION_ES;\r
35 \r
36 /*Maximum number of streams in a TS*/\r
37 #define GF_M2TS_MAX_STREAMS     8192\r
38 \r
39 /*MPEG-2 TS Media types*/\r
40 enum\r
41 {\r
42         GF_M2TS_VIDEO_MPEG1                             = 0x01,\r
43         GF_M2TS_VIDEO_MPEG2                             = 0x02,\r
44         GF_M2TS_AUDIO_MPEG1                             = 0x03,\r
45         GF_M2TS_AUDIO_MPEG2                             = 0x04, \r
46         GF_M2TS_PRIVATE_SECTION                 = 0x05,\r
47         GF_M2TS_PRIVATE_DATA                    = 0x06,\r
48         GF_M2TS_AUDIO_AAC                               = 0x0F,\r
49         GF_M2TS_VIDEO_MPEG4                             = 0x10,\r
50         GF_M2TS_AUDIO_LATM_AAC                  = 0x11,\r
51 \r
52         GF_M2TS_SYSTEMS_MPEG4_PES               = 0x12,\r
53         GF_M2TS_SYSTEMS_MPEG4_SECTIONS  = 0x13,\r
54 \r
55         GF_M2TS_VIDEO_H264                              = 0x1B,\r
56 \r
57         GF_M2TS_AUDIO_AC3                               = 0x81,\r
58         GF_M2TS_AUDIO_DTS                               = 0x8A,\r
59         GF_M2TS_SUBTITLE_DVB                    = 0x100,\r
60 };\r
61 /*returns readable name for given stream type*/\r
62 const char *gf_m2ts_get_stream_name(u32 streamType);\r
63 \r
64 /*PES data framing modes*/\r
65 enum\r
66 {\r
67         /*use data framing: recompute start of AUs (data frames)*/\r
68         GF_M2TS_PES_FRAMING_DEFAULT,\r
69         /*don't use data framing: all packets are raw PES packets*/\r
70         GF_M2TS_PES_FRAMING_RAW,\r
71         /*skip pes processing: all transport packets related to this stream are discarded*/\r
72         GF_M2TS_PES_FRAMING_SKIP\r
73 };\r
74 \r
75 /*PES packet flags*/\r
76 enum\r
77 {\r
78         GF_M2TS_PES_PCK_RAP = 1,\r
79         GF_M2TS_PES_PCK_AU_START = 1<<1,\r
80         /*visual frame starting in this packet is an I frame or IDR (AVC/H264)*/\r
81         GF_M2TS_PES_PCK_I_FRAME = 1<<2,\r
82         /*visual frame starting in this packet is a P frame*/\r
83         GF_M2TS_PES_PCK_P_FRAME = 1<<3,\r
84         /*visual frame starting in this packet is a B frame*/\r
85         GF_M2TS_PES_PCK_B_FRAME = 1<<4\r
86 };\r
87 \r
88 /*Events used by the MPEGTS demuxer*/\r
89 enum\r
90 {\r
91         /*PAT has been found (service connection) - no assoctiated parameter*/\r
92         GF_M2TS_EVT_PAT_FOUND = 0,\r
93         /*PAT has been updated - no assoctiated parameter*/\r
94         GF_M2TS_EVT_PAT_UPDATE,\r
95         /*repeated PAT has been found (carousel) - no assoctiated parameter*/\r
96         GF_M2TS_EVT_PAT_REPEAT,\r
97         /*PMT has been found (service tune-in) - assoctiated parameter: new PMT*/\r
98         GF_M2TS_EVT_PMT_FOUND,\r
99         /*repeated PMT has been found (carousel) - assoctiated parameter: updated PMT*/\r
100         GF_M2TS_EVT_PMT_REPEAT,\r
101         /*PMT has been changed - assoctiated parameter: updated PMT*/\r
102         GF_M2TS_EVT_PMT_UPDATE,\r
103         /*SDT has been received - assoctiated parameter: none*/\r
104         GF_M2TS_EVT_SDT_FOUND,\r
105         /*repeated SDT has been found (carousel) - assoctiated parameter: none*/\r
106         GF_M2TS_EVT_SDT_REPEAT,\r
107         /*SDT has been received - assoctiated parameter: none*/\r
108         GF_M2TS_EVT_SDT_UPDATE,\r
109         /*INT has been received - assoctiated parameter: none*/\r
110         GF_M2TS_EVT_INT_FOUND,\r
111         /*repeated INT has been found (carousel) - assoctiated parameter: none*/\r
112         GF_M2TS_EVT_INT_REPEAT,\r
113         /*INT has been received - assoctiated parameter: none*/\r
114         GF_M2TS_EVT_INT_UPDATE,\r
115         /*PES packet has been received - assoctiated parameter: PES packet*/\r
116         GF_M2TS_EVT_PES_PCK,\r
117         /*PCR has been received - assoctiated parameter: PES packet with no data*/\r
118         GF_M2TS_EVT_PES_PCR,\r
119         /*An MPEG-4 SL Packet has been received in a section - assoctiated parameter: SL packet */\r
120         GF_M2TS_EVT_SL_PCK,\r
121         /*An IP datagram has been received in a section - assoctiated parameter: IP datagram */\r
122         GF_M2TS_EVT_IP_DATAGRAM,\r
123 \r
124         /*AAC config has been extracted - associated parameter: PES Packet with encoded M4ADecSpecInfo in its data\r
125                 THIS MUST BE CLEANED UP\r
126         */\r
127         GF_M2TS_EVT_AAC_CFG,\r
128 #if 0\r
129         /* An EIT message for the present or following event on this TS has been received */\r
130         GF_M2TS_EVT_EIT_ACTUAL_PF,\r
131         /* An EIT message for the schedule of this TS has been received */\r
132         GF_M2TS_EVT_EIT_ACTUAL_SCHEDULE,\r
133         /* An EIT message for the present or following event of an other TS has been received */\r
134         GF_M2TS_EVT_EIT_OTHER_PF,\r
135         /* An EIT message for the schedule of an other TS has been received */\r
136         GF_M2TS_EVT_EIT_OTHER_SCHEDULE,\r
137         /* A message to inform about the current date and time in the TS */\r
138         GF_M2TS_EVT_TDT,\r
139         /* A message to inform about the current time offset in the TS */\r
140         GF_M2TS_EVT_TOT,\r
141 #endif\r
142         /* A generic event message for EIT, TDT, TOT etc */\r
143         GF_M2TS_EVT_DVB_GENERAL,\r
144 };\r
145 \r
146 enum\r
147 {\r
148         GF_M2TS_TABLE_START             = 1,\r
149         GF_M2TS_TABLE_END               = 1<<1,\r
150         GF_M2TS_TABLE_FOUND             = 1<<2,\r
151         GF_M2TS_TABLE_UPDATE    = 1<<3,\r
152         GF_M2TS_TABLE_REPEAT    = 1<<4,\r
153 };\r
154 \r
155 typedef void (*gf_m2ts_section_callback)(GF_M2TS_Demuxer *ts, GF_M2TS_SECTION_ES *es, GF_List *sections, u8 table_id, u16 ex_table_id, u8 version_number, u8 last_section_number, u32 status); \r
156 \r
157 typedef struct __m2ts_demux_section\r
158 {\r
159         unsigned char *data;\r
160         u32 data_size;\r
161 } GF_M2TS_Section;\r
162 \r
163 typedef struct __m2ts_demux_table\r
164 {\r
165         struct __m2ts_demux_table *next;\r
166 \r
167         Bool is_init;\r
168 \r
169         /*table id*/\r
170         u8 table_id;\r
171         u16 ex_table_id;\r
172 \r
173         /*reassembler state*/\r
174         u8 version_number;\r
175         u8 last_version_number;\r
176 \r
177         u8 current_next_indicator;\r
178 \r
179         u8 section_number;\r
180         u8 last_section_number;\r
181 \r
182         GF_List *sections;\r
183 \r
184 } GF_M2TS_Table;\r
185 \r
186 \r
187 typedef struct GF_M2TS_SectionFilter\r
188 {\r
189         /*section reassembler*/\r
190         s16 cc;\r
191         /*section buffer (max 4096)*/\r
192         char *section;\r
193         /*current section length as indicated in section header*/\r
194         u16 length;\r
195         /*number of bytes received from current section*/\r
196         u16 received;\r
197         /*error indiator when reaggregating sections*/\r
198         u8 had_error;\r
199 \r
200         /*section->table aggregator*/\r
201         GF_M2TS_Table *table;\r
202         \r
203         /* indicates that the section and last_section_number do not need to be checked */\r
204         Bool process_individual;\r
205 \r
206         /* indicates that the section header with table id and extended table id ... is\r
207            not parsed by the TS demuxer and left for the application  */\r
208         Bool direct_dispatch;\r
209 \r
210         gf_m2ts_section_callback process_section; \r
211 } GF_M2TS_SectionFilter;\r
212 \r
213 \r
214 \r
215 /*MPEG-2 TS program object*/\r
216 typedef struct \r
217 {\r
218         GF_List *streams;\r
219         u32 pmt_pid;  \r
220         u32 pcr_pid;\r
221         u32 number;\r
222 \r
223         GF_InitialObjectDescriptor *pmt_iod;\r
224 \r
225         /*list of additional ODs found per program !! used by media importer only , refine this !! \r
226                 this list is only created when MPEG-4 over MPEG-2 is detected\r
227                 the list AND the ODs contained in it are destroyed when destroying the demuxer\r
228         */\r
229         GF_List *additional_ods;\r
230         /*first dts found on this program - this is used by parsers, but not setup by the lib*/\r
231         u64 first_dts;\r
232 } GF_M2TS_Program;\r
233 \r
234 /*ES flags*/\r
235 enum\r
236 {\r
237         /*ES is a section stream*/\r
238         GF_M2TS_ES_IS_SECTION = 1,\r
239         /*ES is an mpeg-4 flexmux stream*/\r
240         GF_M2TS_ES_IS_FMC = 1<<1,\r
241         /*ES is an mpeg-4 SL-packetized stream*/\r
242         GF_M2TS_ES_IS_SL = 1<<2,\r
243         /*ES is an mpeg-4 Object Descriptor SL-packetized stream*/\r
244         GF_M2TS_ES_IS_MPEG4_OD = 1<<3,\r
245         \r
246         /*all flags above this mask are used by importers & co*/\r
247         GF_M2TS_ES_STATIC_FLAGS_MASK = 0x0000FFFF,\r
248 \r
249         /*Flag used by importers*/\r
250         GF_M2TS_ES_FIRST_DTS = 1<<20,\r
251 };\r
252 \r
253 /*Abstract Section/PES stream object, only used for type casting*/\r
254 #define ABSTRACT_ES             \\r
255                         GF_M2TS_Program *program; \\r
256                         u32 flags; \\r
257                         u32 pid; \\r
258                         u32 stream_type; \\r
259                         u32 mpeg4_es_id; \\r
260                         void *user; \\r
261                         u64 first_dts;\r
262 \r
263 struct tag_m2ts_es\r
264 {\r
265         ABSTRACT_ES\r
266 };\r
267 \r
268 /*INT object*/\r
269 typedef struct\r
270 {\r
271         u32 id;\r
272 } GF_M2TS_INT;\r
273 \r
274 struct tag_m2ts_section_es\r
275 {\r
276         ABSTRACT_ES\r
277         GF_M2TS_SectionFilter *sec;\r
278 \r
279         /* MPE Frame object, MPE-FEC related data */\r
280         GF_M2TS_INT *ip_mac_not_table;  \r
281 };                      \r
282 \r
283 /*******************************************************************************/\r
284 typedef struct tag_m2ts_dvb_sub\r
285 {\r
286         char language[3];\r
287         u8 type;\r
288         u16 composition_page_id;\r
289         u16 ancillary_page_id;\r
290 } GF_M2TS_DVB_Subtitling_Descriptor;\r
291 \r
292 typedef struct tag_m2ts_dvb_teletext\r
293 {\r
294         char language[3];\r
295         u8 type;\r
296         u8 magazine_number;\r
297         u8 page_number;\r
298 } GF_M2TS_DVB_Teletext_Descriptor;\r
299 \r
300 /*MPEG-2 TS ES object*/\r
301 typedef struct tag_m2ts_pes\r
302 {\r
303         ABSTRACT_ES\r
304         u32 lang;\r
305 \r
306         /*object info*/\r
307         u32 vid_w, vid_h, vid_par, aud_sr, aud_nb_ch;\r
308         /*user private*/\r
309 \r
310 \r
311         /*mpegts lib private - do not touch :)*/\r
312         /*PES re-assembler*/\r
313         unsigned char *data;\r
314         u32 data_len, pes_len;\r
315         Bool rap;\r
316         u64 PTS, DTS;\r
317         \r
318         /*PES reframer - if NULL, pes processing is skiped*/\r
319         u32 frame_state;\r
320         void (*reframe)(struct tag_m2ts_demux *ts, struct tag_m2ts_pes *pes, u64 DTS, u64 CTS, unsigned char *data, u32 data_len);\r
321         /*LATM stuff - should be moved out of mpegts*/\r
322         unsigned char *buf;\r
323         u32 buf_len;\r
324 \r
325         GF_M2TS_DVB_Subtitling_Descriptor sub;\r
326 \r
327 } GF_M2TS_PES;\r
328 \r
329 /*SDT information object*/\r
330 typedef struct\r
331 {\r
332         u16 original_network_id;\r
333         u16 transport_stream_id;\r
334         u32 service_id;\r
335         u32 EIT_schedule;\r
336         u32 EIT_present_following;\r
337         u32 running_status;\r
338         u32 free_CA_mode;\r
339         u8 service_type;\r
340         unsigned char *provider, *service;\r
341 } GF_M2TS_SDT;\r
342 \r
343 typedef struct\r
344 {\r
345         u16 network_id;\r
346         unsigned char *network_name;\r
347         u16 original_network_id;\r
348         u16 transport_stream_id;\r
349         u16 service_id;\r
350         u32 service_type;\r
351         u32 logical_channel_number;\r
352 } GF_M2TS_NIT;\r
353 \r
354 #define GF_M2TS_BASE_DESCRIPTOR u32 tag;\r
355 \r
356 typedef struct {\r
357         u8 content_nibble_level_1, content_nibble_level_2, user_nibble;\r
358 } GF_M2TS_DVB_Content_Descriptor;\r
359 \r
360 typedef struct {\r
361         char country_code[3];\r
362         u8 value;\r
363 } GF_M2TS_DVB_Rating_Descriptor;\r
364 \r
365 typedef struct {\r
366         unsigned char lang[3];\r
367         unsigned char *event_name, *event_text;\r
368 } GF_M2TS_DVB_Short_Event_Descriptor;\r
369 \r
370 typedef struct {\r
371         unsigned char *item;\r
372         unsigned char *description;\r
373 } GF_M2TS_DVB_Extended_Event_Item;\r
374 \r
375 typedef struct {\r
376         unsigned char lang[3];\r
377         u32 last;\r
378         GF_List *items;\r
379         unsigned char *text;\r
380 } GF_M2TS_DVB_Extended_Event_Descriptor;\r
381 \r
382 /*EIT information objects*/\r
383 typedef struct\r
384 {\r
385         u32 year, month, day, time;\r
386 \r
387         /* local time offset descriptor data */\r
388         char country_code[3];\r
389         u8 country_region_id;\r
390         u8 local_time_offset_polarity;\r
391         u16 local_time_offset;\r
392         /*time_of_change*/\r
393         u32 toc_year, toc_month, toc_day, toc_time;\r
394         u16 next_time_offset;\r
395 } GF_M2TS_DateTime_Event;\r
396 \r
397 typedef struct {\r
398         u8 stream_content;\r
399         u8 component_type;\r
400         u8 component_tag;\r
401         char language_code[3];\r
402         unsigned char *text;\r
403 } GF_M2TS_Component;\r
404 \r
405 typedef struct\r
406 {\r
407         u16 event_id;\r
408         GF_M2TS_DateTime_Event start;\r
409         u32 duration;\r
410         u8 running_status;\r
411         u8 free_CA_mode;\r
412         GF_List *short_events;\r
413         GF_List *extended_events;\r
414         GF_List *components;\r
415         GF_List *contents;\r
416         GF_List *ratings;\r
417 } GF_M2TS_EIT_Event;\r
418 \r
419 typedef struct\r
420 {\r
421         u32 original_network_id;\r
422         u32 transport_stream_id;\r
423         u16 service_id;\r
424         GF_List *events;\r
425 } GF_M2TS_EIT;\r
426 \r
427 void gf_m2ts_decode_mjd_date(u32 date, u32 *year, u32 *month, u32 *day);\r
428 \r
429 \r
430 /*MPEG-2 TS packet*/\r
431 typedef struct\r
432 {\r
433         char *data;\r
434         u32 data_len;\r
435         u32 flags;\r
436         u64 PTS, DTS;\r
437         /*parent stream*/\r
438         GF_M2TS_PES *stream;\r
439 } GF_M2TS_PES_PCK;\r
440 \r
441 /*MPEG-4 SL packet from MPEG-2 TS*/\r
442 typedef struct\r
443 {\r
444         char *data;\r
445         u32 data_len;\r
446         /*parent stream */\r
447         GF_M2TS_ES *stream;\r
448 } GF_M2TS_SL_PCK;\r
449 \r
450 /*MPEG-2 TS demuxer*/\r
451 struct tag_m2ts_demux\r
452 {\r
453         GF_M2TS_ES *ess[GF_M2TS_MAX_STREAMS];\r
454         GF_List *programs;\r
455         /*keep it seperate for now - TODO check if we're sure of the order*/\r
456         GF_List *SDTs;\r
457 \r
458         /*user callback - MUST NOT BE NULL*/\r
459         void (*on_event)(struct tag_m2ts_demux *ts, u32 evt_type, void *par);\r
460         /*private user data*/\r
461         void *user;\r
462 \r
463         /*private resync buffer*/\r
464         char *buffer;\r
465         u32 buffer_size, alloc_size;\r
466         /*default transport PID filters*/\r
467         GF_M2TS_SectionFilter *pat, *nit, *sdt, *eit, *tdt_tot_st;\r
468 \r
469         /* Structure to hold all the INT tables if the TS contains IP streams */\r
470         GF_List *ip_mac_not_tables;\r
471         \r
472         Bool has_4on2;\r
473         /* analyser */\r
474         FILE *pes_out;\r
475 \r
476 \r
477 };\r
478 \r
479 \r
480 GF_M2TS_Demuxer *gf_m2ts_demux_new();\r
481 void gf_m2ts_demux_del(GF_M2TS_Demuxer *ts);\r
482 void gf_m2ts_reset_parsers(GF_M2TS_Demuxer *ts);\r
483 GF_Err gf_m2ts_set_pes_framing(GF_M2TS_PES *pes, u32 mode);\r
484 GF_Err gf_m2ts_process_data(GF_M2TS_Demuxer *ts, char *data, u32 data_size);\r
485 \r
486 u32 gf_m2ts_crc32_check(char *data, u32 len);\r
487 \r
488 /*MPEG-2 Descriptor tags*/\r
489 enum\r
490 {\r
491         /* ... */\r
492         GF_M2TS_VIDEO_STREAM_DESCRIPTOR                         = 0x02,\r
493         GF_M2TS_AUDIO_STREAM_DESCRIPTOR                         = 0x03,\r
494         GF_M2TS_HIERARCHY_DESCRIPTOR                            = 0x04,\r
495         GF_M2TS_REGISTRATION_DESCRIPTOR                         = 0x05,\r
496         GF_M2TS_DATA_STREAM_ALIGNEMENT_DESCRIPTOR               = 0x06,\r
497         GF_M2TS_TARGET_BACKGROUND_GRID_DESCRIPTOR               = 0x07,\r
498         GF_M2TS_VIEW_WINDOW_DESCRIPTOR                          = 0x08,\r
499         GF_M2TS_CA_DESCRIPTOR                                   = 0x09,\r
500         GF_M2TS_ISO_639_LANGUAGE_DESCRIPTOR                     = 0x0A,\r
501         /* ... */\r
502         GF_M2TS_STD_DESCRIPTOR                                  = 0x17,\r
503         /* ... */\r
504         GF_M2TS_MPEG4_VIDEO_DESCRIPTOR                          = 0x1B,\r
505         GF_M2TS_MPEG4_AUDIO_DESCRIPTOR                          = 0x1C,\r
506         GF_M2TS_MPEG4_IOD_DESCRIPTOR                            = 0x1D,\r
507         GF_M2TS_MPEG4_SL_DESCRIPTOR                             = 0x1E,\r
508         GF_M2TS_MPEG4_FMC_DESCRIPTOR                            = 0x1F,\r
509         /* ... */\r
510         GF_M2TS_AVC_VIDEO_DESCRIPTOR                            = 0x28,\r
511         /* ... */       \r
512         GF_M2TS_AVC_TIMING_HRD_DESCRIPTOR                       = 0x2A,\r
513         /* ... */\r
514 \r
515         /* 0x2D - 0x3F - ISO/IEC 13818-6 values */\r
516         /* 0x40 - 0xFF - User Private values */\r
517         GF_M2TS_DVB_NETWORK_NAME_DESCRIPTOR                     = 0x40,\r
518         GF_M2TS_DVB_SERVICE_LIST_DESCRIPTOR                     = 0x41,\r
519         GF_M2TS_DVB_STUFFING_DESCRIPTOR                         = 0x42,\r
520         GF_M2TS_DVB_SAT_DELIVERY_SYSTEM_DESCRIPTOR              = 0x43,\r
521         GF_M2TS_DVB_CABLE_DELIVERY_SYSTEM_DESCRIPTOR            = 0x44,\r
522         GF_M2TS_DVB_VBI_DATA_DESCRIPTOR                         = 0x45,\r
523         GF_M2TS_DVB_VBI_TELETEXT_DESCRIPTOR                     = 0x46,\r
524         GF_M2TS_DVB_BOUQUET_NAME_DESCRIPTOR                     = 0x47,\r
525         GF_M2TS_DVB_SERVICE_DESCRIPTOR                          = 0x48,\r
526         GF_M2TS_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR             = 0x49,\r
527         GF_M2TS_DVB_LINKAGE_DESCRIPTOR                          = 0x4A,\r
528         GF_M2TS_DVB_NVOD_REFERENCE_DESCRIPTOR                   = 0x4B,\r
529         GF_M2TS_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR             = 0x4C,\r
530         GF_M2TS_DVB_SHORT_EVENT_DESCRIPTOR                      = 0x4D,\r
531         GF_M2TS_DVB_EXTENDED_EVENT_DESCRIPTOR                   = 0x4E,\r
532         GF_M2TS_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR               = 0x4F,\r
533         GF_M2TS_DVB_COMPONENT_DESCRIPTOR                        = 0x50,\r
534         GF_M2TS_DVB_MOSAIC_DESCRIPTOR                           = 0x51,\r
535         GF_M2TS_DVB_STREAM_IDENTIFIER_DESCRIPTOR                = 0x52,\r
536         GF_M2TS_DVB_CA_IDENTIFIER_DESCRIPTOR                    = 0x53,\r
537         GF_M2TS_DVB_CONTENT_DESCRIPTOR                          = 0x54,\r
538         GF_M2TS_DVB_PARENTAL_RATING_DESCRIPTOR                  = 0x55,\r
539         GF_M2TS_DVB_TELETEXT_DESCRIPTOR                         = 0x56,\r
540         /* ... */\r
541         GF_M2TS_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR                = 0x58,\r
542         GF_M2TS_DVB_SUBTITLING_DESCRIPTOR                       = 0x59,\r
543         /* ... */\r
544         GF_M2TS_DVB_DATA_BROADCAST_DESCRIPTOR                   = 0x64,\r
545         /* ... */\r
546         GF_M2TS_DVB_DATA_BROADCAST_ID_DESCRIPTOR                = 0x66,\r
547         /* ... */\r
548         GF_M2TS_DVB_AC3_DESCRIPTOR                              = 0x6A,\r
549         \r
550 };\r
551 \r
552 /* Reserved PID values */\r
553 enum {\r
554         GF_M2TS_PID_PAT                 = 0x0000,\r
555         GF_M2TS_PID_CAT                 = 0x0001,\r
556         GF_M2TS_PID_TSDT                = 0x0002,\r
557         /* reserved 0x0003 to 0x000F */ \r
558         GF_M2TS_PID_NIT_ST              = 0x0010,\r
559         GF_M2TS_PID_SDT_BAT_ST          = 0x0011,\r
560         GF_M2TS_PID_EIT_ST_CIT          = 0x0012,\r
561         GF_M2TS_PID_RST_ST              = 0x0013,\r
562         GF_M2TS_PID_TDT_TOT_ST          = 0x0014,\r
563         GF_M2TS_PID_NET_SYNC            = 0x0015,\r
564         GF_M2TS_PID_RNT                 = 0x0016,\r
565         /* reserved 0x0017 to 0x001B */ \r
566         GF_M2TS_PID_IN_SIG              = 0x001C,\r
567         GF_M2TS_PID_MEAS                = 0x001D,\r
568         GF_M2TS_PID_DIT                 = 0x001E,\r
569         GF_M2TS_PID_SIT                 = 0x001F\r
570 };\r
571 \r
572 /* max size includes first header, second header, payload and CRC */\r
573 enum {\r
574         GF_M2TS_TABLE_ID_PAT                    = 0x00,\r
575         GF_M2TS_TABLE_ID_CAT                    = 0x01, \r
576         GF_M2TS_TABLE_ID_PMT                    = 0x02, \r
577         GF_M2TS_TABLE_ID_TSDT                   = 0x03, /* max size for section 1024 */\r
578         GF_M2TS_TABLE_ID_MPEG4_BIFS             = 0x04, /* max size for section 4096 */\r
579         GF_M2TS_TABLE_ID_MPEG4_OD               = 0x05, /* max size for section 4096 */\r
580         GF_M2TS_TABLE_ID_METADATA               = 0x06, \r
581         GF_M2TS_TABLE_ID_IPMP_CONTROL           = 0x07, \r
582         /* 0x08 - 0x37 reserved */\r
583         /* 0x38 - 0x3D DSM-CC defined */\r
584         GF_M2TS_TABLE_ID_DSM_CC_PRIVATE         = 0x3E, /* used for MPE (only, not MPE-FEC) */\r
585         /* 0x3F DSM-CC defined */\r
586         GF_M2TS_TABLE_ID_NIT_ACTUAL             = 0x40, /* max size for section 1024 */\r
587         GF_M2TS_TABLE_ID_NIT_OTHER              = 0x41,\r
588         GF_M2TS_TABLE_ID_SDT_ACTUAL             = 0x42, /* max size for section 1024 */\r
589         /* 0x43 - 0x45 reserved */\r
590         GF_M2TS_TABLE_ID_SDT_OTHER              = 0x46, /* max size for section 1024 */\r
591         /* 0x47 - 0x49 reserved */\r
592         GF_M2TS_TABLE_ID_BAT                    = 0x4a, /* max size for section 1024 */\r
593         /* 0x4b - 0x4d reserved */\r
594         GF_M2TS_TABLE_ID_EIT_ACTUAL_PF          = 0x4E, /* max size for section 4096 */\r
595         GF_M2TS_TABLE_ID_EIT_OTHER_PF           = 0x4F,\r
596         /* 0x50 - 0x6f EIT SCHEDULE */\r
597         GF_M2TS_TABLE_ID_EIT_SCHEDULE_MIN       = 0x50,\r
598         GF_M2TS_TABLE_ID_EIT_SCHEDULE_ACTUAL_MAX= 0x5F,\r
599         GF_M2TS_TABLE_ID_EIT_SCHEDULE_MAX       = 0x6F,\r
600 \r
601         GF_M2TS_TABLE_ID_TDT                    = 0x70,\r
602         GF_M2TS_TABLE_ID_RST                    = 0x71, /* max size for section 1024 */\r
603         GF_M2TS_TABLE_ID_ST                     = 0x72, /* max size for section 4096 */\r
604         GF_M2TS_TABLE_ID_TOT                    = 0x73,\r
605         GF_M2TS_TABLE_ID_AI                     = 0x74,\r
606         GF_M2TS_TABLE_ID_CONT                   = 0x75,\r
607         GF_M2TS_TABLE_ID_RC                     = 0x76,\r
608         GF_M2TS_TABLE_ID_CID                    = 0x77,\r
609         GF_M2TS_TABLE_ID_MPE_FEC                = 0x78,\r
610         GF_M2TS_TABLE_ID_RES_NOT                = 0x79,\r
611         /* 0x7A - 0x7D reserved */\r
612         GF_M2TS_TABLE_ID_DIT                    = 0x7E,\r
613         GF_M2TS_TABLE_ID_SIT                    = 0x7F, /* max size for section 4096 */\r
614         /* 0x80 - 0xfe reserved */\r
615         /* 0xff reserved */\r
616 };\r
617 \r
618 enum {\r
619         M2TS_ADAPTATION_RESERVED        = 0,\r
620         M2TS_ADAPTATION_NONE            = 1,\r
621         M2TS_ADAPTATION_ONLY            = 2,\r
622         M2TS_ADAPTATION_AND_PAYLOAD     = 3,\r
623 };\r
624 \r
625 \r
626 #define SECTION_HEADER_LENGTH 3 /* header till the last bit of the section_length field */\r
627 #define SECTION_ADDITIONAL_HEADER_LENGTH 5 /* header from the last bit of the section_length field to the payload */\r
628 #define CRC_LENGTH 4\r
629 \r
630 typedef struct\r
631 {\r
632         u8 sync;\r
633         u8 error;\r
634         u8 payload_start;\r
635         u8 priority;\r
636         u16 pid;\r
637         u8 scrambling_ctrl;\r
638         u8 adaptation_field;\r
639         u8 continuity_counter;\r
640 } GF_M2TS_Header;\r
641 \r
642 typedef struct\r
643 {\r
644         u32 discontinuity_indicator;\r
645         u32 random_access_indicator;\r
646         u32 priority_indicator;\r
647 \r
648         u32 PCR_flag;\r
649         u64 PCR_base, PCR_ext;\r
650 \r
651         u32 OPCR_flag;\r
652         u64 OPCR_base, OPCR_ext;\r
653 \r
654         u32 splicing_point_flag;\r
655         u32 transport_private_data_flag;\r
656         u32 adaptation_field_extension_flag;\r
657 /*      \r
658         u32 splice_countdown;\r
659         u32 transport_private_data_length;\r
660         u32 adaptation_field_extension_length;\r
661         u32 ltw_flag;\r
662         u32 piecewise_rate_flag;\r
663         u32 seamless_splice_flag;\r
664         u32 ltw_valid_flag;\r
665         u32 ltw_offset;\r
666         u32 piecewise_rate;\r
667         u32 splice_type;\r
668         u32 DTS_next_AU;\r
669 */\r
670 } GF_M2TS_AdaptationField;\r
671 \r
672 typedef struct \r
673 {\r
674         u8 id;\r
675         u16 pck_len;\r
676         u8 data_alignment;\r
677         u64 PTS, DTS;\r
678         u8 hdr_data_len;\r
679 } GF_M2TS_PESHeader;\r
680 \r
681 #endif  //_GF_MPEG_TS_H_\r