From dba3fd6c1ba3717d80f0801e9937d07d83a4c477 Mon Sep 17 00:00:00 2001 From: Jianjun Zhu Date: Fri, 9 Feb 2024 14:18:58 +0800 Subject: [PATCH] Correctly mark video frame type for FU packets. Mark FU packets with type between kBlaWLp and kRsvIrapVcl23 as key frames. This behavior aligns with AP and single NALU. Bug: webrtc:13485 Change-Id: I51762e89ebb4829b50524d9f5476f2d5d9c093f7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/338860 Reviewed-by: Philip Eliasson Reviewed-by: Danil Chapovalov Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/main@{#41764} --- modules/rtp_rtcp/source/video_rtp_depacketizer_h265.cc | 5 ++--- .../source/video_rtp_depacketizer_h265_unittest.cc | 10 ++++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/rtp_rtcp/source/video_rtp_depacketizer_h265.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_h265.cc index b54df7c271..d2646e82da 100644 --- a/modules/rtp_rtcp/source/video_rtp_depacketizer_h265.cc +++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_h265.cc @@ -202,9 +202,8 @@ absl::optional ParseFuNalu( rtp_payload.size() - kH265NalHeaderSizeBytes - kH265FuHeaderSizeBytes); } - if (original_nal_type == H265::NaluType::kIdrWRadl || - original_nal_type == H265::NaluType::kIdrNLp || - original_nal_type == H265::NaluType::kCra) { + if (original_nal_type >= H265::NaluType::kBlaWLp && + original_nal_type <= H265::NaluType::kRsvIrapVcl23) { parsed_payload->video_header.frame_type = VideoFrameType::kVideoFrameKey; } else { parsed_payload->video_header.frame_type = VideoFrameType::kVideoFrameDelta; diff --git a/modules/rtp_rtcp/source/video_rtp_depacketizer_h265_unittest.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_h265_unittest.cc index a630671a71..c94e0d59c2 100644 --- a/modules/rtp_rtcp/source/video_rtp_depacketizer_h265_unittest.cc +++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_h265_unittest.cc @@ -297,15 +297,15 @@ TEST(VideoRtpDepacketizerH265Test, Fu) { 0x08, 0x4a, 0x31, 0x11, 0x15, 0xe5, 0xc0}; uint8_t packet2[] = { - 0x62, 0x02, // F=0, Type=49 (kH265Fu). - H265::kIdrWRadl, // FU header. - 0x02 // Payload. + 0x62, 0x02, // F=0, Type=49 (kH265Fu). + H265::kBlaWLp, // FU header. + 0x02 // Payload. }; const uint8_t kExpected2[] = {0x02}; uint8_t packet3[] = { 0x62, 0x02, // F=0, Type=49 (kH265Fu). - 0x33, // FU header kH265EBitMask | H265::kIdrWRadl. + 0x53, // FU header kH265EBitMask | H265::kIdrWRadl. 0x03 // Payload. }; const uint8_t kExpected3[] = {0x03}; @@ -330,6 +330,7 @@ TEST(VideoRtpDepacketizerH265Test, Fu) { parsed2->video_payload.size()), ElementsAreArray(kExpected2)); EXPECT_FALSE(parsed2->video_header.is_first_packet_in_frame); + EXPECT_EQ(parsed2->video_header.frame_type, VideoFrameType::kVideoFrameKey); EXPECT_EQ(parsed2->video_header.codec, kVideoCodecH265); auto parsed3 = depacketizer.Parse(rtc::CopyOnWriteBuffer(packet3)); @@ -337,6 +338,7 @@ TEST(VideoRtpDepacketizerH265Test, Fu) { parsed3->video_payload.size()), ElementsAreArray(kExpected3)); EXPECT_FALSE(parsed3->video_header.is_first_packet_in_frame); + EXPECT_EQ(parsed3->video_header.frame_type, VideoFrameType::kVideoFrameKey); EXPECT_EQ(parsed3->video_header.codec, kVideoCodecH265); }