From 1d41b6499f6a280c2d1879393030aee457ba493b Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 20 Mar 2025 23:22:04 +0800 Subject: [PATCH] [fix] audio and data rtp packets do not be sent by pacer module --- src/transport/channel/audio_channel_send.cpp | 3 +- src/transport/channel/data_channel_send.cpp | 3 +- src/transport/channel/rtp_audio_sender.cpp | 2 +- src/transport/channel/rtp_audio_sender.h | 2 +- src/transport/channel/rtp_data_sender.cpp | 2 +- src/transport/channel/rtp_data_sender.h | 2 +- src/transport/channel/rtp_video_receiver.cpp | 57 +++---------------- src/transport/channel/rtp_video_receiver.h | 2 + .../packet_sender/packet_sender_imp.h | 2 +- 9 files changed, 19 insertions(+), 56 deletions(-) diff --git a/src/transport/channel/audio_channel_send.cpp b/src/transport/channel/audio_channel_send.cpp index 558e31d..06c8033 100644 --- a/src/transport/channel/audio_channel_send.cpp +++ b/src/transport/channel/audio_channel_send.cpp @@ -49,7 +49,8 @@ int AudioChannelSend::SendAudio(char *data, size_t size) { if (rtp_audio_sender_ && rtp_packetizer_) { std::vector> rtp_packets = rtp_packetizer_->Build((uint8_t *)data, (uint32_t)size, 0, true); - packet_sender_->EnqueueRtpPacket(rtp_packets, 0); + // packet_sender_->EnqueueRtpPacket(rtp_packets, 0); + rtp_audio_sender_->Enqueue(rtp_packets); } return 0; diff --git a/src/transport/channel/data_channel_send.cpp b/src/transport/channel/data_channel_send.cpp index 8b59a3b..66b245e 100644 --- a/src/transport/channel/data_channel_send.cpp +++ b/src/transport/channel/data_channel_send.cpp @@ -49,7 +49,8 @@ int DataChannelSend::SendData(const char *data, size_t size) { if (rtp_data_sender_ && rtp_packetizer_) { std::vector> rtp_packets = rtp_packetizer_->Build((uint8_t *)data, (uint32_t)size, 0, true); - packet_sender_->EnqueueRtpPacket(rtp_packets, 0); + // packet_sender_->EnqueueRtpPacket(rtp_packets, 0); + rtp_data_sender_->Enqueue(rtp_packets); } return 0; diff --git a/src/transport/channel/rtp_audio_sender.cpp b/src/transport/channel/rtp_audio_sender.cpp index e323c3e..a0f5e90 100644 --- a/src/transport/channel/rtp_audio_sender.cpp +++ b/src/transport/channel/rtp_audio_sender.cpp @@ -23,7 +23,7 @@ RtpAudioSender::~RtpAudioSender() { } void RtpAudioSender::Enqueue( - std::vector> rtp_packets) { + std::vector>& rtp_packets) { if (!rtp_statistics_) { rtp_statistics_ = std::make_unique(); rtp_statistics_->Start(); diff --git a/src/transport/channel/rtp_audio_sender.h b/src/transport/channel/rtp_audio_sender.h index d2c6e0f..07df804 100644 --- a/src/transport/channel/rtp_audio_sender.h +++ b/src/transport/channel/rtp_audio_sender.h @@ -24,7 +24,7 @@ class RtpAudioSender : public ThreadBase { virtual ~RtpAudioSender(); public: - void Enqueue(std::vector> rtp_packets); + void Enqueue(std::vector> &rtp_packets); void SetSendDataFunc(std::function data_send_func); uint32_t GetSsrc() { return ssrc_; } void OnReceiverReport(const ReceiverReport &receiver_report) {} diff --git a/src/transport/channel/rtp_data_sender.cpp b/src/transport/channel/rtp_data_sender.cpp index 3d92137..1739e42 100644 --- a/src/transport/channel/rtp_data_sender.cpp +++ b/src/transport/channel/rtp_data_sender.cpp @@ -23,7 +23,7 @@ RtpDataSender::~RtpDataSender() { } void RtpDataSender::Enqueue( - std::vector> rtp_packets) { + std::vector>& rtp_packets) { if (!rtp_statistics_) { rtp_statistics_ = std::make_unique(); rtp_statistics_->Start(); diff --git a/src/transport/channel/rtp_data_sender.h b/src/transport/channel/rtp_data_sender.h index bdd9f90..83bc2c0 100644 --- a/src/transport/channel/rtp_data_sender.h +++ b/src/transport/channel/rtp_data_sender.h @@ -24,7 +24,7 @@ class RtpDataSender : public ThreadBase { virtual ~RtpDataSender(); public: - void Enqueue(std::vector> rtp_packets); + void Enqueue(std::vector> &rtp_packets); void SetSendDataFunc(std::function data_send_func); uint32_t GetSsrc() { return ssrc_; } void OnReceiverReport(const ReceiverReport &receiver_report) {} diff --git a/src/transport/channel/rtp_video_receiver.cpp b/src/transport/channel/rtp_video_receiver.cpp index 0d6f0b2..34bf9b4 100644 --- a/src/transport/channel/rtp_video_receiver.cpp +++ b/src/transport/channel/rtp_video_receiver.cpp @@ -398,7 +398,6 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedFuaEndReceived( if (padding_sequence_numbers_.find(seq) == padding_sequence_numbers_.end()) { missing_sequence_numbers_[timestamp].insert(seq); - LOG_WARN("missing {}", seq); } } else if (it->second.FuAStart()) { start_seq = seq; @@ -418,53 +417,7 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedFuaEndReceived( } } - size_t complete_frame_size = 0; - int frame_fragment_count = 0; - - for (uint16_t seq = start_seq; seq <= end_seq; ++seq) { - if (padding_sequence_numbers_.find(seq) != - padding_sequence_numbers_.end()) { - padding_sequence_numbers_.erase(seq); - continue; - } - if (incomplete_h264_frame_list_.find(seq) != - incomplete_h264_frame_list_.end()) { - complete_frame_size += incomplete_h264_frame_list_[seq].PayloadSize(); - } - } - - if (!nv12_data_) { - nv12_data_ = new uint8_t[NV12_BUFFER_SIZE]; - } else if (complete_frame_size > NV12_BUFFER_SIZE) { - delete[] nv12_data_; - nv12_data_ = new uint8_t[complete_frame_size]; - } - - uint8_t* dest = nv12_data_; - for (uint16_t seq = start_seq; seq <= end_seq; ++seq) { - if (incomplete_h264_frame_list_.find(seq) != - incomplete_h264_frame_list_.end()) { - size_t payload_size = incomplete_h264_frame_list_[seq].PayloadSize(); - memcpy(dest, incomplete_h264_frame_list_[seq].Payload(), payload_size); - dest += payload_size; - incomplete_h264_frame_list_.erase(seq); - frame_fragment_count++; - } - } - - ReceivedFrame received_frame(nv12_data_, complete_frame_size); - received_frame.SetReceivedTimestamp(clock_->CurrentTime().us()); - received_frame.SetCapturedTimestamp( - (static_cast(timestamp) / rtp::kMsToRtpTimestamp - - delta_ntp_internal_ms_) * - 1000); - - fua_end_sequence_numbers_.erase(timestamp); - missing_sequence_numbers_wait_time_.erase(timestamp); - missing_sequence_numbers_.erase(timestamp); - compelete_video_frame_queue_.push(received_frame); - - return true; + return PopCompleteFrame(start_seq, end_seq, timestamp); } bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived( @@ -511,6 +464,11 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived( } } + return PopCompleteFrame(start_seq, end_seq, timestamp); +} + +bool RtpVideoReceiver::PopCompleteFrame(uint16_t start_seq, uint16_t end_seq, + uint64_t timestamp) { size_t complete_frame_size = 0; int frame_fragment_count = 0; @@ -552,8 +510,9 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived( delta_ntp_internal_ms_) * 1000); - missing_sequence_numbers_.erase(timestamp); + fua_end_sequence_numbers_.erase(timestamp); missing_sequence_numbers_wait_time_.erase(timestamp); + missing_sequence_numbers_.erase(timestamp); compelete_video_frame_queue_.push(received_frame); return true; diff --git a/src/transport/channel/rtp_video_receiver.h b/src/transport/channel/rtp_video_receiver.h index ff2c954..c5a710e 100644 --- a/src/transport/channel/rtp_video_receiver.h +++ b/src/transport/channel/rtp_video_receiver.h @@ -58,6 +58,8 @@ class RtpVideoReceiver : public ThreadBase, void ProcessH264RtpPacket(RtpPacketH264& rtp_packet_h264); bool CheckIsH264FrameCompletedFuaEndReceived(RtpPacketH264& rtp_packet_h264); bool CheckIsH264FrameCompletedMissSeqReceived(RtpPacketH264& rtp_packet_h264); + bool PopCompleteFrame(uint16_t start_seq, uint16_t end_seq, + uint64_t timestamp); private: bool CheckIsTimeSendRR(); diff --git a/src/transport/packet_sender/packet_sender_imp.h b/src/transport/packet_sender/packet_sender_imp.h index a6d6bf6..4c45592 100644 --- a/src/transport/packet_sender/packet_sender_imp.h +++ b/src/transport/packet_sender/packet_sender_imp.h @@ -64,7 +64,7 @@ class PacketSenderImp : public PacketSender, ssrc_seq_[packet->Ssrc()] = 1; } - if (packet->packet_type() != + if (packet->packet_type().value() != webrtc::RtpPacketMediaType::kRetransmission) { packet->UpdateSequenceNumber(ssrc_seq_[packet->Ssrc()]++); }