Fold AudioEncoderMutable into AudioEncoder

It makes more sense to combine the two interfaces, since there wasn't
a clear line separating them. The result is a combined interface with
just over a dozen methods, half of which need to be implemented by
every subclass, while the other half have sensible (and trivial)
default implementations and are implemented only by the few subclasses
that need non-default behavior.

Review URL: https://codereview.webrtc.org/1322973004

Cr-Commit-Position: refs/heads/master@{#9894}
This commit is contained in:
kwiberg
2015-09-08 05:57:53 -07:00
committed by Commit bot
parent cd3c475407
commit 12cfc9b4da
40 changed files with 851 additions and 984 deletions

View File

@ -22,6 +22,13 @@ namespace {
const int kSampleRateHz = 8000;
AudioEncoderIlbc::Config CreateConfig(const CodecInst& codec_inst) {
AudioEncoderIlbc::Config config;
config.frame_size_ms = codec_inst.pacsize / 8;
config.payload_type = codec_inst.pltype;
return config;
}
} // namespace
// static
@ -35,22 +42,24 @@ bool AudioEncoderIlbc::Config::IsOk() const {
}
AudioEncoderIlbc::AudioEncoderIlbc(const Config& config)
: payload_type_(config.payload_type),
: config_(config),
num_10ms_frames_per_packet_(
static_cast<size_t>(config.frame_size_ms / 10)),
num_10ms_frames_buffered_(0) {
CHECK(config.IsOk());
CHECK_EQ(0, WebRtcIlbcfix_EncoderCreate(&encoder_));
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));
encoder_(nullptr) {
Reset();
}
AudioEncoderIlbc::AudioEncoderIlbc(const CodecInst& codec_inst)
: AudioEncoderIlbc(CreateConfig(codec_inst)) {}
AudioEncoderIlbc::~AudioEncoderIlbc() {
CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_));
}
size_t AudioEncoderIlbc::MaxEncodedBytes() const {
return RequiredOutputSizeBytes();
}
int AudioEncoderIlbc::SampleRateHz() const {
return kSampleRateHz;
}
@ -59,10 +68,6 @@ int AudioEncoderIlbc::NumChannels() const {
return 1;
}
size_t AudioEncoderIlbc::MaxEncodedBytes() const {
return RequiredOutputSizeBytes();
}
size_t AudioEncoderIlbc::Num10MsFramesInNextPacket() const {
return num_10ms_frames_per_packet_;
}
@ -119,10 +124,22 @@ AudioEncoder::EncodedInfo AudioEncoderIlbc::EncodeInternal(
info.encoded_bytes = static_cast<size_t>(output_len);
DCHECK_EQ(info.encoded_bytes, RequiredOutputSizeBytes());
info.encoded_timestamp = first_timestamp_in_buffer_;
info.payload_type = payload_type_;
info.payload_type = config_.payload_type;
return info;
}
void AudioEncoderIlbc::Reset() {
if (encoder_)
CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_));
CHECK(config_.IsOk());
CHECK_EQ(0, WebRtcIlbcfix_EncoderCreate(&encoder_));
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));
num_10ms_frames_buffered_ = 0;
}
size_t AudioEncoderIlbc::RequiredOutputSizeBytes() const {
switch (num_10ms_frames_per_packet_) {
case 2: return 38;
@ -133,17 +150,4 @@ size_t AudioEncoderIlbc::RequiredOutputSizeBytes() const {
}
}
namespace {
AudioEncoderIlbc::Config CreateConfig(const CodecInst& codec_inst) {
AudioEncoderIlbc::Config config;
config.frame_size_ms = codec_inst.pacsize / 8;
config.payload_type = codec_inst.pltype;
return config;
}
} // namespace
AudioEncoderMutableIlbc::AudioEncoderMutableIlbc(const CodecInst& codec_inst)
: AudioEncoderMutableImpl<AudioEncoderIlbc>(CreateConfig(codec_inst)) {
}
} // namespace webrtc

View File

@ -13,29 +13,30 @@
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
#include "webrtc/modules/audio_coding/codecs/audio_encoder_mutable_impl.h"
#include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h"
namespace webrtc {
struct CodecInst;
class AudioEncoderIlbc final : public AudioEncoder {
public:
struct Config {
Config() : payload_type(102), frame_size_ms(30) {}
bool IsOk() const;
int payload_type;
int frame_size_ms; // Valid values are 20, 30, 40, and 60 ms.
int payload_type = 102;
int frame_size_ms = 30; // 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);
explicit AudioEncoderIlbc(const CodecInst& codec_inst);
~AudioEncoderIlbc() override;
size_t MaxEncodedBytes() const override;
int SampleRateHz() const override;
int NumChannels() const override;
size_t MaxEncodedBytes() const override;
size_t Num10MsFramesInNextPacket() const override;
size_t Max10MsFramesInAPacket() const override;
int GetTargetBitrate() const override;
@ -43,12 +44,13 @@ class AudioEncoderIlbc final : public AudioEncoder {
const int16_t* audio,
size_t max_encoded_bytes,
uint8_t* encoded) override;
void Reset() override;
private:
size_t RequiredOutputSizeBytes() const;
static const size_t kMaxSamplesPerPacket = 480;
const int payload_type_;
const Config config_;
const size_t num_10ms_frames_per_packet_;
size_t num_10ms_frames_buffered_;
uint32_t first_timestamp_in_buffer_;
@ -56,13 +58,5 @@ class AudioEncoderIlbc final : public AudioEncoder {
IlbcEncoderInstance* encoder_;
};
struct CodecInst;
class AudioEncoderMutableIlbc
: public AudioEncoderMutableImpl<AudioEncoderIlbc> {
public:
explicit AudioEncoderMutableIlbc(const CodecInst& codec_inst);
};
} // namespace webrtc
#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_INTERFACE_AUDIO_ENCODER_ILBC_H_