andrew@webrtc.org 2014-09-23 01:32:57 +00:00
parent 8c5740b485
commit a3c4d4dd2c
15 changed files with 68 additions and 73 deletions

View File

@ -130,7 +130,7 @@ extern "C" {
int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst, int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
const int16_t *speechIn, const int16_t *speechIn,
uint8_t* encoded); int16_t *encoded);

View File

@ -17,7 +17,6 @@
#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h" #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
#include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include "webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h" #include "webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h"
@ -356,7 +355,7 @@ int16_t WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst, int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
const int16_t *speechIn, const int16_t *speechIn,
uint8_t* encoded) int16_t *encoded)
{ {
ISACFIX_SubStruct *ISAC_inst; ISACFIX_SubStruct *ISAC_inst;
int16_t stream_len; int16_t stream_len;
@ -383,20 +382,16 @@ int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
return -1; return -1;
} }
assert(stream_len % 2 == 0);
/* convert from bytes to int16_t */
#ifndef WEBRTC_ARCH_BIG_ENDIAN #ifndef WEBRTC_ARCH_BIG_ENDIAN
/* The encoded data vector is supposesd to be big-endian, but our internal for (k=0;k<(stream_len+1)>>1;k++) {
representation is little-endian. So byteswap. */ encoded[k] = (int16_t)( ( (uint16_t)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 )
for (k = 0; k < stream_len / 2; ++k) { | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8));
uint16_t s = ISAC_inst->ISACenc_obj.bitstr_obj.stream[k];
/* In big-endian, we have... */
encoded[2 * k] = s >> 8; /* ...most significant byte at low address... */
encoded[2 * k + 1] = s; /* ...least significant byte at high address. */
} }
#else #else
/* The encoded data vector and our internal representation are both WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1);
big-endian. */
memcpy(encoded, ISAC_inst->ISACenc_obj.bitstr_obj.stream, stream_len);
#endif #endif

View File

@ -71,7 +71,7 @@ float IsacSpeedTest::EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
size_t pointer = 0; size_t pointer = 0;
for (int idx = 0; idx < subblocks; idx++, pointer += subblock_length) { for (int idx = 0; idx < subblocks; idx++, pointer += subblock_length) {
value = WebRtcIsacfix_Encode(ISACFIX_main_inst_, &in_data[pointer], value = WebRtcIsacfix_Encode(ISACFIX_main_inst_, &in_data[pointer],
bit_stream); reinterpret_cast<int16_t*>(bit_stream));
} }
clocks = clock() - clocks; clocks = clock() - clocks;
EXPECT_GT(value, 0); EXPECT_GT(value, 0);

View File

@ -565,7 +565,7 @@ int main(int argc, char* argv[])
/* Encode */ /* Encode */
stream_len = WebRtcIsacfix_Encode(ISAC_main_inst, stream_len = WebRtcIsacfix_Encode(ISAC_main_inst,
shortdata, shortdata,
(uint8_t*)streamdata); (int16_t*)streamdata);
/* If packet is ready, and CE testing, call the different API /* If packet is ready, and CE testing, call the different API
functions from the internal API. */ functions from the internal API. */

View File

