Adding support for full-stereo codec.
This is an experiment, letting Celt represent a full-stereo codec. Review URL: https://webrtc-codereview.appspot.com/379013 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1636 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
2979461595
commit
df69775bfa
317
src/modules/audio_coding/main/source/acm_celt.cc
Normal file
317
src/modules/audio_coding/main/source/acm_celt.cc
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "acm_common_defs.h"
|
||||||
|
#include "acm_neteq.h"
|
||||||
|
#include "acm_celt.h"
|
||||||
|
#include "trace.h"
|
||||||
|
#include "webrtc_neteq.h"
|
||||||
|
#include "webrtc_neteq_help_macros.h"
|
||||||
|
// TODO(tlegrand): Add full paths.
|
||||||
|
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
// NOTE! Celt is not included in the open-source package. Modify this file or
|
||||||
|
// your codec API to match the function call and name of used Celt API file.
|
||||||
|
#include "celt_interface.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
|
||||||
|
#ifndef WEBRTC_CODEC_CELT
|
||||||
|
|
||||||
|
ACMCELT::ACMCELT(int16_t /* codecID */)
|
||||||
|
: enc_inst_ptr_(NULL),
|
||||||
|
dec_inst_ptr_(NULL),
|
||||||
|
sampling_freq_(0),
|
||||||
|
bitrate_(0),
|
||||||
|
channels_(1),
|
||||||
|
dec_channels_(1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ACMCELT::~ACMCELT() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalEncode(uint8_t* /* bitStream */,
|
||||||
|
int16_t* /* bitStreamLenByte */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::DecodeSafe(uint8_t* /* bitStream */,
|
||||||
|
int16_t /* bitStreamLenByte */,
|
||||||
|
int16_t* /* audio */,
|
||||||
|
int16_t* /* audioSamples */,
|
||||||
|
char* /* speechType */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalInitEncoder(WebRtcACMCodecParams* /* codecParams */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalInitDecoder(WebRtcACMCodecParams* /* codecParams */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ACMCELT::CodecDef(WebRtcNetEQ_CodecDef& /* codecDef */,
|
||||||
|
const CodecInst& /* codecInst */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ACMGenericCodec* ACMCELT::CreateInstance(void) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalCreateEncoder() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACMCELT::DestructEncoderSafe() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalCreateDecoder() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACMCELT::DestructDecoderSafe() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACMCELT::InternalDestructEncoderInst(void* /* ptrInst */) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::UnregisterFromNetEqSafe(ACMNetEQ* /* netEq */,
|
||||||
|
int16_t /* payloadType */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACMCELT::IsTrueStereoCodec() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::SetBitRateSafe(const int32_t /*rate*/) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else //===================== Actual Implementation =======================
|
||||||
|
|
||||||
|
ACMCELT::ACMCELT(int16_t codecID)
|
||||||
|
: enc_inst_ptr_(NULL),
|
||||||
|
dec_inst_ptr_(NULL),
|
||||||
|
sampling_freq_(32000), // Default sampling frequency.
|
||||||
|
bitrate_(48000), // Default rate.
|
||||||
|
channels_(1), // Default send mono.
|
||||||
|
dec_channels_(1) { // Default receive mono.
|
||||||
|
// TODO(tlegrand): remove later when ACMGenericCodec has a new constructor.
|
||||||
|
_codecID = codecID;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ACMCELT::~ACMCELT() {
|
||||||
|
if (enc_inst_ptr_ != NULL) {
|
||||||
|
WebRtcCelt_FreeEnc(enc_inst_ptr_);
|
||||||
|
enc_inst_ptr_ = NULL;
|
||||||
|
}
|
||||||
|
if (dec_inst_ptr_ != NULL) {
|
||||||
|
WebRtcCelt_FreeDec(dec_inst_ptr_);
|
||||||
|
dec_inst_ptr_ = NULL;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalEncode(uint8_t* bitStream, int16_t* bitStreamLenByte) {
|
||||||
|
*bitStreamLenByte = 0;
|
||||||
|
|
||||||
|
// Call Encoder.
|
||||||
|
*bitStreamLenByte = WebRtcCelt_Encode(enc_inst_ptr_,
|
||||||
|
&_inAudio[_inAudioIxRead],
|
||||||
|
bitStream);
|
||||||
|
|
||||||
|
// Increment the read index this tell the caller that how far
|
||||||
|
// we have gone forward in reading the audio buffer.
|
||||||
|
_inAudioIxRead += _frameLenSmpl * channels_;
|
||||||
|
|
||||||
|
if (*bitStreamLenByte < 0) {
|
||||||
|
// Error reported from the encoder.
|
||||||
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
|
||||||
|
"InternalEncode: Encode error for Celt");
|
||||||
|
*bitStreamLenByte = 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *bitStreamLenByte;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::DecodeSafe(uint8_t* /* bitStream */,
|
||||||
|
int16_t /* bitStreamLenByte */,
|
||||||
|
int16_t* /* audio */,
|
||||||
|
int16_t* /* audioSamples */,
|
||||||
|
char* /* speechType */) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalInitEncoder(WebRtcACMCodecParams* codecParams) {
|
||||||
|
// Set bitrate and check that it is withing the valid range.
|
||||||
|
int16_t status = SetBitRateSafe((codecParams->codecInstant).rate);
|
||||||
|
if (status < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If number of channels changed we need to re-create memory.
|
||||||
|
if (codecParams->codecInstant.channels != channels_) {
|
||||||
|
WebRtcCelt_FreeEnc(enc_inst_ptr_);
|
||||||
|
enc_inst_ptr_ = NULL;
|
||||||
|
// Store new number of channels.
|
||||||
|
channels_ = codecParams->codecInstant.channels;
|
||||||
|
if (WebRtcCelt_CreateEnc(&enc_inst_ptr_, channels_) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initiate encoder.
|
||||||
|
if (WebRtcCelt_EncoderInit(enc_inst_ptr_, channels_, bitrate_) >= 0) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalInitDecoder(WebRtcACMCodecParams* codecParams) {
|
||||||
|
// If number of channels changed we need to re-create memory.
|
||||||
|
if (codecParams->codecInstant.channels != dec_channels_) {
|
||||||
|
WebRtcCelt_FreeDec(dec_inst_ptr_);
|
||||||
|
dec_inst_ptr_ = NULL;
|
||||||
|
// Store new number of channels.
|
||||||
|
dec_channels_ = codecParams->codecInstant.channels;
|
||||||
|
if (WebRtcCelt_CreateDec(&dec_inst_ptr_, dec_channels_) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initiate decoder.
|
||||||
|
if (WebRtcCelt_DecoderInit(dec_inst_ptr_) < 0) {
|
||||||
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
|
||||||
|
"InternalInitDecoder: init decoder failed for Celt.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ACMCELT::CodecDef(WebRtcNetEQ_CodecDef& codecDef,
|
||||||
|
const CodecInst& codecInst) {
|
||||||
|
if (!_decoderInitialized) {
|
||||||
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
|
||||||
|
"CodecDef: Decoder uninitialized for Celt");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill up the structure by calling
|
||||||
|
// "SET_CODEC_PAR" and "SET_CELT_FUNCTIONS" or "SET_CELTSLAVE_FUNCTIONS".
|
||||||
|
// Then call NetEQ to add the codec to it's
|
||||||
|
// database.
|
||||||
|
SET_CODEC_PAR((codecDef), kDecoderCELT_32, codecInst.pltype, dec_inst_ptr_,
|
||||||
|
32000);
|
||||||
|
// If this is the master of NetEQ, regular decoder will be added, otherwise
|
||||||
|
// the slave decoder will be used.
|
||||||
|
if (_isMaster) {
|
||||||
|
SET_CELT_FUNCTIONS((codecDef));
|
||||||
|
} else {
|
||||||
|
SET_CELTSLAVE_FUNCTIONS((codecDef));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ACMGenericCodec* ACMCELT::CreateInstance(void) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalCreateEncoder() {
|
||||||
|
if (WebRtcCelt_CreateEnc(&enc_inst_ptr_, _noChannels) < 0) {
|
||||||
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
|
||||||
|
"InternalCreateEncoder: create encoder failed for Celt");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
channels_ = _noChannels;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACMCELT::DestructEncoderSafe() {
|
||||||
|
_encoderExist = false;
|
||||||
|
_encoderInitialized = false;
|
||||||
|
if (enc_inst_ptr_ != NULL) {
|
||||||
|
WebRtcCelt_FreeEnc(enc_inst_ptr_);
|
||||||
|
enc_inst_ptr_ = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::InternalCreateDecoder() {
|
||||||
|
if (WebRtcCelt_CreateDec(&dec_inst_ptr_, dec_channels_) < 0) {
|
||||||
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
|
||||||
|
"InternalCreateDecoder: create decoder failed for Celt");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACMCELT::DestructDecoderSafe() {
|
||||||
|
_decoderExist = false;
|
||||||
|
_decoderInitialized = false;
|
||||||
|
if (dec_inst_ptr_ != NULL) {
|
||||||
|
WebRtcCelt_FreeDec(dec_inst_ptr_);
|
||||||
|
dec_inst_ptr_ = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACMCELT::InternalDestructEncoderInst(void* ptrInst) {
|
||||||
|
if (ptrInst != NULL) {
|
||||||
|
WebRtcCelt_FreeEnc(static_cast<CELT_encinst_t*>(ptrInst));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::UnregisterFromNetEqSafe(ACMNetEQ* netEq, int16_t payloadType) {
|
||||||
|
if (payloadType != _decoderParams.codecInstant.pltype) {
|
||||||
|
WEBRTC_TRACE(
|
||||||
|
webrtc::kTraceError,
|
||||||
|
webrtc::kTraceAudioCoding,
|
||||||
|
_uniqueID,
|
||||||
|
"Cannot unregister codec: given payload-type does not match the stored "
|
||||||
|
"payload type",
|
||||||
|
_decoderParams.codecInstant.plname, payloadType,
|
||||||
|
_decoderParams.codecInstant.pltype);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return netEq->RemoveCodec(kDecoderCELT_32);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACMCELT::IsTrueStereoCodec() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t ACMCELT::SetBitRateSafe(const int32_t rate) {
|
||||||
|
// Check that rate is in the valid range.
|
||||||
|
if ((rate >= 48000) && (rate <= 96000)) {
|
||||||
|
bitrate_ = rate;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
|
||||||
|
"SetBitRateSafe: Invalid rate Celt");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace webrtc
|
72
src/modules/audio_coding/main/source/acm_celt.h
Normal file
72
src/modules/audio_coding/main/source/acm_celt.h
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_ACM_CELT_H_
|
||||||
|
#define WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_ACM_CELT_H_
|
||||||
|
|
||||||
|
#include "acm_generic_codec.h"
|
||||||
|
|
||||||
|
// forward declaration
|
||||||
|
struct CELT_encinst_t_;
|
||||||
|
struct CELT_decinst_t_;
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
|
||||||
|
class ACMCELT : public ACMGenericCodec {
|
||||||
|
public:
|
||||||
|
ACMCELT(int16_t codecID);
|
||||||
|
~ACMCELT();
|
||||||
|
|
||||||
|
ACMGenericCodec* CreateInstance(void);
|
||||||
|
|
||||||
|
int16_t InternalEncode(uint8_t* bitstream, int16_t* bitStreamLenByte);
|
||||||
|
|
||||||
|
int16_t InternalInitEncoder(WebRtcACMCodecParams *codecParams);
|
||||||
|
|
||||||
|
int16_t InternalInitDecoder(WebRtcACMCodecParams *codecParams);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
WebRtc_Word16 DecodeSafe(
|
||||||
|
WebRtc_UWord8* bitStream,
|
||||||
|
WebRtc_Word16 bitStreamLenByte,
|
||||||
|
WebRtc_Word16* audio,
|
||||||
|
WebRtc_Word16* audioSamples,
|
||||||
|
WebRtc_Word8* speechType);
|
||||||
|
|
||||||
|
int32_t CodecDef(WebRtcNetEQ_CodecDef& codecDef, const CodecInst& codecInst);
|
||||||
|
|
||||||
|
void DestructEncoderSafe();
|
||||||
|
|
||||||
|
void DestructDecoderSafe();
|
||||||
|
|
||||||
|
int16_t InternalCreateEncoder();
|
||||||
|
|
||||||
|
int16_t InternalCreateDecoder();
|
||||||
|
|
||||||
|
void InternalDestructEncoderInst(void* ptrInst);
|
||||||
|
|
||||||
|
int16_t UnregisterFromNetEqSafe(ACMNetEQ* netEq, int16_t payloadType);
|
||||||
|
|
||||||
|
bool IsTrueStereoCodec();
|
||||||
|
|
||||||
|
int16_t SetBitRateSafe(const int32_t rate);
|
||||||
|
|
||||||
|
CELT_encinst_t_* enc_inst_ptr_;
|
||||||
|
CELT_decinst_t_* dec_inst_ptr_;
|
||||||
|
uint16_t sampling_freq_;
|
||||||
|
uint16_t bitrate_;
|
||||||
|
uint16_t channels_;
|
||||||
|
uint16_t dec_channels_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace webrtc
|
||||||
|
|
||||||
|
#endif // WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_ACM_CELT_H_
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -58,6 +58,10 @@
|
|||||||
#include "acm_amrwb.h"
|
#include "acm_amrwb.h"
|
||||||
#include "amrwb_interface.h"
|
#include "amrwb_interface.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
#include "acm_celt.h"
|
||||||
|
#include "celt_interface.h"
|
||||||
|
#endif
|
||||||
#ifdef WEBRTC_CODEC_G722
|
#ifdef WEBRTC_CODEC_G722
|
||||||
#include "acm_g722.h"
|
#include "acm_g722.h"
|
||||||
#include "g722_interface.h"
|
#include "g722_interface.h"
|
||||||
@ -111,8 +115,9 @@ const int kDynamicPayloadtypes[ACMCodecDB::kMaxNumCodecs] = {
|
|||||||
// default channel support, and default rate.
|
// default channel support, and default rate.
|
||||||
#if (defined(WEBRTC_CODEC_PCM16) || \
|
#if (defined(WEBRTC_CODEC_PCM16) || \
|
||||||
defined(WEBRTC_CODEC_AMR) || defined(WEBRTC_CODEC_AMRWB) || \
|
defined(WEBRTC_CODEC_AMR) || defined(WEBRTC_CODEC_AMRWB) || \
|
||||||
defined(WEBRTC_CODEC_G729_1) || defined(WEBRTC_CODEC_SPEEX) || \
|
defined(WEBRTC_CODEC_CELT) || defined(WEBRTC_CODEC_G729_1) || \
|
||||||
defined(WEBRTC_CODEC_G722_1) || defined(WEBRTC_CODEC_G722_1C))
|
defined(WEBRTC_CODEC_SPEEX) || defined(WEBRTC_CODEC_G722_1) || \
|
||||||
|
defined(WEBRTC_CODEC_G722_1C))
|
||||||
static int count_database = 0;
|
static int count_database = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -140,6 +145,9 @@ const CodecInst ACMCodecDB::database_[] = {
|
|||||||
#ifdef WEBRTC_CODEC_AMRWB
|
#ifdef WEBRTC_CODEC_AMRWB
|
||||||
{kDynamicPayloadtypes[count_database++], "AMR-WB", 16000, 320, 1, 20000},
|
{kDynamicPayloadtypes[count_database++], "AMR-WB", 16000, 320, 1, 20000},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
{kDynamicPayloadtypes[count_database++], "CELT", 32000, 320, 1, 48000},
|
||||||
|
#endif
|
||||||
#ifdef WEBRTC_CODEC_G722
|
#ifdef WEBRTC_CODEC_G722
|
||||||
{9, "G722", 16000, 320, 1, 64000},
|
{9, "G722", 16000, 320, 1, 64000},
|
||||||
#endif
|
#endif
|
||||||
@ -208,6 +216,9 @@ const ACMCodecDB::CodecSettings ACMCodecDB::codec_settings_[] = {
|
|||||||
#ifdef WEBRTC_CODEC_AMRWB
|
#ifdef WEBRTC_CODEC_AMRWB
|
||||||
{3, {320, 640, 960}, 0, 1},
|
{3, {320, 640, 960}, 0, 1},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
{1, {320}, 0, 2},
|
||||||
|
#endif
|
||||||
#ifdef WEBRTC_CODEC_G722
|
#ifdef WEBRTC_CODEC_G722
|
||||||
{6, {160, 320, 480, 640, 800, 960}, 0, 2},
|
{6, {160, 320, 480, 640, 800, 960}, 0, 2},
|
||||||
#endif
|
#endif
|
||||||
@ -273,6 +284,9 @@ const WebRtcNetEQDecoder ACMCodecDB::neteq_decoders_[] = {
|
|||||||
#ifdef WEBRTC_CODEC_AMRWB
|
#ifdef WEBRTC_CODEC_AMRWB
|
||||||
kDecoderAMRWB,
|
kDecoderAMRWB,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
kDecoderCELT_32,
|
||||||
|
#endif
|
||||||
#ifdef WEBRTC_CODEC_G722
|
#ifdef WEBRTC_CODEC_G722
|
||||||
kDecoderG722,
|
kDecoderG722,
|
||||||
#endif
|
#endif
|
||||||
@ -698,6 +712,10 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst* codec_inst) {
|
|||||||
} 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);
|
||||||
|
#endif
|
||||||
|
} else if (!STR_CASE_CMP(codec_inst->plname, "CELT")) {
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
return new ACMCELT(kCELT32);
|
||||||
#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
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -51,6 +51,9 @@ class ACMCodecDB {
|
|||||||
#ifdef WEBRTC_CODEC_AMRWB
|
#ifdef WEBRTC_CODEC_AMRWB
|
||||||
, kGSMAMRWB
|
, kGSMAMRWB
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
, kCELT32
|
||||||
|
#endif
|
||||||
#ifdef WEBRTC_CODEC_G722
|
#ifdef WEBRTC_CODEC_G722
|
||||||
, kG722
|
, kG722
|
||||||
#endif
|
#endif
|
||||||
@ -112,6 +115,9 @@ class ACMCodecDB {
|
|||||||
#ifndef WEBRTC_CODEC_AMRWB
|
#ifndef WEBRTC_CODEC_AMRWB
|
||||||
enum {kGSMAMRWB = -1};
|
enum {kGSMAMRWB = -1};
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef WEBRTC_CODEC_CELT
|
||||||
|
enum {kCELT32 = -1};
|
||||||
|
#endif
|
||||||
#ifndef WEBRTC_CODEC_G722
|
#ifndef WEBRTC_CODEC_G722
|
||||||
enum {kG722 = -1};
|
enum {kG722 = -1};
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -664,6 +664,7 @@ ACMGenericCodec::InitEncoderSafe(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_frameLenSmpl = (codecParams->codecInstant).pacsize;
|
_frameLenSmpl = (codecParams->codecInstant).pacsize;
|
||||||
|
_noChannels = codecParams->codecInstant.channels;
|
||||||
status = InternalInitEncoder(codecParams);
|
status = InternalInitEncoder(codecParams);
|
||||||
if(status < 0)
|
if(status < 0)
|
||||||
{
|
{
|
||||||
@ -700,8 +701,6 @@ ACMGenericCodec::InitEncoderSafe(
|
|||||||
status = SetVADSafe(codecParams->enableDTX, codecParams->enableVAD,
|
status = SetVADSafe(codecParams->enableDTX, codecParams->enableVAD,
|
||||||
codecParams->vadMode);
|
codecParams->vadMode);
|
||||||
|
|
||||||
_noChannels = codecParams->codecInstant.channels;
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -811,6 +811,18 @@ public:
|
|||||||
WebRtc_UWord8* payload,
|
WebRtc_UWord8* payload,
|
||||||
WebRtc_Word16* payloadLenBytes);
|
WebRtc_Word16* payloadLenBytes);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// IsTrueStereoCodec()
|
||||||
|
// Call to see if current encoder is a true stereo codec. This function
|
||||||
|
// should be overwritten for codecs which are true stereo codecs
|
||||||
|
// Return value:
|
||||||
|
// -true if stereo codec
|
||||||
|
// -false if not stereo codec.
|
||||||
|
//
|
||||||
|
virtual bool IsTrueStereoCodec() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// All the functions with FunctionNameSafe(...) contain the actual
|
// All the functions with FunctionNameSafe(...) contain the actual
|
||||||
@ -1262,7 +1274,6 @@ protected:
|
|||||||
virtual void SaveDecoderParamSafe(
|
virtual void SaveDecoderParamSafe(
|
||||||
const WebRtcACMCodecParams* codecParams);
|
const WebRtcACMCodecParams* codecParams);
|
||||||
|
|
||||||
|
|
||||||
// &_inAudio[_inAudioIxWrite] always point to where new audio can be
|
// &_inAudio[_inAudioIxWrite] always point to where new audio can be
|
||||||
// written to
|
// written to
|
||||||
WebRtc_Word16 _inAudioIxWrite;
|
WebRtc_Word16 _inAudioIxWrite;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
#
|
#
|
||||||
# Use of this source code is governed by a BSD-style license
|
# Use of this source code is governed by a BSD-style license
|
||||||
# that can be found in the LICENSE file in the root of the source
|
# that can be found in the LICENSE file in the root of the source
|
||||||
@ -42,6 +42,8 @@
|
|||||||
'acm_amr.h',
|
'acm_amr.h',
|
||||||
'acm_amrwb.cc',
|
'acm_amrwb.cc',
|
||||||
'acm_amrwb.h',
|
'acm_amrwb.h',
|
||||||
|
'acm_celt.cc',
|
||||||
|
'acm_celt.h',
|
||||||
'acm_cng.cc',
|
'acm_cng.cc',
|
||||||
'acm_cng.h',
|
'acm_cng.h',
|
||||||
'acm_codec_database.cc',
|
'acm_codec_database.cc',
|
||||||
|
@ -1642,6 +1642,12 @@ AudioCodingModuleImpl::RegisterRecCodecMSSafe(
|
|||||||
else if(jitterBuffer == ACMNetEQ::slaveJB)
|
else if(jitterBuffer == ACMNetEQ::slaveJB)
|
||||||
{
|
{
|
||||||
codecArray = &_slaveCodecs[0];
|
codecArray = &_slaveCodecs[0];
|
||||||
|
if (_codecs[codecId]->IsTrueStereoCodec()) {
|
||||||
|
// True stereo codecs need to use the same codec memory
|
||||||
|
// for both master and slave.
|
||||||
|
_slaveCodecs[mirrorId] = _codecs[mirrorId];
|
||||||
|
_mirrorCodecIdx[mirrorId] = mirrorId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1827,6 +1833,8 @@ AudioCodingModuleImpl::IncomingPacket(
|
|||||||
// current payload type.
|
// current payload type.
|
||||||
if (_stereoReceive[i]) {
|
if (_stereoReceive[i]) {
|
||||||
_expected_channels = 2;
|
_expected_channels = 2;
|
||||||
|
} else {
|
||||||
|
_expected_channels = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset previous received channel
|
// Reset previous received channel
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -583,7 +583,7 @@ void TestAllCodecs::Perform()
|
|||||||
} else {
|
} else {
|
||||||
printf(".");
|
printf(".");
|
||||||
}
|
}
|
||||||
_testCntr++;
|
_testCntr++;
|
||||||
OpenOutFile(_testCntr);
|
OpenOutFile(_testCntr);
|
||||||
char codecPCMA[] = "PCMA";
|
char codecPCMA[] = "PCMA";
|
||||||
RegisterSendCodec('A', codecPCMA, 8000, 64000, 80, 0);
|
RegisterSendCodec('A', codecPCMA, 8000, 64000, 80, 0);
|
||||||
@ -597,13 +597,12 @@ void TestAllCodecs::Perform()
|
|||||||
RegisterSendCodec('A', codecPCMA, 8000, 64000, 400, 0);
|
RegisterSendCodec('A', codecPCMA, 8000, 64000, 400, 0);
|
||||||
Run(_channelA2B);
|
Run(_channelA2B);
|
||||||
RegisterSendCodec('A', codecPCMA, 8000, 64000, 480, 0);
|
RegisterSendCodec('A', codecPCMA, 8000, 64000, 480, 0);
|
||||||
|
Run(_channelA2B);
|
||||||
if(_testMode != 0) {
|
if(_testMode != 0) {
|
||||||
printf("=======================================================================\n");
|
printf("=======================================================================\n");
|
||||||
} else {
|
} else {
|
||||||
printf(".");
|
printf(".");
|
||||||
}
|
}
|
||||||
_testCntr++;
|
|
||||||
Run(_channelA2B);
|
|
||||||
char codecPCMU[] = "PCMU";
|
char codecPCMU[] = "PCMU";
|
||||||
RegisterSendCodec('A', codecPCMU, 8000, 64000, 80, 0);
|
RegisterSendCodec('A', codecPCMU, 8000, 64000, 80, 0);
|
||||||
Run(_channelA2B);
|
Run(_channelA2B);
|
||||||
@ -650,7 +649,19 @@ void TestAllCodecs::Perform()
|
|||||||
Run(_channelA2B);
|
Run(_channelA2B);
|
||||||
_outFileB.Close();
|
_outFileB.Close();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
if(_testMode != 0) {
|
||||||
|
printf("=======================================================================\n");
|
||||||
|
} else {
|
||||||
|
printf(".");
|
||||||
|
}
|
||||||
|
_testCntr++;
|
||||||
|
OpenOutFile(_testCntr);
|
||||||
|
char codecCELT_32[] = "CELT";
|
||||||
|
RegisterSendCodec('A', codecCELT_32, 32000, 48000, 320, 0);
|
||||||
|
Run(_channelA2B);
|
||||||
|
_outFileB.Close();
|
||||||
|
#endif
|
||||||
if(_testMode != 0) {
|
if(_testMode != 0) {
|
||||||
printf("=======================================================================\n");
|
printf("=======================================================================\n");
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -104,6 +104,11 @@ TestPackStereo::SendData(
|
|||||||
payloadDataMaster[j] = (payloadData[i] & 0xF0) + (payloadData[i+1] >> 4);
|
payloadDataMaster[j] = (payloadData[i] & 0xF0) + (payloadData[i+1] >> 4);
|
||||||
payloadDataSlave[j] = ((payloadData[i] & 0x0F) << 4) + (payloadData[i+1] & 0x0F);
|
payloadDataSlave[j] = ((payloadData[i] & 0x0F) << 4) + (payloadData[i+1] & 0x0F);
|
||||||
}
|
}
|
||||||
|
} else if (_codecType == 4) {
|
||||||
|
// True stereo, call both master and slave with whole stream.
|
||||||
|
memcpy(payloadDataMaster, payloadData, payloadSize);
|
||||||
|
memcpy(payloadDataSlave, payloadData, payloadSize);
|
||||||
|
payloadDataSize = payloadSize*2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -115,7 +120,7 @@ TestPackStereo::SendData(
|
|||||||
payloadDataSize = payloadSize*2;
|
payloadDataSize = payloadSize*2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_codecType != 4) {
|
if (_codecType != 5) {
|
||||||
// Call ACM with two packets, one for each channel
|
// Call ACM with two packets, one for each channel
|
||||||
rtpInfo.type.Audio.channel = 1;
|
rtpInfo.type.Audio.channel = 1;
|
||||||
status = _receiverACM->IncomingPacket((WebRtc_Word8*)payloadDataMaster, payloadDataSize/2, rtpInfo);
|
status = _receiverACM->IncomingPacket((WebRtc_Word8*)payloadDataMaster, payloadDataSize/2, rtpInfo);
|
||||||
@ -235,7 +240,8 @@ void TestStereo::Perform()
|
|||||||
if(!strcmp(myCodecParam.plname, "L16") ||
|
if(!strcmp(myCodecParam.plname, "L16") ||
|
||||||
!strcmp(myCodecParam.plname, "PCMA")||
|
!strcmp(myCodecParam.plname, "PCMA")||
|
||||||
!strcmp(myCodecParam.plname, "PCMU")||
|
!strcmp(myCodecParam.plname, "PCMU")||
|
||||||
!strcmp(myCodecParam.plname, "G722"))
|
!strcmp(myCodecParam.plname, "G722")||
|
||||||
|
!strcmp(myCodecParam.plname, "CELT"))
|
||||||
{
|
{
|
||||||
myCodecParam.channels=2;
|
myCodecParam.channels=2;
|
||||||
_acmB->RegisterReceiveCodec(myCodecParam);
|
_acmB->RegisterReceiveCodec(myCodecParam);
|
||||||
@ -246,7 +252,7 @@ void TestStereo::Perform()
|
|||||||
_channelA2B = new TestPackStereo;
|
_channelA2B = new TestPackStereo;
|
||||||
_acmA->RegisterTransportCallback(_channelA2B);
|
_acmA->RegisterTransportCallback(_channelA2B);
|
||||||
_channelA2B->RegisterReceiverACM(_acmB);
|
_channelA2B->RegisterReceiverACM(_acmB);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test Stereo-To-Stereo for all codecs.
|
// Test Stereo-To-Stereo for all codecs.
|
||||||
//
|
//
|
||||||
@ -410,10 +416,30 @@ void TestStereo::Perform()
|
|||||||
RegisterSendCodec('A', codecPCMU, 8000, 64000, 80, codec_channels);
|
RegisterSendCodec('A', codecPCMU, 8000, 64000, 80, codec_channels);
|
||||||
Run(_channelA2B, audio_channels, codec_channels);
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
_acmA->SetVAD(false, false, VADNormal);
|
_acmA->SetVAD(false, false, VADNormal);
|
||||||
Run(_channelA2B, audio_channels, codec_channels);
|
|
||||||
_outFileB.Close();
|
_outFileB.Close();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
if(_testMode != 0) {
|
||||||
|
printf("=======================================================================\n");
|
||||||
|
printf("Test number: %d\n",_testCntr + 1);
|
||||||
|
printf("Test type: Stereo-to-stereo\n");
|
||||||
|
} else {
|
||||||
|
printf(".");
|
||||||
|
}
|
||||||
|
_channelA2B->SetCodecType(4);
|
||||||
|
audio_channels = 2;
|
||||||
|
codec_channels = 2;
|
||||||
|
_testCntr++;
|
||||||
|
OpenOutFile(_testCntr);
|
||||||
|
char codecCELT[] = "CELT";
|
||||||
|
RegisterSendCodec('A', codecCELT, 32000, 48000, 320, codec_channels);
|
||||||
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
|
_acmA->SetVAD(true, true, VADNormal);
|
||||||
|
RegisterSendCodec('A', codecCELT, 32000, 48000, 320, codec_channels);
|
||||||
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
|
_acmA->SetVAD(false, false, VADNormal);
|
||||||
|
_outFileB.Close();
|
||||||
|
#endif
|
||||||
//
|
//
|
||||||
// Test Mono-To-Stereo for all codecs.
|
// Test Mono-To-Stereo for all codecs.
|
||||||
//
|
//
|
||||||
@ -481,13 +507,26 @@ void TestStereo::Perform()
|
|||||||
Run(_channelA2B, audio_channels, codec_channels);
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
_outFileB.Close();
|
_outFileB.Close();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
if(_testMode != 0) {
|
||||||
|
printf("===============================================================\n");
|
||||||
|
printf("Test number: %d\n",_testCntr + 1);
|
||||||
|
printf("Test type: Mono-to-stereo\n");
|
||||||
|
}
|
||||||
|
_testCntr++;
|
||||||
|
_channelA2B->SetCodecType(4);
|
||||||
|
OpenOutFile(_testCntr);
|
||||||
|
RegisterSendCodec('A', codecCELT, 32000, 48000, 320, codec_channels);
|
||||||
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
|
_outFileB.Close();
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test Stereo-To-Mono for all codecs.
|
// Test Stereo-To-Mono for all codecs.
|
||||||
//
|
//
|
||||||
audio_channels = 2;
|
audio_channels = 2;
|
||||||
codec_channels = 1;
|
codec_channels = 1;
|
||||||
_channelA2B->SetCodecType(4);
|
_channelA2B->SetCodecType(5);
|
||||||
|
|
||||||
// Register receivers as mono.
|
// Register receivers as mono.
|
||||||
for(WebRtc_UWord8 n = 0; n < numEncoders; n++) {
|
for(WebRtc_UWord8 n = 0; n < numEncoders; n++) {
|
||||||
@ -495,7 +534,8 @@ void TestStereo::Perform()
|
|||||||
if(!strcmp(myCodecParam.plname, "L16") ||
|
if(!strcmp(myCodecParam.plname, "L16") ||
|
||||||
!strcmp(myCodecParam.plname, "PCMA")||
|
!strcmp(myCodecParam.plname, "PCMA")||
|
||||||
!strcmp(myCodecParam.plname, "PCMU")||
|
!strcmp(myCodecParam.plname, "PCMU")||
|
||||||
!strcmp(myCodecParam.plname, "G722")) {
|
!strcmp(myCodecParam.plname, "G722")||
|
||||||
|
!strcmp(myCodecParam.plname, "CELT")) {
|
||||||
myCodecParam.channels = 1;
|
myCodecParam.channels = 1;
|
||||||
_acmB->RegisterReceiveCodec(myCodecParam);
|
_acmB->RegisterReceiveCodec(myCodecParam);
|
||||||
}
|
}
|
||||||
@ -537,7 +577,7 @@ void TestStereo::Perform()
|
|||||||
if(_testMode != 0) {
|
if(_testMode != 0) {
|
||||||
printf("===============================================================\n");
|
printf("===============================================================\n");
|
||||||
printf("Test number: %d\n",_testCntr + 1);
|
printf("Test number: %d\n",_testCntr + 1);
|
||||||
printf("Test type: Mono-to-stereo\n");
|
printf("Test type: Stereo-to-mono\n");
|
||||||
}
|
}
|
||||||
_testCntr++;
|
_testCntr++;
|
||||||
OpenOutFile(_testCntr);
|
OpenOutFile(_testCntr);
|
||||||
@ -549,7 +589,7 @@ void TestStereo::Perform()
|
|||||||
if(_testMode != 0) {
|
if(_testMode != 0) {
|
||||||
printf("===============================================================\n");
|
printf("===============================================================\n");
|
||||||
printf("Test number: %d\n",_testCntr + 1);
|
printf("Test number: %d\n",_testCntr + 1);
|
||||||
printf("Test type: Mono-to-stereo\n");
|
printf("Test type: Stereo-to-mono\n");
|
||||||
}
|
}
|
||||||
_testCntr++;
|
_testCntr++;
|
||||||
OpenOutFile(_testCntr);
|
OpenOutFile(_testCntr);
|
||||||
@ -559,10 +599,22 @@ void TestStereo::Perform()
|
|||||||
Run(_channelA2B, audio_channels, codec_channels);
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
_outFileB.Close();
|
_outFileB.Close();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WEBRTC_CODEC_CELT
|
||||||
|
if(_testMode != 0) {
|
||||||
|
printf("===============================================================\n");
|
||||||
|
printf("Test number: %d\n",_testCntr + 1);
|
||||||
|
printf("Test type: Stereo-to-mono\n");
|
||||||
|
}
|
||||||
|
_testCntr++;
|
||||||
|
OpenOutFile(_testCntr);
|
||||||
|
RegisterSendCodec('A', codecCELT, 32000, 48000, 320, codec_channels);
|
||||||
|
Run(_channelA2B, audio_channels, codec_channels);
|
||||||
|
_outFileB.Close();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Print out which codecs were tested, and which were not, in the run.
|
// Print out which codecs were tested, and which were not, in the run.
|
||||||
if(_testMode != 0) {
|
if(_testMode != 0) {
|
||||||
printf("/nThe following codecs was INCLUDED in the test:\n");
|
printf("\nThe following codecs was INCLUDED in the test:\n");
|
||||||
#ifdef WEBRTC_CODEC_G722
|
#ifdef WEBRTC_CODEC_G722
|
||||||
printf(" G.722\n");
|
printf(" G.722\n");
|
||||||
#endif
|
#endif
|
||||||
@ -716,6 +768,9 @@ void TestStereo::Run(TestPackStereo* channel, int in_channels, int out_channels)
|
|||||||
if (_counter == 1000) {
|
if (_counter == 1000) {
|
||||||
_counter = 0;
|
_counter = 0;
|
||||||
}
|
}
|
||||||
|
if (_in_file_mono.EndOfFile()) {
|
||||||
|
_in_file_mono.Rewind();
|
||||||
|
}
|
||||||
if (_in_file_stereo.EndOfFile()) {
|
if (_in_file_stereo.EndOfFile()) {
|
||||||
_in_file_stereo.Rewind();
|
_in_file_stereo.Rewind();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -161,6 +161,9 @@ int WebRtcNetEQ_DbAdd(CodecDbInst_t *inst, enum WebRtcNetEQDecoder codec,
|
|||||||
case kDecoderSPEEX_8 :
|
case kDecoderSPEEX_8 :
|
||||||
case kDecoderSPEEX_16 :
|
case kDecoderSPEEX_16 :
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef NETEQ_CELT_CODEC
|
||||||
|
case kDecoderCELT_32 :
|
||||||
|
#endif
|
||||||
#ifdef NETEQ_GSMFR_CODEC
|
#ifdef NETEQ_GSMFR_CODEC
|
||||||
case kDecoderGSMFR :
|
case kDecoderGSMFR :
|
||||||
#endif
|
#endif
|
||||||
@ -468,6 +471,9 @@ int WebRtcNetEQ_DbGetSplitInfo(SplitInfo_t *inst, enum WebRtcNetEQDecoder codecI
|
|||||||
case kDecoderSPEEX_8:
|
case kDecoderSPEEX_8:
|
||||||
case kDecoderSPEEX_16:
|
case kDecoderSPEEX_16:
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef NETEQ_CELT_CODEC
|
||||||
|
case kDecoderCELT_32 :
|
||||||
|
#endif
|
||||||
#ifdef NETEQ_G729_1_CODEC
|
#ifdef NETEQ_G729_1_CODEC
|
||||||
case kDecoderG729_1:
|
case kDecoderG729_1:
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -58,6 +58,7 @@ enum WebRtcNetEQDecoder
|
|||||||
kDecoderG722_1C_48,
|
kDecoderG722_1C_48,
|
||||||
kDecoderSPEEX_8,
|
kDecoderSPEEX_8,
|
||||||
kDecoderSPEEX_16,
|
kDecoderSPEEX_16,
|
||||||
|
kDecoderCELT_32,
|
||||||
kDecoderGSMFR,
|
kDecoderGSMFR,
|
||||||
kDecoderAMR,
|
kDecoderAMR,
|
||||||
kDecoderAMRWB,
|
kDecoderAMRWB,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -328,6 +328,28 @@
|
|||||||
inst.funcUpdBWEst=NULL; \
|
inst.funcUpdBWEst=NULL; \
|
||||||
inst.funcGetErrorCode=NULL;
|
inst.funcGetErrorCode=NULL;
|
||||||
|
|
||||||
|
#define SET_CELT_FUNCTIONS(inst) \
|
||||||
|
inst.funcDecode=(WebRtcNetEQ_FuncDecode)WebRtcCelt_Decode; \
|
||||||
|
inst.funcDecodeRCU=NULL; \
|
||||||
|
inst.funcDecodePLC=(WebRtcNetEQ_FuncDecodePLC)WebRtcCelt_DecodePlc; \
|
||||||
|
inst.funcDecodeInit=(WebRtcNetEQ_FuncDecodeInit)WebRtcCelt_DecoderInit; \
|
||||||
|
inst.funcAddLatePkt=NULL; \
|
||||||
|
inst.funcGetMDinfo=NULL; \
|
||||||
|
inst.funcGetPitch=NULL; \
|
||||||
|
inst.funcUpdBWEst=NULL; \
|
||||||
|
inst.funcGetErrorCode=NULL;
|
||||||
|
|
||||||
|
#define SET_CELTSLAVE_FUNCTIONS(inst) \
|
||||||
|
inst.funcDecode=(WebRtcNetEQ_FuncDecode)WebRtcCelt_DecodeSlave; \
|
||||||
|
inst.funcDecodeRCU=NULL; \
|
||||||
|
inst.funcDecodePLC=(WebRtcNetEQ_FuncDecodePLC)WebRtcCelt_DecodePlc; \
|
||||||
|
inst.funcDecodeInit=(WebRtcNetEQ_FuncDecodeInit)WebRtcCelt_DecoderInit; \
|
||||||
|
inst.funcAddLatePkt=NULL; \
|
||||||
|
inst.funcGetMDinfo=NULL; \
|
||||||
|
inst.funcGetPitch=NULL; \
|
||||||
|
inst.funcUpdBWEst=NULL; \
|
||||||
|
inst.funcGetErrorCode=NULL;
|
||||||
|
|
||||||
#define SET_RED_FUNCTIONS(inst) \
|
#define SET_RED_FUNCTIONS(inst) \
|
||||||
inst.funcDecode=NULL; \
|
inst.funcDecode=NULL; \
|
||||||
inst.funcDecodeRCU=NULL; \
|
inst.funcDecodeRCU=NULL; \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -79,6 +79,8 @@
|
|||||||
*
|
*
|
||||||
* NETEQ_SPEEX_CODEC Enable Speex (at 8 and 16 kHz sample rate)
|
* NETEQ_SPEEX_CODEC Enable Speex (at 8 and 16 kHz sample rate)
|
||||||
*
|
*
|
||||||
|
* NETEQ_CELT_CODEC Enable Celt (at 32 kHz sample rate)
|
||||||
|
*
|
||||||
* NETEQ_GSMFR_CODEC Enable GSM-FR
|
* NETEQ_GSMFR_CODEC Enable GSM-FR
|
||||||
*
|
*
|
||||||
* NETEQ_AMR_CODEC Enable AMR (narrowband)
|
* NETEQ_AMR_CODEC Enable AMR (narrowband)
|
||||||
@ -259,6 +261,7 @@
|
|||||||
#define NETEQ_ISAC_SWB_CODEC
|
#define NETEQ_ISAC_SWB_CODEC
|
||||||
#define NETEQ_32KHZ_WIDEBAND
|
#define NETEQ_32KHZ_WIDEBAND
|
||||||
#define NETEQ_G722_1C_CODEC
|
#define NETEQ_G722_1C_CODEC
|
||||||
|
#define NETEQ_CELT_CODEC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(NETEQ_VOICEENGINE_CODECS))
|
#if (defined(NETEQ_VOICEENGINE_CODECS))
|
||||||
@ -290,6 +293,7 @@
|
|||||||
#define NETEQ_ISAC_SWB_CODEC
|
#define NETEQ_ISAC_SWB_CODEC
|
||||||
#define NETEQ_32KHZ_WIDEBAND
|
#define NETEQ_32KHZ_WIDEBAND
|
||||||
#define NETEQ_G722_1C_CODEC
|
#define NETEQ_G722_1C_CODEC
|
||||||
|
#define NETEQ_CELT_CODEC
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -323,6 +327,7 @@
|
|||||||
#define NETEQ_ISAC_SWB_CODEC
|
#define NETEQ_ISAC_SWB_CODEC
|
||||||
#define NETEQ_32KHZ_WIDEBAND
|
#define NETEQ_32KHZ_WIDEBAND
|
||||||
#define NETEQ_G722_1C_CODEC
|
#define NETEQ_G722_1C_CODEC
|
||||||
|
#define NETEQ_CELT_CODEC
|
||||||
|
|
||||||
/* Super wideband 48kHz codecs */
|
/* Super wideband 48kHz codecs */
|
||||||
#define NETEQ_48KHZ_WIDEBAND
|
#define NETEQ_48KHZ_WIDEBAND
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -678,6 +678,11 @@ int WebRtcNetEQ_GetDefaultCodecSettings(const enum WebRtcNetEQDecoder *codecID,
|
|||||||
codecBytes = 1250; /* 210ms @ 50kbps */
|
codecBytes = 1250; /* 210ms @ 50kbps */
|
||||||
codecBuffers = 10;
|
codecBuffers = 10;
|
||||||
}
|
}
|
||||||
|
else if (codecID[i] == kDecoderCELT_32)
|
||||||
|
{
|
||||||
|
codecBytes = 1250; /* 210ms @ 50kbps */
|
||||||
|
codecBuffers = 10;
|
||||||
|
}
|
||||||
else if (codecID[i] == kDecoderGSMFR)
|
else if (codecID[i] == kDecoderGSMFR)
|
||||||
{
|
{
|
||||||
codecBytes = 340; /* 200ms */
|
codecBytes = 340; /* 200ms */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -580,6 +580,31 @@ int decoder_SPEEX::loadToNetEQ(NETEQTEST_NetEQClass & neteq)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
#include "celt_interface.h"
|
||||||
|
decoder_CELT::decoder_CELT(WebRtc_UWord8 pt, WebRtc_UWord16 fs)
|
||||||
|
:
|
||||||
|
NETEQTEST_Decoder(kDecoderCELT_32, fs, "CELT", pt)
|
||||||
|
{
|
||||||
|
if (WebRtcCelt_CreateDec((CELT_decinst_t **) &_decoder, 1))
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder_CELT::~decoder_CELT()
|
||||||
|
{
|
||||||
|
WebRtcCelt_FreeDec((CELT_decinst_t *) _decoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
int decoder_CELT::loadToNetEQ(NETEQTEST_NetEQClass & neteq)
|
||||||
|
{
|
||||||
|
WebRtcNetEQ_CodecDef codecInst;
|
||||||
|
|
||||||
|
SET_CELT_FUNCTIONS(codecInst);
|
||||||
|
|
||||||
|
return(NETEQTEST_Decoder::loadToNetEQ(neteq, codecInst));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CODEC_RED
|
#ifdef CODEC_RED
|
||||||
int decoder_RED::loadToNetEQ(NETEQTEST_NetEQClass & neteq)
|
int decoder_RED::loadToNetEQ(NETEQTEST_NetEQClass & neteq)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -265,6 +265,14 @@ public:
|
|||||||
int loadToNetEQ(NETEQTEST_NetEQClass & neteq);
|
int loadToNetEQ(NETEQTEST_NetEQClass & neteq);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class decoder_CELT : public NETEQTEST_Decoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
decoder_CELT(WebRtc_UWord8 pt = 0, WebRtc_UWord16 fs = 32000);
|
||||||
|
virtual ~decoder_CELT();
|
||||||
|
int loadToNetEQ(NETEQTEST_NetEQClass & neteq);
|
||||||
|
};
|
||||||
|
|
||||||
class decoder_RED : public NETEQTEST_Decoder
|
class decoder_RED : public NETEQTEST_Decoder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -1027,6 +1027,12 @@ void parsePtypeFile(FILE *ptypeFile, std::map<WebRtc_UWord8, decoderStruct>* dec
|
|||||||
tempDecoder.fs = 16000;
|
tempDecoder.fs = 16000;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
else if(strcmp(codec, "celt32") == 0) {
|
||||||
|
tempDecoder.codec = kDecoderCELT_32;
|
||||||
|
tempDecoder.fs = 32000;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef CODEC_SILK_NB
|
#ifdef CODEC_SILK_NB
|
||||||
else if(strcmp(codec, "silk8") == 0) {
|
else if(strcmp(codec, "silk8") == 0) {
|
||||||
tempDecoder.codec = NETEQ_CODEC_SILK_8;
|
tempDecoder.codec = NETEQ_CODEC_SILK_8;
|
||||||
@ -1421,6 +1427,11 @@ void createAndInsertDecoders (NETEQTEST_NetEQClass *neteq, std::map<WebRtc_UWord
|
|||||||
*dec = new decoder_SPEEX( pt, 16000 );
|
*dec = new decoder_SPEEX( pt, 16000 );
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
case kDecoderCELT_32:
|
||||||
|
*dec = new decoder_CELT( pt, 32000 );
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
#ifdef CODEC_RED
|
#ifdef CODEC_RED
|
||||||
case kDecoderRED:
|
case kDecoderRED:
|
||||||
*dec = new decoder_RED( pt );
|
*dec = new decoder_RED( pt );
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@ -54,6 +54,7 @@
|
|||||||
#define NETEQ_CODEC_G729_1_PT 107
|
#define NETEQ_CODEC_G729_1_PT 107
|
||||||
#define NETEQ_CODEC_G729D_PT 123
|
#define NETEQ_CODEC_G729D_PT 123
|
||||||
#define NETEQ_CODEC_MELPE_PT 124
|
#define NETEQ_CODEC_MELPE_PT 124
|
||||||
|
#define NETEQ_CODEC_CELT32_PT 114
|
||||||
|
|
||||||
/* Extra dynamic codepoints */
|
/* Extra dynamic codepoints */
|
||||||
#define NETEQ_CODEC_AMRWB_PT 120
|
#define NETEQ_CODEC_AMRWB_PT 120
|
||||||
|
@ -155,6 +155,9 @@ void stereoInterleave(unsigned char* data, int dataLen, int stride);
|
|||||||
#if ((defined CODEC_SPEEX_8)||(defined CODEC_SPEEX_16))
|
#if ((defined CODEC_SPEEX_8)||(defined CODEC_SPEEX_16))
|
||||||
#include "SpeexInterface.h"
|
#include "SpeexInterface.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
#include "celt_interface.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/***********************************/
|
/***********************************/
|
||||||
@ -227,6 +230,9 @@ WebRtcVadInst *VAD_inst[2];
|
|||||||
#ifdef CODEC_SPEEX_16
|
#ifdef CODEC_SPEEX_16
|
||||||
SPEEX_encinst_t *SPEEX16enc_inst[2];
|
SPEEX_encinst_t *SPEEX16enc_inst[2];
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
CELT_encinst_t *CELT32enc_inst[2];
|
||||||
|
#endif
|
||||||
#ifdef CODEC_G711
|
#ifdef CODEC_G711
|
||||||
void *G711state[2]={NULL, NULL};
|
void *G711state[2]={NULL, NULL};
|
||||||
#endif
|
#endif
|
||||||
@ -368,6 +374,9 @@ int main(int argc, char* argv[])
|
|||||||
#ifdef CODEC_SPEEX_16
|
#ifdef CODEC_SPEEX_16
|
||||||
printf(" : speex16 speex coder (16 kHz)\n");
|
printf(" : speex16 speex coder (16 kHz)\n");
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
printf(" : celt32 celt coder (32 kHz)\n");
|
||||||
|
#endif
|
||||||
#ifdef CODEC_RED
|
#ifdef CODEC_RED
|
||||||
#ifdef CODEC_G711
|
#ifdef CODEC_G711
|
||||||
printf(" : red_pcm Redundancy RTP packet with 2*G711A frames\n");
|
printf(" : red_pcm Redundancy RTP packet with 2*G711A frames\n");
|
||||||
@ -950,6 +959,11 @@ void NetEQTest_GetCodec_and_PT(char * name, enum WebRtcNetEQDecoder *codec, int
|
|||||||
*codec=kDecoderSPEEX_16;
|
*codec=kDecoderSPEEX_16;
|
||||||
*PT=NETEQ_CODEC_SPEEX16_PT;
|
*PT=NETEQ_CODEC_SPEEX16_PT;
|
||||||
}
|
}
|
||||||
|
else if(!strcmp(name,"celt32")){
|
||||||
|
*fs=32000;
|
||||||
|
*codec=kDecoderCELT_32;
|
||||||
|
*PT=NETEQ_CODEC_CELT32_PT;
|
||||||
|
}
|
||||||
else if(!strcmp(name,"red_pcm")){
|
else if(!strcmp(name,"red_pcm")){
|
||||||
*codec=kDecoderPCMa;
|
*codec=kDecoderPCMa;
|
||||||
*PT=NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
|
*PT=NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
|
||||||
@ -1122,6 +1136,26 @@ int NetEQTest_init_coders(enum WebRtcNetEQDecoder coder, int enc_frameSize, int
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
case kDecoderCELT_32 :
|
||||||
|
if (sampfreq==32000) {
|
||||||
|
if (enc_frameSize==320) {
|
||||||
|
ok=WebRtcCelt_CreateEnc(&CELT32enc_inst[k], 1 /*mono*/);
|
||||||
|
if (ok!=0) {
|
||||||
|
printf("Error: Couldn't allocate memory for Celt encoding instance\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("\nError: Celt only supports 10 ms!!\n\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
ok=WebRtcCelt_EncoderInit(CELT32enc_inst[k], 1 /*mono*/, 48000 /*bitrate*/);
|
||||||
|
if (ok!=0) exit(0);
|
||||||
|
} else {
|
||||||
|
printf("\nError - Celt32 called with sample frequency other than 32 kHz.\n\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CODEC_G722_1_16
|
#ifdef CODEC_G722_1_16
|
||||||
case kDecoderG722_1_16 :
|
case kDecoderG722_1_16 :
|
||||||
@ -1511,6 +1545,11 @@ int NetEQTest_free_coders(enum WebRtcNetEQDecoder coder, int numChannels) {
|
|||||||
WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
|
WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
case kDecoderCELT_32 :
|
||||||
|
WebRtcCelt_FreeEnc(CELT32enc_inst[k]);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CODEC_G722_1_16
|
#ifdef CODEC_G722_1_16
|
||||||
case kDecoderG722_1_16 :
|
case kDecoderG722_1_16 :
|
||||||
@ -1814,6 +1853,20 @@ int NetEQTest_encode(int coder, WebRtc_Word16 *indata, int frameLen, unsigned ch
|
|||||||
cdlen=WebRtcSpeex_GetBitstream(SPEEX16enc_inst[k], (WebRtc_Word16*)encoded);
|
cdlen=WebRtcSpeex_GetBitstream(SPEEX16enc_inst[k], (WebRtc_Word16*)encoded);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CODEC_CELT_32
|
||||||
|
else if (coder==kDecoderCELT_32) { /* Celt */
|
||||||
|
int encodedLen = 0;
|
||||||
|
cdlen = 0;
|
||||||
|
while (cdlen <= 0) {
|
||||||
|
cdlen = WebRtcCelt_Encode(CELT32enc_inst[k], &indata[encodedLen], encoded);
|
||||||
|
encodedLen += 10*32; /* 10 ms */
|
||||||
|
}
|
||||||
|
if( (encodedLen != frameLen) || cdlen < 0) {
|
||||||
|
printf("Error encoding Celt frame!\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
indata += frameLen;
|
indata += frameLen;
|
||||||
encoded += cdlen;
|
encoded += cdlen;
|
||||||
|
@ -17,3 +17,4 @@ pcm16b_swb32khz 95
|
|||||||
//pcm16b_swb48khz 96
|
//pcm16b_swb48khz 96
|
||||||
//mpeg4aac 122
|
//mpeg4aac 122
|
||||||
g722 9
|
g722 9
|
||||||
|
celt32 114
|
||||||
|
@ -225,6 +225,7 @@ ModuleRTPUtility::Payload* RTPReceiverAudio::RegisterReceiveAudioPayload(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
WebRtc_UWord8 bitsPerSample = 0; // zero implies frame based
|
WebRtc_UWord8 bitsPerSample = 0; // zero implies frame based
|
||||||
|
bool isTrueStereo = false; // Default value
|
||||||
if (ModuleRTPUtility::StringCompare(payloadName, "DVI4", 4)) {
|
if (ModuleRTPUtility::StringCompare(payloadName, "DVI4", 4)) {
|
||||||
bitsPerSample = 4;
|
bitsPerSample = 4;
|
||||||
} else if(ModuleRTPUtility::StringCompare(payloadName, "G722", 4)) {
|
} else if(ModuleRTPUtility::StringCompare(payloadName, "G722", 4)) {
|
||||||
@ -250,6 +251,9 @@ ModuleRTPUtility::Payload* RTPReceiverAudio::RegisterReceiveAudioPayload(
|
|||||||
bitsPerSample = 8;
|
bitsPerSample = 8;
|
||||||
} else if(ModuleRTPUtility::StringCompare(payloadName,"PCMA",4)) {
|
} else if(ModuleRTPUtility::StringCompare(payloadName,"PCMA",4)) {
|
||||||
bitsPerSample = 8;
|
bitsPerSample = 8;
|
||||||
|
} else if(ModuleRTPUtility::StringCompare(payloadName,"CELT",4))
|
||||||
|
{
|
||||||
|
isTrueStereo = true;
|
||||||
}
|
}
|
||||||
ModuleRTPUtility::Payload* payload = new ModuleRTPUtility::Payload;
|
ModuleRTPUtility::Payload* payload = new ModuleRTPUtility::Payload;
|
||||||
payload->name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
|
payload->name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
|
||||||
@ -258,6 +262,7 @@ ModuleRTPUtility::Payload* RTPReceiverAudio::RegisterReceiveAudioPayload(
|
|||||||
payload->typeSpecific.Audio.channels = channels;
|
payload->typeSpecific.Audio.channels = channels;
|
||||||
payload->typeSpecific.Audio.bitsPerSample = bitsPerSample;
|
payload->typeSpecific.Audio.bitsPerSample = bitsPerSample;
|
||||||
payload->typeSpecific.Audio.rate = rate;
|
payload->typeSpecific.Audio.rate = rate;
|
||||||
|
payload->typeSpecific.Audio.trueStereoCodec = isTrueStereo;
|
||||||
payload->audio = true;
|
payload->audio = true;
|
||||||
return payload;
|
return payload;
|
||||||
}
|
}
|
||||||
@ -539,6 +544,18 @@ RTPReceiverAudio::ParseAudioCodecSpecific(WebRtcRTPHeader* rtpHeader,
|
|||||||
rtpHeader);
|
rtpHeader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (audioSpecific.trueStereoCodec)
|
||||||
|
{
|
||||||
|
// One callback with the whole payload for each channel.
|
||||||
|
for(int channel = 1; (channel <= audioSpecific.channels) &&
|
||||||
|
(retVal == 0); channel++)
|
||||||
|
{
|
||||||
|
// One callback per channel.
|
||||||
|
rtpHeader->type.Audio.channel = channel;
|
||||||
|
retVal = CallbackOfReceivedPayloadData(payloadData,
|
||||||
|
payloadLength,
|
||||||
|
rtpHeader);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
for(int channel = 1; channel <= audioSpecific.channels && retVal == 0; channel++)
|
for(int channel = 1; channel <= audioSpecific.channels && retVal == 0; channel++)
|
||||||
|
@ -42,6 +42,7 @@ namespace ModuleRTPUtility
|
|||||||
WebRtc_UWord8 channels;
|
WebRtc_UWord8 channels;
|
||||||
WebRtc_UWord8 bitsPerSample;
|
WebRtc_UWord8 bitsPerSample;
|
||||||
WebRtc_UWord32 rate;
|
WebRtc_UWord32 rate;
|
||||||
|
bool trueStereoCodec;
|
||||||
};
|
};
|
||||||
struct VideoPayload
|
struct VideoPayload
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user