/* * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/audio_coding/audio_network_adaptor/debug_dump_writer.h" #include #include "absl/types/optional.h" #include "rtc_base/checks.h" #include "rtc_base/ignore_wundef.h" #include "rtc_base/numerics/safe_conversions.h" #include "rtc_base/system/file_wrapper.h" #if WEBRTC_ENABLE_PROTOBUF RTC_PUSH_IGNORING_WUNDEF() #ifdef WEBRTC_ANDROID_PLATFORM_BUILD #include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/debug_dump.pb.h" #else #include "modules/audio_coding/audio_network_adaptor/debug_dump.pb.h" #endif RTC_POP_IGNORING_WUNDEF() #endif namespace webrtc { #if WEBRTC_ENABLE_PROTOBUF namespace { using audio_network_adaptor::debug_dump::EncoderRuntimeConfig; using audio_network_adaptor::debug_dump::Event; using audio_network_adaptor::debug_dump::NetworkMetrics; void DumpEventToFile(const Event& event, FileWrapper* dump_file) { RTC_CHECK(dump_file->is_open()); std::string dump_data; event.SerializeToString(&dump_data); int32_t size = rtc::checked_cast(event.ByteSizeLong()); dump_file->Write(&size, sizeof(size)); dump_file->Write(dump_data.data(), dump_data.length()); } } // namespace #endif // WEBRTC_ENABLE_PROTOBUF class DebugDumpWriterImpl final : public DebugDumpWriter { public: explicit DebugDumpWriterImpl(FILE* file_handle); ~DebugDumpWriterImpl() override = default; void DumpEncoderRuntimeConfig(const AudioEncoderRuntimeConfig& config, int64_t timestamp) override; void DumpNetworkMetrics(const Controller::NetworkMetrics& metrics, int64_t timestamp) override; #if WEBRTC_ENABLE_PROTOBUF void DumpControllerManagerConfig( const audio_network_adaptor::config::ControllerManager& controller_manager_config, int64_t timestamp) override; #endif private: FileWrapper dump_file_; }; DebugDumpWriterImpl::DebugDumpWriterImpl(FILE* file_handle) { #if WEBRTC_ENABLE_PROTOBUF dump_file_ = FileWrapper(file_handle); RTC_CHECK(dump_file_.is_open()); #else RTC_DCHECK_NOTREACHED(); #endif } void DebugDumpWriterImpl::DumpNetworkMetrics( const Controller::NetworkMetrics& metrics, int64_t timestamp) { #if WEBRTC_ENABLE_PROTOBUF Event event; event.set_timestamp(timestamp); event.set_type(Event::NETWORK_METRICS); auto dump_metrics = event.mutable_network_metrics(); if (metrics.uplink_bandwidth_bps) dump_metrics->set_uplink_bandwidth_bps(*metrics.uplink_bandwidth_bps); if (metrics.uplink_packet_loss_fraction) { dump_metrics->set_uplink_packet_loss_fraction( *metrics.uplink_packet_loss_fraction); } if (metrics.target_audio_bitrate_bps) { dump_metrics->set_target_audio_bitrate_bps( *metrics.target_audio_bitrate_bps); } if (metrics.rtt_ms) dump_metrics->set_rtt_ms(*metrics.rtt_ms); DumpEventToFile(event, &dump_file_); #endif // WEBRTC_ENABLE_PROTOBUF } void DebugDumpWriterImpl::DumpEncoderRuntimeConfig( const AudioEncoderRuntimeConfig& config, int64_t timestamp) { #if WEBRTC_ENABLE_PROTOBUF Event event; event.set_timestamp(timestamp); event.set_type(Event::ENCODER_RUNTIME_CONFIG); auto dump_config = event.mutable_encoder_runtime_config(); if (config.bitrate_bps) dump_config->set_bitrate_bps(*config.bitrate_bps); if (config.frame_length_ms) dump_config->set_frame_length_ms(*config.frame_length_ms); if (config.uplink_packet_loss_fraction) { dump_config->set_uplink_packet_loss_fraction( *config.uplink_packet_loss_fraction); } if (config.enable_fec) dump_config->set_enable_fec(*config.enable_fec); if (config.enable_dtx) dump_config->set_enable_dtx(*config.enable_dtx); if (config.num_channels) dump_config->set_num_channels(*config.num_channels); DumpEventToFile(event, &dump_file_); #endif // WEBRTC_ENABLE_PROTOBUF } #if WEBRTC_ENABLE_PROTOBUF void DebugDumpWriterImpl::DumpControllerManagerConfig( const audio_network_adaptor::config::ControllerManager& controller_manager_config, int64_t timestamp) { Event event; event.set_timestamp(timestamp); event.set_type(Event::CONTROLLER_MANAGER_CONFIG); event.mutable_controller_manager_config()->CopyFrom( controller_manager_config); DumpEventToFile(event, &dump_file_); } #endif // WEBRTC_ENABLE_PROTOBUF std::unique_ptr DebugDumpWriter::Create(FILE* file_handle) { return std::unique_ptr(new DebugDumpWriterImpl(file_handle)); } } // namespace webrtc