From 3913e46ba51d54bb01a45532908ee15487fb6555 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 20 Nov 2013 23:48:21 +0800 Subject: [PATCH] fix bug of ts_info --- trunk/doc/ts-audio-video-analysis.txt | 52 +++++++++++++++++ trunk/research/ts_info.cpp | 81 ++++++++++----------------- 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/trunk/doc/ts-audio-video-analysis.txt b/trunk/doc/ts-audio-video-analysis.txt index 55b8fb73c..775f5f2f7 100755 --- a/trunk/doc/ts-audio-video-analysis.txt +++ b/trunk/doc/ts-audio-video-analysis.txt @@ -225,3 +225,55 @@ TS 0x60b3b0: 0xf3 0x99 0x45 0xee 0xce 0xc7 0x1f 0xeb 0x60b3b8: 0x43 0x37 0xfd 0x67 0x34 0x97 0xcc 0x8c 0x60b3c0: 0xc5 0xec 0x86 0xb0 0x57 0xb4 0x83 0xa9 + + + +3031个ts包是空包,解析有问题: +47 41 00 38 07 50 05 09 5A A6 7E 00 00 00 01 E0 +00 00 80 C0 0A 31 28 53 60 81 11 28 53 42 F9 00 +00 00 01 09 F0 00 00 00 01 67 64 00 28 AC D1 C0 +50 05 BB FF 00 2D 00 22 10 00 00 03 00 10 00 00 +03 03 08 F1 83 11 E0 00 00 00 01 68 E9 AB 2C 8B +00 00 01 65 88 84 00 42 BF 08 EE 00 02 B2 75 8D +9F C4 24 E5 BD 27 87 F1 E4 09 A0 51 2D 12 FC F5 +6E 31 3D C4 0E 3F 51 47 07 BD D2 8C AB 72 1C 2D +D0 FA 2F 7D EF AA FB 17 C1 08 AD 36 8D F1 41 35 +E0 20 AE E8 75 66 39 15 78 88 01 E8 2E 4E 8A 8B +F8 04 68 BF EC 82 59 86 DE E1 66 32 37 FA 78 6D +01 EF C0 2C 6B A6 E9 36 44 4B C8 37 + +Adaptation fields + Adaptation_field_length: 7 + discontinuity_indicator: False + random_access_indicator: True + ES_priority_indicator: False + PCR_flag: True + OPCR_flag: False + splicing_point_flag: False + transport_private_data_flag: False + adaptation_field_extension_flag: False + PCR: 50699466000 + +PES header + stream_id: E0 (video stream 224) + PES_packet_length: 0 (undefined) + PES_scrambling: 0 + PES_priority: False + data_alignment: False + copyright: False + original_or_copy: False + PTS_flag: True + DTS_flag: True + ESCR_flag: False + ES_rate_flag: False + DSM_trick_mode_flag: False + additional_copy_info_flag: False + PES_CRC_flag: False + PES_extension_flag: False + PES_header_data_length: 10 + PTS: 169128000 + DTS: 169124220 + +Video sequence +Sequence header code not found in this packet +AFD not found in this packet \ No newline at end of file diff --git a/trunk/research/ts_info.cpp b/trunk/research/ts_info.cpp index 24bc51897..dd64dfd0d 100755 --- a/trunk/research/ts_info.cpp +++ b/trunk/research/ts_info.cpp @@ -568,6 +568,7 @@ public: */ int pid_size; TSPid* pids; + int64_t ts_packet_count; std::map msgs; TSContext(); @@ -583,6 +584,7 @@ public: TSContext::TSContext() { pid_size = 0; + ts_packet_count = 0; pids = NULL; } @@ -1567,8 +1569,9 @@ int TSPacket::demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*& trace("ts+header payload decoded."); } - trace("ts+header parsed finished. parsed: %d left: %d header: %d payload: %d(%d+%d)", - (int)(p - start), (int)(last - p), header->get_size(), payload->size, payload->pointer_field_size, + ctx->ts_packet_count++; + trace("ts+header parsed %"PRId64" packets finished. parsed: %d left: %d header: %d payload: %d(%d+%d)", + ctx->ts_packet_count, (int)(p - start), (int)(last - p), header->get_size(), payload->size, payload->pointer_field_size, payload->size - payload->pointer_field_size); return finish(); @@ -1692,22 +1695,11 @@ enum TSH264PicType class TSH264Codec { public: - int8_t forbidden_zero_bit; //1bit - int8_t nal_ref_idc; //2bits - TSH264NalUnitType nal_unit_type; //5bits - - // for nal_unit_type == TSH264NalUnitTypePictureDelimiter - TSH264PicType pic_type; //3bits - u_int8_t* raw_data; int size; TSH264Codec() { - forbidden_zero_bit = 0; - nal_ref_idc = 0; - nal_unit_type = TSH264NalUnitTypeUnspecified; - pic_type = TSH264PicTypeI; size = 0; raw_data = NULL; } @@ -1724,7 +1716,9 @@ public: { int ret = 0; - while (next_int(p, 3) != 0x000001) { + srs_assert(p); + + while (next_start_code_prefix(p) != 0x000001) { char ch = *p++; if (ch != 0x00) { trace("ts+h264 parse msg failed, " @@ -1741,45 +1735,25 @@ public: // start_code_prefix_one_3bytes /* equal to 0x000001 */ p += 3; - raw_data = (u_int8_t*)p; - while (p < last) { + if (p < last) { + raw_data = (u_int8_t*)p; + } + while (p < last - 3) { if (match_start_code_prefix(p)) { break; } p++; } - size = (u_int8_t*)p - raw_data; - - trace("ts+h264 parse msg finished"); - return ret; - - // nal_unit( NumBytesInNALunit ) specified in page 44. - // where f(1) specified in page 43. - int8_t _nal_unit_type = *p++; - forbidden_zero_bit = (_nal_unit_type >> 7) &0x01; - nal_ref_idc = (_nal_unit_type >> 5) &0x03; - _nal_unit_type &= 0x1f; - - nal_unit_type = (TSH264NalUnitType)_nal_unit_type; - - if (nal_unit_type == TSH264NalUnitTypePictureDelimiter) { - /** - * 7.3.2.4 Picture delimiter RBSP syntax - * pic_delimiter_rbsp(), in page 47 - */ - } else if (nal_unit_type == TSH264NalUnitTypeSequenceParameterSet) { - /** - * 7.3.2.1 Sequence parameter set RBSP syntax - * seq_parameter_set_rbsp(), in page 45 - */ - } else if (nal_unit_type == TSH264NalUnitTypePictureParameterSet) { - /** - * 7.3.2.2 Picture parameter set RBSP syntax - * pic_parameter_set_rbsp(), in page 46 - */ + if (raw_data) { + size = (u_int8_t*)p - raw_data; + if (p == last - 3) { + size = (u_int8_t*)last - raw_data; + p = last; + } } + trace("ts+h264 parse msg finished"); return ret; } @@ -1788,16 +1762,14 @@ public: return p[0] == 0x00 && p[1] == 0x00 && (p[2] == 0x00 || p[2] == 0x01); } - int32_t next_int(char* p, int bytes) + int32_t next_start_code_prefix(char* p) { - srs_assert(bytes <= sizeof(int32_t)); - int32_t value = 0; char* pp = (char*)&value; - for (int i = 0; i < bytes; i++) { - *(pp + bytes - 1 - i) = *(p + i); - } + pp[2] = p[0]; + pp[1] = p[1]; + pp[0] = p[2]; return value; } @@ -1868,6 +1840,8 @@ public: { int ret = 0; + srs_assert(p); + char* start = p; // adts_fixed_header @@ -1946,6 +1920,11 @@ int consume(TSMessage* msg) int ret = 0; char* p = msg->packet_data; + if (!p) { + trace("ts+aac+h264 ignore empty message."); + return ret; + } + char* last = msg->packet_data + msg->packet_data_size; if (!msg->is_video()) {