Insert audio frame transformer between depacketizer and decoder.
The frame transformer is passed from RTPReceiverInterface through the
library to be eventually set in ChannelReceive, 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: I5af06d1431047ef50d00e304cf95e92a832b4220
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/171872
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Commit-Queue: Marina Ciocea <marinaciocea@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30956}
diff --git a/pc/audio_rtp_receiver.cc b/pc/audio_rtp_receiver.cc
index e83e558..69e8e7b 100644
--- a/pc/audio_rtp_receiver.cc
+++ b/pc/audio_rtp_receiver.cc
@@ -225,6 +225,20 @@
RTC_FROM_HERE, [&] { return media_channel_->GetSources(*ssrc_); });
}
+void AudioRtpReceiver::SetDepacketizerToDecoderFrameTransformer(
+ rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
+ if (media_channel_ && ssrc_.has_value() && !stopped_) {
+ worker_thread_->Invoke<void>(
+ RTC_FROM_HERE,
+ [this, frame_transformer = std::move(frame_transformer)] {
+ RTC_DCHECK_RUN_ON(worker_thread_);
+ frame_transformer_ = frame_transformer;
+ media_channel_->SetDepacketizerToDecoderFrameTransformer(
+ *ssrc_, frame_transformer);
+ });
+ }
+}
+
void AudioRtpReceiver::Reconfigure() {
if (!media_channel_ || stopped_) {
RTC_LOG(LS_ERROR)
@@ -237,6 +251,16 @@
// Reattach the frame decryptor if we were reconfigured.
MaybeAttachFrameDecryptorToMediaChannel(
ssrc_, worker_thread_, frame_decryptor_, media_channel_, stopped_);
+
+ if (media_channel_ && ssrc_.has_value() && !stopped_) {
+ worker_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
+ RTC_DCHECK_RUN_ON(worker_thread_);
+ if (!frame_transformer_)
+ return;
+ media_channel_->SetDepacketizerToDecoderFrameTransformer(
+ *ssrc_, frame_transformer_);
+ });
+ }
}
void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
diff --git a/pc/audio_rtp_receiver.h b/pc/audio_rtp_receiver.h
index 908cb64..88b16ee 100644
--- a/pc/audio_rtp_receiver.h
+++ b/pc/audio_rtp_receiver.h
@@ -104,6 +104,9 @@
std::vector<RtpSource> GetSources() const override;
int AttachmentId() const override { return attachment_id_; }
+ void SetDepacketizerToDecoderFrameTransformer(
+ rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
+ override;
private:
void RestartMediaChannel(absl::optional<uint32_t> ssrc);
@@ -128,6 +131,8 @@
// Allows to thread safely change playout delay. Handles caching cases if
// |SetJitterBufferMinimumDelay| is called before start.
rtc::scoped_refptr<JitterBufferDelayInterface> delay_;
+ rtc::scoped_refptr<FrameTransformerInterface> frame_transformer_
+ RTC_GUARDED_BY(worker_thread_);
};
} // namespace webrtc