/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */

/***********************************************************************
*      File: q_pulse.c                                                 *
*                                                                      *
*      Description: Coding and decoding of algebraic codebook          *
*                                                                      *
************************************************************************/

#include <stdio.h>
#include "typedef.h"
#include "basic_op.h"
#include "q_pulse.h"

#define NB_POS 16                          /* pos in track, mask for sign bit */

Word32 quant_1p_N1(                        /* (o) return N+1 bits             */
		Word16 pos,                        /* (i) position of the pulse       */
		Word16 N)                          /* (i) number of bits for position */
{
	Word16 mask;
	Word32 index;

	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
	/*-------------------------------------------------------*
	 * Quantization of 1 pulse with N+1 bits:                *
	 *-------------------------------------------------------*/
	index = L_deposit_l((Word16) (pos & mask));
	if ((pos & NB_POS) != 0)
	{
		index = vo_L_add(index, L_deposit_l(1 << N));   /* index += 1 << N; */
	}
	return (index);
}


Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */
		Word16 pos1,                          /* (i) position of the pulse 1     */
		Word16 pos2,                          /* (i) position of the pulse 2     */
		Word16 N)                             /* (i) number of bits for position */
{
	Word16 mask, tmp;
	Word32 index;
	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
	/*-------------------------------------------------------*
	 * Quantization of 2 pulses with 2*N+1 bits:             *
	 *-------------------------------------------------------*/
	if (((pos2 ^ pos1) & NB_POS) == 0)
	{
		/* sign of 1st pulse == sign of 2th pulse */
		if(pos1 <= pos2)          /* ((pos1 - pos2) <= 0) */
		{
			/* index = ((pos1 & mask) << N) + (pos2 & mask); */
			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
		} else
		{
			/* ((pos2 & mask) << N) + (pos1 & mask); */
			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
		}
		if ((pos1 & NB_POS) != 0)
		{
			tmp = (N << 1);
			index = vo_L_add(index, (1L << tmp));       /* index += 1 << (2*N); */
		}
	} else
	{
		/* sign of 1st pulse != sign of 2th pulse */
		if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
		{
			/* index = ((pos2 & mask) << N) + (pos1 & mask); */
			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask)))); 
			if ((pos2 & NB_POS) != 0)
			{
				tmp = (N << 1);           /* index += 1 << (2*N); */
				index = vo_L_add(index, (1L << tmp));
			}
		} else
		{
			/* index = ((pos1 & mask) << N) + (pos2 & mask);	 */
			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); 
			if ((pos1 & NB_POS) != 0)
			{
				tmp = (N << 1);
				index = vo_L_add(index, (1 << tmp));    /* index += 1 << (2*N); */
			}
		}
	}
	return (index);
}


Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */
		Word16 pos1,                          /* (i) position of the pulse 1     */
		Word16 pos2,                          /* (i) position of the pulse 2     */
		Word16 pos3,                          /* (i) position of the pulse 3     */
		Word16 N)                             /* (i) number of bits for position */
{
	Word16 nb_pos;
	Word32 index;

	nb_pos =(1 <<(N - 1));            /* nb_pos = (1<<(N-1)); */
	/*-------------------------------------------------------*
	 * Quantization of 3 pulses with 3*N+1 bits:             *
	 *-------------------------------------------------------*/
	if (((pos1 ^ pos2) & nb_pos) == 0)
	{
		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
		/* index += (pos1 & nb_pos) << N; */
		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  
		/* index += quant_1p_N1(pos3, N) << (2*N); */
		index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));

	} else if (((pos1 ^ pos3) & nb_pos) == 0)
	{
		index = quant_2p_2N1(pos1, pos3, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); 
		/* index += (pos1 & nb_pos) << N; */
		index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
		/* index += quant_1p_N1(pos2, N) <<
		 * (2*N); */
	} else
	{
		index = quant_2p_2N1(pos2, pos3, (N - 1));    /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
		/* index += (pos2 & nb_pos) << N;			 */
		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));  
		/* index += quant_1p_N1(pos1, N) << (2*N);	 */
		index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
	}
	return (index);
}


Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */
		Word16 pos1,                          /* (i) position of the pulse 1     */
		Word16 pos2,                          /* (i) position of the pulse 2     */
		Word16 pos3,                          /* (i) position of the pulse 3     */
		Word16 pos4,                          /* (i) position of the pulse 4     */
		Word16 N)                             /* (i) number of bits for position */
{
	Word16 nb_pos;
	Word32 index;

	nb_pos = 1 << (N - 1);            /* nb_pos = (1<<(N-1));  */
	/*-------------------------------------------------------*
	 * Quantization of 4 pulses with 4*N+1 bits:             *
	 *-------------------------------------------------------*/
	if (((pos1 ^ pos2) & nb_pos) == 0)
	{
		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
		/* index += (pos1 & nb_pos) << N;	 */
		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  
		/* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
		index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
	} else if (((pos1 ^ pos3) & nb_pos) == 0)
	{
		index = quant_2p_2N1(pos1, pos3, (N - 1));
		/* index += (pos1 & nb_pos) << N; */
		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  
		/* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
		index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
	} else
	{
		index = quant_2p_2N1(pos2, pos3, (N - 1));
		/* index += (pos2 & nb_pos) << N; */
		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));  
		/* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
		index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
	}
	return (index);
}


Word32 quant_4p_4N(                        /* (o) return 4*N bits             */
		Word16 pos[],                         /* (i) position of the pulse 1..4  */
		Word16 N)                             /* (i) number of bits for position */
{
	Word16 nb_pos, mask, n_1, tmp;
	Word16 posA[4], posB[4];
	Word32 i, j, k, index;

	n_1 = (Word16) (N - 1);                
	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
	mask = vo_sub((1 << N), 1);              /* mask = ((1<<N)-1); */

	i = 0;                                 
	j = 0;                                 
	for (k = 0; k < 4; k++)
	{
		if ((pos[k] & nb_pos) == 0)
		{
			posA[i++] = pos[k];            
		} else
		{
			posB[j++] = pos[k];            
		}
	}

	switch (i)
	{
		case 0:
			tmp = vo_sub((N << 2), 3);           /* index = 1 << ((4*N)-3); */
			index = (1L << tmp);
			/* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
			index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
			break;
		case 1:
			/* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
			tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
			index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
			/* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
			index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
			break;
		case 2:
			tmp = ((n_1 << 1) + 1);         /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
			index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
			/* index += quant_2p_2N1(posB[0], posB[1], n_1); */
			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
			break;
		case 3:
			/* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
			break;
		case 4:
			index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
			break;
		default:
			index = 0;
			fprintf(stderr, "Error in function quant_4p_4N\n");
	}
	tmp = ((N << 2) - 2);               /* index += (i & 3) << ((4*N)-2); */
	index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));

	return (index);
}



