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

@ -19,6 +19,7 @@
namespace webrtc {
namespace {
int16_t NumSamplesPerFrame(int num_channels,
int frame_size_ms,
int sample_rate_hz) {
@ -27,6 +28,16 @@ int16_t NumSamplesPerFrame(int num_channels,
<< "Frame size too large.";
return static_cast<int16_t>(samples_per_frame);
}
template <typename T>
typename T::Config CreateConfig(const CodecInst& codec_inst) {
typename T::Config config;
config.frame_size_ms = codec_inst.pacsize / 8;
config.num_channels = codec_inst.channels;
config.payload_type = codec_inst.pltype;
return config;
}
} // namespace
bool AudioEncoderPcm::Config::IsOk() const {
@ -49,7 +60,10 @@ AudioEncoderPcm::AudioEncoderPcm(const Config& config, int sample_rate_hz)
speech_buffer_.reserve(full_frame_samples_);
}
AudioEncoderPcm::~AudioEncoderPcm() {
AudioEncoderPcm::~AudioEncoderPcm() = default;
size_t AudioEncoderPcm::MaxEncodedBytes() const {
return full_frame_samples_ * BytesPerSample();
}
int AudioEncoderPcm::SampleRateHz() const {
@ -60,10 +74,6 @@ int AudioEncoderPcm::NumChannels() const {
return num_channels_;
}
size_t AudioEncoderPcm::MaxEncodedBytes() const {
return full_frame_samples_ * BytesPerSample();
}
size_t AudioEncoderPcm::Num10MsFramesInNextPacket() const {
return num_10ms_frames_per_packet_;
}
@ -102,6 +112,13 @@ AudioEncoder::EncodedInfo AudioEncoderPcm::EncodeInternal(
return info;
}
void AudioEncoderPcm::Reset() {
speech_buffer_.clear();
}
AudioEncoderPcmA::AudioEncoderPcmA(const CodecInst& codec_inst)
: AudioEncoderPcmA(CreateConfig<AudioEncoderPcmA>(codec_inst)) {}
size_t AudioEncoderPcmA::EncodeCall(const int16_t* audio,
size_t input_len,
uint8_t* encoded) {
@ -112,6 +129,9 @@ int AudioEncoderPcmA::BytesPerSample() const {
return 1;
}
AudioEncoderPcmU::AudioEncoderPcmU(const CodecInst& codec_inst)
: AudioEncoderPcmU(CreateConfig<AudioEncoderPcmU>(codec_inst)) {}
size_t AudioEncoderPcmU::EncodeCall(const int16_t* audio,
size_t input_len,
uint8_t* encoded) {
@ -122,25 +142,4 @@ int AudioEncoderPcmU::BytesPerSample() const {
return 1;
}
namespace {
template <typename T>
typename T::Config CreateConfig(const CodecInst& codec_inst) {
typename T::Config config;
config.frame_size_ms = codec_inst.pacsize / 8;
config.num_channels = codec_inst.channels;
config.payload_type = codec_inst.pltype;
return config;
}
} // namespace
AudioEncoderMutablePcmU::AudioEncoderMutablePcmU(const CodecInst& codec_inst)
: AudioEncoderMutableImpl<AudioEncoderPcmU>(
CreateConfig<AudioEncoderPcmU>(codec_inst)) {
}
AudioEncoderMutablePcmA::AudioEncoderMutablePcmA(const CodecInst& codec_inst)
: AudioEncoderMutableImpl<AudioEncoderPcmA>(
CreateConfig<AudioEncoderPcmA>(codec_inst)) {
}
} // namespace webrtc

View File

@ -15,7 +15,6 @@
#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"
namespace webrtc {
@ -36,9 +35,9 @@ class AudioEncoderPcm : public AudioEncoder {
~AudioEncoderPcm() 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;
@ -46,6 +45,7 @@ class AudioEncoderPcm : public AudioEncoder {
const int16_t* audio,
size_t max_encoded_bytes,
uint8_t* encoded) override;
void Reset() override;
protected:
AudioEncoderPcm(const Config& config, int sample_rate_hz);
@ -66,6 +66,8 @@ class AudioEncoderPcm : public AudioEncoder {
uint32_t first_timestamp_in_buffer_;
};
struct CodecInst;
class AudioEncoderPcmA final : public AudioEncoderPcm {
public:
struct Config : public AudioEncoderPcm::Config {
@ -74,6 +76,7 @@ class AudioEncoderPcmA final : public AudioEncoderPcm {
explicit AudioEncoderPcmA(const Config& config)
: AudioEncoderPcm(config, kSampleRateHz) {}
explicit AudioEncoderPcmA(const CodecInst& codec_inst);
protected:
size_t EncodeCall(const int16_t* audio,
@ -94,6 +97,7 @@ class AudioEncoderPcmU final : public AudioEncoderPcm {
explicit AudioEncoderPcmU(const Config& config)
: AudioEncoderPcm(config, kSampleRateHz) {}
explicit AudioEncoderPcmU(const CodecInst& codec_inst);
protected:
size_t EncodeCall(const int16_t* audio,
@ -106,19 +110,5 @@ class AudioEncoderPcmU final : public AudioEncoderPcm {
static const int kSampleRateHz = 8000;
};
struct CodecInst;
class AudioEncoderMutablePcmU
: public AudioEncoderMutableImpl<AudioEncoderPcmU> {
public:
explicit AudioEncoderMutablePcmU(const CodecInst& codec_inst);
};
class AudioEncoderMutablePcmA
: public AudioEncoderMutableImpl<AudioEncoderPcmA> {
public:
explicit AudioEncoderMutablePcmA(const CodecInst& codec_inst);
};
} // namespace webrtc
#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_INCLUDE_AUDIO_ENCODER_PCM_H_