@ -439,9 +439,7 @@ int main(int argc, char* argv[])
/* iSAC encoding */ /* iSAC encoding */
if (mode==0 || mode ==1) { if (mode==0 || mode ==1) {
stream_len = WebRtcIsac_Encode(ISAC_main_inst, stream_len = WebRtcIsac_Encode(ISAC_main_inst, shortdata, streamdata);
shortdata,
(uint8_t*)streamdata);
if (stream_len < 0) { if (stream_len < 0) {
/* exit if returned with error */ /* exit if returned with error */
errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst); errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
@ -451,10 +449,7 @@ int main(int argc, char* argv[])
} else if (mode==2 || mode==3) { } else if (mode==2 || mode==3) {
/* iSAC encoding */ /* iSAC encoding */
if (nbTest != 1) if (nbTest != 1)
stream_len = WebRtcIsacfix_Encode( stream_len = WebRtcIsacfix_Encode(ISACFIX_main_inst, shortdata, streamdata);
ISACFIX_main_inst,
shortdata,
(uint8_t*)streamdata);
else else
stream_len = WebRtcIsacfix_EncodeNb(ISACFIX_main_inst, shortdata, streamdata); stream_len = WebRtcIsacfix_EncodeNb(ISACFIX_main_inst, shortdata, streamdata);

View File

@ -147,7 +147,7 @@ extern "C" {
int16_t WebRtcIsac_Encode( int16_t WebRtcIsac_Encode(
ISACStruct* ISAC_main_inst, ISACStruct* ISAC_main_inst,
const int16_t* speechIn, const int16_t* speechIn,
uint8_t* encoded); int16_t* encoded);
/****************************************************************************** /******************************************************************************

View File

@ -496,7 +496,7 @@ int16_t WebRtcIsac_EncoderInit(ISACStruct* ISAC_main_inst,
*/ */
int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
const int16_t* speechIn, const int16_t* speechIn,
uint8_t* encoded) { int16_t* encoded) {
float inFrame[FRAMESAMPLES_10ms]; float inFrame[FRAMESAMPLES_10ms];
int16_t speechInLB[FRAMESAMPLES_10ms]; int16_t speechInLB[FRAMESAMPLES_10ms];
int16_t speechInUB[FRAMESAMPLES_10ms]; int16_t speechInUB[FRAMESAMPLES_10ms];
@ -504,6 +504,7 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
int16_t streamLenUB = 0; int16_t streamLenUB = 0;
int16_t streamLen = 0; int16_t streamLen = 0;
int16_t k = 0; int16_t k = 0;
uint8_t* ptrEncodedUW8 = (uint8_t*)encoded;
int garbageLen = 0; int garbageLen = 0;
int32_t bottleneck = 0; int32_t bottleneck = 0;
int16_t bottleneckIdx = 0; int16_t bottleneckIdx = 0;
@ -642,22 +643,23 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
streamLenUB = 0; streamLenUB = 0;
} }
memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB); memcpy(ptrEncodedUW8, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB);
streamLen = streamLenLB; streamLen = streamLenLB;
if (streamLenUB > 0) { if (streamLenUB > 0) {
encoded[streamLenLB] = streamLenUB + 1 + LEN_CHECK_SUM_WORD8; ptrEncodedUW8[streamLenLB] = (uint8_t)(streamLenUB + 1 +
memcpy(&encoded[streamLenLB + 1], LEN_CHECK_SUM_WORD8);
instUB->ISACencUB_obj.bitstr_obj.stream, memcpy(&ptrEncodedUW8[streamLenLB + 1],
streamLenUB); instUB->ISACencUB_obj.bitstr_obj.stream, streamLenUB);
streamLen += encoded[streamLenLB]; streamLen += ptrEncodedUW8[streamLenLB];
} else { } else {
encoded[streamLenLB] = 0; ptrEncodedUW8[streamLenLB] = 0;
} }
} else { } else {
if (streamLenLB == 0) { if (streamLenLB == 0) {
return 0; return 0;
} }
memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB); memcpy(ptrEncodedUW8, instLB->ISACencLB_obj.bitstr_obj.stream,
streamLenLB);
streamLenUB = 0; streamLenUB = 0;
streamLen = streamLenLB; streamLen = streamLenLB;
} }
@ -695,11 +697,11 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
* 255 is the max garbage length we can signal using 8 bits. */ * 255 is the max garbage length we can signal using 8 bits. */
if ((instISAC->bandwidthKHz == isac8kHz) || if ((instISAC->bandwidthKHz == isac8kHz) ||
(streamLenUB == 0)) { (streamLenUB == 0)) {
ptrGarbage = &encoded[streamLenLB]; ptrGarbage = &ptrEncodedUW8[streamLenLB];
limit = streamLen + 255; limit = streamLen + 255;
} else { } else {
ptrGarbage = &encoded[streamLenLB + 1 + streamLenUB]; ptrGarbage = &ptrEncodedUW8[streamLenLB + 1 + streamLenUB];
limit = streamLen + (255 - encoded[streamLenLB]); limit = streamLen + (255 - ptrEncodedUW8[streamLenLB]);
} }
minBytes = (minBytes > limit) ? limit : minBytes; minBytes = (minBytes > limit) ? limit : minBytes;
@ -716,12 +718,13 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
* That is the only way to preserve backward compatibility. */ * That is the only way to preserve backward compatibility. */
if ((instISAC->bandwidthKHz == isac8kHz) || if ((instISAC->bandwidthKHz == isac8kHz) ||
(streamLenUB == 0)) { (streamLenUB == 0)) {
encoded[streamLenLB] = garbageLen; ptrEncodedUW8[streamLenLB] = (uint8_t)garbageLen;
} else { } else {
encoded[streamLenLB] += garbageLen; ptrEncodedUW8[streamLenLB] += (uint8_t)garbageLen;
/* Write the length of the garbage at the end of the upper-band /* Write the length of the garbage at the end of the upper-band
* bit-stream, if exists. This helps for sanity check. */ * bit-stream, if exists. This helps for sanity check. */
encoded[streamLenLB + 1 + streamLenUB] = garbageLen; ptrEncodedUW8[streamLenLB + 1 + streamLenUB] =
(uint8_t)garbageLen;
} }
streamLen += garbageLen; streamLen += garbageLen;
@ -738,14 +741,16 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
if ((instISAC->bandwidthKHz != isac8kHz) && (streamLenUB > 0)) { if ((instISAC->bandwidthKHz != isac8kHz) && (streamLenUB > 0)) {
uint32_t crc; uint32_t crc;
WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])), WebRtcIsac_GetCrc((int16_t*)(&(ptrEncodedUW8[streamLenLB + 1])),
streamLenUB + garbageLen, &crc); streamLenUB + garbageLen, &crc);
#ifndef WEBRTC_ARCH_BIG_ENDIAN #ifndef WEBRTC_ARCH_BIG_ENDIAN
for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) { for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
encoded[streamLen - LEN_CHECK_SUM_WORD8 + k] = crc >> (24 - k * 8); ptrEncodedUW8[streamLen - LEN_CHECK_SUM_WORD8 + k] =
(uint8_t)((crc >> (24 - k * 8)) & 0xFF);
} }
#else #else
memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc, LEN_CHECK_SUM_WORD8); memcpy(&ptrEncodedUW8[streamLenLB + streamLenUB + 1], &crc,
LEN_CHECK_SUM_WORD8);
#endif #endif
} }
return streamLen; return streamLen;

