diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc index 4aae5880b4..bc7197d8e7 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc @@ -29,6 +29,18 @@ namespace webrtc { +namespace { + +// Adds a codec usage sample to the histogram. +void UpdateCodecTypeHistogram(size_t codec_type) { + RTC_HISTOGRAM_ENUMERATION( + "WebRTC.Audio.Encoder.CodecType", static_cast(codec_type), + static_cast( + webrtc::AudioEncoder::CodecType::kMaxLoggedAudioCodecTypes)); +} + +} // namespace + namespace acm2 { struct EncoderFactory { @@ -185,7 +197,9 @@ AudioCodingModuleImpl::AudioCodingModuleImpl( first_10ms_data_(false), first_frame_(true), packetization_callback_(NULL), - vad_callback_(NULL) { + vad_callback_(NULL), + codec_histogram_bins_log_(), + number_of_consecutive_empty_packets_(0) { if (InitializeReceiverSafe() < 0) { WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_, "Cannot initialize receiver"); @@ -231,6 +245,20 @@ int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) { } previous_pltype = previous_pltype_; // Read it while we have the critsect. + // Log codec type to histogram once every 500 packets. + if (encoded_info.encoded_bytes == 0) { + ++number_of_consecutive_empty_packets_; + } else { + size_t codec_type = static_cast(encoded_info.encoder_type); + codec_histogram_bins_log_[codec_type] += + number_of_consecutive_empty_packets_ + 1; + number_of_consecutive_empty_packets_ = 0; + if (codec_histogram_bins_log_[codec_type] >= 500) { + codec_histogram_bins_log_[codec_type] -= 500; + UpdateCodecTypeHistogram(codec_type); + } + } + RTPFragmentationHeader my_fragmentation; ConvertEncodedInfoToFragmentationHeader(encoded_info, &my_fragmentation); FrameType frame_type; diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h index 864e4f69a3..c098e62b99 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h @@ -23,6 +23,7 @@ #include "webrtc/modules/audio_coding/acm2/acm_receiver.h" #include "webrtc/modules/audio_coding/acm2/acm_resampler.h" #include "webrtc/modules/audio_coding/acm2/codec_manager.h" +#include "webrtc/modules/audio_coding/codecs/audio_encoder.h" namespace webrtc { @@ -298,6 +299,10 @@ class AudioCodingModuleImpl final : public AudioCodingModule { AudioPacketizationCallback* packetization_callback_ GUARDED_BY(callback_crit_sect_); ACMVADCallback* vad_callback_ GUARDED_BY(callback_crit_sect_); + + int codec_histogram_bins_log_[static_cast( + AudioEncoder::CodecType::kMaxLoggedAudioCodecTypes)]; + int number_of_consecutive_empty_packets_; }; } // namespace acm2 diff --git a/webrtc/modules/audio_coding/codecs/audio_encoder.h b/webrtc/modules/audio_coding/codecs/audio_encoder.h index c1c3cb3d2a..f4c5794d92 100644 --- a/webrtc/modules/audio_coding/codecs/audio_encoder.h +++ b/webrtc/modules/audio_coding/codecs/audio_encoder.h @@ -25,12 +25,32 @@ namespace webrtc { // type must have an implementation of this class. class AudioEncoder { public: + // Used for UMA logging of codec usage. The same codecs, with the + // same values, must be listed in + // src/tools/metrics/histograms/histograms.xml in chromium to log + // correct values. + enum class CodecType { + kOther = 0, // Codec not specified, and/or not listed in this enum + kOpus = 1, + kIsac = 2, + kPcmA = 3, + kPcmU = 4, + kG722 = 5, + kIlbc = 6, + + // Number of histogram bins in the UMA logging of codec types. The + // total number of different codecs that are logged cannot exceed this + // number. + kMaxLoggedAudioCodecTypes + }; + struct EncodedInfoLeaf { size_t encoded_bytes = 0; uint32_t encoded_timestamp = 0; int payload_type = 0; bool send_even_if_empty = false; bool speech = true; + CodecType encoder_type = CodecType::kOther; }; // This is the main struct for auxiliary encoding information. Each encoded diff --git a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc index e4da8d7440..baa5d382d3 100644 --- a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc +++ b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc @@ -96,6 +96,7 @@ AudioEncoder::EncodedInfo AudioEncoderPcm::EncodeImpl( encoded.data()); }); speech_buffer_.clear(); + info.encoder_type = GetCodecType(); return info; } @@ -116,6 +117,10 @@ size_t AudioEncoderPcmA::BytesPerSample() const { return 1; } +AudioEncoder::CodecType AudioEncoderPcmA::GetCodecType() const { + return AudioEncoder::CodecType::kPcmA; +} + AudioEncoderPcmU::AudioEncoderPcmU(const CodecInst& codec_inst) : AudioEncoderPcmU(CreateConfig(codec_inst)) {} @@ -129,4 +134,8 @@ size_t AudioEncoderPcmU::BytesPerSample() const { return 1; } +AudioEncoder::CodecType AudioEncoderPcmU::GetCodecType() const { + return AudioEncoder::CodecType::kPcmU; +} + } // namespace webrtc diff --git a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h index eb5ad02878..721344528f 100644 --- a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h +++ b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h @@ -55,6 +55,10 @@ class AudioEncoderPcm : public AudioEncoder { virtual size_t BytesPerSample() const = 0; + // Used to set EncodedInfoLeaf::encoder_type in + // AudioEncoderPcm::EncodeImpl + virtual AudioEncoder::CodecType GetCodecType() const = 0; + private: const int sample_rate_hz_; const size_t num_channels_; @@ -84,6 +88,8 @@ class AudioEncoderPcmA final : public AudioEncoderPcm { size_t BytesPerSample() const override; + AudioEncoder::CodecType GetCodecType() const override; + private: static const int kSampleRateHz = 8000; RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmA); @@ -106,6 +112,8 @@ class AudioEncoderPcmU final : public AudioEncoderPcm { size_t BytesPerSample() const override; + AudioEncoder::CodecType GetCodecType() const override; + private: static const int kSampleRateHz = 8000; RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmU); diff --git a/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc b/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc index 256013266d..1f3936c8ee 100644 --- a/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc +++ b/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc @@ -145,6 +145,7 @@ AudioEncoder::EncodedInfo AudioEncoderG722::EncodeImpl( }); info.encoded_timestamp = first_timestamp_in_buffer_; info.payload_type = payload_type_; + info.encoder_type = CodecType::kG722; return info; } diff --git a/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc b/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc index 45401a1280..ca11587dfa 100644 --- a/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc +++ b/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc @@ -127,6 +127,7 @@ AudioEncoder::EncodedInfo AudioEncoderIlbc::EncodeImpl( info.encoded_bytes = encoded_bytes; info.encoded_timestamp = first_timestamp_in_buffer_; info.payload_type = config_.payload_type; + info.encoder_type = CodecType::kIlbc; return info; } diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h index 1f95e5980e..b6a1747c39 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h @@ -145,6 +145,7 @@ AudioEncoder::EncodedInfo AudioEncoderIsacT::EncodeImpl( info.encoded_bytes = encoded_bytes; info.encoded_timestamp = packet_timestamp_; info.payload_type = config_.payload_type; + info.encoder_type = CodecType::kIsac; return info; } diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc index 9a120f55c6..a2497c7862 100644 --- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc +++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc @@ -212,6 +212,7 @@ AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl( info.payload_type = config_.payload_type; info.send_even_if_empty = true; // Allows Opus to send empty packets. info.speech = (info.encoded_bytes > 0); + info.encoder_type = CodecType::kOpus; return info; } diff --git a/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc b/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc index f4d4022302..cafd3e851b 100644 --- a/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc +++ b/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc @@ -26,6 +26,10 @@ size_t AudioEncoderPcm16B::BytesPerSample() const { return 2; } +AudioEncoder::CodecType AudioEncoderPcm16B::GetCodecType() const { + return CodecType::kOther; +} + namespace { AudioEncoderPcm16B::Config CreateConfig(const CodecInst& codec_inst) { AudioEncoderPcm16B::Config config; diff --git a/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h b/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h index 9eb3b61fae..bdc27a67e3 100644 --- a/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h +++ b/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h @@ -39,6 +39,8 @@ class AudioEncoderPcm16B final : public AudioEncoderPcm { size_t BytesPerSample() const override; + AudioEncoder::CodecType GetCodecType() const override; + private: RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcm16B); };