正在显示
1 个修改的文件
包含
188 行增加
和
34 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论