/*************************************************************************
 *
 *  FUNCTION:  Bits2prm_12k2
 *
 *  PURPOSE: Retrieves the vector of encoder parameters from the received
 *           serial bits in a frame.
 *
 *  DESCRIPTION: The encoder parameters are:
 *
 *     LPC:
 *              1st codebook             7 bit
 *              2nd codebook             8 bit
 *              3rd codebook             8+1 bit
 *              4th codebook             8 bit
 *              5th codebook             6 bit
 *
 *     1st and 3rd subframes:
 *           pitch period                9 bit
 *           pitch gain                  4 bit
 *           codebook index              35 bit
 *           codebook gain               5 bit
 *
 *     2nd and 4th subframes:
 *           pitch period                6 bit
 *           pitch gain                  4 bit
 *           codebook index              35 bit
 *           codebook gain               5 bit
 *
 *************************************************************************/

#include "typedef.h"


#define PRM_NO    57


void Bits2prm_12k2 (
    unsigned int *data,      /* input : serial bits 244                */
    Word16 prm[]        /* output: analysis parameters  (57 parameters) */
)
{
    Word16 i;
		Word32
			left,
			need;
		unsigned int
			bits,
			temp,
			mask;

    static const char bitno[PRM_NO] =
    {
        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 */

		left = 0;

    for (i = 0; i < PRM_NO; i++)
    {
				need = bitno[i];

				if (!left)
				{
					bits = *data++;
					left = 32;
				}

				if (need > left)
				{
					temp = bits;
					need -= left;
					bits = *data++;
					mask = (1 << need) - 1;
					temp |= (bits & mask) << left;
					prm[i] = (Word16)temp;
					bits >>= need;
					left = 32 - need;
				}
				else
				{
					mask = (1 << need) - 1;
					prm[i] = (Word16)(bits & mask);
					bits >>= need;
					left -= need;
				}
    }
}
