FreeCalypso > hg > gsm-codec-lib
view dev/efr-sid-insert.c @ 477:4c9222d95647
libtwamr encoder: always emit frame->mode = mode;
In the original implementation of amr_encode_frame(), the 'mode' member
of the output struct was set to 0xFF if the output frame type is TX_NO_DATA.
This design was made to mimic the mode field (16-bit word) being set to
0xFFFF (or -1) in 3GPP test sequence format - but nothing actually depends
on this struct member being set in any way, and amr_frame_to_tseq()
generates the needed 0xFFFF on its own, based on frame->type being equal
to TX_NO_DATA.
It is simpler and more efficient to always set frame->mode to the actual
encoding mode in amr_encode_frame(), and this new behavior has already
been documented in doc/AMR-library-API description in anticipation of
the present change.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 18 May 2024 22:30:42 +0000 |
parents | 3b5958f28a40 |
children |
line wrap: on
line source
/* * We need to implement a function that inserts the 95 bit wide SID * codeword into the frame, and we would like to do it more efficiently * than calling a "set bit" function for each of the 95 bits. This * program will produce a more efficient solution. */ #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> static const uint8_t SID_codeword_bit_idx[95] = { 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 94, 95, 96, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221 }; static void set_bit(uint8_t *frame, unsigned bitnum) { unsigned bytenum = bitnum >> 3; unsigned bit_in_byte = 7 - (bitnum & 7); unsigned bitmask = 1 << bit_in_byte; frame[bytenum] |= bitmask; } main(argc, argv) char **argv; { uint8_t bytes[31]; unsigned n; memset(bytes, 0, 31); for (n = 0; n < 95; n++) set_bit(bytes, SID_codeword_bit_idx[n] + 4); for (n = 0; n < 31; n++) if (bytes[n]) printf("\tframe[%u] |= 0x%02X;\n", n, bytes[n]); exit(0); }