From 8718f5886832be826347ecde56e7086f099e5198 Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 15 Nov 2021 16:22:29 +0100 Subject: [PATCH] Correctly set first/last packet of frame bit in VideoRtpDepacketizerVp9. Bug: none Change-Id: I72911859b313add520f58e06f0529d082a0291aa Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/237801 Reviewed-by: Danil Chapovalov Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Philip Eliasson Cr-Commit-Position: refs/heads/main@{#35345} --- modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc | 4 ++-- .../rtp_rtcp/source/video_rtp_depacketizer_vp9_unittest.cc | 2 ++ video/rtp_video_stream_receiver2.cc | 6 ------ video/video_send_stream_tests.cc | 7 +++++-- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc index cd5ebe7235..41f363d221 100644 --- a/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc +++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc @@ -211,8 +211,8 @@ int VideoRtpDepacketizerVp9::ParseRtpPayload( video_header->height = vp9_header.height[0]; } } - video_header->is_first_packet_in_frame = - b_bit && (!l_bit || !vp9_header.inter_layer_predicted); + video_header->is_first_packet_in_frame = b_bit; + video_header->is_last_packet_in_frame = e_bit; int num_remaining_bits = parser.RemainingBitCount(); if (num_remaining_bits <= 0) { diff --git a/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9_unittest.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9_unittest.cc index 937d15de23..36af59a779 100644 --- a/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9_unittest.cc +++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9_unittest.cc @@ -279,6 +279,7 @@ TEST(VideoRtpDepacketizerVp9Test, ParseFirstPacketInKeyFrame) { EXPECT_EQ(video_header.frame_type, VideoFrameType::kVideoFrameKey); EXPECT_TRUE(video_header.is_first_packet_in_frame); + EXPECT_FALSE(video_header.is_last_packet_in_frame); } TEST(VideoRtpDepacketizerVp9Test, ParseLastPacketInDeltaFrame) { @@ -290,6 +291,7 @@ TEST(VideoRtpDepacketizerVp9Test, ParseLastPacketInDeltaFrame) { EXPECT_EQ(video_header.frame_type, VideoFrameType::kVideoFrameDelta); EXPECT_FALSE(video_header.is_first_packet_in_frame); + EXPECT_TRUE(video_header.is_last_packet_in_frame); } TEST(VideoRtpDepacketizerVp9Test, ParseResolution) { diff --git a/video/rtp_video_stream_receiver2.cc b/video/rtp_video_stream_receiver2.cc index 21414ff8b3..2519da2b0a 100644 --- a/video/rtp_video_stream_receiver2.cc +++ b/video/rtp_video_stream_receiver2.cc @@ -503,12 +503,6 @@ void RtpVideoStreamReceiver2::OnReceivedPayloadData( video_header.video_timing.flags = VideoSendTiming::kInvalid; video_header.is_last_packet_in_frame |= rtp_packet.Marker(); - if (const auto* vp9_header = - absl::get_if(&video_header.video_type_header)) { - video_header.is_last_packet_in_frame |= vp9_header->end_of_frame; - video_header.is_first_packet_in_frame |= vp9_header->beginning_of_frame; - } - rtp_packet.GetExtension(&video_header.rotation); rtp_packet.GetExtension( &video_header.content_type); diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc index b5e4f2b74e..91d5ccc85b 100644 --- a/video/video_send_stream_tests.cc +++ b/video/video_send_stream_tests.cc @@ -3377,11 +3377,14 @@ class Vp9HeaderObserver : public test::SendTest { const auto& vp9_header = absl::get(video.video_type_header); - bool new_frame = + const bool new_temporal_unit = packets_sent_ == 0 || IsNewerTimestamp(rtp_packet.Timestamp(), last_packet_timestamp_); + const bool new_frame = + new_temporal_unit || last_vp9_.spatial_idx != vp9_header.spatial_idx; + EXPECT_EQ(new_frame, video.is_first_packet_in_frame); - if (!new_frame) { + if (!new_temporal_unit) { EXPECT_FALSE(last_packet_marker_); EXPECT_EQ(last_packet_timestamp_, rtp_packet.Timestamp()); EXPECT_EQ(last_vp9_.picture_id, vp9_header.picture_id);