Chromium Code Reviews| Index: webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc |
| 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 baa5d382d327ef0abf16de5ffcfbd40fa5dab723..e2956caac06dff90ea733295eac74b31e1324e7d 100644 |
| --- a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc |
| +++ b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc |
| @@ -13,6 +13,7 @@ |
| #include <limits> |
| #include "webrtc/base/checks.h" |
| +#include "webrtc/base/string_to_number.h" |
| #include "webrtc/common_types.h" |
| #include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h" |
| @@ -29,6 +30,37 @@ typename T::Config CreateConfig(const CodecInst& codec_inst) { |
| return config; |
| } |
| +template <typename T> |
| +typename T::Config CreateConfig(int payload_type, |
| + const SdpAudioFormat& format) { |
| + typename T::Config config; |
| + config.frame_size_ms = 20; |
| + 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) { |
| + config.frame_size_ms = *ptime; |
| + } |
| + } |
| + config.num_channels = format.num_channels; |
| + config.payload_type = payload_type; |
| + return config; |
| +} |
| + |
| +template <typename T> |
| +rtc::Optional<AudioFormatInfo> QueryAudioFormatImpl( |
| + const SdpAudioFormat& format) { |
| + if (STR_CASE_CMP(format.name.c_str(), T::GetPayloadName()) == 0 && |
| + format.clockrate_hz == 8000 && format.num_channels >= 1) { |
| + typename T::Config config = CreateConfig<T>(0, format); |
| + if (config.IsOk()) { |
|
kwiberg-webrtc
2017/02/19 21:41:10
if (CreateConfig<T>(0, format).IsOk()) {
And then
ossu
2017/02/20 12:20:26
Alright.
|
| + return rtc::Optional<AudioFormatInfo>({8000, format.num_channels, 64000}); |
| + } |
| + } |
| + return rtc::Optional<AudioFormatInfo>(); |
| +} |
| + |
| + |
| } // namespace |
| bool AudioEncoderPcm::Config::IsOk() const { |
| @@ -107,6 +139,15 @@ void AudioEncoderPcm::Reset() { |
| AudioEncoderPcmA::AudioEncoderPcmA(const CodecInst& codec_inst) |
| : AudioEncoderPcmA(CreateConfig<AudioEncoderPcmA>(codec_inst)) {} |
| +AudioEncoderPcmA::AudioEncoderPcmA(int payload_type, |
| + const SdpAudioFormat& format) |
| + : AudioEncoderPcmA(CreateConfig<AudioEncoderPcmA>(payload_type, format)) {} |
| + |
| +rtc::Optional<AudioFormatInfo> AudioEncoderPcmA::QueryAudioFormat( |
| + const SdpAudioFormat& format) { |
| + return QueryAudioFormatImpl<AudioEncoderPcmA>(format); |
| +} |
| + |
| size_t AudioEncoderPcmA::EncodeCall(const int16_t* audio, |
| size_t input_len, |
| uint8_t* encoded) { |
| @@ -124,6 +165,15 @@ AudioEncoder::CodecType AudioEncoderPcmA::GetCodecType() const { |
| AudioEncoderPcmU::AudioEncoderPcmU(const CodecInst& codec_inst) |
| : AudioEncoderPcmU(CreateConfig<AudioEncoderPcmU>(codec_inst)) {} |
| +AudioEncoderPcmU::AudioEncoderPcmU(int payload_type, |
| + const SdpAudioFormat& format) |
| + : AudioEncoderPcmU(CreateConfig<AudioEncoderPcmU>(payload_type, format)) {} |
| + |
| +rtc::Optional<AudioFormatInfo> AudioEncoderPcmU::QueryAudioFormat( |
| + const SdpAudioFormat& format) { |
| + return QueryAudioFormatImpl<AudioEncoderPcmU>(format); |
| +} |
| + |
| size_t AudioEncoderPcmU::EncodeCall(const int16_t* audio, |
| size_t input_len, |
| uint8_t* encoded) { |