Index: webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc |
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 cafd3e851bd376cf37aef2a9633b7bfa887fbcd7..442ea662dd336b89c562f61f74de412b2b4addf4 100644 |
--- a/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc |
+++ b/webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc |
@@ -10,7 +10,11 @@ |
#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h" |
+#include <algorithm> |
+ |
#include "webrtc/base/checks.h" |
+#include "webrtc/base/safe_conversions.h" |
+#include "webrtc/base/string_to_number.h" |
#include "webrtc/common_types.h" |
#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h" |
@@ -40,6 +44,24 @@ AudioEncoderPcm16B::Config CreateConfig(const CodecInst& codec_inst) { |
config.payload_type = codec_inst.pltype; |
return config; |
} |
+ |
+AudioEncoderPcm16B::Config CreateConfig(int payload_type, |
+ const SdpAudioFormat& format) { |
+ AudioEncoderPcm16B::Config config; |
+ config.num_channels = format.num_channels; |
+ config.sample_rate_hz = format.clockrate_hz; |
+ config.frame_size_ms = 10; |
+ 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(10, std::min(whole_packets * 10, 60)); |
+ } |
+ } |
+ config.payload_type = payload_type; |
+ return config; |
+} |
} // namespace |
bool AudioEncoderPcm16B::Config::IsOk() const { |
@@ -52,4 +74,23 @@ bool AudioEncoderPcm16B::Config::IsOk() const { |
AudioEncoderPcm16B::AudioEncoderPcm16B(const CodecInst& codec_inst) |
: AudioEncoderPcm16B(CreateConfig(codec_inst)) {} |
+AudioEncoderPcm16B::AudioEncoderPcm16B(int payload_type, |
+ const SdpAudioFormat& format) |
+ : AudioEncoderPcm16B(CreateConfig(payload_type, format)) {} |
+ |
+rtc::Optional<AudioCodecInfo> AudioEncoderPcm16B::QueryAudioEncoder( |
+ const SdpAudioFormat& format) { |
+ if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0 && |
+ format.num_channels >= 1) { |
+ Config config = CreateConfig(0, format); |
+ if (config.IsOk()) { |
+ return rtc::Optional<AudioCodecInfo>( |
+ {config.sample_rate_hz, config.num_channels, |
+ config.sample_rate_hz * 2 * |
+ rtc::dchecked_cast<int>(config.num_channels)}); |
+ } |
+ } |
+ return rtc::Optional<AudioCodecInfo>(); |
+} |
+ |
} // namespace webrtc |