aboutsummaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authorMarina Ciocea <marinaciocea@webrtc.org>2020-02-27 16:16:55 +0100
committerCommit Bot <commit-bot@chromium.org>2020-02-28 07:43:13 +0000
commite77912ba8c0f0a768dc79ea33d72707aad04b972 (patch)
tree2072aec757b2a07b7618068cfa2d73dbbbb3b370 /media
parentc62e4c5dc7526ab6d4914c467d2ec24cce21b134 (diff)
downloadwebrtc-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.gn1
-rw-r--r--media/base/media_channel.cc4
-rw-r--r--media/base/media_channel.h5
-rw-r--r--media/engine/webrtc_video_engine.cc19
-rw-r--r--media/engine/webrtc_video_engine.h9
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