From 39feabe35c5175a2c497b3b4ac79787c1bc14ab1 Mon Sep 17 00:00:00 2001 From: Benjamin Wright Date: Mon, 22 Oct 2018 13:33:09 -0700 Subject: [PATCH] Enables FrameDecryptor to do an initial key request on frame decryption. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change enables the FrameDecryptor attached to an RtpVideoReceiver to do an initial request for a KeyFrame if the first successfully decrypted payload is not a key frame. Bug: webrtc:9795 Change-Id: I401ce1f513cb51ce520b60dcaf8b825a68d00c7f Reviewed-on: https://webrtc-review.googlesource.com/c/107246 Commit-Queue: Benjamin Wright Reviewed-by: Åsa Persson Cr-Commit-Position: refs/heads/master@{#25295} --- video/rtp_video_stream_receiver.cc | 24 ++++++++++++++++++------ video/rtp_video_stream_receiver.h | 2 ++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc index b3cf7fbbf2..6f1724f41a 100644 --- a/video/rtp_video_stream_receiver.cc +++ b/video/rtp_video_stream_receiver.cc @@ -378,6 +378,16 @@ int32_t RtpVideoStreamReceiver::ResendPackets(const uint16_t* sequence_numbers, void RtpVideoStreamReceiver::OnReceivedFrame( std::unique_ptr frame) { + // Request a key frame as soon as possible. + bool key_frame_requested = false; + if (!has_received_frame_) { + has_received_frame_ = true; + if (frame->FrameType() != kVideoFrameKey) { + key_frame_requested = true; + keyframe_request_sender_->RequestKeyFrame(); + } + } + // Optionally attempt to decrypt the raw video frame if it was provided. if (frame_decryptor_ != nullptr) { // When using encryption we expect the frame to have the generic descriptor. @@ -408,6 +418,14 @@ void RtpVideoStreamReceiver::OnReceivedFrame( inline_decrypted_bitstream, &bytes_written) != 0) { return; } + + if (!has_received_decrypted_frame_ && !key_frame_requested) { + has_received_decrypted_frame_ = true; + if (frame->FrameType() != kVideoFrameKey) { + keyframe_request_sender_->RequestKeyFrame(); + } + } + RTC_CHECK(bytes_written <= max_plaintext_byte_size); // Update the frame to contain just the written bytes. frame->SetLength(bytes_written); @@ -417,12 +435,6 @@ void RtpVideoStreamReceiver::OnReceivedFrame( return; } - if (!has_received_frame_) { - has_received_frame_ = true; - if (frame->FrameType() != kVideoFrameKey) - keyframe_request_sender_->RequestKeyFrame(); - } - reference_finder_->ManageFrame(std::move(frame)); } diff --git a/video/rtp_video_stream_receiver.h b/video/rtp_video_stream_receiver.h index 9c88173a13..ed5164769e 100644 --- a/video/rtp_video_stream_receiver.h +++ b/video/rtp_video_stream_receiver.h @@ -208,6 +208,8 @@ class RtpVideoStreamReceiver : public RecoveredPacketReceiver, // E2EE Video Frame Decryptor (Optional) rtc::scoped_refptr frame_decryptor_; + // Set to true on the first successsfully decrypted frame. + bool has_received_decrypted_frame_ = false; }; } // namespace webrtc