View File

@ -31,7 +31,7 @@ class IsacTest : public ::testing::Test {
int16_t speech_data_[kIsacNumberOfSamples]; int16_t speech_data_[kIsacNumberOfSamples];
int16_t output_data_[kIsacNumberOfSamples]; int16_t output_data_[kIsacNumberOfSamples];
uint8_t bitstream_[kMaxBytes]; int16_t bitstream_[kMaxBytes / 2];
uint8_t bitstream_small_[7]; // Simulate sync packets. uint8_t bitstream_small_[7]; // Simulate sync packets.
}; };

View File

@ -662,8 +662,8 @@ int main(int argc, char* argv[])
if(!(testNum == 3 && framecnt == 0)) if(!(testNum == 3 && framecnt == 0))
{ {
stream_len = WebRtcIsac_Encode(ISAC_main_inst, stream_len = WebRtcIsac_Encode(ISAC_main_inst,
shortdata, shortdata,
(uint8_t*)streamdata); (int16_t*)streamdata);
if((payloadSize != 0) && (stream_len > payloadSize)) if((payloadSize != 0) && (stream_len > payloadSize))
{ {
if(testNum == 0) if(testNum == 0)

View File

@ -283,8 +283,7 @@ int main(int argc, char* argv[])
streamLen = WebRtcIsac_Encode(codecInstance[senderIdx], streamLen = WebRtcIsac_Encode(codecInstance[senderIdx],
audioBuff10ms, audioBuff10ms, (short*)bitStream);
(uint8_t*)bitStream);
int16_t ggg; int16_t ggg;
if (streamLen > 0) { if (streamLen > 0) {
if(( WebRtcIsac_ReadFrameLen(codecInstance[receiverIdx], if(( WebRtcIsac_ReadFrameLen(codecInstance[receiverIdx],

View File

@ -373,10 +373,8 @@ valid values are 8 and 16.\n", sampFreqKHz);
cur_framesmpls += samplesIn10Ms; cur_framesmpls += samplesIn10Ms;
//-------- iSAC encoding --------- //-------- iSAC encoding ---------
stream_len = WebRtcIsac_Encode( stream_len = WebRtcIsac_Encode(ISAC_main_inst, shortdata,
ISAC_main_inst, (int16_t*)payload);
shortdata,
(uint8_t*)payload);
if(stream_len < 0) if(stream_len < 0)
{ {

View File

@ -347,9 +347,8 @@ int16_t ACMISAC::InternalEncode(uint8_t* bitstream,
return -1; return -1;
} }
*bitstream_len_byte = ACM_ISAC_ENCODE( *bitstream_len_byte = ACM_ISAC_ENCODE(
codec_inst_ptr_->inst, codec_inst_ptr_->inst, &in_audio_[in_audio_ix_read_],
&in_audio_[in_audio_ix_read_], reinterpret_cast<int16_t*>(bitstream));
bitstream);
// increment the read index this tell the caller that how far // increment the read index this tell the caller that how far
// we have gone forward in reading the audio buffer // we have gone forward in reading the audio buffer
in_audio_ix_read_ += samples_in_10ms_audio_; in_audio_ix_read_ += samples_in_10ms_audio_;

View File

@ -348,11 +348,14 @@ class AudioDecoderIsacFloatTest : public AudioDecoderTest {
virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
uint8_t* output) { uint8_t* output) {
// Insert 3 * 10 ms. Expect non-zero output on third call. // Insert 3 * 10 ms. Expect non-zero output on third call.
EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input,
reinterpret_cast<int16_t*>(output)));
input += input_size_; input += input_size_;
EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input,
reinterpret_cast<int16_t*>(output)));
input += input_size_; input += input_size_;
int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output); int enc_len_bytes =
WebRtcIsac_Encode(encoder_, input, reinterpret_cast<int16_t*>(output));
EXPECT_GT(enc_len_bytes, 0); EXPECT_GT(enc_len_bytes, 0);
return enc_len_bytes; return enc_len_bytes;
} }
@ -385,11 +388,14 @@ class AudioDecoderIsacSwbTest : public AudioDecoderTest {
virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
uint8_t* output) { uint8_t* output) {
// Insert 3 * 10 ms. Expect non-zero output on third call. // Insert 3 * 10 ms. Expect non-zero output on third call.
EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input,
reinterpret_cast<int16_t*>(output)));
input += input_size_; input += input_size_;
EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input,
reinterpret_cast<int16_t*>(output)));
input += input_size_; input += input_size_;
int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output); int enc_len_bytes =
WebRtcIsac_Encode(encoder_, input, reinterpret_cast<int16_t*>(output));
EXPECT_GT(enc_len_bytes, 0); EXPECT_GT(enc_len_bytes, 0);
return enc_len_bytes; return enc_len_bytes;
} }
@ -435,11 +441,14 @@ class AudioDecoderIsacFixTest : public AudioDecoderTest {
virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
uint8_t* output) { uint8_t* output) {
// Insert 3 * 10 ms. Expect non-zero output on third call. // Insert 3 * 10 ms. Expect non-zero output on third call.
EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output)); EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input,
reinterpret_cast<int16_t*>(output)));
input += input_size_; input += input_size_;
EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output)); EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input,
reinterpret_cast<int16_t*>(output)));
input += input_size_; input += input_size_;
int enc_len_bytes = WebRtcIsacfix_Encode(encoder_, input, output); int enc_len_bytes = WebRtcIsacfix_Encode(
encoder_, input, reinterpret_cast<int16_t*>(output));
EXPECT_GT(enc_len_bytes, 0); EXPECT_GT(enc_len_bytes, 0);
return enc_len_bytes; return enc_len_bytes;
} }

