Add a new parameter to ACMGenericCodec constructor

Adding the same parameter to the constructors in all subclasses.

This change is in preparation for changes to come where this will be
needed.

BUG=4228
COAUTHOR=kwiberg@webrtc.org
R=minyue@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#8210}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8210 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
henrik.lundin@webrtc.org 2015-01-30 06:14:28 +00:00
parent 2444d9605a
commit c3643f2fe3
40 changed files with 121 additions and 73 deletions

View File

@ -46,8 +46,9 @@ namespace webrtc {
namespace acm2 {
#ifndef WEBRTC_CODEC_AMR
ACMAMR::ACMAMR(int16_t /* codec_id */)
: encoder_inst_ptr_(NULL),
ACMAMR::ACMAMR(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoding_mode_(-1), // Invalid value.
encoding_rate_(0), // Invalid value.
encoder_packing_format_(AMRBandwidthEfficient) {

View File

@ -25,7 +25,7 @@ namespace acm2 {
class ACMAMR : public ACMGenericCodec {
public:
explicit ACMAMR(int16_t codec_id);
ACMAMR(int16_t codec_id, bool enable_red);
~ACMAMR();
// for FEC

View File

@ -43,8 +43,9 @@ namespace webrtc {
namespace acm2 {
#ifndef WEBRTC_CODEC_AMRWB
ACMAMRwb::ACMAMRwb(int16_t /* codec_id */)
: encoder_inst_ptr_(NULL),
ACMAMRwb::ACMAMRwb(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoding_mode_(-1), // invalid value
encoding_rate_(0), // invalid value
encoder_packing_format_(AMRBandwidthEfficient) {}

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMAMRwb : public ACMGenericCodec {
public:
explicit ACMAMRwb(int16_t codec_id);
ACMAMRwb(int16_t codec_id, bool enable_red);
~ACMAMRwb();
// for FEC

View File

@ -19,7 +19,8 @@ namespace webrtc {
namespace acm2 {
ACMCNG::ACMCNG(int16_t codec_id) {
ACMCNG::ACMCNG(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red) {
encoder_inst_ptr_ = NULL;
codec_id_ = codec_id;
samp_freq_hz_ = ACMCodecDB::CodecFreq(codec_id_);

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMCNG: public ACMGenericCodec {
public:
explicit ACMCNG(int16_t codec_id);
ACMCNG(int16_t codec_id, bool enable_red);
~ACMCNG();
// for FEC

View File

@ -572,38 +572,38 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
// All we have support for right now.
if (!STR_CASE_CMP(codec_inst.plname, "ISAC")) {
#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
return new ACMISAC(kISAC);
return new ACMISAC(kISAC, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "PCMU")) {
if (codec_inst.channels == 1) {
return new ACMPCMU(kPCMU);
return new ACMPCMU(kPCMU, false);
} else {
return new ACMPCMU(kPCMU_2ch);
return new ACMPCMU(kPCMU_2ch, false);
}
} else if (!STR_CASE_CMP(codec_inst.plname, "PCMA")) {
if (codec_inst.channels == 1) {
return new ACMPCMA(kPCMA);
return new ACMPCMA(kPCMA, false);
} else {
return new ACMPCMA(kPCMA_2ch);
return new ACMPCMA(kPCMA_2ch, false);
}
} else if (!STR_CASE_CMP(codec_inst.plname, "ILBC")) {
#ifdef WEBRTC_CODEC_ILBC
return new ACMILBC(kILBC);
return new ACMILBC(kILBC, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "AMR")) {
#ifdef WEBRTC_CODEC_AMR
return new ACMAMR(kGSMAMR);
return new ACMAMR(kGSMAMR, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "AMR-WB")) {
#ifdef WEBRTC_CODEC_AMRWB
return new ACMAMRwb(kGSMAMRWB);
return new ACMAMRwb(kGSMAMRWB, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "G722")) {
#ifdef WEBRTC_CODEC_G722
if (codec_inst.channels == 1) {
return new ACMG722(kG722);
return new ACMG722(kG722, false);
} else {
return new ACMG722(kG722_2ch);
return new ACMG722(kG722_2ch, false);
}
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "G7221")) {
@ -628,7 +628,7 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
return NULL;
}
}
return new ACMG722_1(codec_id);
return new ACMG722_1(codec_id, false);
#endif
FALLTHROUGH();
}
@ -652,7 +652,7 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
return NULL;
}
}
return new ACMG722_1C(codec_id);
return new ACMG722_1C(codec_id, false);
#endif
FALLTHROUGH();
}
@ -685,18 +685,18 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
return NULL;
}
}
return new ACMCNG(codec_id);
return new ACMCNG(codec_id, false);
} else if (!STR_CASE_CMP(codec_inst.plname, "G729")) {
#ifdef WEBRTC_CODEC_G729
return new ACMG729(kG729);
return new ACMG729(kG729, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "G7291")) {
#ifdef WEBRTC_CODEC_G729_1
return new ACMG729_1(kG729_1);
return new ACMG729_1(kG729_1, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "opus")) {
#ifdef WEBRTC_CODEC_OPUS
return new ACMOpus(kOpus);
return new ACMOpus(kOpus, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "speex")) {
#ifdef WEBRTC_CODEC_SPEEX
@ -714,7 +714,7 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
return NULL;
}
}
return new ACMSPEEX(codec_id);
return new ACMSPEEX(codec_id, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "CN")) {
// For CN we need to check sampling frequency to know what codec to create.
@ -742,7 +742,7 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
return NULL;
}
}
return new ACMCNG(codec_id);
return new ACMCNG(codec_id, false);
} else if (!STR_CASE_CMP(codec_inst.plname, "L16")) {
#ifdef WEBRTC_CODEC_PCM16
// For L16 we need to check sampling frequency to know what codec to create.
@ -784,15 +784,15 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
}
}
}
return new ACMPCM16B(codec_id);
return new ACMPCM16B(codec_id, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "telephone-event")) {
#ifdef WEBRTC_CODEC_AVT
return new ACMDTMFPlayout(kAVT);
return new ACMDTMFPlayout(kAVT, false);
#endif
} else if (!STR_CASE_CMP(codec_inst.plname, "red")) {
#ifdef WEBRTC_CODEC_RED
return new ACMRED(kRED);
return new ACMRED(kRED, false);
#endif
}
return NULL;

