Avoid recreating the audio stream when a frame decryptor is set.
This is to be consistent with how things work on the video side but also much less drastic than the current implementation. Aim is to remove RecreateAudioReceiveStream(), which would improve efficiency as well as allow for specific handling of the cases that currently trigger recreation. Bug: webrtc:11993 Change-Id: Ia81a5e66d44e41ea4eb2bff800e0b1583821c96a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221860 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Markus Handell <handellm@webrtc.org> Commit-Queue: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34282}
This commit is contained in:
@ -152,6 +152,7 @@ if (rtc_include_tests) {
|
||||
"../api/audio_codecs:audio_codecs_api",
|
||||
"../api/audio_codecs/opus:audio_decoder_opus",
|
||||
"../api/audio_codecs/opus:audio_encoder_opus",
|
||||
"../api/crypto:frame_decryptor_interface",
|
||||
"../api/rtc_event_log",
|
||||
"../api/task_queue:default_task_queue_factory",
|
||||
"../api/units:time_delta",
|
||||
|
@ -246,6 +246,14 @@ void AudioReceiveStream::SetUseTransportCcAndNackHistory(bool use_transport_cc,
|
||||
}
|
||||
}
|
||||
|
||||
void AudioReceiveStream::SetFrameDecryptor(
|
||||
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
|
||||
// TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
|
||||
// expect to be called on the network thread.
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
channel_receive_->SetFrameDecryptor(std::move(frame_decryptor));
|
||||
}
|
||||
|
||||
webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats(
|
||||
bool get_and_clear_legacy_stats) const {
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
|
@ -91,6 +91,8 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream,
|
||||
void SetDecoderMap(std::map<int, SdpAudioFormat> decoder_map) override;
|
||||
void SetUseTransportCcAndNackHistory(bool use_transport_cc,
|
||||
int history_ms) override;
|
||||
void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
|
||||
frame_decryptor) override;
|
||||
|
||||
webrtc::AudioReceiveStream::Stats GetStats(
|
||||
bool get_and_clear_legacy_stats) const override;
|
||||
|
@ -177,6 +177,9 @@ class ChannelReceive : public ChannelReceiveInterface {
|
||||
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
|
||||
override;
|
||||
|
||||
void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
|
||||
frame_decryptor) override;
|
||||
|
||||
private:
|
||||
void ReceivePacket(const uint8_t* packet,
|
||||
size_t packet_length,
|
||||
@ -275,10 +278,12 @@ class ChannelReceive : public ChannelReceiveInterface {
|
||||
SequenceChecker construction_thread_;
|
||||
|
||||
// E2EE Audio Frame Decryption
|
||||
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor_;
|
||||
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor_
|
||||
RTC_GUARDED_BY(worker_thread_checker_);
|
||||
webrtc::CryptoOptions crypto_options_;
|
||||
|
||||
webrtc::AbsoluteCaptureTimeInterpolator absolute_capture_time_interpolator_;
|
||||
webrtc::AbsoluteCaptureTimeInterpolator absolute_capture_time_interpolator_
|
||||
RTC_GUARDED_BY(worker_thread_checker_);
|
||||
|
||||
webrtc::CaptureClockOffsetUpdater capture_clock_offset_updater_;
|
||||
|
||||
@ -889,6 +894,13 @@ void ChannelReceive::SetDepacketizerToDecoderFrameTransformer(
|
||||
InitFrameTransformerDelegate(std::move(frame_transformer));
|
||||
}
|
||||
|
||||
void ChannelReceive::SetFrameDecryptor(
|
||||
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
|
||||
// TODO(bugs.webrtc.org/11993): Expect to be called on the network thread.
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
frame_decryptor_ = std::move(frame_decryptor);
|
||||
}
|
||||
|
||||
NetworkStatistics ChannelReceive::GetNetworkStatistics(
|
||||
bool get_and_clear_legacy_stats) const {
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
|
@ -159,6 +159,9 @@ class ChannelReceiveInterface : public RtpPacketSinkInterface {
|
||||
virtual void SetDepacketizerToDecoderFrameTransformer(
|
||||
rtc::scoped_refptr<webrtc::FrameTransformerInterface>
|
||||
frame_transformer) = 0;
|
||||
|
||||
virtual void SetFrameDecryptor(
|
||||
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) = 0;
|
||||
};
|
||||
|
||||
std::unique_ptr<ChannelReceiveInterface> CreateChannelReceive(
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "api/crypto/frame_decryptor_interface.h"
|
||||
#include "api/test/mock_frame_encryptor.h"
|
||||
#include "audio/channel_receive.h"
|
||||
#include "audio/channel_send.h"
|
||||
@ -98,6 +99,11 @@ class MockChannelReceive : public voe::ChannelReceiveInterface {
|
||||
SetDepacketizerToDecoderFrameTransformer,
|
||||
(rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer),
|
||||
(override));
|
||||
MOCK_METHOD(
|
||||
void,
|
||||
SetFrameDecryptor,
|
||||
(rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor),
|
||||
(override));
|
||||
};
|
||||
|
||||
class MockChannelSend : public voe::ChannelSendInterface {
|
||||
|
@ -177,6 +177,8 @@ class AudioReceiveStream {
|
||||
virtual void SetDecoderMap(std::map<int, SdpAudioFormat> decoder_map) = 0;
|
||||
virtual void SetUseTransportCcAndNackHistory(bool use_transport_cc,
|
||||
int history_ms) = 0;
|
||||
virtual void SetFrameDecryptor(
|
||||
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) = 0;
|
||||
|
||||
// Starts stream activity.
|
||||
// When a stream is active, it can receive, process and deliver packets.
|
||||
|
@ -113,6 +113,11 @@ void FakeAudioReceiveStream::SetUseTransportCcAndNackHistory(
|
||||
config_.rtp.nack.rtp_history_ms = history_ms;
|
||||
}
|
||||
|
||||
void FakeAudioReceiveStream::SetFrameDecryptor(
|
||||
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
|
||||
config_.frame_decryptor = std::move(frame_decryptor);
|
||||
}
|
||||
|
||||
webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats(
|
||||
bool get_and_clear_legacy_stats) const {
|
||||
return stats_;
|
||||
|
@ -112,6 +112,8 @@ class FakeAudioReceiveStream final : public webrtc::AudioReceiveStream {
|
||||
std::map<int, webrtc::SdpAudioFormat> decoder_map) override;
|
||||
void SetUseTransportCcAndNackHistory(bool use_transport_cc,
|
||||
int history_ms) override;
|
||||
void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
|
||||
frame_decryptor) override;
|
||||
|
||||
webrtc::AudioReceiveStream::Stats GetStats(
|
||||
bool get_and_clear_legacy_stats) const override;
|
||||
|
@ -1218,7 +1218,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
|
||||
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
config_.frame_decryptor = frame_decryptor;
|
||||
RecreateAudioReceiveStream();
|
||||
stream_->SetFrameDecryptor(std::move(frame_decryptor));
|
||||
}
|
||||
|
||||
void SetLocalSsrc(uint32_t local_ssrc) {
|
||||
|
Reference in New Issue
Block a user