winlin

parse video/audio message

@@ -17,11 +17,13 @@ g++ -o ts_info ts_info.cpp -g -O0 -ansi @@ -17,11 +17,13 @@ g++ -o ts_info ts_info.cpp -g -O0 -ansi
17 #include <assert.h> 17 #include <assert.h>
18 18
19 #include <vector> 19 #include <vector>
  20 +#include <map>
20 21
21 #define trace(msg, ...) printf(msg"\n", ##__VA_ARGS__); 22 #define trace(msg, ...) printf(msg"\n", ##__VA_ARGS__);
22 #define srs_freep(p) delete p; p = NULL 23 #define srs_freep(p) delete p; p = NULL
23 #define srs_freepa(p) delete[] p; p = NULL 24 #define srs_freepa(p) delete[] p; p = NULL
24 #define srs_assert(p) assert(p) 25 #define srs_assert(p) assert(p)
  26 +#define srs_min(a, b) ((a)<(b)? (a):(b))
25 27
26 #endif 28 #endif
27 /** 29 /**
@@ -111,6 +113,7 @@ class TSPayloadPAT; @@ -111,6 +113,7 @@ class TSPayloadPAT;
111 class TSPayloadPMT; 113 class TSPayloadPMT;
112 class TSPayloadPES; 114 class TSPayloadPES;
113 class TSContext; 115 class TSContext;
  116 +class TSMessage;
114 117
115 // TSPacket declares. 118 // TSPacket declares.
116 class TSPacket 119 class TSPacket
@@ -122,7 +125,7 @@ public: @@ -122,7 +125,7 @@ public:
122 125
123 TSPacket(); 126 TSPacket();
124 virtual ~TSPacket(); 127 virtual ~TSPacket();
125 - int demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 128 + int demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
126 int finish(); 129 int finish();
127 }; 130 };
128 131
@@ -145,7 +148,7 @@ public: @@ -145,7 +148,7 @@ public:
145 TSHeader(); 148 TSHeader();
146 virtual ~TSHeader(); 149 virtual ~TSHeader();
147 int get_size(); 150 int get_size();
148 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 151 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
149 }; 152 };
150 153
151 // variant ts packet adation field. page 40. 154 // variant ts packet adation field. page 40.
@@ -213,7 +216,7 @@ public: @@ -213,7 +216,7 @@ public:
213 TSAdaptionField(); 216 TSAdaptionField();
214 virtual ~TSAdaptionField(); 217 virtual ~TSAdaptionField();
215 int get_size(); 218 int get_size();
216 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 219 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
217 }; 220 };
218 221
219 // variant ts packet payload. 222 // variant ts packet payload.
@@ -247,7 +250,7 @@ public: @@ -247,7 +250,7 @@ public:
247 TSPayload(); 250 TSPayload();
248 virtual ~TSPayload();; 251 virtual ~TSPayload();;
249 void read_pointer_field(TSPacket* pkt, u_int8_t*& p); 252 void read_pointer_field(TSPacket* pkt, u_int8_t*& p);
250 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 253 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
251 }; 254 };
252 255
253 256
@@ -294,7 +297,7 @@ public: @@ -294,7 +297,7 @@ public:
294 297
295 TSPayloadPAT(); 298 TSPayloadPAT();
296 virtual ~TSPayloadPAT(); 299 virtual ~TSPayloadPAT();
297 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 300 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
298 }; 301 };
299 302
300 class TSPMTESInfo 303 class TSPMTESInfo
@@ -364,7 +367,7 @@ public: @@ -364,7 +367,7 @@ public:
364 367
365 TSPayloadPMT(); 368 TSPayloadPMT();
366 virtual ~TSPayloadPMT(); 369 virtual ~TSPayloadPMT();
367 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 370 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
368 }; 371 };
369 372
370 /** 373 /**
@@ -479,13 +482,11 @@ public: @@ -479,13 +482,11 @@ public:
479 int stuffing_size; 482 int stuffing_size;
480 char* stuffing_byte; 483 char* stuffing_byte;
481 484
482 - char* PES_packet_data_byte; //[PES_packet_length] bytes  
483 -  
484 TSPayloadPES(); 485 TSPayloadPES();
485 virtual ~TSPayloadPES(); 486 virtual ~TSPayloadPES();
486 int64_t decode_33bits_int(u_int8_t*& p, int64_t& temp); 487 int64_t decode_33bits_int(u_int8_t*& p, int64_t& temp);
487 int64_t decode_33bits_int(int64_t& temp); 488 int64_t decode_33bits_int(int64_t& temp);
488 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 489 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
489 }; 490 };
490 491
491 class TSPayloadReserved 492 class TSPayloadReserved
@@ -496,7 +497,7 @@ public: @@ -496,7 +497,7 @@ public:
496 497
497 TSPayloadReserved(); 498 TSPayloadReserved();
498 virtual ~TSPayloadReserved(); 499 virtual ~TSPayloadReserved();
499 - int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); 500 + int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg);
500 }; 501 };
501 502
502 struct TSPid 503 struct TSPid
@@ -505,6 +506,48 @@ struct TSPid @@ -505,6 +506,48 @@ struct TSPid
505 int16_t pid; 506 int16_t pid;
506 }; 507 };
507 508
  509 +/**
  510 +* logic audio/video message
  511 +*/
  512 +class TSMessage
  513 +{
  514 +public:
  515 + // 2.4.3.2 Transport Stream packet layer. page 36
  516 + // the pid of PES packet.
  517 + int16_t pid;
  518 +
  519 + // the type of pid.
  520 + TSPidType type;
  521 +
  522 + // 2.4.3.7 Semantic definition of fields in PES packet. page 49
  523 + // PES packet header size plus data size.
  524 + u_int16_t PES_packet_length; //16bits
  525 +
  526 + // the stream id.
  527 + u_int8_t stream_id;
  528 +
  529 + // 2.4.3.7 Semantic definition of fields in PES packet. page 49.
  530 + int32_t packet_start_code_prefix;
  531 +
  532 + // header size.
  533 + int packet_header_size;
  534 +
  535 + // the parsed packet size.
  536 + int parsed_packet_size;
  537 +
  538 + // total packet size.
  539 + int packet_data_size;
  540 + char* packet_data;
  541 +
  542 + TSMessage();
  543 + virtual ~TSMessage();
  544 +
  545 + void append(u_int8_t*& p, int size);
  546 + void detach(TSContext* ctx, TSMessage*& pmsg);
  547 +
  548 + bool is_video();
  549 +};
  550 +