View File

@ -46,7 +46,10 @@ void ACMDTMFPlayout::DestructEncoderSafe() {
#else //===================== Actual Implementation =======================
ACMDTMFPlayout::ACMDTMFPlayout(int16_t codec_id) { codec_id_ = codec_id; }
ACMDTMFPlayout::ACMDTMFPlayout(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red) {
codec_id_ = codec_id;
}
ACMDTMFPlayout::~ACMDTMFPlayout() { return; }

View File

@ -19,7 +19,7 @@ namespace acm2 {
class ACMDTMFPlayout : public ACMGenericCodec {
public:
explicit ACMDTMFPlayout(int16_t codec_id);
ACMDTMFPlayout(int16_t codec_id, bool enable_red);
~ACMDTMFPlayout();
// for FEC

View File

@ -64,8 +64,10 @@ struct ACMG722DecStr {
G722DecInst* inst_right; // instance for right channel in case of stereo
};
ACMG722::ACMG722(int16_t codec_id)
: encoder_inst_ptr_(NULL), encoder_inst_ptr_right_(NULL) {
ACMG722::ACMG722(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL) {
ptr_enc_str_ = new ACMG722EncStr;
if (ptr_enc_str_ != NULL) {
ptr_enc_str_->inst = NULL;

View File

@ -27,7 +27,7 @@ struct ACMG722DecStr;
class ACMG722 : public ACMGenericCodec {
public:
explicit ACMG722(int16_t codec_id);
ACMG722(int16_t codec_id, bool enable_red);
~ACMG722();
// For FEC.

View File

@ -84,8 +84,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G722_1
ACMG722_1::ACMG722_1(int16_t /* codec_id */)
: operational_rate_(-1),
ACMG722_1::ACMG722_1(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red),
operational_rate_(-1),
encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL),
encoder_inst16_ptr_(NULL),

View File

@ -28,7 +28,7 @@ namespace acm2 {
class ACMG722_1 : public ACMGenericCodec {
public:
explicit ACMG722_1(int16_t codec_id);
ACMG722_1(int16_t codec_id, bool enable_red);
~ACMG722_1();
// for FEC

View File

@ -84,8 +84,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G722_1C
ACMG722_1C::ACMG722_1C(int16_t /* codec_id */)
: operational_rate_(-1),
ACMG722_1C::ACMG722_1C(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red),
operational_rate_(-1),
encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL),
encoder_inst24_ptr_(NULL),

View File

@ -28,7 +28,7 @@ namespace acm2 {
class ACMG722_1C : public ACMGenericCodec {
public:
explicit ACMG722_1C(int16_t codec_id);
ACMG722_1C(int16_t codec_id, bool enable_red);
~ACMG722_1C();
// for FEC

View File

@ -26,7 +26,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G729
ACMG729::ACMG729(int16_t /* codec_id */) : encoder_inst_ptr_(NULL) {}
ACMG729::ACMG729(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red), encoder_inst_ptr_(NULL) {
}
ACMG729::~ACMG729() { return; }

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMG729 : public ACMGenericCodec {
public:
explicit ACMG729(int16_t codec_id);
ACMG729(int16_t codec_id, bool enable_red);
~ACMG729();
// for FEC

View File

@ -25,8 +25,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G729_1
ACMG729_1::ACMG729_1(int16_t /* codec_id */)
: encoder_inst_ptr_(NULL),
ACMG729_1::ACMG729_1(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
my_rate_(32000),
flag_8khz_(0),
flag_g729_mode_(0) {

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMG729_1 : public ACMGenericCodec {
public:
explicit ACMG729_1(int16_t codec_id);
ACMG729_1(int16_t codec_id, bool enable_red);
~ACMG729_1();
// for FEC

View File

@ -37,7 +37,7 @@ enum {
// We set some of the variables to invalid values as a check point
// if a proper initialization has happened. Another approach is
// to initialize to a default codec that we are sure is always included.
ACMGenericCodec::ACMGenericCodec()
ACMGenericCodec::ACMGenericCodec(bool enable_red)
: in_audio_ix_write_(0),
in_audio_ix_read_(0),
in_timestamp_ix_write_(0),
@ -60,6 +60,7 @@ ACMGenericCodec::ACMGenericCodec()
sent_cn_previous_(false),
prev_frame_cng_(0),
has_internal_fec_(false),
copy_red_enabled_(enable_red),
codec_wrapper_lock_(*RWLockWrapper::CreateRWLock()),
last_timestamp_(0xD87F3F9F),
unique_id_(0) {
@ -202,6 +203,16 @@ int ACMGenericCodec::SetFEC(bool enable_fec) {
return 0;
}
void ACMGenericCodec::EnableCopyRed(bool enable, int /*red_payload_type*/) {
WriteLockScoped lockCodec(codec_wrapper_lock_);
copy_red_enabled_ = enable;
}
bool ACMGenericCodec::ExternalRedNeeded() {
ReadLockScoped lockCodec(codec_wrapper_lock_);
return copy_red_enabled_;
}
int16_t ACMGenericCodec::Encode(uint8_t* bitstream,
int16_t* bitstream_len_byte,
uint32_t* timestamp,

View File

@ -40,7 +40,7 @@ class ACMGenericCodec {
///////////////////////////////////////////////////////////////////////////
// Constructor of the class
//
ACMGenericCodec();
explicit ACMGenericCodec(bool enable_red);
///////////////////////////////////////////////////////////////////////////
// Destructor of the class.
@ -614,6 +614,13 @@ class ACMGenericCodec {
//
virtual int SetPacketLossRate(int /* loss_rate */) { return 0; }
// Sets if CopyRed should be enabled.
virtual void EnableCopyRed(bool enable, int red_payload_type);
// Returns true if the caller needs to produce RED data manually (that is, if
// RED has been enabled but the codec isn't able to produce the data itself).
virtual bool ExternalRedNeeded();
protected:
///////////////////////////////////////////////////////////////////////////
// All the functions with FunctionNameSafe(...) contain the actual
@ -953,6 +960,8 @@ class ACMGenericCodec {
// FEC.
bool has_internal_fec_ GUARDED_BY(codec_wrapper_lock_);
bool copy_red_enabled_ GUARDED_BY(codec_wrapper_lock_);
WebRtcACMCodecParams encoder_params_ GUARDED_BY(codec_wrapper_lock_);
// Used to lock wrapper internal data

View File

@ -25,7 +25,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_GSMFR
ACMGSMFR::ACMGSMFR(int16_t /* codec_id */) : encoder_inst_ptr_(NULL) {}
ACMGSMFR::ACMGSMFR(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red), encoder_inst_ptr_(NULL) {
}
ACMGSMFR::~ACMGSMFR() { return; }

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMGSMFR : public ACMGenericCodec {
public:
explicit ACMGSMFR(int16_t codec_id);
ACMGSMFR(int16_t codec_id, bool enable_red);
~ACMGSMFR();
// for FEC

View File

@ -44,7 +44,8 @@ int16_t ACMILBC::SetBitRateSafe(const int32_t /* rate */) { return -1; }
#else //===================== Actual Implementation =======================
ACMILBC::ACMILBC(int16_t codec_id) : encoder_inst_ptr_(NULL) {
ACMILBC::ACMILBC(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red), encoder_inst_ptr_(NULL) {
codec_id_ = codec_id;
return;
}

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMILBC : public ACMGenericCodec {
public:
explicit ACMILBC(int16_t codec_id);
ACMILBC(int16_t codec_id, bool enable_red);
~ACMILBC();
// for FEC

View File

@ -261,8 +261,9 @@ static uint16_t ACMISACFixGetDecSampRate(ACM_ISAC_STRUCT* /* inst */) {
#endif
ACMISAC::ACMISAC(int16_t codec_id)
: codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
ACMISAC::ACMISAC(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red),
codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
is_enc_initialized_(false),
isac_coding_mode_(CHANNEL_INDEPENDENT),
enforce_frame_size_(false),

View File

@ -31,7 +31,7 @@ enum IsacCodingMode {
class ACMISAC : public ACMGenericCodec, AudioDecoder {
public:
explicit ACMISAC(int16_t codec_id);
ACMISAC(int16_t codec_id, bool enable_red);
~ACMISAC();
int16_t InternalInitDecoder(WebRtcACMCodecParams* codec_params)

View File

@ -63,11 +63,12 @@ int16_t ACMOpus::SetBitRateSafe(const int32_t /*rate*/) {
#else //===================== Actual Implementation =======================
ACMOpus::ACMOpus(int16_t codec_id)
: encoder_inst_ptr_(NULL),
sample_freq_(32000), // Default sampling frequency.
bitrate_(20000), // Default bit-rate.
channels_(1), // Default mono.
ACMOpus::ACMOpus(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
sample_freq_(32000), // Default sampling frequency.
bitrate_(20000), // Default bit-rate.
channels_(1), // Default mono.
packet_loss_rate_(0), // Initial packet loss rate.
application_(kVoip) { // Initial application mode.
codec_id_ = codec_id;

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMOpus : public ACMGenericCodec {
public:
explicit ACMOpus(int16_t codec_id);
ACMOpus(int16_t codec_id, bool enable_red);
~ACMOpus();
ACMGenericCodec* CreateInstance(void);

View File

@ -31,8 +31,7 @@ namespace {
class AcmOpusTest : public ACMOpus {
public:
explicit AcmOpusTest(int16_t codec_id)
: ACMOpus(codec_id) {}
explicit AcmOpusTest(int16_t codec_id) : ACMOpus(codec_id, false) {}
~AcmOpusTest() {}
int packet_loss_rate() { return packet_loss_rate_; }
OpusApplicationMode application() { return application_; }

View File

@ -44,7 +44,8 @@ int16_t ACMPCM16B::InternalCreateEncoder() { return -1; }
void ACMPCM16B::DestructEncoderSafe() { return; }
#else //===================== Actual Implementation =======================
ACMPCM16B::ACMPCM16B(int16_t codec_id) {
ACMPCM16B::ACMPCM16B(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red) {
codec_id_ = codec_id;
sampling_freq_hz_ = ACMCodecDB::CodecFreq(codec_id_);
}

View File

@ -19,7 +19,7 @@ namespace acm2 {
class ACMPCM16B : public ACMGenericCodec {
public:
explicit ACMPCM16B(int16_t codec_id);
ACMPCM16B(int16_t codec_id, bool enable_red);
~ACMPCM16B();
// For FEC.

View File

@ -20,7 +20,10 @@ namespace webrtc {
namespace acm2 {
ACMPCMA::ACMPCMA(int16_t codec_id) { codec_id_ = codec_id; }
ACMPCMA::ACMPCMA(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red) {
codec_id_ = codec_id;
}
ACMPCMA::~ACMPCMA() { return; }

View File

@ -19,7 +19,7 @@ namespace acm2 {
class ACMPCMA : public ACMGenericCodec {
public:
explicit ACMPCMA(int16_t codec_id);
ACMPCMA(int16_t codec_id, bool enable_red);
~ACMPCMA();
// For FEC.

View File

@ -20,7 +20,10 @@ namespace webrtc {
namespace acm2 {
ACMPCMU::ACMPCMU(int16_t codec_id) { codec_id_ = codec_id; }
ACMPCMU::ACMPCMU(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red) {
codec_id_ = codec_id;
}
ACMPCMU::~ACMPCMU() {}

View File

@ -19,7 +19,7 @@ namespace acm2 {
class ACMPCMU : public ACMGenericCodec {
public:
explicit ACMPCMU(int16_t codec_id);
ACMPCMU(int16_t codec_id, bool enable_red);
~ACMPCMU();
// For FEC.

View File

@ -17,7 +17,10 @@ namespace webrtc {
namespace acm2 {
ACMRED::ACMRED(int16_t codec_id) { codec_id_ = codec_id; }
ACMRED::ACMRED(int16_t codec_id, bool enable_red)
: ACMGenericCodec(enable_red) {
codec_id_ = codec_id;
}
ACMRED::~ACMRED() {}

View File

@ -19,7 +19,7 @@ namespace acm2 {
class ACMRED : public ACMGenericCodec {
public:
explicit ACMRED(int16_t codec_id);
ACMRED(int16_t codec_id, bool enable_red);
~ACMRED();
// For FEC.

View File

@ -24,8 +24,9 @@ namespace webrtc {
namespace acm2 {
#ifndef WEBRTC_CODEC_SPEEX
ACMSPEEX::ACMSPEEX(int16_t /* codec_id */)
: encoder_inst_ptr_(NULL),
ACMSPEEX::ACMSPEEX(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
compl_mode_(0),
vbr_enabled_(false),
encoding_rate_(-1),

View File

@ -23,7 +23,7 @@ namespace acm2 {
class ACMSPEEX : public ACMGenericCodec {
public:
explicit ACMSPEEX(int16_t codec_id);
ACMSPEEX(int16_t codec_id, bool enable_red);
~ACMSPEEX();
// For FEC.