#include "audio/channel_receive.h"
#include <algorithm>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "api/audio/audio_device.h"
#include "api/crypto/frame_decryptor_interface.h"
#include "api/frame_transformer_interface.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/sequence_checker.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/task_queue/task_queue_base.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "audio/audio_level.h"
#include "audio/channel_receive_frame_transformer_delegate.h"
#include "audio/channel_send.h"
#include "audio/utility/audio_frame_operations.h"
#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
#include "logging/rtc_event_log/events/rtc_event_neteq_set_minimum_delay.h"
#include "modules/audio_coding/acm2/acm_receiver.h"
#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
#include "modules/pacing/packet_router.h"
#include "modules/rtp_rtcp/include/receive_statistics.h"
#include "modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
#include "modules/rtp_rtcp/source/absolute_capture_time_interpolator.h"
#include "modules/rtp_rtcp/source/capture_clock_offset_updater.h"
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_minmax.h"
#include "rtc_base/numerics/sequence_number_unwrapper.h"
#include "rtc_base/race_checker.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/system/no_unique_address.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/trace_event.h"
#include "system_wrappers/include/metrics.h"
#include "system_wrappers/include/ntp_time.h"
namespace webrtc {
namespace voe {
namespace {
constexpr double kAudioSampleDurationSeconds = …;
constexpr int kVoiceEngineMinMinPlayoutDelayMs = …;
constexpr int kVoiceEngineMaxMinPlayoutDelayMs = …;
acm2::AcmReceiver::Config AcmConfig(
NetEqFactory* neteq_factory,
rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
absl::optional<AudioCodecPairId> codec_pair_id,
size_t jitter_buffer_max_packets,
bool jitter_buffer_fast_playout,
int jitter_buffer_min_delay_ms) { … }
class ChannelReceive : public ChannelReceiveInterface,
public RtcpPacketTypeCounterObserver { … };
void ChannelReceive::OnReceivedPayloadData(
rtc::ArrayView<const uint8_t> payload,
const RTPHeader& rtpHeader,
Timestamp receive_time) { … }
void ChannelReceive::InitFrameTransformerDelegate(
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) { … }
AudioMixer::Source::AudioFrameInfo ChannelReceive::GetAudioFrameWithInfo(
int sample_rate_hz,
AudioFrame* audio_frame) { … }
int ChannelReceive::PreferredSampleRate() const { … }
void ChannelReceive::SetSourceTracker(SourceTracker* source_tracker) { … }
ChannelReceive::ChannelReceive(
const Environment& env,
NetEqFactory* neteq_factory,
AudioDeviceModule* audio_device_module,
Transport* rtcp_send_transport,
uint32_t local_ssrc,
uint32_t remote_ssrc,
size_t jitter_buffer_max_packets,
bool jitter_buffer_fast_playout,
int jitter_buffer_min_delay_ms,
bool enable_non_sender_rtt,
rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
absl::optional<AudioCodecPairId> codec_pair_id,
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
const webrtc::CryptoOptions& crypto_options,
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer)
: … { … }
ChannelReceive::~ChannelReceive() { … }
void ChannelReceive::SetSink(AudioSinkInterface* sink) { … }
void ChannelReceive::StartPlayout() { … }
void ChannelReceive::StopPlayout() { … }
absl::optional<std::pair<int, SdpAudioFormat>> ChannelReceive::GetReceiveCodec()
const { … }
void ChannelReceive::SetReceiveCodecs(
const std::map<int, SdpAudioFormat>& codecs) { … }
void ChannelReceive::OnRtpPacket(const RtpPacketReceived& packet) { … }
void ChannelReceive::ReceivePacket(const uint8_t* packet,
size_t packet_length,
const RTPHeader& header,
Timestamp receive_time) { … }
void ChannelReceive::ReceivedRTCPPacket(const uint8_t* data, size_t length) { … }
int ChannelReceive::GetSpeechOutputLevelFullRange() const { … }
double ChannelReceive::GetTotalOutputEnergy() const { … }
double ChannelReceive::GetTotalOutputDuration() const { … }
void ChannelReceive::SetChannelOutputVolumeScaling(float scaling) { … }
void ChannelReceive::RegisterReceiverCongestionControlObjects(
PacketRouter* packet_router) { … }
void ChannelReceive::ResetReceiverCongestionControlObjects() { … }
CallReceiveStatistics ChannelReceive::GetRTCPStatistics() const { … }
void ChannelReceive::SetNACKStatus(bool enable, int max_packets) { … }
void ChannelReceive::SetRtcpMode(webrtc::RtcpMode mode) { … }
void ChannelReceive::SetNonSenderRttMeasurement(bool enabled) { … }
int ChannelReceive::ResendPackets(const uint16_t* sequence_numbers,
int length) { … }
void ChannelReceive::RtcpPacketTypesCounterUpdated(
uint32_t ssrc,
const RtcpPacketTypeCounter& packet_counter) { … }
void ChannelReceive::SetAssociatedSendChannel(
const ChannelSendInterface* channel) { … }
void ChannelReceive::SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) { … }
void ChannelReceive::SetFrameDecryptor(
rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) { … }
void ChannelReceive::OnLocalSsrcChange(uint32_t local_ssrc) { … }
uint32_t ChannelReceive::GetLocalSsrc() const { … }
NetworkStatistics ChannelReceive::GetNetworkStatistics(
bool get_and_clear_legacy_stats) const { … }
AudioDecodingCallStats ChannelReceive::GetDecodingCallStatistics() const { … }
uint32_t ChannelReceive::GetDelayEstimate() const { … }
bool ChannelReceive::SetMinimumPlayoutDelay(int delay_ms) { … }
bool ChannelReceive::GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp,
int64_t* time_ms) const { … }
void ChannelReceive::SetEstimatedPlayoutNtpTimestampMs(int64_t ntp_timestamp_ms,
int64_t time_ms) { … }
absl::optional<int64_t>
ChannelReceive::GetCurrentEstimatedPlayoutNtpTimestampMs(int64_t now_ms) const { … }
bool ChannelReceive::SetBaseMinimumPlayoutDelayMs(int delay_ms) { … }
int ChannelReceive::GetBaseMinimumPlayoutDelayMs() const { … }
absl::optional<Syncable::Info> ChannelReceive::GetSyncInfo() const { … }
void ChannelReceive::UpdatePlayoutTimestamp(bool rtcp, int64_t now_ms) { … }
int ChannelReceive::GetRtpTimestampRateHz() const { … }
}
std::unique_ptr<ChannelReceiveInterface> CreateChannelReceive(
const Environment& env,
NetEqFactory* neteq_factory,
AudioDeviceModule* audio_device_module,
Transport* rtcp_send_transport,
uint32_t local_ssrc,
uint32_t remote_ssrc,
size_t jitter_buffer_max_packets,
bool jitter_buffer_fast_playout,
int jitter_buffer_min_delay_ms,
bool enable_non_sender_rtt,
rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
absl::optional<AudioCodecPairId> codec_pair_id,
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
const webrtc::CryptoOptions& crypto_options,
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) { … }
}
}