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
PackBits(Word16 prms[],Word16 coding_mode,Word16 mode,Coder_State * st)35 int 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
Parm_serial(Word16 value,Word16 no_of_bits,Word16 ** prms)187 void 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