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