libtsfuncs is a library for mpeg PSI parsing and generation. https://georgi.unixsol.org/programs/libtsfuncs/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tsdata.h 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. /*
  2. * Data defintions
  3. * Copyright (C) 2010-2011 Unix Solutions Ltd.
  4. *
  5. * Released under MIT license.
  6. * See LICENSE-MIT.txt for license terms.
  7. */
  8. #ifndef LIBTS_TSDATA_H
  9. #define LIBTS_TSDATA_H
  10. #include <netdb.h>
  11. #include <time.h>
  12. #ifndef FREE
  13. #define FREE(x) if(x) { free(x); x=NULL; }
  14. #endif
  15. #define TS_PACKET_SIZE 188
  16. #define TS_MAX_PAYLOAD_SIZE (TS_PACKET_SIZE-4)
  17. struct ts_header {
  18. uint8_t sync_byte; // Always 0x47
  19. uint16_t tei : 1, // Transport Error Indicator (TEI)
  20. pusi : 1, // Payload Unit Start Indicator
  21. prio : 1, // Transport Priority
  22. pid : 13; // PID
  23. uint8_t scramble : 2, // 00 - not scrambled, 01 - reserved, 10 - scrambled with even key, 11 - scrambled with odd key
  24. adapt_field : 1,
  25. payload_field : 1,
  26. continuity : 4;
  27. // The variables bellow this line depends may not exist in a packet
  28. uint8_t adapt_len; // adaptation field length
  29. uint8_t adapt_flags; // adaptation field flags
  30. uint8_t payload_size; // Payload size inside the packet
  31. uint8_t payload_offset; // Payload offset inside the packet
  32. };
  33. struct ts_section_header {
  34. uint8_t pointer_field;
  35. uint8_t table_id;
  36. uint16_t section_syntax_indicator: 1, // Section Syntax Indicator
  37. private_indicator : 1, // Private section indicator
  38. reserved1 : 2, // 2 reserved bits
  39. section_length : 12; // Section lenth
  40. uint16_t ts_id_number; // Transport stream id (in PAT), Program number (in PMT)
  41. uint8_t reserved2 : 2,
  42. version_number : 5,
  43. current_next_indicator : 1;
  44. uint8_t section_number;
  45. uint8_t last_section_number;
  46. // The variables bellow this line are not in the physical packet
  47. int section_pos; // Up to this pos the section data has come
  48. int initialized; // Set to 1 when whole sectino is initialized
  49. int section_data_len; // Full section length (3 + section_length)
  50. uint8_t *section_data; // The whole section data
  51. uint8_t *packet_data; // TS packet(s) that were used to transfer the table.
  52. int num_packets; // From how much packets this section is build
  53. int data_len; // Data size without the CRC32 (4 bytes)
  54. uint8_t *data; // Offset into section_data (where the section data start without the section header)
  55. uint32_t CRC;
  56. };
  57. struct ts_pat_program {
  58. uint16_t program;
  59. uint16_t reserved:3,
  60. pid:13;
  61. };
  62. struct ts_pat {
  63. struct ts_header ts_header;
  64. struct ts_section_header *section_header;
  65. struct ts_pat_program **programs;
  66. // The variables bellow are nor part of the physical packet
  67. int programs_max; // How much programs are allocated
  68. int programs_num; // How much programs are initialized
  69. uint8_t initialized; // Set to 1 when full table is initialized
  70. };
  71. enum CA_system {
  72. CA_SECA, // 0x0100 - 0x01FF Canal Plus (SECA/Mediaguard)
  73. CA_VIACCESS, // 0x0500 - 0x05FF France Telecom
  74. CA_IRDETO, // 0x0600 - 0x06FF Irdeto
  75. CA_VIDEOGUARD, // 0x0900 - 0x09FF News Datacom (NDS/Videoguard)
  76. CA_CONAX, // 0x0B00 - 0x0BFF Norwegian Telekom
  77. CA_CRYPTOWORKS, // 0x0D00 - 0x0DFF CrytoWorks
  78. CA_NAGRA, // 0x1800 - 0x18FF Kudelski SA (Nagravision)
  79. CA_DRECRYPT, // 0x4AE0 - 0x4AE1 OOO Cifra (DRE-Crypt)
  80. CA_BULCRYPT, // 0x5581 & 0x4AEE Bulcrypt
  81. CA_GRIFFIN, // 0x5501 & 0x5504 & 0x5511 Griffin (Not in dvbservices.com registration)
  82. CA_DGCRYPT, // 0x4ABF DGCrypt (Beijing Compunicate Technology Inc.)
  83. CA_UNKNOWN,
  84. };
  85. struct ts_cat {
  86. struct ts_header ts_header;
  87. struct ts_section_header *section_header;
  88. int program_info_size;
  89. uint8_t *program_info;
  90. // The variables bellow are nor part of the physical packet
  91. uint8_t initialized; // Set to 1 when full table is initialized
  92. };
  93. struct ts_pmt_stream {
  94. uint8_t stream_type;
  95. uint16_t reserved1 : 3,
  96. pid : 13;
  97. uint16_t reserved2 : 4,
  98. ES_info_size : 12;
  99. uint8_t *ES_info;
  100. };
  101. struct ts_pmt {
  102. struct ts_header ts_header;
  103. struct ts_section_header *section_header;
  104. uint16_t reserved1 : 3,
  105. PCR_pid : 13;
  106. uint16_t reserved2 : 4,
  107. program_info_size : 12;
  108. uint8_t *program_info;
  109. struct ts_pmt_stream **streams;
  110. // The variables bellow are nor part of the physical packet
  111. int streams_max; // How much streams are allocated
  112. int streams_num; // How much streams are initialized
  113. uint8_t initialized; // Set to 1 when full table is initialized
  114. };
  115. struct ts_sdt_stream {
  116. uint16_t service_id;
  117. uint8_t reserved1 : 6,
  118. EIT_schedule_flag : 1,
  119. EIT_present_following_flag : 1;
  120. uint16_t running_status : 3,
  121. free_CA_mode : 1,
  122. descriptor_size : 12;
  123. uint8_t *descriptor_data;
  124. };
  125. struct ts_sdt {
  126. struct ts_header ts_header;
  127. struct ts_section_header *section_header;
  128. uint16_t original_network_id;
  129. uint8_t reserved;
  130. struct ts_sdt_stream **streams;
  131. // The variables bellow are nor part of the physical packet
  132. int streams_max; // How much streams are allocated
  133. int streams_num; // How much streams are initialized
  134. uint8_t initialized; // Set to 1 when full table is initialized
  135. };
  136. struct ts_nit_stream {
  137. uint16_t transport_stream_id;
  138. uint16_t original_network_id;
  139. uint16_t reserved1 : 4,
  140. descriptor_size : 12;
  141. uint8_t *descriptor_data;
  142. };
  143. struct ts_nit {
  144. struct ts_header ts_header;
  145. struct ts_section_header *section_header;
  146. uint16_t reserved1 : 4,
  147. network_info_size : 12;
  148. uint8_t *network_info;
  149. uint16_t reserved2 : 4,
  150. ts_loop_size : 12;
  151. struct ts_nit_stream **streams;
  152. // The variables bellow are nor part of the physical packet
  153. int streams_max; // How much streams are allocated
  154. int streams_num; // How much streams are initialized
  155. uint8_t initialized; // Set to 1 when full NIT table is initialized
  156. };
  157. struct ts_eit_stream {
  158. uint16_t event_id;
  159. uint64_t start_time_mjd : 16,
  160. start_time_bcd : 24, // Total 40, start_time
  161. duration_bcd : 24;
  162. uint16_t running_status : 3,
  163. free_CA_mode : 1,
  164. descriptor_size : 12;
  165. uint8_t *descriptor_data;
  166. };
  167. struct ts_eit {
  168. struct ts_header ts_header;
  169. struct ts_section_header *section_header;
  170. uint16_t transport_stream_id;
  171. uint16_t original_network_id;
  172. uint8_t segment_last_section_number;
  173. uint8_t last_table_id;
  174. struct ts_eit_stream **streams;
  175. // The variables bellow are nor part of the physical packet
  176. int streams_max; // How much streams are allocated
  177. int streams_num; // How much streams are initialized
  178. uint8_t initialized; // Set to 1 when full eit table is initialized
  179. };
  180. struct ts_tdt {
  181. struct ts_header ts_header;
  182. struct ts_section_header *section_header;
  183. uint16_t mjd; // This both are part of one 40 bit field (UTC_time)
  184. uint32_t bcd; // Only 24 bits are used
  185. // The below fields are only in TOT packets, table_id 0x73
  186. uint16_t reserved_3 : 4,
  187. descriptors_size : 12;
  188. uint8_t *descriptors;
  189. // The variables bellow are nor part of the physical packet
  190. time_t utc; // decoded UTC_time
  191. struct tm tm; // decoded UTC_time
  192. uint8_t initialized;
  193. };
  194. struct ts_privsec {
  195. struct ts_header ts_header;
  196. struct ts_section_header *section_header;
  197. uint8_t initialized;
  198. };
  199. // PMT stream types
  200. enum ts_stream_type {
  201. STREAM_TYPE_MPEG1_VIDEO = 0x01, // MPEG-1 video
  202. STREAM_TYPE_MPEG2_VIDEO = 0x02, // H.262 - MPEG-2 video
  203. STREAM_TYPE_MPEG1_AUDIO = 0x03, // MPEG-1 audio
  204. STREAM_TYPE_MPEG2_AUDIO = 0x04, // MPEG-2 audio
  205. STREAM_TYPE_ADTS_AUDIO = 0x0F, // AAC ADTS
  206. STREAM_TYPE_MPEG4_PART2_VIDEO = 0x10, // DIVX - MPEG-4 part 2
  207. STREAM_TYPE_AVC_VIDEO = 0x1B, // H.264 - MPEG-4 part 10
  208. STREAM_TYPE_AVS_VIDEO = 0x42, // Chinese AVS
  209. STREAM_TYPE_DOLBY_DVB_AUDIO = 0x06, // 0x06 - Private stream, look at stream descriptors for AC-3 descriptor
  210. STREAM_TYPE_DOLBY_ATSC_AUDIO = 0x81, // 0x81 - Private stream in ATSC (US system, probably we shouldn't care)
  211. };
  212. // ------------------------------------------------------------
  213. // PES packet stream ids
  214. // See H.222.0 Table 2-17 and Table 2-18
  215. #define STREAM_ID_PROGRAM_STREAM_MAP 0xbc
  216. #define STREAM_ID_PRIVATE_STREAM_1 0xbd
  217. #define STREAM_ID_PADDING_STREAM 0xbe
  218. #define STREAM_ID_PRIVATE_STREAM_2 0xbf
  219. #define STREAM_ID_ECM_STREAM 0xf0
  220. #define STREAM_ID_EMM_STREAM 0xf1
  221. #define STREAM_ID_DSMCC_STREAM 0xf2
  222. #define STREAM_ID_13522_STREAM 0xf3
  223. #define STREAM_ID_H222_A_STREAM 0xf4
  224. #define STREAM_ID_H222_B_STREAM 0xf5
  225. #define STREAM_ID_H222_C_STREAM 0xf6
  226. #define STREAM_ID_H222_D_STREAM 0xf7
  227. #define STREAM_ID_H222_E_STREAM 0xf8
  228. #define STREAM_ID_ANCILLARY_STREAM 0xf9
  229. #define STREAM_ID_PROGRAM_STREAM_DIRECTORY 0xff
  230. #define IS_AUDIO_STREAM_ID(id) ((id) >= 0xc0 && (id) <= 0xdf)
  231. #define IS_VIDEO_STREAM_ID(id) ((id) >= 0xe0 && (id) <= 0xef)
  232. #define IS_PES_STREAM_SUPPORTED(id) (!(id == STREAM_ID_PROGRAM_STREAM_MAP || \
  233. id == STREAM_ID_PADDING_STREAM || \
  234. id == STREAM_ID_PRIVATE_STREAM_2 || \
  235. id == STREAM_ID_ECM_STREAM || \
  236. id == STREAM_ID_EMM_STREAM || \
  237. id == STREAM_ID_PROGRAM_STREAM_DIRECTORY || \
  238. id == STREAM_ID_DSMCC_STREAM || \
  239. id == STREAM_ID_H222_E_STREAM))
  240. struct mpeg_audio_header {
  241. uint32_t syncword : 12,
  242. ID : 1,
  243. layer : 2,
  244. protection_bit : 1,
  245. bitrate_index : 4,
  246. sampl_freq : 2,
  247. padding_bit : 1,
  248. private_bit : 1,
  249. mode : 2,
  250. mode_extension : 2,
  251. copyright : 1,
  252. org_home : 1,
  253. emphasis : 2;
  254. uint8_t initialized;
  255. };
  256. struct ts_pes {
  257. struct ts_header ts_header;
  258. uint32_t have_pts : 1, // Have PTS in the PES (init from PES header)
  259. have_dts : 1, // Have DTS in the PES (init from PES header)
  260. is_audio : 1, // PES carries audio (mpeg2 or AC3) (init from PES stream_id and PMT stream_type and descriptors)
  261. is_audio_mpeg1 : 1, // PES carries MP1 audio (init from PMT stream_id)
  262. is_audio_mpeg1l1: 1, // PES carries MP1 audio Layer I (init from PMT audio descriptor)
  263. is_audio_mpeg1l2: 1, // PES carries MP1 audio Layer II (init from PMT audio descriptor)
  264. is_audio_mpeg1l3: 1, // PES carries MP1 audio Layer III (init from PMT audio descriptor)
  265. is_audio_mpeg2 : 1, // PES carries MP2 audio (init from PMT stream_id)
  266. is_audio_aac : 1, // PES carries AAC audio (init from PMT stream_id)
  267. is_audio_ac3 : 1, // PES carries AC3 audio (init from stream_id and PMT descriptors and elmentary stream)
  268. is_audio_dts : 1, // PES carries DTS audio (init from stream_id and elementary stream)
  269. is_video : 1, // PES carries video (mpeg2 or H.264) (init from PES stream_id)
  270. is_video_mpeg1 : 1, // PES carries mpeg1 video (init from PES stream_id)
  271. is_video_mpeg2 : 1, // PES carries mpeg2 video (init from PES stream_id)
  272. is_video_mpeg4 : 1, // PES carries mpeg4 part 2 video (init from PES stream_id)
  273. is_video_h264 : 1, // PES carries H.264 video (init from PES stream_id)
  274. is_video_avs : 1, // PES carries AVS video (init from PES stream_id)
  275. is_teletext : 1, // PES carries teletext (init from PMT descriptors)
  276. is_subtitle : 1; // PES carries subtitles (init from PMT descriptors)
  277. uint8_t stream_id; // If !0 then the PES has started initializing
  278. uint16_t pes_packet_len; // Allowed to be 0 for video streams
  279. int real_pes_packet_len; // if pes_packet_len is > 0 the this is eq to pes_packet_len
  280. // if pes_packet_len is = 0 this is set to -1 until very last packet
  281. uint8_t flags_1; // Bellow flags
  282. uint8_t reserved1 : 2, // Always eq 2 (10 binary)
  283. scrambling : 2,
  284. priority : 1,
  285. data_alignment : 1,
  286. copyright : 1,
  287. original_or_copy : 1;
  288. uint8_t flags_2; // Bellow flags
  289. uint8_t PTS_flag : 1,
  290. DTS_flag : 1,
  291. ESCR_flag : 1,
  292. ES_rate_flag : 1,
  293. trick_mode_flag : 1,
  294. add_copy_info_flag : 1,
  295. pes_crc_flag : 1,
  296. pes_extension_flag : 1;
  297. uint8_t pes_header_len;
  298. uint64_t PTS; // if (PTS_flag)
  299. uint64_t DTS; // if (DTS_flag)
  300. uint64_t ESCR; // if (ESCR_flag)
  301. uint32_t ES_rate; // if (ES_rate_flag)
  302. uint16_t trick_mode_control : 2, // if (trick_mode_flag)
  303. field_id : 2,
  304. intra_slice_refresh : 1,
  305. freq_truncation : 2,
  306. rep_ctrl : 5,
  307. tm_reserved : 4;
  308. uint8_t reserved_add : 1, // if (add_copy_info_flag)
  309. add_copy_info : 7;
  310. uint16_t prev_pes_crc; // if (pes_crc_flag)
  311. // PES extension
  312. uint8_t flags_3; // Bellow flags
  313. uint8_t pes_private_data_flag : 1,
  314. pack_header_field_flag : 1,
  315. program_packet_seq_counter_flag : 1,
  316. p_std_buffer_flag : 1,
  317. reserved2 : 3,
  318. pes_extension2_flag : 1;
  319. uint64_t pes_private_data_1; // if (pes_private_data_flag)
  320. uint64_t pes_private_data_2; // The whole field is 128 bits
  321. uint8_t pack_header_len; // if (pack_header_field_flag)
  322. uint8_t *pack_header; // Pointer into *pes_data
  323. uint8_t reserved3 : 1, // if (program_packet_seq_counter_flag)
  324. program_packet_seq_counter : 7;
  325. uint8_t mpeg1_mpeg2_identifier : 1,
  326. original_stuff_length : 6;
  327. uint16_t p_std_reserved : 2, // Always 1, if (p_std_buffer_flag)
  328. p_std_buffer_scale : 1,
  329. p_std_buffer_size : 13;
  330. uint16_t reserved4 : 1, // if (pes_extension2_flag)
  331. pes_extension_field_len : 7;
  332. uint8_t *pes_extension2; // Pointer into *pes_data
  333. // Private data
  334. uint8_t *pes_data; // Whole packet is stored here
  335. uint32_t pes_data_pos; // How much data is filled in pes_data
  336. uint32_t pes_data_size; // Total allocated for pes_data
  337. uint8_t pes_data_initialized; // Set to 1 when all of the pes_data is in *pes_data and the parsing can start
  338. // More private data
  339. uint8_t *es_data; // Pointer to start of data after PES header, initialized when the packet is fully assembled
  340. uint32_t es_data_size; // Full pes packet length (used for video streams, otherwise equal to pes_packet_len)
  341. uint8_t initialized; // Set to 1 when the packet is fully assembled
  342. // Extra data
  343. struct mpeg_audio_header mpeg_audio_header;
  344. };
  345. struct pes_entry {
  346. uint16_t pid;
  347. struct ts_pes *pes;
  348. struct ts_pes *pes_next;
  349. };
  350. struct pes_array {
  351. int max;
  352. int cur;
  353. struct pes_entry **entries;
  354. };
  355. typedef uint8_t pidmap_t[0x2000];
  356. #endif