View File

@ -1632,13 +1632,9 @@ int NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * e
cdlen=0; cdlen=0;
while (cdlen<=0) { while (cdlen<=0) {
#ifdef CODEC_ISAC /* floating point */ #ifdef CODEC_ISAC /* floating point */
cdlen = WebRtcIsac_Encode(ISAC_inst[k], cdlen=WebRtcIsac_Encode(ISAC_inst[k],&indata[noOfCalls*160],(int16_t*)encoded);
&indata[noOfCalls * 160],
encoded);
#else /* fixed point */ #else /* fixed point */
cdlen = WebRtcIsacfix_Encode(ISAC_inst[k], cdlen=WebRtcIsacfix_Encode(ISAC_inst[k],&indata[noOfCalls*160],(int16_t*)encoded);
&indata[noOfCalls * 160],
encoded);
#endif #endif
noOfCalls++; noOfCalls++;
} }
@ -1649,9 +1645,7 @@ int NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * e
int noOfCalls=0; int noOfCalls=0;
cdlen=0; cdlen=0;
while (cdlen<=0) { while (cdlen<=0) {
cdlen = WebRtcIsac_Encode(ISACSWB_inst[k], cdlen=WebRtcIsac_Encode(ISACSWB_inst[k],&indata[noOfCalls*320],(int16_t*)encoded);
&indata[noOfCalls * 320],
encoded);
noOfCalls++; noOfCalls++;
} }
} }

View File

@ -138,7 +138,8 @@ int NetEqIsacQualityTest::EncodeBlock(int16_t* in_data,
// The Isac encoder does not perform encoding (and returns 0) until it // The Isac encoder does not perform encoding (and returns 0) until it
// receives a sequence of sub-blocks that amount to the frame duration. // receives a sequence of sub-blocks that amount to the frame duration.
EXPECT_EQ(0, value); EXPECT_EQ(0, value);
value = WebRtcIsacfix_Encode(isac_encoder_, &in_data[pointer], payload); value = WebRtcIsacfix_Encode(isac_encoder_, &in_data[pointer],
reinterpret_cast<int16_t*>(payload));
} }
EXPECT_GT(value, 0); EXPECT_GT(value, 0);
return value; return value;