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