Add support for 40 and 60 ms frames to AudioEncoderIlbc

BUG=3926
COAUTHOR:kwiberg@webrtc.org

R=tina.legrand@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/37789004

Cr-Commit-Position: refs/heads/master@{#8182}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8182 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
henrik.lundin@webrtc.org 2015-01-28 13:16:31 +00:00
parent 2a6558c2a5
commit 4aecd008dd
2 changed files with 28 additions and 7 deletions

View File

@ -27,12 +27,16 @@ AudioEncoderIlbc::AudioEncoderIlbc(const Config& config)
: payload_type_(config.payload_type),
num_10ms_frames_per_packet_(config.frame_size_ms / 10),
num_10ms_frames_buffered_(0) {
CHECK(config.frame_size_ms == 20 || config.frame_size_ms == 30)
<< "Frame size must be 20 or 30 ms.";
CHECK(config.frame_size_ms == 20 || config.frame_size_ms == 30 ||
config.frame_size_ms == 40 || config.frame_size_ms == 60)
<< "Frame size must be 20, 30, 40, or 60 ms.";
DCHECK_LE(kSampleRateHz / 100 * num_10ms_frames_per_packet_,
kMaxSamplesPerPacket);
CHECK_EQ(0, WebRtcIlbcfix_EncoderCreate(&encoder_));
CHECK_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, config.frame_size_ms));
const int encoder_frame_size_ms = config.frame_size_ms > 30
? config.frame_size_ms / 2
: config.frame_size_ms;
CHECK_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, encoder_frame_size_ms));
}
AudioEncoderIlbc::~AudioEncoderIlbc() {
@ -57,8 +61,23 @@ bool AudioEncoderIlbc::EncodeInternal(uint32_t rtp_timestamp,
size_t max_encoded_bytes,
uint8_t* encoded,
EncodedInfo* info) {
const size_t expected_output_len =
num_10ms_frames_per_packet_ == 2 ? 38 : 50;
size_t expected_output_len;
switch (num_10ms_frames_per_packet_) {
case 2:
expected_output_len = 38;
break;
case 3:
expected_output_len = 50;
break;
case 4:
expected_output_len = 2 * 38;
break;
case 6:
expected_output_len = 2 * 50;
break;
default:
FATAL();
}
DCHECK_GE(max_encoded_bytes, expected_output_len);
// Save timestamp if starting a new packet.

View File

@ -23,7 +23,9 @@ class AudioEncoderIlbc : public AudioEncoder {
Config() : payload_type(102), frame_size_ms(30) {}
int payload_type;
int frame_size_ms;
int frame_size_ms; // Valid values are 20, 30, 40, and 60 ms.
// Note that frame size 40 ms produces encodings with two 20 ms frames in
// them, and frame size 60 ms consists of two 30 ms frames.
};
explicit AudioEncoderIlbc(const Config& config);
@ -42,7 +44,7 @@ class AudioEncoderIlbc : public AudioEncoder {
EncodedInfo* info) OVERRIDE;
private:
static const int kMaxSamplesPerPacket = 240;
static const int kMaxSamplesPerPacket = 480;
const int payload_type_;
const int num_10ms_frames_per_packet_;
int num_10ms_frames_buffered_;