From 506ded3027d686e2da50fbab6e0f0539ffed8ca1 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Fri, 28 Mar 2025 15:16:41 +0800 Subject: [PATCH] [fix] fix h264 frame assember --- src/transport/channel/rtp_video_receiver.cpp | 46 ++++++++++++-------- src/transport/channel/video_channel_send.cpp | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/transport/channel/rtp_video_receiver.cpp b/src/transport/channel/rtp_video_receiver.cpp index 2e15f6b..5023250 100644 --- a/src/transport/channel/rtp_video_receiver.cpp +++ b/src/transport/channel/rtp_video_receiver.cpp @@ -7,7 +7,7 @@ #include "nack.h" #include "rtcp_sender.h" -#define SAVE_RTP_RECV_STREAM +// #define SAVE_RTP_RECV_STREAM #define NV12_BUFFER_SIZE (1280 * 720 * 3 / 2) #define RTCP_RR_INTERVAL 1000 @@ -200,31 +200,41 @@ void RtpVideoReceiver::InsertRtpPacket(RtpPacket& rtp_packet) { if (rtp_packet.Buffer().data() != nullptr && rtp_packet.Size() > 0 && rtp_packet_h264->Build(rtp_packet.Buffer().data(), rtp_packet.Size())) { rtp_packet_h264->GetFrameHeaderInfo(); - std::vector> complete_frame = - h264_frame_assembler_.InsertPacket(std::move(rtp_packet_h264)); - if (!complete_frame.empty()) { - uint8_t* nv12_data_ = new uint8_t[NV12_BUFFER_SIZE]; - uint8_t* dest = nv12_data_; - size_t complete_frame_size = 0; - for (auto& frame : complete_frame) { - memcpy(dest, frame->Payload(), frame->PayloadSize()); - dest += frame->PayloadSize(); - complete_frame_size += frame->PayloadSize(); - } - - ReceivedFrame received_frame(nv12_data_, complete_frame_size); + rtp::NAL_UNIT_TYPE nalu_type = rtp_packet_h264->NalUnitType(); + if (rtp::NAL_UNIT_TYPE::NALU == nalu_type) { + ReceivedFrame received_frame(rtp_packet_h264->Payload(), + rtp_packet_h264->PayloadSize()); received_frame.SetReceivedTimestamp(clock_->CurrentTime().us()); received_frame.SetCapturedTimestamp( - (static_cast(complete_frame[0]->Timestamp()) / + (static_cast(rtp_packet_h264->Timestamp()) / rtp::kMsToRtpTimestamp - delta_ntp_internal_ms_) * 1000); compelete_video_frame_queue_.push(received_frame); + } else if (rtp::NAL_UNIT_TYPE::FU_A == nalu_type) { + std::vector> complete_frame = + h264_frame_assembler_.InsertPacket(std::move(rtp_packet_h264)); + if (!complete_frame.empty()) { + uint8_t* nv12_data_ = new uint8_t[NV12_BUFFER_SIZE]; + uint8_t* dest = nv12_data_; + size_t complete_frame_size = 0; + for (auto& frame : complete_frame) { + memcpy(dest, frame->Payload(), frame->PayloadSize()); + dest += frame->PayloadSize(); + complete_frame_size += frame->PayloadSize(); + } - fwrite((unsigned char*)received_frame.Buffer(), 1, - received_frame.Size(), file_rtp_recv_); + ReceivedFrame received_frame(nv12_data_, complete_frame_size); + received_frame.SetReceivedTimestamp(clock_->CurrentTime().us()); + received_frame.SetCapturedTimestamp( + (static_cast(complete_frame[0]->Timestamp()) / + rtp::kMsToRtpTimestamp - + delta_ntp_internal_ms_) * + 1000); + compelete_video_frame_queue_.push(received_frame); - delete[] nv12_data_; + delete[] nv12_data_; + } } } diff --git a/src/transport/channel/video_channel_send.cpp b/src/transport/channel/video_channel_send.cpp index 11be99a..5a64eef 100644 --- a/src/transport/channel/video_channel_send.cpp +++ b/src/transport/channel/video_channel_send.cpp @@ -3,7 +3,7 @@ #include "log.h" #include "rtc_base/network/sent_packet.h" -#define SAVE_RTP_SENT_STREAM +// #define SAVE_RTP_SENT_STREAM VideoChannelSend::VideoChannelSend( std::shared_ptr clock, std::shared_ptr ice_agent,