Word32 quant_5p_5N(                        /* (o) return 5*N bits             */
		Word16 pos[],                         /* (i) position of the pulse 1..5  */
		Word16 N)                             /* (i) number of bits for position */
{
	Word16 nb_pos, n_1, tmp;
	Word16 posA[5], posB[5];
	Word32 i, j, k, index, tmp2;

	n_1 = (Word16) (N - 1);                
	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */

	i = 0;                                 
	j = 0;                                 
	for (k = 0; k < 5; k++)
	{
		if ((pos[k] & nb_pos) == 0)
		{
			posA[i++] = pos[k];            
		} else
		{
			posB[j++] = pos[k];            
		}
	}

	switch (i)
	{
		case 0:
			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
			index = L_shl(1L, tmp);   /* index = 1 << ((5*N)-1); */
			tmp = add1((N << 1), 1);  /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
			index = vo_L_add(index, tmp2);
			index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N));        /* index += quant_2p_2N1(posB[3], posB[4], N); */
			break;
		case 1:
			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* index = 1 << ((5*N)-1); */
			index = L_shl(1L, tmp);
			tmp = add1((N << 1), 1);   /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1);  */
			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
			index = vo_L_add(index, tmp2);
			index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N));        /* index += quant_2p_2N1(posB[3], posA[0], N); */
			break;
		case 2:
			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
			index = L_shl(1L, tmp);            /* index = 1 << ((5*N)-1); */
			tmp = add1((N << 1), 1);           /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);  */
			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
			index = vo_L_add(index, tmp2);
			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N));        /* index += quant_2p_2N1(posA[0], posA[1], N); */
			break;
		case 3:
			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N));        /* index += quant_2p_2N1(posB[0], posB[1], N); */
			break;
		case 4:
			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
			index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N));        /* index += quant_2p_2N1(posA[3], posB[0], N); */
			break;
		case 5:
			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
			index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N));        /* index += quant_2p_2N1(posA[3], posA[4], N); */
			break;
		default:
			index = 0;
			fprintf(stderr, "Error in function quant_5p_5N\n");
	}

	return (index);
}


Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */
		Word16 pos[],                         /* (i) position of the pulse 1..6  */
		Word16 N)                             /* (i) number of bits for position */
{
	Word16 nb_pos, n_1;
	Word16 posA[6], posB[6];
	Word32 i, j, k, index;

	/* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
	n_1 = (Word16) (N - 1);                
	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */

	i = 0;                                 
	j = 0;                                 
	for (k = 0; k < 6; k++)
	{
		if ((pos[k] & nb_pos) == 0)
		{
			posA[i++] = pos[k];            
		} else
		{
			posB[j++] = pos[k];            
		}
	}

	switch (i)
	{
		case 0:
			index = (1 << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
			index = vo_L_add(index, quant_1p_N1(posB[5], n_1));        /* index += quant_1p_N1(posB[5], n_1); */
			break;
		case 1:
			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
			index = vo_L_add(index, quant_1p_N1(posA[0], n_1));        /* index += quant_1p_N1(posA[0], n_1); */
			break;
		case 2:
			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
			/* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
			index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1));      /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
			break;
		case 3:
			index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));    
			                                  /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
			index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));     
			                                 /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
			break;
		case 4:
			i = 2;                            
			index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1));  /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));      /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
			break;
		case 5:
			i = 1;                            
			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
			break;
		case 6:
			i = 0;                             
			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
			index = vo_L_add(index, quant_1p_N1(posA[5], n_1));        /* index += quant_1p_N1(posA[5], n_1); */
			break;
		default:
			index = 0;
			fprintf(stderr, "Error in function quant_6p_6N_2\n");
	}
	index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4)));   /* index += (i & 3) << ((6*N)-4); */

	return (index);
}


