From 426b5e7ea12e12b684f283a4a773121faa679e33 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 22 Mar 2024 12:52:02 +0000 Subject: [PATCH] Revert "Mark frames with inter_layer_predicted=true as delta frames" This reverts commit 7ae48c452abf8694a1b0a7a9a2aef13a9d10298a. Reason for revert: breaks RtpVp9RefFinder Original change's description: > Mark frames with inter_layer_predicted=true as delta frames > > As it is currently implemented, the VP9 depacketizer decides packet's frame type based on p_bit ("Inter-picture predicted layer frame"). p_bit is set to 0 for upper spatial layer frames of keyframe since they do not have temporal refs. This results in marking packets of upper spatial layer frames, and, eventually these frames, of SVC keyframes as "keyframe" while they are in fact delta frames. > > Normally spatial layer frames are merged into a superframe and the superframe is passed to decoder. But passing individual layers to a single decoder instance is a valid scenario too and is used in downstream projects. In this case, an upper layer frame marked as keyframe may cause decoder reset [2] and break decoding. > > This CL changes frame type decision logic in the VP9 depacketizer such that only packets with both P and D (inter-layer predicted) bits unset are considered as keyframe packets. > > When spatial layer frames are merged into a superframe in CombineAndDeleteFrames [1], frame type of the superframe is inferred from the lowest spatial layer frame. > > [1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/modules/video_coding/frame_helpers.cc;l=53 > > [2] https://source.corp.google.com/piper///depot/google3/third_party/webrtc/files/stable/webrtc/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc;l=209 > > Bug: webrtc:15827 > Change-Id: Idc3445636f0eae0192dac998876fedec48628560 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/343342 > Reviewed-by: Danil Chapovalov > Commit-Queue: Sergey Silkin > Cr-Commit-Position: refs/heads/main@{#41939} Bug: webrtc:15827 Change-Id: I697a057b8b3e88c07499f77c42f014da43cf1dc1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/343763 Reviewed-by: Danil Chapovalov Commit-Queue: Sergey Silkin Bot-Commit: rubber-stamper@appspot.gserviceaccount.com Cr-Commit-Position: refs/heads/main@{#41953} --- modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc index a8b04db78d..41f363d221 100644 --- a/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc +++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_vp9.cc @@ -180,6 +180,9 @@ int VideoRtpDepacketizerVp9::ParseRtpPayload( video_header->simulcastIdx = 0; video_header->codec = kVideoCodecVP9; + video_header->frame_type = + p_bit ? VideoFrameType::kVideoFrameDelta : VideoFrameType::kVideoFrameKey; + auto& vp9_header = video_header->video_type_header.emplace(); vp9_header.InitRTPVideoHeaderVP9(); @@ -208,9 +211,6 @@ int VideoRtpDepacketizerVp9::ParseRtpPayload( video_header->height = vp9_header.height[0]; } } - video_header->frame_type = p_bit || vp9_header.inter_layer_predicted - ? VideoFrameType::kVideoFrameDelta - : VideoFrameType::kVideoFrameKey; video_header->is_first_packet_in_frame = b_bit; video_header->is_last_packet_in_frame = e_bit;