aboutsummaryrefslogtreecommitdiff
path: root/audio/channel_send.cc
diff options
context:
space:
mode:
authorMarina Ciocea <marinaciocea@webrtc.org>2020-03-31 11:29:56 +0200
committerCommit Bot <commit-bot@chromium.org>2020-03-31 11:14:00 +0000
commitd2aa8f97f1091f87561d5559a72c27ec73fa4cdb (patch)
tree886a42fd7a4ac70b69f6f0c8c3f736a98a7387aa /audio/channel_send.cc
parente062c15ce64929f488bd57e5733c6661d11890ed (diff)
downloadwebrtc-d2aa8f97f1091f87561d5559a72c27ec73fa4cdb.tar.gz
Insert audio frame transformer between encoder and packetizer.
The frame transformer is passed from RTPSenderInterface through the library to be eventually set in ChannelSend, where the frame transformation will occur in the follow-up CL. 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: I01b2adc3c96b948d182d5401a9a4fe14cf5960a2 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/171870 Commit-Queue: Tommi <tommi@webrtc.org> Reviewed-by: Per Ã…hgren <peah@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Reviewed-by: Magnus Flodman <mflodman@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30946}
Diffstat (limited to 'audio/channel_send.cc')
-rw-r--r--audio/channel_send.cc56
1 files changed, 41 insertions, 15 deletions
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index dd866f3f7b..d8ac39c8e2 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -76,7 +76,8 @@ class ChannelSend : public ChannelSendInterface,
const webrtc::CryptoOptions& crypto_options,
bool extmap_allow_mixed,
int rtcp_report_interval_ms,
- uint32_t ssrc);
+ uint32_t ssrc,
+ rtc::scoped_refptr<FrameTransformerInterface> frame_transformer);
~ChannelSend() override;
@@ -142,6 +143,12 @@ class ChannelSend : public ChannelSendInterface,
void SetFrameEncryptor(
rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
+ // Sets a frame transformer between encoder and packetizer, to transform
+ // encoded frames before sending them out the network.
+ void SetEncoderToPacketizerFrameTransformer(
+ rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
+ override;
+
private:
// From AudioPacketizationCallback in the ACM
int32_t SendData(AudioFrameType frameType,
@@ -217,6 +224,10 @@ class ChannelSend : public ChannelSendInterface,
// E2EE Frame Encryption Options
const webrtc::CryptoOptions crypto_options_;
+ // Frame transformer used by insertable streams to transform encoded frames.
+ rtc::scoped_refptr<FrameTransformerInterface> frame_transformer_
+ RTC_GUARDED_BY(encoder_queue_);
+
rtc::CriticalSection bitrate_crit_section_;
int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
@@ -452,18 +463,20 @@ int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
return 0;
}
-ChannelSend::ChannelSend(Clock* clock,
- TaskQueueFactory* task_queue_factory,
- ProcessThread* module_process_thread,
- OverheadObserver* overhead_observer,
- Transport* rtp_transport,
- RtcpRttStats* rtcp_rtt_stats,
- RtcEventLog* rtc_event_log,
- FrameEncryptorInterface* frame_encryptor,
- const webrtc::CryptoOptions& crypto_options,
- bool extmap_allow_mixed,
- int rtcp_report_interval_ms,
- uint32_t ssrc)
+ChannelSend::ChannelSend(
+ Clock* clock,
+ TaskQueueFactory* task_queue_factory,
+ ProcessThread* module_process_thread,
+ OverheadObserver* overhead_observer,
+ Transport* rtp_transport,
+ RtcpRttStats* rtcp_rtt_stats,
+ RtcEventLog* rtc_event_log,
+ FrameEncryptorInterface* frame_encryptor,
+ const webrtc::CryptoOptions& crypto_options,
+ bool extmap_allow_mixed,
+ int rtcp_report_interval_ms,
+ uint32_t ssrc,
+ rtc::scoped_refptr<FrameTransformerInterface> frame_transformer)
: event_log_(rtc_event_log),
_timeStamp(0), // This is just an offset, RTP module will add it's own
// random offset
@@ -478,6 +491,7 @@ ChannelSend::ChannelSend(Clock* clock,
new RateLimiter(clock, kMaxRetransmissionWindowMs)),
frame_encryptor_(frame_encryptor),
crypto_options_(crypto_options),
+ frame_transformer_(std::move(frame_transformer)),
encoder_queue_(task_queue_factory->CreateTaskQueue(
"AudioEncoder",
TaskQueueFactory::Priority::NORMAL)) {
@@ -898,6 +912,16 @@ void ChannelSend::SetFrameEncryptor(
});
}
+void ChannelSend::SetEncoderToPacketizerFrameTransformer(
+ rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
+ RTC_DCHECK_RUN_ON(&worker_thread_checker_);
+ encoder_queue_.PostTask(
+ [this, frame_transformer = std::move(frame_transformer)]() mutable {
+ RTC_DCHECK_RUN_ON(&encoder_queue_);
+ frame_transformer_ = std::move(frame_transformer);
+ });
+}
+
void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
// Invoke audio encoders OnReceivedRtt().
CallEncoder(
@@ -918,11 +942,13 @@ std::unique_ptr<ChannelSendInterface> CreateChannelSend(
const webrtc::CryptoOptions& crypto_options,
bool extmap_allow_mixed,
int rtcp_report_interval_ms,
- uint32_t ssrc) {
+ uint32_t ssrc,
+ rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
return std::make_unique<ChannelSend>(
clock, task_queue_factory, module_process_thread, overhead_observer,
rtp_transport, rtcp_rtt_stats, rtc_event_log, frame_encryptor,
- crypto_options, extmap_allow_mixed, rtcp_report_interval_ms, ssrc);
+ crypto_options, extmap_allow_mixed, rtcp_report_interval_ms, ssrc,
+ std::move(frame_transformer));
}
} // namespace voe