winlin

update ts_info, parse the PES packet dts/pts.

@@ -2,6 +2,12 @@ @@ -2,6 +2,12 @@
2 g++ -o ts_info ts_info.cpp -g -O0 -ansi 2 g++ -o ts_info ts_info.cpp -g -O0 -ansi
3 */ 3 */
4 #if 1 4 #if 1
  5 +// for int64_t print using PRId64 format.
  6 +#ifndef __STDC_FORMAT_MACROS
  7 + #define __STDC_FORMAT_MACROS
  8 +#endif
  9 +#include <inttypes.h>
  10 +
5 #include <sys/types.h> 11 #include <sys/types.h>
6 #include <sys/stat.h> 12 #include <sys/stat.h>
7 #include <fcntl.h> 13 #include <fcntl.h>
@@ -361,6 +367,45 @@ public: @@ -361,6 +367,45 @@ public:
361 int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 367 int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p);
362 }; 368 };
363 369
  370 +/**
  371 +* Table 2-18 – Stream_id assignments. page 52.
  372 +*/
  373 +enum TSPESStreamId
  374 +{
  375 + PES_program_stream_map = 0b10111100,
  376 + PES_private_stream_1 = 0b10111101,
  377 + PES_padding_stream = 0b10111110,
  378 + PES_private_stream_2 = 0b10111111,
  379 +
  380 + // 110x xxxx
  381 + // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC
  382 + // 14496-3 audio stream number x xxxx
  383 + // (stream_id>>5)&0x07 == PES_audio_prefix
  384 + PES_audio_prefix = 0b110,
  385 +
  386 + // 1110 xxxx
  387 + // ITU-T Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC
  388 + // 14496-2 video stream number xxxx
  389 + // (stream_id>>5)&0x07 == PES_audio_prefix
  390 + PES_video_prefix = 0b1110,
  391 +
  392 + PES_ECM_stream = 0b11110000,
  393 + PES_EMM_stream = 0b11110001,
  394 + PES_DSMCC_stream = 0b11110010,
  395 + PES_13522_stream = 0b11110011,
  396 + PES_H_222_1_type_A = 0b11110100,
  397 + PES_H_222_1_type_B = 0b11110101,
  398 + PES_H_222_1_type_C = 0b11110110,
  399 + PES_H_222_1_type_D = 0b11110111,
  400 + PES_H_222_1_type_E = 0b11111000,
  401 + PES_ancillary_stream = 0b11111001,
  402 + PES_SL_packetized_stream = 0b11111010,
  403 + PES_FlexMux_stream = 0b11111011,
  404 + // reserved data stream
  405 + // 1111 1100 … 1111 1110
  406 + PES_program_stream_directory= 0b11111111,
  407 +};
  408 +
364 409
365 /** 410 /**
366 * 2.4.3.7 Semantic definition of fields in PES packet. page 49. 411 * 2.4.3.7 Semantic definition of fields in PES packet. page 49.
@@ -374,6 +419,33 @@ public: @@ -374,6 +419,33 @@ public:
374 u_int8_t stream_id; //8bits 419 u_int8_t stream_id; //8bits
375 // 2B 420 // 2B
376 u_int16_t PES_packet_length; //16bits 421 u_int16_t PES_packet_length; //16bits
  422 +
  423 + // 1B
  424 + // 2bits const '10'
  425 + int8_t PES_scrambling_control; //2bits
  426 + int8_t PES_priority; //1bit
  427 + int8_t data_alignment_indicator; //1bit
  428 + int8_t copyright; //1bit
  429 + int8_t original_or_copy; //1bit
  430 +
  431 + // 1B
  432 + int8_t PTS_DTS_flags; //2bits
  433 + int8_t ESCR_flag; //1bit
  434 + int8_t ES_rate_flag; //1bit
  435 + int8_t DSM_trick_mode_flag; //1bit
  436 + int8_t additional_copy_info_flag; //1bit
  437 + int8_t PES_CRC_flag; //1bit
  438 + int8_t PES_extension_flag; //1bit
  439 +
  440 + // 1B
  441 + u_int8_t PES_header_data_length; //8bits
  442 +
  443 + /**
  444 + * logic data.
  445 + */
  446 + // generated by PTS_DTS_flags
  447 + int64_t pts; // 33bits
  448 + int64_t dts; // 33bits
