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_;