• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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