377 449
378 TSPayloadPES(); 450 TSPayloadPES();
379 virtual ~TSPayloadPES(); 451 virtual ~TSPayloadPES();
@@ -832,6 +904,7 @@ int TSPayloadPMT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t @@ -832,6 +904,7 @@ int TSPayloadPMT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t
832 904
833 TSPayloadPES::TSPayloadPES() 905 TSPayloadPES::TSPayloadPES()
834 { 906 {
  907 + pts = dts = 0;
835 } 908 }
836 909
837 TSPayloadPES::~TSPayloadPES() 910 TSPayloadPES::~TSPayloadPES()
@@ -854,6 +927,131 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t @@ -854,6 +927,131 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t
854 pp = (char*)&PES_packet_length; 927 pp = (char*)&PES_packet_length;
855 pp[1] = *p++; 928 pp[1] = *p++;
856 pp[0] = *p++; 929 pp[0] = *p++;
  930 +
  931 + if (stream_id != PES_program_stream_map
  932 + && stream_id != PES_padding_stream
  933 + && stream_id != PES_private_stream_2
  934 + && stream_id != PES_ECM_stream
  935 + && stream_id != PES_EMM_stream
  936 + && stream_id != PES_program_stream_directory
  937 + && stream_id != PES_DSMCC_stream
  938 + && stream_id != PES_H_222_1_type_E
  939 + ) {
  940 + original_or_copy = *p++;
  941 +
  942 + //int8_t const2bits = (original_or_copy >> 6) & 0x03;
  943 + PES_scrambling_control = (original_or_copy >> 4) & 0x03;
  944 + PES_priority = (original_or_copy >> 3) & 0x01;
  945 + data_alignment_indicator = (original_or_copy >> 2) & 0x01;
  946 + copyright = (original_or_copy >> 1) & 0x01;
  947 + original_or_copy &= 0x01;
  948 +
  949 + PES_extension_flag = *p++;
  950 +
  951 + PTS_DTS_flags = (PES_extension_flag >> 6) & 0x03;
  952 + ESCR_flag = (PES_extension_flag >> 5) & 0x01;
  953 + ES_rate_flag = (PES_extension_flag >> 4) & 0x01;
  954 + DSM_trick_mode_flag = (PES_extension_flag >> 3) & 0x01;
  955 + additional_copy_info_flag = (PES_extension_flag >> 2) & 0x01;
  956 + PES_CRC_flag = (PES_extension_flag >> 1) & 0x01;
  957 + PES_extension_flag &= 0x01;
  958 +
  959 + PES_header_data_length = *p++;
  960 +
  961 + if (PTS_DTS_flags == 0x2) {
  962 + int64_t temp = 0;
  963 + pp = (char*)&temp;
  964 + pp[4] = *p++;
  965 + pp[3] = *p++;
  966 + pp[2] = *p++;
  967 + pp[1] = *p++;
  968 + pp[0] = *p++;
  969 +
  970 + // marker_bit 1bit
  971 + temp = temp >> 1;
  972 + // PTS [14..0] 15bits
  973 + pts |= temp & 0x3FFF;
  974 + // marker_bit 1bit
  975 + temp = temp >> 1;
  976 + // PTS [29..15] 15bits
  977 + pts |= temp & 0x3fff8000;
  978 + // marker_bit 1bit
  979 + temp = temp >> 1;
  980 + // PTS [32..30] 3bits
  981 + pts |= temp & 0x1c0000000;
  982 + // '0010' 4bits
  983 + //int8_t const4bits = (temp >> 32) & 0x0F;
  984 + }
  985 +
  986 + if (PTS_DTS_flags == 0x3) {
  987 + int64_t temp = 0;
  988 +
  989 + pp = (char*)&temp;
  990 + pp[4] = *p++;
  991 + pp[3] = *p++;
  992 + pp[2] = *p++;
  993 + pp[1] = *p++;
  994 + pp[0] = *p++;
  995 +
  996 + // marker_bit 1bit
  997 + temp = temp >> 1;
  998 + // PTS [14..0] 15bits
  999 + pts |= temp & 0x3FFF;
  1000 + // marker_bit 1bit
  1001 + temp = temp >> 1;
  1002 + // PTS [29..15] 15bits
  1003 + pts |= temp & 0x3fff8000;
  1004 + // marker_bit 1bit
  1005 + temp = temp >> 1;
  1006 + // PTS [32..30] 3bits
  1007 + pts |= temp & 0x1c0000000;
  1008 + // '0010' 4bits
  1009 + //int8_t const4bits = (temp >> 32) & 0x0F;
  1010 +
  1011 + pp = (char*)&temp;
  1012 + pp[4] = *p++;
  1013 + pp[3] = *p++;
  1014 + pp[2] = *p++;
  1015 + pp[1] = *p++;
  1016 + pp[0] = *p++;
  1017 +
  1018 + // marker_bit 1bit
  1019 + temp = temp >> 1;
  1020 + // PTS [14..0] 15bits
  1021 + dts |= temp & 0x3FFF;
  1022 + // marker_bit 1bit
  1023 + temp = temp >> 1;
  1024 + // PTS [29..15] 15bits
  1025 + dts |= temp & 0x3fff8000;
  1026 + // marker_bit 1bit
  1027 + temp = temp >> 1;
  1028 + // PTS [32..30] 3bits
  1029 + dts |= temp & 0x1c0000000;
  1030 + // '0010' 4bits
  1031 + //int8_t const4bits = (temp >> 32) & 0x0F;
  1032 + }
  1033 +
  1034 + if (ESCR_flag) {
  1035 + }
  1036 + } else if (stream_id == PES_program_stream_map
  1037 + || stream_id == PES_private_stream_2
  1038 + || stream_id == PES_ECM_stream
  1039 + || stream_id == PES_EMM_stream
  1040 + || stream_id == PES_program_stream_directory
  1041 + || stream_id == PES_DSMCC_stream
  1042 + || stream_id == PES_H_222_1_type_E
  1043 + ) {
  1044 + // for (i = 0; i < PES_packet_length; i++) {
  1045 + // PES_packet_data_byte
  1046 + // }
  1047 + } else if (stream_id != PES_padding_stream) {
  1048 + // for (i = 0; i < PES_packet_length; i++) {
  1049 + // padding_byte
  1050 + // }
  1051 + }
  1052 +
  1053 + trace("ts+pes stream_id: %d size: %d pts: %"PRId64" dts: %"PRId64"",
  1054 + stream_id, PES_packet_length, pts, dts);
857 1055
858 return ret; 1056 return ret;
859 } 1057 }