From 8c5740b48507e8fbb2c56c7dd52a1197ebb5d20d Mon Sep 17 00:00:00 2001 From: "kwiberg@webrtc.org" Date: Mon, 22 Sep 2014 23:04:14 +0000 Subject: [PATCH] WebRtcIsac_Encode and WebRtcIsacfix_Encode: Type encoded stream as uint8_t We have to fix both at once, since there's a macro that calls one of them or the other. BUG=909 R=andrew@webrtc.org, bjornv@webrtc.org, henrik.lundin@webrtc.org, minyue@webrtc.org Review URL: https://webrtc-codereview.appspot.com/19229004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7266 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../codecs/isac/fix/interface/isacfix.h | 2 +- .../codecs/isac/fix/source/isacfix.c | 21 ++++++---- .../codecs/isac/fix/test/isac_speed_test.cc | 2 +- .../codecs/isac/fix/test/kenny.cc | 2 +- .../codecs/isac/fix/test/test_iSACfixfloat.c | 9 +++- .../codecs/isac/main/interface/isac.h | 2 +- .../codecs/isac/main/source/isac.c | 41 ++++++++----------- .../codecs/isac/main/source/isac_unittest.cc | 2 +- .../test/ReleaseTest-API/ReleaseTest-API.cc | 4 +- .../SwitchingSampRate/SwitchingSampRate.cc | 3 +- .../codecs/isac/main/test/simpleKenny.c | 6 ++- .../audio_coding/main/acm2/acm_isac.cc | 5 ++- .../neteq/audio_decoder_unittest.cc | 27 ++++-------- .../audio_coding/neteq/test/RTPencode.cc | 12 ++++-- .../neteq/test/neteq_isac_quality_test.cc | 3 +- 15 files changed, 73 insertions(+), 68 deletions(-) diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h b/webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h index 7cd295440..942727ab4 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h +++ b/webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h @@ -130,7 +130,7 @@ extern "C" { int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst, const int16_t *speechIn, - int16_t *encoded); + uint8_t* encoded); diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.c index e855daea3..48631b509 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.c @@ -17,6 +17,7 @@ #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h" +#include #include #include "webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h" @@ -355,7 +356,7 @@ int16_t WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst, int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst, const int16_t *speechIn, - int16_t *encoded) + uint8_t* encoded) { ISACFIX_SubStruct *ISAC_inst; int16_t stream_len; @@ -382,16 +383,20 @@ int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst, return -1; } - - /* convert from bytes to int16_t */ + assert(stream_len % 2 == 0); #ifndef WEBRTC_ARCH_BIG_ENDIAN - for (k=0;k<(stream_len+1)>>1;k++) { - encoded[k] = (int16_t)( ( (uint16_t)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 ) - | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8)); + /* The encoded data vector is supposesd to be big-endian, but our internal + representation is little-endian. So byteswap. */ + for (k = 0; k < stream_len / 2; ++k) { + 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 - WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1); + /* The encoded data vector and our internal representation are both + big-endian. */ + memcpy(encoded, ISAC_inst->ISACenc_obj.bitstr_obj.stream, stream_len); #endif diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc b/webrtc/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc index 358275111..207ee8c30 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc +++ b/webrtc/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc @@ -71,7 +71,7 @@ float IsacSpeedTest::EncodeABlock(int16_t* in_data, uint8_t* bit_stream, size_t pointer = 0; for (int idx = 0; idx < subblocks; idx++, pointer += subblock_length) { value = WebRtcIsacfix_Encode(ISACFIX_main_inst_, &in_data[pointer], - reinterpret_cast(bit_stream)); + bit_stream); } clocks = clock() - clocks; EXPECT_GT(value, 0); diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/test/kenny.cc b/webrtc/modules/audio_coding/codecs/isac/fix/test/kenny.cc index c3c6f1352..91c4d76ab 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/test/kenny.cc +++ b/webrtc/modules/audio_coding/codecs/isac/fix/test/kenny.cc @@ -565,7 +565,7 @@ int main(int argc, char* argv[]) /* Encode */ stream_len = WebRtcIsacfix_Encode(ISAC_main_inst, shortdata, - (int16_t*)streamdata); + (uint8_t*)streamdata); /* If packet is ready, and CE testing, call the different API functions from the internal API. */ diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/test/test_iSACfixfloat.c b/webrtc/modules/audio_coding/codecs/isac/fix/test/test_iSACfixfloat.c index d5682b219..965f2bc1f 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/test/test_iSACfixfloat.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/test/test_iSACfixfloat.c @@ -439,7 +439,9 @@ int main(int argc, char* argv[]) /* iSAC encoding */ if (mode==0 || mode ==1) { - stream_len = WebRtcIsac_Encode(ISAC_main_inst, shortdata, streamdata); + stream_len = WebRtcIsac_Encode(ISAC_main_inst, + shortdata, + (uint8_t*)streamdata); if (stream_len < 0) { /* exit if returned with error */ errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst); @@ -449,7 +451,10 @@ int main(int argc, char* argv[]) } else if (mode==2 || mode==3) { /* iSAC encoding */ if (nbTest != 1) - stream_len = WebRtcIsacfix_Encode(ISACFIX_main_inst, shortdata, streamdata); + stream_len = WebRtcIsacfix_Encode( + ISACFIX_main_inst, + shortdata, + (uint8_t*)streamdata); else stream_len = WebRtcIsacfix_EncodeNb(ISACFIX_main_inst, shortdata, streamdata); diff --git a/webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h b/webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h index 76a61e6d3..406705802 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h +++ b/webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h @@ -147,7 +147,7 @@ extern "C" { int16_t WebRtcIsac_Encode( ISACStruct* ISAC_main_inst, const int16_t* speechIn, - int16_t* encoded); + uint8_t* encoded); /****************************************************************************** diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/isac.c b/webrtc/modules/audio_coding/codecs/isac/main/source/isac.c index d47eb80b9..13170a084 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/source/isac.c +++ b/webrtc/modules/audio_coding/codecs/isac/main/source/isac.c @@ -496,7 +496,7 @@ int16_t WebRtcIsac_EncoderInit(ISACStruct* ISAC_main_inst, */ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, const int16_t* speechIn, - int16_t* encoded) { + uint8_t* encoded) { float inFrame[FRAMESAMPLES_10ms]; int16_t speechInLB[FRAMESAMPLES_10ms]; int16_t speechInUB[FRAMESAMPLES_10ms]; @@ -504,7 +504,6 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, int16_t streamLenUB = 0; int16_t streamLen = 0; int16_t k = 0; - uint8_t* ptrEncodedUW8 = (uint8_t*)encoded; int garbageLen = 0; int32_t bottleneck = 0; int16_t bottleneckIdx = 0; @@ -643,23 +642,22 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, streamLenUB = 0; } - memcpy(ptrEncodedUW8, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB); + memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB); streamLen = streamLenLB; if (streamLenUB > 0) { - ptrEncodedUW8[streamLenLB] = (uint8_t)(streamLenUB + 1 + - LEN_CHECK_SUM_WORD8); - memcpy(&ptrEncodedUW8[streamLenLB + 1], - instUB->ISACencUB_obj.bitstr_obj.stream, streamLenUB); - streamLen += ptrEncodedUW8[streamLenLB]; + encoded[streamLenLB] = streamLenUB + 1 + LEN_CHECK_SUM_WORD8; + memcpy(&encoded[streamLenLB + 1], + instUB->ISACencUB_obj.bitstr_obj.stream, + streamLenUB); + streamLen += encoded[streamLenLB]; } else { - ptrEncodedUW8[streamLenLB] = 0; + encoded[streamLenLB] = 0; } } else { if (streamLenLB == 0) { return 0; } - memcpy(ptrEncodedUW8, instLB->ISACencLB_obj.bitstr_obj.stream, - streamLenLB); + memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB); streamLenUB = 0; streamLen = streamLenLB; } @@ -697,11 +695,11 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, * 255 is the max garbage length we can signal using 8 bits. */ if ((instISAC->bandwidthKHz == isac8kHz) || (streamLenUB == 0)) { - ptrGarbage = &ptrEncodedUW8[streamLenLB]; + ptrGarbage = &encoded[streamLenLB]; limit = streamLen + 255; } else { - ptrGarbage = &ptrEncodedUW8[streamLenLB + 1 + streamLenUB]; - limit = streamLen + (255 - ptrEncodedUW8[streamLenLB]); + ptrGarbage = &encoded[streamLenLB + 1 + streamLenUB]; + limit = streamLen + (255 - encoded[streamLenLB]); } minBytes = (minBytes > limit) ? limit : minBytes; @@ -718,13 +716,12 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, * That is the only way to preserve backward compatibility. */ if ((instISAC->bandwidthKHz == isac8kHz) || (streamLenUB == 0)) { - ptrEncodedUW8[streamLenLB] = (uint8_t)garbageLen; + encoded[streamLenLB] = garbageLen; } else { - ptrEncodedUW8[streamLenLB] += (uint8_t)garbageLen; + encoded[streamLenLB] += garbageLen; /* Write the length of the garbage at the end of the upper-band * bit-stream, if exists. This helps for sanity check. */ - ptrEncodedUW8[streamLenLB + 1 + streamLenUB] = - (uint8_t)garbageLen; + encoded[streamLenLB + 1 + streamLenUB] = garbageLen; } streamLen += garbageLen; @@ -741,16 +738,14 @@ int16_t WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, if ((instISAC->bandwidthKHz != isac8kHz) && (streamLenUB > 0)) { uint32_t crc; - WebRtcIsac_GetCrc((int16_t*)(&(ptrEncodedUW8[streamLenLB + 1])), + WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])), streamLenUB + garbageLen, &crc); #ifndef WEBRTC_ARCH_BIG_ENDIAN for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) { - ptrEncodedUW8[streamLen - LEN_CHECK_SUM_WORD8 + k] = - (uint8_t)((crc >> (24 - k * 8)) & 0xFF); + encoded[streamLen - LEN_CHECK_SUM_WORD8 + k] = crc >> (24 - k * 8); } #else - memcpy(&ptrEncodedUW8[streamLenLB + streamLenUB + 1], &crc, - LEN_CHECK_SUM_WORD8); + memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc, LEN_CHECK_SUM_WORD8); #endif } return streamLen; diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc b/webrtc/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc index 3c55bd3dc..1d653731a 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc +++ b/webrtc/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc @@ -31,7 +31,7 @@ class IsacTest : public ::testing::Test { int16_t speech_data_[kIsacNumberOfSamples]; int16_t output_data_[kIsacNumberOfSamples]; - int16_t bitstream_[kMaxBytes / 2]; + uint8_t bitstream_[kMaxBytes]; uint8_t bitstream_small_[7]; // Simulate sync packets. }; diff --git a/webrtc/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc b/webrtc/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc index c5f9561b0..8af4e6f99 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc +++ b/webrtc/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc @@ -662,8 +662,8 @@ int main(int argc, char* argv[]) if(!(testNum == 3 && framecnt == 0)) { stream_len = WebRtcIsac_Encode(ISAC_main_inst, - shortdata, - (int16_t*)streamdata); + shortdata, + (uint8_t*)streamdata); if((payloadSize != 0) && (stream_len > payloadSize)) { if(testNum == 0) diff --git a/webrtc/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc b/webrtc/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc index fd70eca71..72d3fe861 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc +++ b/webrtc/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc @@ -283,7 +283,8 @@ int main(int argc, char* argv[]) streamLen = WebRtcIsac_Encode(codecInstance[senderIdx], - audioBuff10ms, (short*)bitStream); + audioBuff10ms, + (uint8_t*)bitStream); int16_t ggg; if (streamLen > 0) { if(( WebRtcIsac_ReadFrameLen(codecInstance[receiverIdx], diff --git a/webrtc/modules/audio_coding/codecs/isac/main/test/simpleKenny.c b/webrtc/modules/audio_coding/codecs/isac/main/test/simpleKenny.c index 980465d65..2df5a84e4 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/test/simpleKenny.c +++ b/webrtc/modules/audio_coding/codecs/isac/main/test/simpleKenny.c @@ -373,8 +373,10 @@ valid values are 8 and 16.\n", sampFreqKHz); cur_framesmpls += samplesIn10Ms; //-------- iSAC encoding --------- - stream_len = WebRtcIsac_Encode(ISAC_main_inst, shortdata, - (int16_t*)payload); + stream_len = WebRtcIsac_Encode( + ISAC_main_inst, + shortdata, + (uint8_t*)payload); if(stream_len < 0) { diff --git a/webrtc/modules/audio_coding/main/acm2/acm_isac.cc b/webrtc/modules/audio_coding/main/acm2/acm_isac.cc index 850204f31..f3682f1e3 100644 --- a/webrtc/modules/audio_coding/main/acm2/acm_isac.cc +++ b/webrtc/modules/audio_coding/main/acm2/acm_isac.cc @@ -347,8 +347,9 @@ int16_t ACMISAC::InternalEncode(uint8_t* bitstream, return -1; } *bitstream_len_byte = ACM_ISAC_ENCODE( - codec_inst_ptr_->inst, &in_audio_[in_audio_ix_read_], - reinterpret_cast(bitstream)); + codec_inst_ptr_->inst, + &in_audio_[in_audio_ix_read_], + bitstream); // increment the read index this tell the caller that how far // we have gone forward in reading the audio buffer in_audio_ix_read_ += samples_in_10ms_audio_; diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc index d33c8f23d..624e6a4d2 100644 --- a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc @@ -348,14 +348,11 @@ class AudioDecoderIsacFloatTest : public AudioDecoderTest { virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, uint8_t* output) { // Insert 3 * 10 ms. Expect non-zero output on third call. - EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, - reinterpret_cast(output))); + EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); input += input_size_; - EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, - reinterpret_cast(output))); + EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); input += input_size_; - int enc_len_bytes = - WebRtcIsac_Encode(encoder_, input, reinterpret_cast(output)); + int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output); EXPECT_GT(enc_len_bytes, 0); return enc_len_bytes; } @@ -388,14 +385,11 @@ class AudioDecoderIsacSwbTest : public AudioDecoderTest { virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, uint8_t* output) { // Insert 3 * 10 ms. Expect non-zero output on third call. - EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, - reinterpret_cast(output))); + EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); input += input_size_; - EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, - reinterpret_cast(output))); + EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); input += input_size_; - int enc_len_bytes = - WebRtcIsac_Encode(encoder_, input, reinterpret_cast(output)); + int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output); EXPECT_GT(enc_len_bytes, 0); return enc_len_bytes; } @@ -441,14 +435,11 @@ class AudioDecoderIsacFixTest : public AudioDecoderTest { virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, uint8_t* output) { // Insert 3 * 10 ms. Expect non-zero output on third call. - EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, - reinterpret_cast(output))); + EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output)); input += input_size_; - EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, - reinterpret_cast(output))); + EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output)); input += input_size_; - int enc_len_bytes = WebRtcIsacfix_Encode( - encoder_, input, reinterpret_cast(output)); + int enc_len_bytes = WebRtcIsacfix_Encode(encoder_, input, output); EXPECT_GT(enc_len_bytes, 0); return enc_len_bytes; } diff --git a/webrtc/modules/audio_coding/neteq/test/RTPencode.cc b/webrtc/modules/audio_coding/neteq/test/RTPencode.cc index 93b366b9a..92bccee2f 100644 --- a/webrtc/modules/audio_coding/neteq/test/RTPencode.cc +++ b/webrtc/modules/audio_coding/neteq/test/RTPencode.cc @@ -1632,9 +1632,13 @@ int NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * e cdlen=0; while (cdlen<=0) { #ifdef CODEC_ISAC /* floating point */ - cdlen=WebRtcIsac_Encode(ISAC_inst[k],&indata[noOfCalls*160],(int16_t*)encoded); + cdlen = WebRtcIsac_Encode(ISAC_inst[k], + &indata[noOfCalls * 160], + encoded); #else /* fixed point */ - cdlen=WebRtcIsacfix_Encode(ISAC_inst[k],&indata[noOfCalls*160],(int16_t*)encoded); + cdlen = WebRtcIsacfix_Encode(ISAC_inst[k], + &indata[noOfCalls * 160], + encoded); #endif noOfCalls++; } @@ -1645,7 +1649,9 @@ int NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * e int noOfCalls=0; cdlen=0; while (cdlen<=0) { - cdlen=WebRtcIsac_Encode(ISACSWB_inst[k],&indata[noOfCalls*320],(int16_t*)encoded); + cdlen = WebRtcIsac_Encode(ISACSWB_inst[k], + &indata[noOfCalls * 320], + encoded); noOfCalls++; } } diff --git a/webrtc/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc b/webrtc/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc index 6b0f48286..b672a0c2b 100644 --- a/webrtc/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc +++ b/webrtc/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc @@ -138,8 +138,7 @@ int NetEqIsacQualityTest::EncodeBlock(int16_t* in_data, // The Isac encoder does not perform encoding (and returns 0) until it // receives a sequence of sub-blocks that amount to the frame duration. EXPECT_EQ(0, value); - value = WebRtcIsacfix_Encode(isac_encoder_, &in_data[pointer], - reinterpret_cast(payload)); + value = WebRtcIsacfix_Encode(isac_encoder_, &in_data[pointer], payload); } EXPECT_GT(value, 0); return value;