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);
}