From 4aecd008dd26537daf1f9cc74b4cc80911f4b67d Mon Sep 17 00:00:00 2001 From: "henrik.lundin@webrtc.org" Date: Wed, 28 Jan 2015 13:16:31 +0000 Subject: [PATCH] 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 --- .../codecs/ilbc/audio_encoder_ilbc.cc | 29 +++++++++++++++---- .../ilbc/interface/audio_encoder_ilbc.h | 6 ++-- 2 files changed, 28 insertions(+), 7 deletions(-) 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 3fb602232e..da72d678ad 100644 --- a/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc +++ b/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc @@ -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. diff --git a/webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h b/webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h index 0ecf0397a6..7c2904dfc6 100644 --- a/webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h +++ b/webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h @@ -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_;