Index: webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc |
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 d5cf6163134fe98dd4b2e218553a15bd6e162317..d3957d8d6f1be7df3b82fde8c8ffd1394e2d82a1 100644 |
--- a/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc |
+++ b/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc |
@@ -25,19 +25,24 @@ namespace { |
const size_t kSampleRateHz = 16000; |
-AudioEncoderG722::Config CreateConfig(const CodecInst& codec_inst) { |
- AudioEncoderG722::Config config; |
- config.num_channels = codec_inst.channels; |
+AudioEncoderG722Config CreateConfig(const CodecInst& codec_inst) { |
+ AudioEncoderG722Config config; |
+ config.num_channels = rtc::dchecked_cast<int>(codec_inst.channels); |
config.frame_size_ms = codec_inst.pacsize / 16; |
- config.payload_type = codec_inst.pltype; |
return config; |
} |
-AudioEncoderG722::Config CreateConfig(int payload_type, |
- const SdpAudioFormat& format) { |
- AudioEncoderG722::Config config; |
- config.payload_type = payload_type; |
- config.num_channels = format.num_channels; |
+} // namespace |
+ |
+rtc::Optional<AudioEncoderG722Config> AudioEncoderG722::SdpToConfig( |
+ const SdpAudioFormat& format) { |
+ if (STR_CASE_CMP(format.name.c_str(), "g722") != 0 || |
+ format.clockrate_hz != 8000) { |
+ return rtc::Optional<AudioEncoderG722Config>(); |
+ } |
+ |
+ AudioEncoderG722Config config; |
+ config.num_channels = rtc::dchecked_cast<int>(format.num_channels); |
auto ptime_iter = format.parameters.find("ptime"); |
if (ptime_iter != format.parameters.end()) { |
auto ptime = rtc::StringToNumber<int>(ptime_iter->second); |
@@ -46,19 +51,14 @@ AudioEncoderG722::Config CreateConfig(int payload_type, |
config.frame_size_ms = std::max(10, std::min(whole_packets * 10, 60)); |
} |
} |
- return config; |
-} |
- |
-} // namespace |
- |
-bool AudioEncoderG722::Config::IsOk() const { |
- return (frame_size_ms > 0) && (frame_size_ms % 10 == 0) && |
- (num_channels >= 1); |
+ return config.IsOk() ? rtc::Optional<AudioEncoderG722Config>(config) |
+ : rtc::Optional<AudioEncoderG722Config>(); |
} |
-AudioEncoderG722::AudioEncoderG722(const Config& config) |
+AudioEncoderG722::AudioEncoderG722(const AudioEncoderG722Config& config, |
+ int payload_type) |
: num_channels_(config.num_channels), |
- payload_type_(config.payload_type), |
+ payload_type_(payload_type), |
num_10ms_frames_per_packet_( |
static_cast<size_t>(config.frame_size_ms / 10)), |
num_10ms_frames_buffered_(0), |
@@ -76,21 +76,23 @@ AudioEncoderG722::AudioEncoderG722(const Config& config) |
} |
AudioEncoderG722::AudioEncoderG722(const CodecInst& codec_inst) |
- : AudioEncoderG722(CreateConfig(codec_inst)) {} |
+ : AudioEncoderG722(CreateConfig(codec_inst), codec_inst.pltype) {} |
AudioEncoderG722::AudioEncoderG722(int payload_type, |
const SdpAudioFormat& format) |
- : AudioEncoderG722(CreateConfig(payload_type, format)) {} |
+ : AudioEncoderG722(*SdpToConfig(format), payload_type) {} |
AudioEncoderG722::~AudioEncoderG722() = default; |
rtc::Optional<AudioCodecInfo> AudioEncoderG722::QueryAudioEncoder( |
const SdpAudioFormat& format) { |
if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0) { |
- Config config = CreateConfig(0, format); |
- if (format.clockrate_hz == 8000 && config.IsOk()) { |
+ const auto config_opt = SdpToConfig(format); |
+ if (format.clockrate_hz == 8000 && config_opt) { |
+ RTC_DCHECK(config_opt->IsOk()); |
return rtc::Optional<AudioCodecInfo>( |
- {rtc::dchecked_cast<int>(kSampleRateHz), config.num_channels, 64000}); |
+ {rtc::dchecked_cast<int>(kSampleRateHz), |
+ rtc::dchecked_cast<size_t>(config_opt->num_channels), 64000}); |
} |
} |
return rtc::Optional<AudioCodecInfo>(); |