508 // ts context 551 // ts context
509 class TSContext 552 class TSContext
510 { 553 {
@@ -514,12 +557,16 @@ public: @@ -514,12 +557,16 @@ public:
514 */ 557 */
515 int pid_size; 558 int pid_size;
516 TSPid* pids; 559 TSPid* pids;
  560 + std::map<int16_t, TSMessage*> msgs;
517 561
518 TSContext(); 562 TSContext();
519 virtual ~TSContext(); 563 virtual ~TSContext();
520 bool exists(int16_t pid); 564 bool exists(int16_t pid);
521 TSPid* get(int16_t pid); 565 TSPid* get(int16_t pid);
522 void push(TSPidType type, int16_t pid); 566 void push(TSPidType type, int16_t pid);
  567 +
  568 + TSMessage* get_msg(int16_t pid);
  569 + void detach(TSMessage* msg);
523 }; 570 };
524 571
525 TSContext::TSContext() 572 TSContext::TSContext()
@@ -531,6 +578,13 @@ TSContext::TSContext() @@ -531,6 +578,13 @@ TSContext::TSContext()
531 TSContext::~TSContext() 578 TSContext::~TSContext()
532 { 579 {
533 srs_freepa(pids); 580 srs_freepa(pids);
  581 +
  582 + std::map<int16_t, TSMessage*>::iterator it;
  583 + for (it = msgs.begin(); it != msgs.end(); ++it) {
  584 + TSMessage* msg = it->second;
  585 + srs_freep(msg);
  586 + }
  587 + msgs.clear();
534 } 588 }
535 589
536 bool TSContext::exists(int16_t pid) 590 bool TSContext::exists(int16_t pid)
@@ -571,6 +625,62 @@ void TSContext::push(TSPidType type, int16_t pid) @@ -571,6 +625,62 @@ void TSContext::push(TSPidType type, int16_t pid)
571 pids = p; 625 pids = p;
572 } 626 }
573 627
  628 +TSMessage* TSContext::get_msg(int16_t pid)
  629 +{
  630 + if (msgs[pid] == NULL) {
  631 + TSMessage* msg = new TSMessage();
  632 + msg->pid = pid;
  633 + msgs[pid] = msg;
  634 + }
  635 +
  636 + return msgs[pid];
  637 +}
  638 +
  639 +void TSContext::detach(TSMessage* msg)
  640 +{
  641 + msgs[msg->pid] = NULL;
  642 +}
  643 +
  644 +TSMessage::TSMessage()
  645 +{
  646 + pid = 0;
  647 + type = TSPidTypeReserved;
  648 + stream_id = 0;
  649 + packet_start_code_prefix = 0;
  650 + PES_packet_length = 0;
  651 + packet_header_size = 0;
  652 + parsed_packet_size = 0;
  653 + packet_data_size = 0;
  654 + packet_data = NULL;
  655 +}
  656 +
  657 +TSMessage::~TSMessage()
  658 +{
  659 + srs_freepa(packet_data);
  660 +}
  661 +
  662 +void TSMessage::append(u_int8_t*& p, int size)
  663 +{
  664 + if (size > 0) {
  665 + memcpy(packet_data + parsed_packet_size, p, size);
  666 + p += size;
  667 + parsed_packet_size += size;
  668 + }
  669 +}
  670 +
  671 +void TSMessage::detach(TSContext* ctx, TSMessage*& pmsg)
  672 +{
  673 + if (parsed_packet_size >= packet_data_size) {
  674 + ctx->detach(this);
  675 + pmsg = this;
  676 + }
  677 +}
  678 +
  679 +bool TSMessage::is_video()
  680 +{
  681 + return type == TSPidTypeVideo;
  682 +}
  683 +
