diff options
author | Marina Ciocea <marinaciocea@webrtc.org> | 2020-02-27 16:16:55 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-28 07:43:13 +0000 |
commit | e77912ba8c0f0a768dc79ea33d72707aad04b972 (patch) | |
tree | 2072aec757b2a07b7618068cfa2d73dbbbb3b370 /media | |
parent | c62e4c5dc7526ab6d4914c467d2ec24cce21b134 (diff) | |
download | webrtc-e77912ba8c0f0a768dc79ea33d72707aad04b972.tar.gz |
Insert frame transformer between Encoded and Packetizer.
Add a new API in RTPSenderInterface, to be called from the browser side
to insert a frame transformer between the Encoded and the Packetizer.
The frame transformer is passed from RTPSenderInterface through the
library to be eventually set in RTPSenderVideo, where the frame
transformation will occur in the follow-up CL
https://webrtc-review.googlesource.com/c/src/+/169128.
Insertable Streams Web API explainer:
https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md
Design doc for WebRTC library changes:
http://doc/1eiLkjNUkRy2FssCPLUp6eH08BZuXXoHfbbBP1ZN7EVk
Bug: webrtc:11380
Change-Id: I46cd0d8a798c2736c837e90cbf90d8901c7d27fb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/169127
Commit-Queue: Marina Ciocea <marinaciocea@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30642}
Diffstat (limited to 'media')
-rw-r--r-- | media/BUILD.gn | 1 | ||||
-rw-r--r-- | media/base/media_channel.cc | 4 | ||||
-rw-r--r-- | media/base/media_channel.h | 5 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine.cc | 19 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine.h | 9 |
5 files changed, 38 insertions, 0 deletions
diff --git a/media/BUILD.gn b/media/BUILD.gn index 5c1ffe870c..f68f9911f3 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -86,6 +86,7 @@ rtc_library("rtc_media_base") { "..:webrtc_common", "../api:array_view", "../api:audio_options_api", + "../api:frame_transformer_interface", "../api:media_stream_interface", "../api:rtc_error", "../api:rtp_parameters", diff --git a/media/base/media_channel.cc b/media/base/media_channel.cc index 579cbc6b6f..29cf550655 100644 --- a/media/base/media_channel.cc +++ b/media/base/media_channel.cc @@ -49,6 +49,10 @@ void MediaChannel::SetFrameDecryptor( void MediaChannel::SetVideoCodecSwitchingEnabled(bool enabled) {} +void MediaChannel::SetEncoderToPacketizerFrameTransformer( + uint32_t ssrc, + rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {} + MediaSenderInfo::MediaSenderInfo() = default; MediaSenderInfo::~MediaSenderInfo() = default; diff --git a/media/base/media_channel.h b/media/base/media_channel.h index 90c33bd7a6..9631722ff6 100644 --- a/media/base/media_channel.h +++ b/media/base/media_channel.h @@ -22,6 +22,7 @@ #include "api/audio_options.h" #include "api/crypto/frame_decryptor_interface.h" #include "api/crypto/frame_encryptor_interface.h" +#include "api/frame_transformer_interface.h" #include "api/rtc_error.h" #include "api/rtp_parameters.h" #include "api/transport/media/media_transport_config.h" @@ -287,6 +288,10 @@ class MediaChannel : public sigslot::has_slots<> { uint32_t ssrc, const webrtc::RtpParameters& parameters) = 0; + virtual void SetEncoderToPacketizerFrameTransformer( + uint32_t ssrc, + rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer); + protected: bool DscpEnabled() const { return enable_dscp_; } diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index 1b8e1374aa..3f43f7906b 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -2464,6 +2464,14 @@ void WebRtcVideoChannel::WebRtcVideoSendStream::FillBitrateInfo( bwe_info->actual_enc_bitrate += stats.media_bitrate_bps; } +void WebRtcVideoChannel::WebRtcVideoSendStream:: + SetEncoderToPacketizerFrameTransformer( + rtc::scoped_refptr<webrtc::FrameTransformerInterface> + frame_transformer) { + RTC_DCHECK_RUN_ON(&thread_checker_); + parameters_.config.frame_transformer = std::move(frame_transformer); +} + void WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream() { RTC_DCHECK_RUN_ON(&thread_checker_); if (stream_ != NULL) { @@ -3133,6 +3141,17 @@ void WebRtcVideoChannel::GenerateKeyFrame(uint32_t ssrc) { } } +void WebRtcVideoChannel::SetEncoderToPacketizerFrameTransformer( + uint32_t ssrc, + rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) { + RTC_DCHECK_RUN_ON(&thread_checker_); + auto matching_stream = send_streams_.find(ssrc); + if (matching_stream != send_streams_.end()) { + matching_stream->second->SetEncoderToPacketizerFrameTransformer( + std::move(frame_transformer)); + } +} + // TODO(bugs.webrtc.org/8785): Consider removing max_qp as member of // EncoderStreamFactory and instead set this value individually for each stream // in the VideoEncoderConfig.simulcast_layers. diff --git a/media/engine/webrtc_video_engine.h b/media/engine/webrtc_video_engine.h index e4506ad096..b1cbd1bae8 100644 --- a/media/engine/webrtc_video_engine.h +++ b/media/engine/webrtc_video_engine.h @@ -224,6 +224,11 @@ class WebRtcVideoChannel : public VideoMediaChannel, void ClearRecordableEncodedFrameCallback(uint32_t ssrc) override; void GenerateKeyFrame(uint32_t ssrc) override; + void SetEncoderToPacketizerFrameTransformer( + uint32_t ssrc, + rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) + override; + private: class WebRtcVideoReceiveStream; @@ -336,6 +341,10 @@ class WebRtcVideoChannel : public VideoMediaChannel, VideoSenderInfo GetVideoSenderInfo(bool log_stats); void FillBitrateInfo(BandwidthEstimationInfo* bwe_info); + void SetEncoderToPacketizerFrameTransformer( + rtc::scoped_refptr<webrtc::FrameTransformerInterface> + frame_transformer); + private: // Parameters needed to reconstruct the underlying stream. // webrtc::VideoSendStream doesn't support setting a lot of options on the |