before rebase

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7563 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
minyue@webrtc.org 2014-10-30 07:19:57 +00:00
parent 0b62672576
commit c673bb9f29

View File

@ -117,6 +117,15 @@ static const int kNackMaxPackets = 250;
// Codec parameters for Opus. // Codec parameters for Opus.
// draft-spittka-payload-rtp-opus-03 // draft-spittka-payload-rtp-opus-03
// Recommended bitrates:
// 8-12 kb/s for NB speech,
// 16-20 kb/s for WB speech,
// 28-40 kb/s for FB speech,
// 48-64 kb/s for FB mono music, and
// 64-128 kb/s for FB stereo music.
// The current implementation applies the following values to mono signals,
// and multiplies them by 2 for stereo.
static const int kOpusBitrateNb = 12000; static const int kOpusBitrateNb = 12000;
static const int kOpusBitrateWb = 20000; static const int kOpusBitrateWb = 20000;
static const int kOpusBitrateFb = 32000; static const int kOpusBitrateFb = 32000;
@ -413,7 +422,7 @@ static bool IsOpusStereoEnabled(const AudioCodec& codec) {
// otherwise. If the value (either from params or codec.bitrate) <=0, use the // otherwise. If the value (either from params or codec.bitrate) <=0, use the
// default configuration. If the value is beyond feasible bit rate of Opus, // default configuration. If the value is beyond feasible bit rate of Opus,
// clamp it. Returns the Opus bit rate for operation. // clamp it. Returns the Opus bit rate for operation.
static int GetOpusBitrate(const AudioCodec& codec) { static int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) {
int bitrate = 0; int bitrate = 0;
bool use_param = true; bool use_param = true;
if (!codec.GetParam(kCodecParamMaxAverageBitrate, &bitrate)) { if (!codec.GetParam(kCodecParamMaxAverageBitrate, &bitrate)) {
@ -421,8 +430,17 @@ static int GetOpusBitrate(const AudioCodec& codec) {
use_param = false; use_param = false;
} }
if (bitrate <= 0) { if (bitrate <= 0) {
bitrate = IsOpusStereoEnabled(codec) ? kOpusStereoBitrate : if (max_playback_rate <= 8000) {
kOpusMonoBitrate; bitrate = kOpusBitrateNb;
} else if (max_playback_rate <= 16000) {
bitrate = kOpusBitrateWb;
} else {
bitrate = kOpusBitrateFb;
}
if (IsOpusStereoEnabled(codec)) {
bitrate *= 2;
}
} else if (bitrate < kOpusMinBitrate || bitrate > kOpusMaxBitrate) { } else if (bitrate < kOpusMinBitrate || bitrate > kOpusMaxBitrate) {
bitrate = (bitrate < kOpusMinBitrate) ? kOpusMinBitrate : kOpusMaxBitrate; bitrate = (bitrate < kOpusMinBitrate) ? kOpusMinBitrate : kOpusMaxBitrate;
std::string rate_source = std::string rate_source =
@ -463,11 +481,8 @@ static void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec,
// the bitrate is not specified, i.e. is <= zero, we set it to the // the bitrate is not specified, i.e. is <= zero, we set it to the
// appropriate default value for mono or stereo Opus. // appropriate default value for mono or stereo Opus.
// TODO(minyue): The determination of bit rate might take the maximum playback
// rate into account.
voe_codec->channels = IsOpusStereoEnabled(codec) ? 2 : 1; voe_codec->channels = IsOpusStereoEnabled(codec) ? 2 : 1;
voe_codec->rate = GetOpusBitrate(codec); voe_codec->rate = GetOpusBitrate(codec, *max_playback_rate);
} }
void WebRtcVoiceEngine::ConstructCodecs() { void WebRtcVoiceEngine::ConstructCodecs() {