574 TSAdaptionField::TSAdaptionField() 684 TSAdaptionField::TSAdaptionField()
575 { 685 {
576 adaption_field_length = 0; 686 adaption_field_length = 0;
@@ -620,7 +730,7 @@ int TSAdaptionField::get_size() @@ -620,7 +730,7 @@ int TSAdaptionField::get_size()
620 return __user_size; 730 return __user_size;
621 } 731 }
622 732
623 -int TSAdaptionField::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 733 +int TSAdaptionField::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
624 { 734 {
625 int ret = 0; 735 int ret = 0;
626 736
@@ -765,7 +875,7 @@ TSPayloadReserved::~TSPayloadReserved() @@ -765,7 +875,7 @@ TSPayloadReserved::~TSPayloadReserved()
765 srs_freepa(bytes); 875 srs_freepa(bytes);
766 } 876 }
767 877
768 -int TSPayloadReserved::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 878 +int TSPayloadReserved::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
769 { 879 {
770 int ret = 0; 880 int ret = 0;
771 881
@@ -802,7 +912,7 @@ TSPayloadPAT::~TSPayloadPAT() @@ -802,7 +912,7 @@ TSPayloadPAT::~TSPayloadPAT()
802 srs_freepa(programs); 912 srs_freepa(programs);
803 } 913 }
804 914
805 -int TSPayloadPAT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 915 +int TSPayloadPAT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
806 { 916 {
807 int ret = 0; 917 int ret = 0;
808 918
@@ -895,7 +1005,7 @@ TSPayloadPMT::~TSPayloadPMT() @@ -895,7 +1005,7 @@ TSPayloadPMT::~TSPayloadPMT()
895 ES_info.clear(); 1005 ES_info.clear();
896 } 1006 }
897 1007
898 -int TSPayloadPMT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 1008 +int TSPayloadPMT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
899 { 1009 {
900 int ret = 0; 1010 int ret = 0;
901 1011
@@ -1034,7 +1144,6 @@ TSPayloadPES::TSPayloadPES() @@ -1034,7 +1144,6 @@ TSPayloadPES::TSPayloadPES()
1034 PES_extension_field = NULL; 1144 PES_extension_field = NULL;
1035 stuffing_size = 0; 1145 stuffing_size = 0;
1036 stuffing_byte = NULL; 1146 stuffing_byte = NULL;
1037 - PES_packet_data_byte = NULL;  
1038 } 1147 }
1039 1148
1040 TSPayloadPES::~TSPayloadPES() 1149 TSPayloadPES::~TSPayloadPES()
@@ -1043,7 +1152,6 @@ TSPayloadPES::~TSPayloadPES() @@ -1043,7 +1152,6 @@ TSPayloadPES::~TSPayloadPES()
1043 srs_freepa(pack_field); 1152 srs_freepa(pack_field);
1044 srs_freepa(PES_extension_field); 1153 srs_freepa(PES_extension_field);
1045 srs_freepa(stuffing_byte); 1154 srs_freepa(stuffing_byte);
1046 - srs_freepa(PES_packet_data_byte);  
1047 } 1155 }
1048 1156
1049 int64_t TSPayloadPES::decode_33bits_int(u_int8_t*& p, int64_t& temp) 1157 int64_t TSPayloadPES::decode_33bits_int(u_int8_t*& p, int64_t& temp)
@@ -1080,7 +1188,7 @@ int64_t TSPayloadPES::decode_33bits_int(int64_t& temp) @@ -1080,7 +1188,7 @@ int64_t TSPayloadPES::decode_33bits_int(int64_t& temp)
1080 return ret; 1188 return ret;
1081 } 1189 }
1082 1190
1083 -int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 1191 +int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
1084 { 1192 {
1085 int ret = 0; 1193 int ret = 0;
1086 1194
@@ -1096,6 +1204,7 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t @@ -1096,6 +1204,7 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t
1096 pp = (char*)&PES_packet_length; 1204 pp = (char*)&PES_packet_length;
1097 pp[1] = *p++; 1205 pp[1] = *p++;
1098 pp[0] = *p++; 1206 pp[0] = *p++;
  1207 + u_int8_t* pos_packet = p;
1099 1208
1100 if (stream_id != PES_program_stream_map 1209 if (stream_id != PES_program_stream_map
1101 && stream_id != PES_padding_stream 1210 && stream_id != PES_padding_stream
@@ -1126,7 +1235,7 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t @@ -1126,7 +1235,7 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t
1126 PES_extension_flag &= 0x01; 1235 PES_extension_flag &= 0x01;
1127 1236
1128 PES_header_data_length = *p++; 1237 PES_header_data_length = *p++;
1129 - u_int8_t* pos = p; 1238 + u_int8_t* pos_header = p;
1130 1239
1131 int64_t temp = 0; 1240 int64_t temp = 0;
1132 if (PTS_DTS_flags == 0x2) { 1241 if (PTS_DTS_flags == 0x2) {
@@ -1252,15 +1361,49 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t @@ -1252,15 +1361,49 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t
1252 } 1361 }
1253 1362
1254 // stuffing_byte 1363 // stuffing_byte
1255 - int stuffing_size = PES_header_data_length - (p - pos); 1364 + int stuffing_size = PES_header_data_length - (p - pos_header);
1256 if (stuffing_size > 0) { 1365 if (stuffing_size > 0) {
1257 stuffing_byte = new char[stuffing_size]; 1366 stuffing_byte = new char[stuffing_size];
1258 memcpy(stuffing_byte, p, stuffing_size); 1367 memcpy(stuffing_byte, p, stuffing_size);
1259 p += stuffing_size; 1368 p += stuffing_size;
1260 } 1369 }
1261 1370
  1371 + // get the pid.
  1372 + TSPid* pid = ctx->get(pkt->header->pid);
  1373 + if (!pid) {
  1374 + trace("ts+pes pid: %d type is invalid.", pkt->header->pid);
  1375 + }
  1376 +
  1377 + // get the message to build from the chunks(PES packets).
  1378 + TSMessage* msg = ctx->get_msg(pid->pid);
  1379 +
  1380 + msg->type = pid->type;
  1381 + msg->stream_id = stream_id;
  1382 + msg->packet_start_code_prefix = packet_start_code_prefix;
  1383 +
  1384 + // PES_packet_data_byte, page58.
  1385 + // the packet size contains the header size.
  1386 + // The number of PES_packet_data_bytes, N, is specified by the
  1387 + // PES_packet_length field. N shall be equal to the value
  1388 + // indicated in the PES_packet_length minus the number of bytes
  1389 + // between the last byte of the PES_packet_length field and the
  1390 + // first PES_packet_data_byte.
  1391 + msg->PES_packet_length = PES_packet_length;
  1392 + msg->packet_header_size = p - pos_packet;
  1393 + msg->packet_data_size = PES_packet_length - msg->packet_header_size;
  1394 +
  1395 + if (msg->packet_data_size > 0) {
  1396 + msg->packet_data = new char[msg->packet_data_size];
  1397 + }
  1398 +
1262 // PES_packet_data_byte 1399 // PES_packet_data_byte
1263 - PES_packet_data_byte = new char[PES_packet_length]; 1400 + int size = srs_min(msg->packet_data_size, last - p);
  1401 + msg->append(p, size);
  1402 +
  1403 + msg->detach(ctx, pmsg);
  1404 +
  1405 + trace("ts+pes stream_id: %d size: %d pts: %"PRId64" dts: %"PRId64" packet_size: %d parsed_size: %d",
  1406 + stream_id, PES_packet_length, pts, dts, msg->packet_data_size, msg->parsed_packet_size);
1264 } else if (stream_id == PES_program_stream_map 1407 } else if (stream_id == PES_program_stream_map
1265 || stream_id == PES_private_stream_2 1408 || stream_id == PES_private_stream_2
1266 || stream_id == PES_ECM_stream 1409 || stream_id == PES_ECM_stream
@@ -1278,9 +1421,6 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t @@ -1278,9 +1421,6 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t
1278 // } 1421 // }
1279 } 1422 }
1280 1423
1281 - trace("ts+pes stream_id: %d size: %d pts: %"PRId64" dts: %"PRId64"",  
1282 - stream_id, PES_packet_length, pts, dts);  
1283 -  
1284 return ret; 1424 return ret;
1285 } 1425 }
1286 1426
@@ -1317,7 +1457,7 @@ void TSPayload::read_pointer_field(TSPacket* pkt, u_int8_t*& p) @@ -1317,7 +1457,7 @@ void TSPayload::read_pointer_field(TSPacket* pkt, u_int8_t*& p)
1317 } 1457 }
1318 } 1458 }
1319 1459
1320 -int TSPayload::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 1460 +int TSPayload::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
1321 { 1461 {
1322 int ret = 0; 1462 int ret = 0;
1323 1463
@@ -1326,7 +1466,7 @@ int TSPayload::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* l @@ -1326,7 +1466,7 @@ int TSPayload::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* l
1326 1466
1327 type = TSPidTypePAT; 1467 type = TSPidTypePAT;
1328 pat = new TSPayloadPAT(); 1468 pat = new TSPayloadPAT();
1329 - return pat->demux(ctx, pkt, start, last, p); 1469 + return pat->demux(ctx, pkt, start, last, p, pmsg);
1330 } 1470 }
1331 1471
1332 TSPid* pid = ctx->get(pkt->header->pid); 1472 TSPid* pid = ctx->get(pkt->header->pid);
@@ -1335,18 +1475,28 @@ int TSPayload::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* l @@ -1335,18 +1475,28 @@ int TSPayload::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* l
1335 1475
1336 type = pid->type; 1476 type = pid->type;
1337 pmt = new TSPayloadPMT(); 1477 pmt = new TSPayloadPMT();
1338 - return pmt->demux(ctx, pkt, start, last, p); 1478 + return pmt->demux(ctx, pkt, start, last, p, pmsg);
1339 } 1479 }
1340 if (pid && (pid->type == TSPidTypeVideo || pid->type == TSPidTypeAudio)) { 1480 if (pid && (pid->type == TSPidTypeVideo || pid->type == TSPidTypeAudio)) {
  1481 + if (!pkt->header->payload_unit_start_indicator) {
  1482 + TSMessage* msg = ctx->get_msg(pkt->header->pid);
  1483 + if (msg->packet_start_code_prefix != 0x01) {
  1484 + trace("ts+pes decode continous packet error, msg is empty.");
  1485 + return -1;
  1486 + }
  1487 + msg->append(p, last - p);
  1488 + msg->detach(ctx, pmsg);
  1489 + return ret;
  1490 + }
1341 type = pid->type; 1491 type = pid->type;
1342 pes = new TSPayloadPES(); 1492 pes = new TSPayloadPES();
1343 - return pes->demux(ctx, pkt, start, last, p); 1493 + return pes->demux(ctx, pkt, start, last, p, pmsg);
1344 } 1494 }
1345 1495
1346 // not parsed bytes. 1496 // not parsed bytes.
1347 type = TSPidTypeReserved; 1497 type = TSPidTypeReserved;
1348 reserved = new TSPayloadReserved(); 1498 reserved = new TSPayloadReserved();
1349 - if ((ret = reserved->demux(ctx, pkt, start, last, p)) != 0) { 1499 + if ((ret = reserved->demux(ctx, pkt, start, last, p, pmsg)) != 0) {
1350 return ret; 1500 return ret;
1351 } 1501 }
1352 1502
@@ -1367,16 +1517,16 @@ TSPacket::~TSPacket() @@ -1367,16 +1517,16 @@ TSPacket::~TSPacket()
1367 srs_freep(payload); 1517 srs_freep(payload);
1368 } 1518 }
1369 1519
1370 -int TSPacket::demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 1520 +int TSPacket::demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
1371 { 1521 {
1372 int ret = 0; 1522 int ret = 0;
1373 1523
1374 - if ((ret = header->demux(ctx, this, start, last, p)) != 0) { 1524 + if ((ret = header->demux(ctx, this, start, last, p, pmsg)) != 0) {
1375 return ret; 1525 return ret;
1376 } 1526 }
1377 1527
1378 if (header->adaption_field_control == AFC_ADAPTION_ONLY || header->adaption_field_control == AFC_BOTH) { 1528 if (header->adaption_field_control == AFC_ADAPTION_ONLY || header->adaption_field_control == AFC_BOTH) {
1379 - if ((ret = adaption_field->demux(ctx, this, start, last, p)) != 0) { 1529 + if ((ret = adaption_field->demux(ctx, this, start, last, p, pmsg)) != 0) {
1380 trace("ts+header af(adaption field) decode error. ret=%d", ret); 1530 trace("ts+header af(adaption field) decode error. ret=%d", ret);
1381 return ret; 1531 return ret;
1382 } 1532 }
@@ -1387,7 +1537,7 @@ int TSPacket::demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*& @@ -1387,7 +1537,7 @@ int TSPacket::demux(TSContext* ctx, u_int8_t* start, u_int8_t* last, u_int8_t*&
1387 payload->size = TS_PACKET_SIZE - header->get_size() - adaption_field->get_size(); 1537 payload->size = TS_PACKET_SIZE - header->get_size() - adaption_field->get_size();
1388 1538
1389 if (header->adaption_field_control == AFC_PAYLOAD_ONLY || header->adaption_field_control == AFC_BOTH) { 1539 if (header->adaption_field_control == AFC_PAYLOAD_ONLY || header->adaption_field_control == AFC_BOTH) {
1390 - if ((ret = payload->demux(ctx, this, start, last, p)) != 0) { 1540 + if ((ret = payload->demux(ctx, this, start, last, p, pmsg)) != 0) {
1391 trace("ts+header payload decode error. ret=%d", ret); 1541 trace("ts+header payload decode error. ret=%d", ret);
1392 return ret; 1542 return ret;
1393 } 1543 }
@@ -1427,7 +1577,7 @@ int TSHeader::get_size() @@ -1427,7 +1577,7 @@ int TSHeader::get_size()
1427 return 4; 1577 return 4;
1428 } 1578 }
1429 1579
1430 -int TSHeader::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) 1580 +int TSHeader::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p, TSMessage*& pmsg)
1431 { 1581 {
1432 int ret = 0; 1582 int ret = 0;
1433 1583
@@ -1494,11 +1644,15 @@ int main(int /*argc*/, char** /*argv*/) @@ -1494,11 +1644,15 @@ int main(int /*argc*/, char** /*argv*/)
1494 u_int8_t* last = ts_packet + TS_PACKET_SIZE; 1644 u_int8_t* last = ts_packet + TS_PACKET_SIZE;
1495 1645
1496 TSPacket pkt; 1646 TSPacket pkt;
1497 - if ((ret = pkt.demux(&ctx, start, last, p)) != 0) { 1647 + TSMessage* msg = NULL;
  1648 + if ((ret = pkt.demux(&ctx, start, last, p, msg)) != 0) {
1498 trace("demuxer+read decode ts packet error. ret=%d", ret); 1649 trace("demuxer+read decode ts packet error. ret=%d", ret);
1499 return ret; 1650 return ret;
1500 } 1651 }
1501 1652
  1653 + // TODO: process it.
  1654 + srs_freep(msg);
  1655 +
1502 offset += nread; 1656 offset += nread;
1503 } 1657 }
1504 1658