Reland r8210 "Add a new parameter to ACMGenericCodec constructor""

This effectively reverts r8211.

The problem with r8210 was that the change in constructor signature was not done for other codec selections that then default one. That is, some code that was hidden under #ifdef did not get updated. This is now fixed.

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

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

Cr-Commit-Position: refs/heads/master@{#8215}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8215 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
henrik.lundin@webrtc.org 2015-01-30 12:29:25 +00:00
parent 4455f6243a
commit 3154a1cf9d
40 changed files with 170 additions and 101 deletions

View File

@ -46,8 +46,9 @@ namespace webrtc {
namespace acm2 { namespace acm2 {
#ifndef WEBRTC_CODEC_AMR #ifndef WEBRTC_CODEC_AMR
ACMAMR::ACMAMR(int16_t /* codec_id */) ACMAMR::ACMAMR(int16_t /* codec_id */, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoding_mode_(-1), // Invalid value. encoding_mode_(-1), // Invalid value.
encoding_rate_(0), // Invalid value. encoding_rate_(0), // Invalid value.
encoder_packing_format_(AMRBandwidthEfficient) { encoder_packing_format_(AMRBandwidthEfficient) {
@ -106,8 +107,9 @@ ACMAMRPackingFormat ACMAMR::AMRDecoderPackingFormat() const {
#define WEBRTC_AMR_MR102 6 #define WEBRTC_AMR_MR102 6
#define WEBRTC_AMR_MR122 7 #define WEBRTC_AMR_MR122 7
ACMAMR::ACMAMR(int16_t codec_id) ACMAMR::ACMAMR(int16_t codec_id, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoding_mode_(-1), // invalid value encoding_mode_(-1), // invalid value
encoding_rate_(0) { // invalid value encoding_rate_(0) { // invalid value
codec_id_ = codec_id; codec_id_ = codec_id;

View File

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

View File

@ -43,11 +43,13 @@ namespace webrtc {
namespace acm2 { namespace acm2 {
#ifndef WEBRTC_CODEC_AMRWB #ifndef WEBRTC_CODEC_AMRWB
ACMAMRwb::ACMAMRwb(int16_t /* codec_id */) ACMAMRwb::ACMAMRwb(int16_t /* codec_id */, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoding_mode_(-1), // invalid value encoding_mode_(-1), // invalid value
encoding_rate_(0), // invalid value encoding_rate_(0), // invalid value
encoder_packing_format_(AMRBandwidthEfficient) {} encoder_packing_format_(AMRBandwidthEfficient) {
}
ACMAMRwb::~ACMAMRwb() {} ACMAMRwb::~ACMAMRwb() {}
@ -103,8 +105,9 @@ ACMAMRPackingFormat ACMAMRwb::AMRwbDecoderPackingFormat() const {
#define AMRWB_MODE_23k 7 #define AMRWB_MODE_23k 7
#define AMRWB_MODE_24k 8 #define AMRWB_MODE_24k 8
ACMAMRwb::ACMAMRwb(int16_t codec_id) ACMAMRwb::ACMAMRwb(int16_t codec_id, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoding_mode_(-1), // invalid value encoding_mode_(-1), // invalid value
encoding_rate_(0) { // invalid value encoding_rate_(0) { // invalid value
codec_id_ = codec_id; codec_id_ = codec_id;

View File

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

View File

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

View File

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

View File

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

View File

@ -22,7 +22,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_AVT #ifndef WEBRTC_CODEC_AVT
ACMDTMFPlayout::ACMDTMFPlayout(int16_t /* codec_id */) { return; } ACMDTMFPlayout::ACMDTMFPlayout(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red) {
}
ACMDTMFPlayout::~ACMDTMFPlayout() { return; } ACMDTMFPlayout::~ACMDTMFPlayout() { return; }
@ -46,7 +48,10 @@ void ACMDTMFPlayout::DestructEncoderSafe() {
#else //===================== Actual Implementation ======================= #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; } ACMDTMFPlayout::~ACMDTMFPlayout() { return; }

View File

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

View File

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

View File

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

View File

@ -84,8 +84,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G722_1 #ifndef WEBRTC_CODEC_G722_1
ACMG722_1::ACMG722_1(int16_t /* codec_id */) ACMG722_1::ACMG722_1(int16_t /* codec_id */, bool enable_red)
: operational_rate_(-1), : ACMGenericCodec(enable_red),
operational_rate_(-1),
encoder_inst_ptr_(NULL), encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL), encoder_inst_ptr_right_(NULL),
encoder_inst16_ptr_(NULL), encoder_inst16_ptr_(NULL),
@ -116,8 +117,9 @@ int16_t ACMG722_1::InternalCreateEncoder() { return -1; }
void ACMG722_1::DestructEncoderSafe() { return; } void ACMG722_1::DestructEncoderSafe() { return; }
#else //===================== Actual Implementation ======================= #else //===================== Actual Implementation =======================
ACMG722_1::ACMG722_1(int16_t codec_id) ACMG722_1::ACMG722_1(int16_t codec_id, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL), encoder_inst_ptr_right_(NULL),
encoder_inst16_ptr_(NULL), encoder_inst16_ptr_(NULL),
encoder_inst16_ptr_right_(NULL), encoder_inst16_ptr_right_(NULL),

View File

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

View File

@ -84,8 +84,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G722_1C #ifndef WEBRTC_CODEC_G722_1C
ACMG722_1C::ACMG722_1C(int16_t /* codec_id */) ACMG722_1C::ACMG722_1C(int16_t /* codec_id */, bool enable_red)
: operational_rate_(-1), : ACMGenericCodec(enable_red),
operational_rate_(-1),
encoder_inst_ptr_(NULL), encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL), encoder_inst_ptr_right_(NULL),
encoder_inst24_ptr_(NULL), encoder_inst24_ptr_(NULL),
@ -116,8 +117,9 @@ int16_t ACMG722_1C::InternalCreateEncoder() { return -1; }
void ACMG722_1C::DestructEncoderSafe() { return; } void ACMG722_1C::DestructEncoderSafe() { return; }
#else //===================== Actual Implementation ======================= #else //===================== Actual Implementation =======================
ACMG722_1C::ACMG722_1C(int16_t codec_id) ACMG722_1C::ACMG722_1C(int16_t codec_id, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
encoder_inst_ptr_right_(NULL), encoder_inst_ptr_right_(NULL),
encoder_inst24_ptr_(NULL), encoder_inst24_ptr_(NULL),
encoder_inst24_ptr_right_(NULL), encoder_inst24_ptr_right_(NULL),

View File

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

View File

@ -26,7 +26,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G729 #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; } ACMG729::~ACMG729() { return; }
@ -58,10 +60,12 @@ int16_t ACMG729::InternalCreateEncoder() { return -1; }
void ACMG729::DestructEncoderSafe() { return; } void ACMG729::DestructEncoderSafe() { return; }
#else //===================== Actual Implementation ======================= #else //===================== Actual Implementation =======================
ACMG729::ACMG729(int16_t codec_id) ACMG729::ACMG729(int16_t codec_id, bool enable_red)
: codec_id_(codec_id), : ACMGenericCodec(enable_red),
codec_id_(codec_id),
has_internal_dtx_(), has_internal_dtx_(),
encoder_inst_ptr_(NULL) {} encoder_inst_ptr_(NULL) {
}
ACMG729::~ACMG729() { ACMG729::~ACMG729() {
if (encoder_inst_ptr_ != NULL) { if (encoder_inst_ptr_ != NULL) {

View File

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

View File

@ -25,8 +25,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_G729_1 #ifndef WEBRTC_CODEC_G729_1
ACMG729_1::ACMG729_1(int16_t /* codec_id */) ACMG729_1::ACMG729_1(int16_t /* codec_id */, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
my_rate_(32000), my_rate_(32000),
flag_8khz_(0), flag_8khz_(0),
flag_g729_mode_(0) { flag_g729_mode_(0) {
@ -57,8 +58,9 @@ int16_t ACMG729_1::SetBitRateSafe(const int32_t /*rate*/) { return -1; }
struct G729_1_inst_t_; struct G729_1_inst_t_;
ACMG729_1::ACMG729_1(int16_t codec_id) ACMG729_1::ACMG729_1(int16_t codec_id, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
my_rate_(32000), // Default rate. my_rate_(32000), // Default rate.
flag_8khz_(0), flag_8khz_(0),
flag_g729_mode_(0) { flag_g729_mode_(0) {

View File

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

View File

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

View File

@ -40,7 +40,7 @@ class ACMGenericCodec {
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// Constructor of the class // Constructor of the class
// //
ACMGenericCodec(); explicit ACMGenericCodec(bool enable_red);
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// Destructor of the class. // Destructor of the class.
@ -614,6 +614,13 @@ class ACMGenericCodec {
// //
virtual int SetPacketLossRate(int /* loss_rate */) { return 0; } 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: protected:
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// All the functions with FunctionNameSafe(...) contain the actual // All the functions with FunctionNameSafe(...) contain the actual
@ -953,6 +960,8 @@ class ACMGenericCodec {
// FEC. // FEC.
bool has_internal_fec_ GUARDED_BY(codec_wrapper_lock_); 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_); WebRtcACMCodecParams encoder_params_ GUARDED_BY(codec_wrapper_lock_);
// Used to lock wrapper internal data // Used to lock wrapper internal data

View File

@ -25,7 +25,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_GSMFR #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; } ACMGSMFR::~ACMGSMFR() { return; }
@ -51,10 +53,12 @@ void ACMGSMFR::DestructEncoderSafe() { return; }
#else //===================== Actual Implementation ======================= #else //===================== Actual Implementation =======================
ACMGSMFR::ACMGSMFR(int16_t codec_id) ACMGSMFR::ACMGSMFR(int16_t codec_id, bool enable_red)
: codec_id_(codec_id), : ACMGenericCodec(enable_red),
codec_id_(codec_id),
has_internal_dtx_(true), has_internal_dtx_(true),
encoder_inst_ptr_(NULL) {} encoder_inst_ptr_(NULL) {
}
ACMGSMFR::~ACMGSMFR() { ACMGSMFR::~ACMGSMFR() {
if (encoder_inst_ptr_ != NULL) { if (encoder_inst_ptr_ != NULL) {

View File

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

View File

@ -21,7 +21,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_ILBC #ifndef WEBRTC_CODEC_ILBC
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) {
}
ACMILBC::~ACMILBC() { return; } ACMILBC::~ACMILBC() { return; }
@ -44,7 +46,8 @@ int16_t ACMILBC::SetBitRateSafe(const int32_t /* rate */) { return -1; }
#else //===================== Actual Implementation ======================= #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; codec_id_ = codec_id;
return; return;
} }

View File

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

View File

@ -59,8 +59,9 @@ static const int32_t kIsacRatesSwb[NR_ISAC_BANDWIDTHS] = {
#if (!defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX)) #if (!defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX))
ACMISAC::ACMISAC(int16_t /* codec_id */) ACMISAC::ACMISAC(int16_t /* codec_id */, bool enable_red)
: codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), : ACMGenericCodec(enable_red),
codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
codec_inst_ptr_(NULL), codec_inst_ptr_(NULL),
is_enc_initialized_(false), is_enc_initialized_(false),
isac_coding_mode_(CHANNEL_INDEPENDENT), isac_coding_mode_(CHANNEL_INDEPENDENT),
@ -261,8 +262,9 @@ static uint16_t ACMISACFixGetDecSampRate(ACM_ISAC_STRUCT* /* inst */) {
#endif #endif
ACMISAC::ACMISAC(int16_t codec_id) ACMISAC::ACMISAC(int16_t codec_id, bool enable_red)
: codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), : ACMGenericCodec(enable_red),
codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
is_enc_initialized_(false), is_enc_initialized_(false),
isac_coding_mode_(CHANNEL_INDEPENDENT), isac_coding_mode_(CHANNEL_INDEPENDENT),
enforce_frame_size_(false), enforce_frame_size_(false),

View File

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

View File

@ -23,8 +23,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_OPUS #ifndef WEBRTC_CODEC_OPUS
ACMOpus::ACMOpus(int16_t /* codec_id */) ACMOpus::ACMOpus(int16_t /* codec_id */, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
sample_freq_(0), sample_freq_(0),
bitrate_(0), bitrate_(0),
channels_(1), channels_(1),
@ -63,8 +64,9 @@ int16_t ACMOpus::SetBitRateSafe(const int32_t /*rate*/) {
#else //===================== Actual Implementation ======================= #else //===================== Actual Implementation =======================
ACMOpus::ACMOpus(int16_t codec_id) ACMOpus::ACMOpus(int16_t codec_id, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
sample_freq_(32000), // Default sampling frequency. sample_freq_(32000), // Default sampling frequency.
bitrate_(20000), // Default bit-rate. bitrate_(20000), // Default bit-rate.
channels_(1), // Default mono. channels_(1), // Default mono.

View File

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

View File

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

View File

@ -23,7 +23,9 @@ namespace acm2 {
#ifndef WEBRTC_CODEC_PCM16 #ifndef WEBRTC_CODEC_PCM16
ACMPCM16B::ACMPCM16B(int16_t /* codec_id */) { return; } ACMPCM16B::ACMPCM16B(int16_t /* codec_id */, bool enable_red)
: ACMGenericCodec(enable_red) {
}
ACMPCM16B::~ACMPCM16B() { return; } ACMPCM16B::~ACMPCM16B() { return; }
@ -44,7 +46,8 @@ int16_t ACMPCM16B::InternalCreateEncoder() { return -1; }
void ACMPCM16B::DestructEncoderSafe() { return; } void ACMPCM16B::DestructEncoderSafe() { return; }
#else //===================== Actual Implementation ======================= #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; codec_id_ = codec_id;
sampling_freq_hz_ = ACMCodecDB::CodecFreq(codec_id_); sampling_freq_hz_ = ACMCodecDB::CodecFreq(codec_id_);
} }

View File

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

View File

@ -20,7 +20,10 @@ namespace webrtc {
namespace acm2 { 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; } ACMPCMA::~ACMPCMA() { return; }

View File

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

View File

@ -20,7 +20,10 @@ namespace webrtc {
namespace acm2 { 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() {} ACMPCMU::~ACMPCMU() {}

View File

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

View File

@ -17,7 +17,10 @@ namespace webrtc {
namespace acm2 { 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() {} ACMRED::~ACMRED() {}

View File

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

View File

@ -24,8 +24,9 @@ namespace webrtc {
namespace acm2 { namespace acm2 {
#ifndef WEBRTC_CODEC_SPEEX #ifndef WEBRTC_CODEC_SPEEX
ACMSPEEX::ACMSPEEX(int16_t /* codec_id */) ACMSPEEX::ACMSPEEX(int16_t /* codec_id */, bool enable_red)
: encoder_inst_ptr_(NULL), : ACMGenericCodec(enable_red),
encoder_inst_ptr_(NULL),
compl_mode_(0), compl_mode_(0),
vbr_enabled_(false), vbr_enabled_(false),
encoding_rate_(-1), encoding_rate_(-1),
@ -68,7 +69,8 @@ int16_t ACMSPEEX::SetComplMode(int16_t mode) { return -1; }
#else //===================== Actual Implementation ======================= #else //===================== Actual Implementation =======================
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) {
codec_id_ = codec_id; codec_id_ = codec_id;
// Set sampling frequency, frame size and rate Speex // Set sampling frequency, frame size and rate Speex

View File

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