From: drowe67 Date: Thu, 18 Dec 2014 11:51:22 +0000 (+0000) Subject: Added some protection against out of range values getting into golay decoder look... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=1cf940a87af99849714600b5348dfa0f67f75184;p=freetel-svn-tracking.git Added some protection against out of range values getting into golay decoder look up table. Haven't repeated problem or found root cause. freedv unit tests work OK with changes git-svn-id: https://svn.code.sf.net/p/freetel/code@1976 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index db3f72f1..70258b24 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -89,7 +89,7 @@ struct freedv *freedv_open(int mode) { nbit = 2*fdmdv_bits_per_frame(f->fdmdv); f->tx_bits = (int*)malloc(nbit*sizeof(int)); f->rx_bits = (int*)malloc(nbit*sizeof(int)); - + nbit = fdmdv_bits_per_frame(f->fdmdv); f->fdmdv_bits = (int*)malloc(nbit*sizeof(int)); @@ -333,15 +333,15 @@ int freedv_floatrx(struct freedv *f, short speech_out[], float demod_in[]) { recd_codeword = 0; for(i=0; i<8; i++) { recd_codeword <<= 1; - recd_codeword |= f->rx_bits[i]; + recd_codeword |= (f->rx_bits[i] & 0x1); } for(i=11; i<15; i++) { recd_codeword <<= 1; - recd_codeword |= f->rx_bits[i]; + recd_codeword |= (f->rx_bits[i] & 0x1); } for(i=bits_per_codec_frame; irx_bits[i]; + recd_codeword |= (f->rx_bits[i] & 0x1); } codeword1 = golay23_decode(recd_codeword); f->total_bit_errors += golay23_count_errors(recd_codeword, codeword1); diff --git a/codec2-dev/src/golay23.c b/codec2-dev/src/golay23.c index cc6c4194..ada17c31 100644 --- a/codec2-dev/src/golay23.c +++ b/codec2-dev/src/golay23.c @@ -6,7 +6,7 @@ To test: - src$ gcc golay23.c -o golay23 -Wall -DGOLAY23_UNITTEST + src$ gcc golay23.c -o golay23 -Wall -DGOLAY23_UNITTEST -DRUN_TIME_TABLES src$ ./golay23 To generate tables: @@ -257,9 +257,9 @@ void golay23_init(void) { int golay23_encode(int data) { assert(inited); + assert(data <= 0xfff); //printf("data: 0x%x\n", data); - assert(data <= 0xfff); return encoding_table[data]; } @@ -275,6 +275,7 @@ int golay23_encode(int data) { int golay23_decode(int received_codeword) { assert(inited); + assert((received_codeword < (1<<23)) && (received_codeword >= 0)); //printf("syndrome: 0x%x\n", get_syndrome(received_codeword)); return received_codeword ^= decoding_table[get_syndrome(received_codeword)];