[InsertableStreams] Send transformed frames on worker queue.

When video frame encoding is done on an external thread (for example in
the case of hardware encoders), the WebRTC TaskQueueBase::Current() is
null; in this case use the worker queue instead to send transformed
frames.

Bug: chromium:1086373
Change-Id: I903ddc52ad6832557fc5b5f76396fe26cf5a88f3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176303
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Marina Ciocea <marinaciocea@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31388}
This commit is contained in:
Marina Ciocea
2020-05-29 12:37:01 +02:00
committed by Commit Bot
parent 461e38761d
commit 2e69660b3e
5 changed files with 21 additions and 6 deletions

View File

@ -30,6 +30,7 @@
#include "rtc_base/checks.h"
#include "rtc_base/location.h"
#include "rtc_base/logging.h"
#include "rtc_base/task_queue.h"
namespace webrtc {
@ -281,6 +282,7 @@ std::vector<RtpStreamSender> CreateRtpStreamSenders(
video_config.fec_overhead_bytes = fec_generator->MaxPacketOverhead();
}
video_config.frame_transformer = frame_transformer;
video_config.worker_queue = transport->GetWorkerQueue()->Get();
auto sender_video = std::make_unique<RTPSenderVideo>(video_config);
rtp_streams.emplace_back(std::move(rtp_rtcp), std::move(sender_video),
std::move(fec_generator));

View File

@ -144,7 +144,8 @@ RTPSenderVideo::RTPSenderVideo(const Config& config)
RTPSenderVideoFrameTransformerDelegate>(
this,
config.frame_transformer,
rtp_sender_->SSRC())
rtp_sender_->SSRC(),
config.worker_queue)
: nullptr) {
if (frame_transformer_delegate_)
frame_transformer_delegate_->Init();

View File

@ -20,6 +20,7 @@
#include "api/array_view.h"
#include "api/frame_transformer_interface.h"
#include "api/scoped_refptr.h"
#include "api/task_queue/task_queue_base.h"
#include "api/transport/rtp/dependency_descriptor.h"
#include "api/video/video_codec_type.h"
#include "api/video/video_frame_type.h"
@ -81,6 +82,7 @@ class RTPSenderVideo {
absl::optional<int> red_payload_type;
const WebRtcKeyValueConfig* field_trials = nullptr;
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer;
TaskQueueBase* worker_queue = nullptr;
};
explicit RTPSenderVideo(const Config& config);

View File

@ -109,10 +109,12 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface {
RTPSenderVideoFrameTransformerDelegate::RTPSenderVideoFrameTransformerDelegate(
RTPSenderVideo* sender,
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
uint32_t ssrc)
uint32_t ssrc,
TaskQueueBase* worker_queue)
: sender_(sender),
frame_transformer_(std::move(frame_transformer)),
ssrc_(ssrc) {}
ssrc_(ssrc),
worker_queue_(worker_queue) {}
void RTPSenderVideoFrameTransformerDelegate::Init() {
frame_transformer_->RegisterTransformedFrameSinkCallback(
@ -127,8 +129,14 @@ bool RTPSenderVideoFrameTransformerDelegate::TransformFrame(
const RTPFragmentationHeader* fragmentation,
RTPVideoHeader video_header,
absl::optional<int64_t> expected_retransmission_time_ms) {
if (!encoder_queue_)
encoder_queue_ = 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.
// encoding is done on an external thread (for example in the case of
// hardware encoders), use the worker queue instead.
TaskQueueBase* current = TaskQueueBase::Current();
encoder_queue_ = current ? current : worker_queue_;
}
frame_transformer_->Transform(std::make_unique<TransformableVideoSenderFrame>(
encoded_image, video_header, payload_type, codec_type, rtp_timestamp,
fragmentation, expected_retransmission_time_ms, ssrc_));

View File

@ -30,7 +30,8 @@ class RTPSenderVideoFrameTransformerDelegate : public TransformedFrameCallback {
RTPSenderVideoFrameTransformerDelegate(
RTPSenderVideo* sender,
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
uint32_t ssrc);
uint32_t ssrc,
TaskQueueBase* worker_queue);
void Init();
@ -69,6 +70,7 @@ class RTPSenderVideoFrameTransformerDelegate : public TransformedFrameCallback {
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer_;
const uint32_t ssrc_;
TaskQueueBase* encoder_queue_ = nullptr;
TaskQueueBase* worker_queue_;
};
} // namespace webrtc