From 893c0e449dcbe4804edf42fb17031015c2601292 Mon Sep 17 00:00:00 2001 From: Tony Herre Date: Thu, 24 Nov 2022 18:32:02 +0100 Subject: [PATCH] Allow Video Sender OnTransformedFrame() before TransformFrame() Lazily initialize the RTPSenderVideoFrameTransformerDelegate's encoder_queue_ on either OnTransformedFrame() or TransformFrame(), to allow apps to write to an encoded insertable stream's writable before reading from its readable. Bug: chromium:1393373 Change-Id: I08f11682fa142884b575bb207d7d7044e80bbb9c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/284921 Reviewed-by: Harald Alvestrand Commit-Queue: Tony Herre Auto-Submit: Tony Herre Commit-Queue: Harald Alvestrand Cr-Commit-Position: refs/heads/main@{#38728} --- ...sender_video_frame_transformer_delegate.cc | 28 +++++++++++-------- ..._sender_video_frame_transformer_delegate.h | 2 ++ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc index 3d6931fe23..3e42781c3e 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc @@ -112,14 +112,9 @@ void RTPSenderVideoFrameTransformerDelegate::Init() { rtc::scoped_refptr(this), ssrc_); } -bool RTPSenderVideoFrameTransformerDelegate::TransformFrame( - int payload_type, - absl::optional codec_type, - uint32_t rtp_timestamp, - const EncodedImage& encoded_image, - RTPVideoHeader video_header, - absl::optional expected_retransmission_time_ms) { +void RTPSenderVideoFrameTransformerDelegate::EnsureEncoderQueueCreated() { TaskQueueBase* current = TaskQueueBase::Current(); + if (!encoder_queue_) { // Save the current task queue to post the transformed frame for sending // once it is transformed. When there is no current task queue, i.e. @@ -133,6 +128,18 @@ bool RTPSenderVideoFrameTransformerDelegate::TransformFrame( encoder_queue_ = owned_encoder_queue_.get(); } } +} + +bool RTPSenderVideoFrameTransformerDelegate::TransformFrame( + int payload_type, + absl::optional codec_type, + uint32_t rtp_timestamp, + const EncodedImage& encoded_image, + RTPVideoHeader video_header, + absl::optional expected_retransmission_time_ms) { + EnsureEncoderQueueCreated(); + + TaskQueueBase* current = TaskQueueBase::Current(); // DCHECK that the current queue does not change, or if does then it was due // to a hardware encoder fallback and thus there is an owned queue. RTC_DCHECK(!current || current == encoder_queue_ || owned_encoder_queue_) @@ -152,10 +159,9 @@ void RTPSenderVideoFrameTransformerDelegate::OnTransformedFrame( std::unique_ptr frame) { MutexLock lock(&sender_lock_); - // The encoder queue normally gets destroyed after the sender; - // however, it might still be null by the time a previously queued frame - // arrives. - if (!sender_ || !encoder_queue_) + EnsureEncoderQueueCreated(); + + if (!sender_) return; rtc::scoped_refptr delegate(this); encoder_queue_->PostTask( diff --git a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h index 65d6d3f6cd..0c2a64372c 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h +++ b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h @@ -74,6 +74,8 @@ class RTPSenderVideoFrameTransformerDelegate : public TransformedFrameCallback { ~RTPSenderVideoFrameTransformerDelegate() override = default; private: + void EnsureEncoderQueueCreated(); + mutable Mutex sender_lock_; RTPSenderVideo* sender_ RTC_GUARDED_BY(sender_lock_); rtc::scoped_refptr frame_transformer_;