1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***********************************************************************
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard       File: bits.c
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	   Description: Performs bit stream manipulation
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdlib.h>
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdio.h>
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h"
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "bits.h"
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "dtx.h"
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "mime_io.tab"
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint PackBits(Word16 prms[],             /*  i: analysis parameters */
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 Word16 coding_mode,        /*  i: coding bit-stream ratio mode */
37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			 Word16 mode,               /*  i: coding bit-stream ratio mode*/
38b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			 Coder_State *st            /*i/o: coder global parameters struct */
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 )
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 i, frame_type;
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	UWord8 temp;
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	UWord8 *stream_ptr;
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 bitstreamformat = st->frameType;
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	unsigned short* dataOut = st->outputStream;
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (coding_mode == MRDTX)
49b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	{
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->sid_update_counter--;
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (st->prev_ft == TX_SPEECH)
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			frame_type = TX_SID_FIRST;
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			st->sid_update_counter = 3;
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2))
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/* ensure extra updates are  properly delayed after a possible SID_FIRST */
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				frame_type = TX_SID_UPDATE;
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				st->sid_handover_debt--;
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			} else
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (st->sid_update_counter == 0)
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					frame_type = TX_SID_UPDATE;
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					st->sid_update_counter = 8;
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				} else
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					frame_type = TX_NO_DATA;
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->sid_update_counter = 8;
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		frame_type = TX_SPEECH;
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->prev_ft = frame_type;
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(bitstreamformat == 0)				/* default file format */
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*(dataOut) = TX_FRAME_TYPE;
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*(dataOut + 1) = frame_type;
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*(dataOut + 2) = mode;
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < nb_of_bits[coding_mode]; i++)
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*(dataOut + 3 + i) = prms[i];
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return  (3 + nb_of_bits[coding_mode])<<1;
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (bitstreamformat == 1)		/* ITU file format */
95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		{
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*(dataOut) = 0x6b21;
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST)
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				*(dataOut + 1) = nb_of_bits[coding_mode];
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				for (i = 0; i < nb_of_bits[coding_mode]; i++)
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					if(prms[i] == BIT_0){
103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard						*(dataOut + 2 + i) = BIT_0_ITU;
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					}
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					else{
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						*(dataOut + 2 + i) = BIT_1_ITU;
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					}
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
109b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				return (2 + nb_of_bits[coding_mode])<<1;
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			} else
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				*(dataOut + 1) = 0;
113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				return 2<<1;
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else							/* MIME/storage file format */
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MRSID 9
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* change mode index in case of SID frame */
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (coding_mode == MRDTX)
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				coding_mode = MRSID;
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (frame_type == TX_SID_FIRST)
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					for (i = 0; i < NBBITS_SID; i++)	prms[i] = BIT_0;
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* -> force NO_DATA frame */
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14))
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				coding_mode = 15;
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* mark empty frames between SID updates as NO_DATA frames */
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (coding_mode == MRSID && frame_type == TX_NO_DATA)
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				coding_mode = 15;
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* set pointer for packed frame, note that we handle data as bytes */
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			stream_ptr = (UWord8*)dataOut;
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* insert table of contents (ToC) byte at the beginning of the packet */
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*stream_ptr = toc_byte[coding_mode];
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			stream_ptr++;
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			temp = 0;
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* sort and pack AMR-WB speech or SID bits */
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			for (i = 1; i < unpacked_size[coding_mode] + 1; i++)
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (prms[sort_ptr[coding_mode][i-1]] == BIT_1)
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					temp++;
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (i&0x7)
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					temp <<= 1;
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				else
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					*stream_ptr = temp;
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					stream_ptr++;
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					temp = 0;
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* insert SID type indication and speech mode in case of SID frame */
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (coding_mode == MRSID)
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (frame_type == TX_SID_UPDATE)
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					temp++;
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				temp <<= 4;
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				temp += mode & 0x000F;
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* insert unused bits (zeros) at the tail of the last byte */
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (unused_size[coding_mode])
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				temp <<= (unused_size[coding_mode] - 1);
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*stream_ptr = temp;
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* write packed frame into file (1 byte added to cover ToC entry) */
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return (1 + packed_size[coding_mode]);
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-----------------------------------------------------*
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Parm_serial -> convert parameters to serial stream  *
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*-----------------------------------------------------*/
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Parm_serial(
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 value,                         /* input : parameter value */
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 no_of_bits,                    /* input : number of bits  */
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 ** prms
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 i, bit;
194b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	*prms += no_of_bits;
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < no_of_bits; i++)
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		bit = (Word16) (value & 0x0001);    /* get lsb */
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (bit == 0)
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*--(*prms) = BIT_0;
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*--(*prms) = BIT_1;
202b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		value >>= 1;
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
204b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	*prms += no_of_bits;
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
211