From 027d34bbd304ce79b48603fa80b2f392d8668306 Mon Sep 17 00:00:00 2001 From: xiaozhihong Date: Fri, 13 Mar 2020 20:34:40 +0800 Subject: [PATCH] add rtp shared packet --- trunk/configure | 2 +- trunk/src/app/srs_app_rtc_conn.cpp | 7 ++-- trunk/src/app/srs_app_rtp.cpp | 51 ++++++++++----------------- trunk/src/app/srs_app_rtp.hpp | 7 ++-- trunk/src/app/srs_app_source.cpp | 2 +- trunk/src/kernel/srs_kernel_error.hpp | 1 + trunk/src/kernel/srs_kernel_flv.cpp | 39 +++++++++----------- trunk/src/kernel/srs_kernel_flv.hpp | 11 +++--- 8 files changed, 51 insertions(+), 69 deletions(-) diff --git a/trunk/configure b/trunk/configure index 495400bb5..211bdbdff 100755 --- a/trunk/configure +++ b/trunk/configure @@ -204,7 +204,7 @@ MODULE_ID="KERNEL" MODULE_DEPENDS=("CORE") ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSSLRoot}) MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_buffer" - "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_io" + "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_rtp" "srs_kernel_codec" "srs_kernel_io" "srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts" "srs_kernel_stream" "srs_kernel_balance" "srs_kernel_mp4" "srs_kernel_file") KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 07d0fc900..802e911c8 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -37,6 +37,7 @@ using namespace std; #include #include +#include #include #include #include @@ -682,12 +683,12 @@ void SrsRtcSenderThread::send_and_free_messages(SrsSharedPtrMessage** msgs, int for (int i = 0; i < nb_msgs; i++) { SrsSharedPtrMessage* msg = msgs[i]; - for (int i = 0; i < msg->nb_rtp_fragments; ++i) { + for (int i = 0; i < msg->rtp_packets.size(); ++i) { if (rtc_session->dtls_session) { char protected_buf[kRtpPacketSize]; - int nb_protected_buf = msg->rtp_fragments[i].size; + int nb_protected_buf = msg->rtp_packets[i]->size; - rtc_session->dtls_session->protect_rtp(protected_buf, msg->rtp_fragments[i].bytes, nb_protected_buf); + rtc_session->dtls_session->protect_rtp(protected_buf, msg->rtp_packets[i]->payload, nb_protected_buf); udp_mux_skt->sendto(protected_buf, nb_protected_buf, 0); } } diff --git a/trunk/src/app/srs_app_rtp.cpp b/trunk/src/app/srs_app_rtp.cpp index f3981babe..ee88f419d 100644 --- a/trunk/src/app/srs_app_rtp.cpp +++ b/trunk/src/app/srs_app_rtp.cpp @@ -38,6 +38,7 @@ using namespace std; #include #include #include +#include #include #include #include @@ -68,7 +69,7 @@ srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsF pps.assign(format->vcodec->pictureParameterSetNALUnit.data(), format->vcodec->pictureParameterSetNALUnit.size()); } - vector rtp_packet_vec; + vector rtp_packet_vec; for (int i = 0; i < format->video->nb_samples; ++i) { SrsSample sample = format->video->samples[i]; @@ -95,17 +96,12 @@ srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsF #endif } - SrsSample* rtp_samples = new SrsSample[rtp_packet_vec.size()]; - for (int i = 0; i < rtp_packet_vec.size(); ++i) { - rtp_samples[i] = rtp_packet_vec[i]; - } - - shared_frame->set_rtp_fragments(rtp_samples, rtp_packet_vec.size()); + shared_frame->set_rtp_packets(rtp_packet_vec); return err; } -srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, vector& rtp_packet_vec) +srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, vector& rtp_packet_vec) { srs_error_t err = srs_success; @@ -136,7 +132,7 @@ srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsForma stream->write_1bytes(kH264PayloadType); } // sequence - stream->write_2bytes(sequence++); + stream->write_2bytes(sequence); // timestamp stream->write_4bytes(int32_t(shared_frame->timestamp * 90)); // ssrc @@ -159,15 +155,14 @@ srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsForma nb_left -= packet_size; - SrsSample rtp_packet; - rtp_packet.bytes = stream->data(); - rtp_packet.size = stream->pos(); + SrsRtpSharedPacket* rtp_shared_pkt = new SrsRtpSharedPacket(); + rtp_shared_pkt->create((shared_frame->timestamp * 90), sequence++, kVideoSSRC, kH264PayloadType, stream->data(), stream->pos()); - rtp_packet_vec.push_back(rtp_packet); + rtp_packet_vec.push_back(rtp_shared_pkt); } } -srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, vector& rtp_packet_vec) +srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, vector& rtp_packet_vec) { srs_error_t err = srs_success; @@ -187,7 +182,7 @@ srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, S // marker payloadtype stream->write_1bytes(kMarker | kH264PayloadType); // sequenct - stream->write_2bytes(sequence++); + stream->write_2bytes(sequence); // timestamp stream->write_4bytes(int32_t(shared_frame->timestamp * 90)); // ssrc @@ -195,16 +190,15 @@ srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, S stream->write_bytes(sample->bytes, sample->size); - SrsSample rtp_packet; - rtp_packet.bytes = stream->data(); - rtp_packet.size = stream->pos(); + SrsRtpSharedPacket* rtp_shared_pkt = new SrsRtpSharedPacket(); + rtp_shared_pkt->create((shared_frame->timestamp * 90), sequence++, kVideoSSRC, kH264PayloadType, stream->data(), stream->pos()); - rtp_packet_vec.push_back(rtp_packet); + rtp_packet_vec.push_back(rtp_shared_pkt); return err; } -srs_error_t SrsRtpMuxer::packet_stap_a(const string &sps, const string& pps, SrsSharedPtrMessage* shared_frame, vector& rtp_packet_vec) +srs_error_t SrsRtpMuxer::packet_stap_a(const string &sps, const string& pps, SrsSharedPtrMessage* shared_frame, vector& rtp_packet_vec) { srs_error_t err = srs_success; @@ -220,7 +214,7 @@ srs_error_t SrsRtpMuxer::packet_stap_a(const string &sps, const string& pps, Srs // marker payloadtype stream->write_1bytes(kMarker | kH264PayloadType); // sequenct - stream->write_2bytes(sequence++); + stream->write_2bytes(sequence); // timestamp stream->write_4bytes(int32_t(shared_frame->timestamp * 90)); // ssrc @@ -237,11 +231,10 @@ srs_error_t SrsRtpMuxer::packet_stap_a(const string &sps, const string& pps, Srs stream->write_2bytes(pps.size()); stream->write_bytes((char*)pps.data(), pps.size()); - SrsSample rtp_packet; - rtp_packet.bytes = stream->data(); - rtp_packet.size = stream->pos(); + SrsRtpSharedPacket* rtp_shared_pkt = new SrsRtpSharedPacket(); + rtp_shared_pkt->create((shared_frame->timestamp * 90), sequence++, kVideoSSRC, kH264PayloadType, stream->data(), stream->pos()); - rtp_packet_vec.push_back(rtp_packet); + rtp_packet_vec.push_back(rtp_shared_pkt); return err; } @@ -336,9 +329,6 @@ srs_error_t SrsRtp::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma // update the hls time, for hls_dispose. last_update_time = srs_get_system_time(); - SrsSharedPtrMessage* audio = shared_audio->copy(); - SrsAutoFree(SrsSharedPtrMessage, audio); - // ts support audio codec: aac/mp3 SrsAudioCodecId acodec = format->acodec->id; if (acodec != SrsAudioCodecIdAAC && acodec != SrsAudioCodecIdMP3) { @@ -369,11 +359,8 @@ srs_error_t SrsRtp::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* forma // update the hls time, for hls_dispose. last_update_time = srs_get_system_time(); - SrsSharedPtrMessage* video = shared_video->copy(); - SrsAutoFree(SrsSharedPtrMessage, video); - // ignore info frame, // @see https://github.com/ossrs/srs/issues/288#issuecomment-69863909 srs_assert(format->video); - return rtp_h264_muxer->frame_to_packet(video, format); + return rtp_h264_muxer->frame_to_packet(shared_video, format); } diff --git a/trunk/src/app/srs_app_rtp.hpp b/trunk/src/app/srs_app_rtp.hpp index 9000fd830..2a23440cd 100644 --- a/trunk/src/app/srs_app_rtp.hpp +++ b/trunk/src/app/srs_app_rtp.hpp @@ -33,6 +33,7 @@ class SrsFormat; class SrsSample; class SrsSharedPtrMessage; +class SrsRtpSharedPacket; class SrsRequest; class SrsOriginHub; @@ -65,9 +66,9 @@ public: public: srs_error_t frame_to_packet(SrsSharedPtrMessage* shared_video, SrsFormat* format); private: - srs_error_t packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, std::vector& rtp_packet_vec); - srs_error_t packet_single_nalu(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, std::vector& rtp_packet_vec); - srs_error_t packet_stap_a(const std::string &sps, const std::string& pps, SrsSharedPtrMessage* shared_frame, std::vector& rtp_packet_vec); + srs_error_t packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, std::vector& rtp_packet_vec); + srs_error_t packet_single_nalu(SrsSharedPtrMessage* shared_frame, SrsFormat* format, SrsSample* sample, std::vector& rtp_packet_vec); + srs_error_t packet_stap_a(const std::string &sps, const std::string& pps, SrsSharedPtrMessage* shared_frame, std::vector& rtp_packet_vec); }; class SrsRtp diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 1452bf93d..5f1de1149 100755 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -2300,7 +2300,7 @@ srs_error_t SrsSource::on_video_imp(SrsSharedPtrMessage* msg) if ((err = hub->on_video(msg, is_sequence_header)) != srs_success) { return srs_error_wrap(err, "hub consume video"); } - + // copy to all consumer if (!drop_for_reduce) { for (int i = 0; i < (int)consumers.size(); i++) { diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 372a0196a..264903e45 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -322,6 +322,7 @@ #define ERROR_BASE64_DECODE 4039 #define ERROR_HTTP_STREAM_EOF 4040 #define ERROR_RTC_PORT 4041 +#define ERROR_RTP_PACKET_CREATE 4042 /////////////////////////////////////////////////////// // HTTP API error. diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index f2f773049..5996b60b5 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -36,6 +36,7 @@ using namespace std; #include #include #include +#include #include #include #include @@ -203,8 +204,6 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload() { payload = NULL; size = 0; - rtp_fragments = NULL; - nb_rtp_fragments = 0; shared_count = 0; } @@ -214,17 +213,9 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload() srs_memory_unwatch(payload); #endif srs_freepa(payload); - - for (int i = 0; i < nb_rtp_fragments; ++i) { - srs_freepa(rtp_fragments[i].bytes); - } - - if (rtp_fragments != NULL && nb_rtp_fragments > 0) { - srs_freepa(rtp_fragments); - } } -SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL), rtp_fragments(NULL), nb_rtp_fragments(0) +SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL) { ptr = NULL; } @@ -238,6 +229,10 @@ SrsSharedPtrMessage::~SrsSharedPtrMessage() ptr->shared_count--; } } + + for (int i = 0; i < rtp_packets.size(); ++i) { + srs_freep(rtp_packets[i]); + } } srs_error_t SrsSharedPtrMessage::create(SrsCommonMessage* msg) @@ -315,15 +310,6 @@ bool SrsSharedPtrMessage::check(int stream_id) return false; } -void SrsSharedPtrMessage::set_rtp_fragments(SrsSample* samples, int nb_samples) -{ - ptr->rtp_fragments = samples; - ptr->nb_rtp_fragments = nb_samples; - - rtp_fragments = samples; - nb_rtp_fragments = nb_samples; -} - bool SrsSharedPtrMessage::is_av() { return ptr->header.message_type == RTMP_MSG_AudioMessage @@ -364,12 +350,19 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy() copy->stream_id = stream_id; copy->payload = ptr->payload; copy->size = ptr->size; - copy->rtp_fragments = ptr->rtp_fragments; - copy->nb_rtp_fragments = ptr->nb_rtp_fragments; - + + for (int i = 0; i < rtp_packets.size(); ++i) { + copy->rtp_packets.push_back(rtp_packets[i]->copy()); + } + return copy; } +void SrsSharedPtrMessage::set_rtp_packets(const std::vector& pkts) +{ + rtp_packets = pkts; +} + SrsFlvTransmuxer::SrsFlvTransmuxer() { writer = NULL; diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index fe8fd9aa0..3bf3afc69 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -27,6 +27,7 @@ #include #include +#include // For srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 @@ -39,6 +40,7 @@ class ISrsReader; class SrsFileReader; class SrsPacket; class SrsSample; +class SrsRtpSharedPacket; #define SRS_FLV_TAG_HEADER_SIZE 11 #define SRS_FLV_PREVIOUS_TAG_SIZE 4 @@ -287,8 +289,7 @@ public: // video/audio packet use raw bytes, no video/audio packet. char* payload; - SrsSample* rtp_fragments; - int nb_rtp_fragments; + std::vector rtp_packets; private: class SrsSharedPtrPayload { @@ -302,8 +303,6 @@ private: int size; // The reference count int shared_count; - SrsSample* rtp_fragments; - int nb_rtp_fragments; public: SrsSharedPtrPayload(); virtual ~SrsSharedPtrPayload(); @@ -333,8 +332,6 @@ public: // check perfer cid and stream id. // @return whether stream id already set. virtual bool check(int stream_id); - - virtual void set_rtp_fragments(SrsSample* samples, int nb_samples); public: virtual bool is_av(); virtual bool is_audio(); @@ -347,6 +344,8 @@ public: // copy current shared ptr message, use ref-count. // @remark, assert object is created. virtual SrsSharedPtrMessage* copy(); +public: + virtual void set_rtp_packets(const std::vector& pkts); }; // Transmux RTMP packets to FLV stream.