#include "call/call.h"
#include <string.h>
#include <algorithm>
#include <atomic>
#include <cstdint>
#include <map>
#include <memory>
#include <set>
#include <utility>
#include <vector>
#include "absl/functional/bind_front.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/media_types.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/transport/network_control.h"
#include "api/units/time_delta.h"
#include "audio/audio_receive_stream.h"
#include "audio/audio_send_stream.h"
#include "audio/audio_state.h"
#include "call/adaptation/broadcast_resource_listener.h"
#include "call/bitrate_allocator.h"
#include "call/flexfec_receive_stream_impl.h"
#include "call/packet_receiver.h"
#include "call/receive_time_calculator.h"
#include "call/rtp_stream_receiver_controller.h"
#include "call/rtp_transport_controller_send.h"
#include "call/rtp_transport_controller_send_factory.h"
#include "call/version.h"
#include "logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h"
#include "logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h"
#include "logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h"
#include "logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h"
#include "logging/rtc_event_log/events/rtc_event_video_send_stream_config.h"
#include "logging/rtc_event_log/rtc_stream_config.h"
#include "modules/congestion_controller/include/receive_side_congestion_controller.h"
#include "modules/rtp_rtcp/include/flexfec_receiver.h"
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
#include "modules/rtp_rtcp/source/byte_io.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_util.h"
#include "modules/video_coding/fec_controller_default.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/system/no_unique_address.h"
#include "rtc_base/task_utils/repeating_task.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/trace_event.h"
#include "system_wrappers/include/clock.h"
#include "system_wrappers/include/cpu_info.h"
#include "system_wrappers/include/metrics.h"
#include "video/call_stats2.h"
#include "video/send_delay_stats.h"
#include "video/stats_counter.h"
#include "video/video_receive_stream2.h"
#include "video/video_send_stream_impl.h"
namespace webrtc {
namespace {
const int* FindKeyByValue(const std::map<int, int>& m, int v) { … }
std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
const VideoReceiveStreamInterface::Config& config) { … }
std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
const VideoSendStream::Config& config,
size_t ssrc_index) { … }
std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
const AudioReceiveStreamInterface::Config& config) { … }
TaskQueueBase* GetCurrentTaskQueueOrThread() { … }
}
namespace internal {
class ResourceVideoSendStreamForwarder { … };
class Call final : public webrtc::Call,
public PacketReceiver,
public TargetTransferRateObserver,
public BitrateAllocator::LimitObserver { … };
}
std::string Call::Stats::ToString(int64_t time_ms) const { … }
std::unique_ptr<Call> Call::Create(CallConfig config) { … }
VideoSendStream* Call::CreateVideoSendStream(
VideoSendStream::Config config,
VideoEncoderConfig encoder_config,
std::unique_ptr<FecController> fec_controller) { … }
namespace internal {
Call::ReceiveStats::ReceiveStats(Clock* clock)
: … { … }
void Call::ReceiveStats::AddReceivedRtcpBytes(int bytes) { … }
void Call::ReceiveStats::AddReceivedAudioBytes(int bytes,
webrtc::Timestamp arrival_time) { … }
void Call::ReceiveStats::AddReceivedVideoBytes(int bytes,
webrtc::Timestamp arrival_time) { … }
Call::ReceiveStats::~ReceiveStats() { … }
Call::SendStats::SendStats(Clock* clock)
: … { … }
Call::SendStats::~SendStats() { … }
void Call::SendStats::SetFirstPacketTime(
absl::optional<Timestamp> first_sent_packet_time) { … }
void Call::SendStats::PauseSendAndPacerBitrateCounters() { … }
void Call::SendStats::AddTargetBitrateSample(uint32_t target_bitrate_bps) { … }
void Call::SendStats::SetMinAllocatableRate(BitrateAllocationLimits limits) { … }
Call::Call(CallConfig config,
std::unique_ptr<RtpTransportControllerSendInterface> transport_send)
: … { … }
Call::~Call() { … }
void Call::EnsureStarted() { … }
void Call::SetClientBitratePreferences(const BitrateSettings& preferences) { … }
PacketReceiver* Call::Receiver() { … }
webrtc::AudioSendStream* Call::CreateAudioSendStream(
const webrtc::AudioSendStream::Config& config) { … }
void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { … }
webrtc::AudioReceiveStreamInterface* Call::CreateAudioReceiveStream(
const webrtc::AudioReceiveStreamInterface::Config& config) { … }
void Call::DestroyAudioReceiveStream(
webrtc::AudioReceiveStreamInterface* receive_stream) { … }
webrtc::VideoSendStream* Call::CreateVideoSendStream(
webrtc::VideoSendStream::Config config,
VideoEncoderConfig encoder_config,
std::unique_ptr<FecController> fec_controller) { … }
webrtc::VideoSendStream* Call::CreateVideoSendStream(
webrtc::VideoSendStream::Config config,
VideoEncoderConfig encoder_config) { … }
void Call::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) { … }
webrtc::VideoReceiveStreamInterface* Call::CreateVideoReceiveStream(
webrtc::VideoReceiveStreamInterface::Config configuration) { … }
void Call::DestroyVideoReceiveStream(
webrtc::VideoReceiveStreamInterface* receive_stream) { … }
FlexfecReceiveStream* Call::CreateFlexfecReceiveStream(
const FlexfecReceiveStream::Config config) { … }
void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { … }
void Call::AddAdaptationResource(rtc::scoped_refptr<Resource> resource) { … }
RtpTransportControllerSendInterface* Call::GetTransportControllerSend() { … }
Call::Stats Call::GetStats() const { … }
const FieldTrialsView& Call::trials() const { … }
TaskQueueBase* Call::network_thread() const { … }
TaskQueueBase* Call::worker_thread() const { … }
void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { … }
void Call::OnAudioTransportOverheadChanged(int transport_overhead_per_packet) { … }
void Call::UpdateAggregateNetworkState() { … }
void Call::OnLocalSsrcUpdated(webrtc::AudioReceiveStreamInterface& stream,
uint32_t local_ssrc) { … }
void Call::OnLocalSsrcUpdated(VideoReceiveStreamInterface& stream,
uint32_t local_ssrc) { … }
void Call::OnLocalSsrcUpdated(FlexfecReceiveStream& stream,
uint32_t local_ssrc) { … }
void Call::OnUpdateSyncGroup(webrtc::AudioReceiveStreamInterface& stream,
absl::string_view sync_group) { … }
void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { … }
void Call::OnStartRateUpdate(DataRate start_rate) { … }
void Call::OnTargetTransferRate(TargetTransferRate msg) { … }
void Call::OnAllocationLimitsChanged(BitrateAllocationLimits limits) { … }
AudioReceiveStreamImpl* Call::FindAudioStreamForSyncGroup(
absl::string_view sync_group) { … }
void Call::ConfigureSync(absl::string_view sync_group) { … }
void Call::DeliverRtcpPacket(rtc::CopyOnWriteBuffer packet) { … }
void Call::DeliverRtpPacket(
MediaType media_type,
RtpPacketReceived packet,
OnUndemuxablePacketHandler undemuxable_packet_handler) { … }
void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet,
MediaType media_type) { … }
}
}