Index: webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc |
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 6ed445a97e466c397e744fdc93e6ed3092971cbc..0dc9bb4d1c0d09f7fb68b066f255fa808e0c3b49 100644 |
--- a/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc |
+++ b/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc |
@@ -24,34 +24,20 @@ namespace { |
const int kSampleRateHz = 8000; |
-AudioEncoderIlbc::Config CreateConfig(const CodecInst& codec_inst) { |
- AudioEncoderIlbc::Config config; |
+AudioEncoderIlbcConfig CreateConfig(const CodecInst& codec_inst) { |
+ AudioEncoderIlbcConfig config; |
config.frame_size_ms = codec_inst.pacsize / 8; |
- config.payload_type = codec_inst.pltype; |
- return config; |
-} |
- |
-AudioEncoderIlbc::Config CreateConfig(int payload_type, |
- const SdpAudioFormat& format) { |
- AudioEncoderIlbc::Config config; |
- config.payload_type = payload_type; |
- auto ptime_iter = format.parameters.find("ptime"); |
- if (ptime_iter != format.parameters.end()) { |
- auto ptime = rtc::StringToNumber<int>(ptime_iter->second); |
- if (ptime && *ptime > 0) { |
- const int whole_packets = *ptime / 10; |
- config.frame_size_ms = std::max(20, std::min(whole_packets * 10, 60)); |
- } |
- } |
return config; |
} |
int GetIlbcBitrate(int ptime) { |
switch (ptime) { |
- case 20: case 40: |
+ case 20: |
+ case 40: |
// 38 bytes per frame of 20 ms => 15200 bits/s. |
return 15200; |
- case 30: case 60: |
+ case 30: |
+ case 60: |
// 50 bytes per frame of 30 ms => (approx) 13333 bits/s. |
return 13333; |
default: |
@@ -61,71 +47,85 @@ int GetIlbcBitrate(int ptime) { |
} // namespace |
-// static |
-const size_t AudioEncoderIlbc::kMaxSamplesPerPacket; |
+rtc::Optional<AudioEncoderIlbcConfig> AudioEncoderIlbcImpl::SdpToConfig( |
+ const SdpAudioFormat& format) { |
+ if (STR_CASE_CMP(format.name.c_str(), "ilbc") != 0 || |
+ format.clockrate_hz != 8000 || format.num_channels != 1) { |
+ return rtc::Optional<AudioEncoderIlbcConfig>(); |
+ } |
-bool AudioEncoderIlbc::Config::IsOk() const { |
- return (frame_size_ms == 20 || frame_size_ms == 30 || frame_size_ms == 40 || |
- frame_size_ms == 60) && |
- static_cast<size_t>(kSampleRateHz / 100 * (frame_size_ms / 10)) <= |
- kMaxSamplesPerPacket; |
+ AudioEncoderIlbcConfig config; |
+ auto ptime_iter = format.parameters.find("ptime"); |
+ if (ptime_iter != format.parameters.end()) { |
+ auto ptime = rtc::StringToNumber<int>(ptime_iter->second); |
+ if (ptime && *ptime > 0) { |
+ const int whole_packets = *ptime / 10; |
+ config.frame_size_ms = std::max(20, std::min(whole_packets * 10, 60)); |
+ } |
+ } |
+ return config.IsOk() ? rtc::Optional<AudioEncoderIlbcConfig>(config) |
+ : rtc::Optional<AudioEncoderIlbcConfig>(); |
} |
-AudioEncoderIlbc::AudioEncoderIlbc(const Config& config) |
- : config_(config), |
+AudioEncoderIlbcImpl::AudioEncoderIlbcImpl(const AudioEncoderIlbcConfig& config, |
+ int payload_type) |
+ : frame_size_ms_(config.frame_size_ms), |
+ payload_type_(payload_type), |
num_10ms_frames_per_packet_( |
static_cast<size_t>(config.frame_size_ms / 10)), |
encoder_(nullptr) { |
+ RTC_CHECK(config.IsOk()); |
Reset(); |
} |
-AudioEncoderIlbc::AudioEncoderIlbc(const CodecInst& codec_inst) |
- : AudioEncoderIlbc(CreateConfig(codec_inst)) {} |
+AudioEncoderIlbcImpl::AudioEncoderIlbcImpl(const CodecInst& codec_inst) |
+ : AudioEncoderIlbcImpl(CreateConfig(codec_inst), codec_inst.pltype) {} |
-AudioEncoderIlbc::AudioEncoderIlbc(int payload_type, |
- const SdpAudioFormat& format) |
- : AudioEncoderIlbc(CreateConfig(payload_type, format)) {} |
+AudioEncoderIlbcImpl::AudioEncoderIlbcImpl(int payload_type, |
+ const SdpAudioFormat& format) |
+ : AudioEncoderIlbcImpl(*SdpToConfig(format), payload_type) {} |
-rtc::Optional<AudioCodecInfo> AudioEncoderIlbc::QueryAudioEncoder( |
+AudioEncoderIlbcImpl::~AudioEncoderIlbcImpl() { |
+ RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_)); |
+} |
+ |
+rtc::Optional<AudioCodecInfo> AudioEncoderIlbcImpl::QueryAudioEncoder( |
const SdpAudioFormat& format) { |
- if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0 && |
- format.clockrate_hz == 8000 && format.num_channels == 1) { |
- Config config = CreateConfig(0, format); |
- if (config.IsOk()) { |
+ if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0) { |
+ const auto config_opt = SdpToConfig(format); |
+ if (format.clockrate_hz == 8000 && format.num_channels == 1 && |
+ config_opt) { |
+ RTC_DCHECK(config_opt->IsOk()); |
return rtc::Optional<AudioCodecInfo>( |
- {kSampleRateHz, 1, GetIlbcBitrate(config.frame_size_ms)}); |
+ {rtc::dchecked_cast<int>(kSampleRateHz), 1, |
+ GetIlbcBitrate(config_opt->frame_size_ms)}); |
} |
} |
- |
return rtc::Optional<AudioCodecInfo>(); |
} |
-AudioEncoderIlbc::~AudioEncoderIlbc() { |
- RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_)); |
-} |
- |
-int AudioEncoderIlbc::SampleRateHz() const { |
+int AudioEncoderIlbcImpl::SampleRateHz() const { |
return kSampleRateHz; |
} |
-size_t AudioEncoderIlbc::NumChannels() const { |
+size_t AudioEncoderIlbcImpl::NumChannels() const { |
return 1; |
} |
-size_t AudioEncoderIlbc::Num10MsFramesInNextPacket() const { |
+size_t AudioEncoderIlbcImpl::Num10MsFramesInNextPacket() const { |
return num_10ms_frames_per_packet_; |
} |
-size_t AudioEncoderIlbc::Max10MsFramesInAPacket() const { |
+size_t AudioEncoderIlbcImpl::Max10MsFramesInAPacket() const { |
return num_10ms_frames_per_packet_; |
} |
-int AudioEncoderIlbc::GetTargetBitrate() const { |
+int AudioEncoderIlbcImpl::GetTargetBitrate() const { |
return GetIlbcBitrate(rtc::dchecked_cast<int>(num_10ms_frames_per_packet_) * |
10); |
} |
-AudioEncoder::EncodedInfo AudioEncoderIlbc::EncodeImpl( |
+AudioEncoder::EncodedInfo AudioEncoderIlbcImpl::EncodeImpl( |
uint32_t rtp_timestamp, |
rtc::ArrayView<const int16_t> audio, |
rtc::Buffer* encoded) { |
@@ -166,24 +166,23 @@ AudioEncoder::EncodedInfo AudioEncoderIlbc::EncodeImpl( |
EncodedInfo info; |
info.encoded_bytes = encoded_bytes; |
info.encoded_timestamp = first_timestamp_in_buffer_; |
- info.payload_type = config_.payload_type; |
+ info.payload_type = payload_type_; |
info.encoder_type = CodecType::kIlbc; |
return info; |
} |
-void AudioEncoderIlbc::Reset() { |
+void AudioEncoderIlbcImpl::Reset() { |
if (encoder_) |
RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_)); |
- RTC_CHECK(config_.IsOk()); |
RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderCreate(&encoder_)); |
- const int encoder_frame_size_ms = config_.frame_size_ms > 30 |
- ? config_.frame_size_ms / 2 |
- : config_.frame_size_ms; |
+ const int encoder_frame_size_ms = frame_size_ms_ > 30 |
+ ? frame_size_ms_ / 2 |
+ : frame_size_ms_; |
RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, encoder_frame_size_ms)); |
num_10ms_frames_buffered_ = 0; |
} |
-size_t AudioEncoderIlbc::RequiredOutputSizeBytes() const { |
+size_t AudioEncoderIlbcImpl::RequiredOutputSizeBytes() const { |
switch (num_10ms_frames_per_packet_) { |
case 2: return 38; |
case 3: return 50; |