view amrconv/param_asm.c @ 467:ad032051166a

doc: AMR-EFR-hybrid-emu new article
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 12 May 2024 23:54:43 +0000
parents 78d1a6513393
children
line wrap: on
line source

/*
 * This C module is common between amr-cod-parse and amr-ietf-parse
 * utilities.  It contains the function that takes an array of bits
 * in the codec's natural order and reassembles these bits into
 * an array of codec parameters.
 */

#include <stdint.h>
#include "amr_defs.h"

/* parameter sizes (# of bits), one table per mode */

static const uint8_t bitno_MR475[PRMNO_MR475] = {
   8, 8, 7,                                 /* LSP VQ          */
   8, 7, 2, 8,                              /* first subframe  */
   4, 7, 2,                                 /* second subframe */
   4, 7, 2, 8,                              /* third subframe  */
   4, 7, 2,                                 /* fourth subframe */
};

static const uint8_t bitno_MR515[PRMNO_MR515] = {
   8, 8, 7,                                 /* LSP VQ          */
   8, 7, 2, 6,                              /* first subframe  */
   4, 7, 2, 6,                              /* second subframe */
   4, 7, 2, 6,                              /* third subframe  */
   4, 7, 2, 6,                              /* fourth subframe */
};

static const uint8_t bitno_MR59[PRMNO_MR59] = {
   8, 9, 9,                                 /* LSP VQ          */
   8, 9, 2, 6,                              /* first subframe  */
   4, 9, 2, 6,                              /* second subframe */
   8, 9, 2, 6,                              /* third subframe  */
   4, 9, 2, 6,                              /* fourth subframe */
};

static const uint8_t bitno_MR67[PRMNO_MR67] = {
   8, 9, 9,                                 /* LSP VQ          */
   8, 11, 3, 7,                             /* first subframe  */
   4, 11, 3, 7,                             /* second subframe */
   8, 11, 3, 7,                             /* third subframe  */
   4, 11, 3, 7,                             /* fourth subframe */
};

static const uint8_t bitno_MR74[PRMNO_MR74] = {
   8, 9, 9,                                 /* LSP VQ          */
   8, 13, 4, 7,                             /* first subframe  */
   5, 13, 4, 7,                             /* second subframe */
   8, 13, 4, 7,                             /* third subframe  */
   5, 13, 4, 7,                             /* fourth subframe */
};

static const uint8_t bitno_MR795[PRMNO_MR795] = {
   9, 9, 9,                                 /* LSP VQ          */
   8, 13, 4, 4, 5,                          /* first subframe  */
   6, 13, 4, 4, 5,                          /* second subframe */
   8, 13, 4, 4, 5,                          /* third subframe  */
   6, 13, 4, 4, 5,                          /* fourth subframe */
};

static const uint8_t bitno_MR102[PRMNO_MR102] = {
   8, 9, 9,                                 /* LSP VQ          */
   8, 1, 1, 1, 1, 10, 10, 7, 7,             /* first subframe  */
   5, 1, 1, 1, 1, 10, 10, 7, 7,             /* second subframe */
   8, 1, 1, 1, 1, 10, 10, 7, 7,             /* third subframe  */
   5, 1, 1, 1, 1, 10, 10, 7, 7,             /* fourth subframe */
};

static const uint8_t bitno_MR122[PRMNO_MR122] = {
   7, 8, 9, 8, 6,                           /* LSP VQ          */
   9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* first subframe  */
   6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* second subframe */
   9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* third subframe  */
   6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5    /* fourth subframe */
};

static const uint8_t bitno_MRDTX[PRMNO_MRDTX] = {
  3,
  8, 9, 9,
  6
};

static void
bits_to_params(bits, params, table, nparam)
	const uint8_t *bits;
	uint16_t *params;
	const uint8_t *table;
	unsigned nparam;
{
	const uint8_t *p = bits;
	const uint8_t *t = table;
	unsigned n, m, acc;

	for (n = 0; n < nparam; n++) {
		acc = 0;
		for (m = 0; m < *t; m++) {
			acc <<= 1;
			if (*p)
				acc |= 1;
			p++;
		}
		params[n] = acc;
		t++;
	}
}

reassemble_amr_params(bits, params, mode)
	const uint8_t *bits;
	uint16_t *params;
	unsigned mode;
{
	switch (mode) {
	case MR475:
		bits_to_params(bits, params, bitno_MR475, PRMNO_MR475);
		return(0);
	case MR515:
		bits_to_params(bits, params, bitno_MR515, PRMNO_MR515);
		return(0);
	case MR59:
		bits_to_params(bits, params, bitno_MR59, PRMNO_MR59);
		return(0);
	case MR67:
		bits_to_params(bits, params, bitno_MR67, PRMNO_MR67);
		return(0);
	case MR74:
		bits_to_params(bits, params, bitno_MR74, PRMNO_MR74);
		return(0);
	case MR795:
		bits_to_params(bits, params, bitno_MR795, PRMNO_MR795);
		return(0);
	case MR102:
		bits_to_params(bits, params, bitno_MR102, PRMNO_MR102);
		return(0);
	case MR122:            
		bits_to_params(bits, params, bitno_MR122, PRMNO_MR122);
		return(0);
	case MRDTX:
		bits_to_params(bits, params, bitno_MRDTX, PRMNO_MRDTX);
		return(0);
	default:
		return(-1);
	}
}