• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
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
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #include "avcdec_bitstream.h"
19 
20 /* Swapping may not be needed anymore since we read one byte at a time and perform
21 EBSP to RBSP conversion in bitstream. */
22 #ifdef LITTLE_ENDIAN
23 #if (WORD_SIZE==32)  /* this can be replaced with assembly instructions */
24 #define SWAP_BYTES(x) ((((x)&0xFF)<<24) | (((x)&0xFF00)<<8) | (((x)&0xFF0000)>>8) | (((x)&0xFF000000)>>24))
25 #else  /* for 16-bit */
26 #define SWAP_BYTES(x) ((((x)&0xFF)<<8) | (((x)&0xFF00)>>8))
27 #endif
28 #else
29 #define SWAP_BYTES(x) (x)
30 #endif
31 
32 
33 /* array for trailing bit pattern as function of number of bits */
34 /* the first one is unused. */
35 const static uint8 trailing_bits[9] = {0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
36 
37 /* ======================================================================== */
38 /*  Function : BitstreamInit()                                              */
39 /*  Date     : 11/4/2003                                                    */
40 /*  Purpose  : Populate bitstream structure with bitstream buffer and size  */
41 /*             it also initializes internal data                            */
42 /*  In/out   :                                                              */
43 /*  Return   : AVCDEC_SUCCESS if successed, AVCDEC_FAIL if failed.              */
44 /*  Modified :                                                              */
45 /* ======================================================================== */
46 /* |--------|--------|----~~~~~-----|---------|---------|---------|
47    ^                                          ^read_pos           ^data_end_pos
48    bitstreamBuffer                  <--------->
49                                     current_word
50 
51    |xxxxxxxxxxxxx----|  = current_word 32 or 16 bits
52     <------------>
53      bit_left
54  ======================================================================== */
55 
56 
57 /* ======================================================================== */
58 /*  Function : BitstreamNextWord()                                          */
59 /*  Date     : 12/4/2003                                                    */
60 /*  Purpose  : Read up to machine word.                                     */
61 /*  In/out   :                                                              */
62 /*  Return   : Next word with emulation prevention code removed. Everything
63     in the bitstream structure got modified except current_word             */
64 /*  Modified :                                                              */
65 /* ======================================================================== */
66 
BitstreamInit(AVCDecBitstream * stream,uint8 * buffer,int size)67 AVCDec_Status BitstreamInit(AVCDecBitstream *stream, uint8 *buffer, int size)
68 {
69     EBSPtoRBSP(buffer, &size);
70 
71     stream->incnt = 0;
72     stream->incnt_next = 0;
73     stream->bitcnt = 0;
74     stream->curr_word = stream->next_word = 0;
75     stream->read_pos = 0;
76 
77     stream->bitstreamBuffer = buffer;
78 
79     stream->data_end_pos = size;
80 
81     stream->nal_size = size;
82 
83     return AVCDEC_SUCCESS;
84 }
85 /* ======================================================================== */
86 /*  Function : AVC_BitstreamFillCache()                                         */
87 /*  Date     : 1/1/2005                                                     */
88 /*  Purpose  : Read up to machine word.                                     */
89 /*  In/out   :                                                              */
90 /*  Return   : Read in 4 bytes of input data                                */
91 /*  Modified :                                                              */
92 /* ======================================================================== */
93 
AVC_BitstreamFillCache(AVCDecBitstream * stream)94 AVCDec_Status AVC_BitstreamFillCache(AVCDecBitstream *stream)
95 {
96     uint8 *bitstreamBuffer = stream->bitstreamBuffer;
97     uint8 *v;
98     int num_bits, i;
99 
100     stream->curr_word |= (stream->next_word >> stream->incnt);   // stream->incnt cannot be 32
101     stream->next_word <<= (31 - stream->incnt);
102     stream->next_word <<= 1;
103     num_bits = stream->incnt_next + stream->incnt;
104     if (num_bits >= 32)
105     {
106         stream->incnt_next -= (32 - stream->incnt);
107         stream->incnt = 32;
108         return AVCDEC_SUCCESS;
109     }
110     /* this check can be removed if there is additional extra 4 bytes at the end of the bitstream */
111     v = bitstreamBuffer + stream->read_pos;
112 
113     if (stream->read_pos > stream->data_end_pos - 4)
114     {
115         if (stream->data_end_pos <= stream->read_pos)
116         {
117             stream->incnt = num_bits;
118             stream->incnt_next = 0;
119             return AVCDEC_SUCCESS;
120         }
121 
122         stream->next_word = 0;
123 
124         for (i = 0; i < stream->data_end_pos - stream->read_pos; i++)
125         {
126             stream->next_word |= (v[i] << ((3 - i) << 3));
127         }
128 
129         stream->read_pos = stream->data_end_pos;
130         stream->curr_word |= (stream->next_word >> num_bits); // this is safe
131 
132         stream->next_word <<= (31 - num_bits);
133         stream->next_word <<= 1;
134         num_bits = i << 3;
135         stream->incnt += stream->incnt_next;
136         stream->incnt_next = num_bits - (32 - stream->incnt);
137         if (stream->incnt_next < 0)
138         {
139             stream->incnt +=  num_bits;
140             stream->incnt_next = 0;
141         }
142         else
143         {
144             stream->incnt = 32;
145         }
146         return AVCDEC_SUCCESS;
147     }
148 
149     stream->next_word = ((uint32)v[0] << 24) | (v[1] << 16) | (v[2] << 8) | v[3];
150     stream->read_pos += 4;
151 
152     stream->curr_word |= (stream->next_word >> num_bits); // this is safe
153     stream->next_word <<= (31 - num_bits);
154     stream->next_word <<= 1;
155     stream->incnt_next += stream->incnt;
156     stream->incnt = 32;
157     return AVCDEC_SUCCESS;
158 
159 }
160 /* ======================================================================== */
161 /*  Function : BitstreamReadBits()                                          */
162 /*  Date     : 11/4/2003                                                    */
163 /*  Purpose  : Read up to machine word.                                     */
164 /*  In/out   :                                                              */
165 /*  Return   : AVCDEC_SUCCESS if successed, AVCDEC_FAIL if number of bits   */
166 /*              is greater than the word-size, AVCDEC_PACKET_LOSS or        */
167 /*              AVCDEC_NO_DATA if callback to get data fails.               */
168 /*  Modified :                                                              */
169 /* ======================================================================== */
BitstreamReadBits(AVCDecBitstream * stream,int nBits,uint * code)170 AVCDec_Status BitstreamReadBits(AVCDecBitstream *stream, int nBits, uint *code)
171 {
172     if (stream->incnt < nBits)
173     {
174         /* frame-based decoding */
175         AVC_BitstreamFillCache(stream);
176     }
177     *code = stream->curr_word >> (32 - nBits);
178     BitstreamFlushBits(stream, nBits);
179     return AVCDEC_SUCCESS;
180 }
181 
182 
183 
184 /* ======================================================================== */
185 /*  Function : BitstreamShowBits()                                          */
186 /*  Date     : 11/4/2003                                                    */
187 /*  Purpose  : Show up to machine word without advancing the pointer.       */
188 /*  In/out   :                                                              */
189 /*  Return   : AVCDEC_SUCCESS if successed, AVCDEC_FAIL if number of bits   */
190 /*              is greater than the word-size, AVCDEC_NO_DATA if it needs   */
191 /*              to callback to get data.                                    */
192 /*  Modified :                                                              */
193 /* ======================================================================== */
BitstreamShowBits(AVCDecBitstream * stream,int nBits,uint * code)194 AVCDec_Status BitstreamShowBits(AVCDecBitstream *stream, int nBits, uint *code)
195 {
196     if (stream->incnt < nBits)
197     {
198         /* frame-based decoding */
199         AVC_BitstreamFillCache(stream);
200     }
201 
202     *code = stream->curr_word >> (32 - nBits);
203 
204     return AVCDEC_SUCCESS;
205 }
206 
207 /* ======================================================================== */
208 /*  Function : BitstreamRead1Bit()                                          */
209 /*  Date     : 11/4/2003                                                    */
210 /*  Purpose  : Read 1 bit from the bitstream.                               */
211 /*  In/out   :                                                              */
212 /*  Return   : AVCDEC_SUCCESS if successed, AVCDEC_FAIL if number of bits   */
213 /*              is greater than the word-size, AVCDEC_PACKET_LOSS or        */
214 /*              AVCDEC_NO_DATA if callback to get data fails.               */
215 /*  Modified :                                                              */
216 /* ======================================================================== */
217 
BitstreamRead1Bit(AVCDecBitstream * stream,uint * code)218 AVCDec_Status BitstreamRead1Bit(AVCDecBitstream *stream, uint *code)
219 {
220     if (stream->incnt < 1)
221     {
222         /* frame-based decoding */
223         AVC_BitstreamFillCache(stream);
224     }
225     *code = stream->curr_word >> 31;
226     BitstreamFlushBits(stream, 1);
227     return AVCDEC_SUCCESS;
228 }
229 
230 
231 
BitstreamByteAlign(AVCDecBitstream * stream)232 AVCDec_Status BitstreamByteAlign(AVCDecBitstream  *stream)
233 {
234     uint n_stuffed;
235 
236     n_stuffed = (8 - (stream->bitcnt & 0x7)) & 0x7; /*  07/05/01 */
237 
238     stream->bitcnt += n_stuffed;
239     stream->incnt -= n_stuffed;
240 
241     if (stream->incnt < 0)
242     {
243         stream->bitcnt += stream->incnt;
244         stream->incnt = 0;
245     }
246     stream->curr_word <<= n_stuffed;
247     return AVCDEC_SUCCESS;
248 }
249 
250 /* check whether there are more RBSP data. */
251 /* ignore the emulation prevention code, assume it has been taken out. */
more_rbsp_data(AVCDecBitstream * stream)252 bool more_rbsp_data(AVCDecBitstream *stream)
253 {
254     int total_bit_left;
255     uint code;
256 
257     if (stream->read_pos >= stream->nal_size)
258     {
259         total_bit_left = stream->incnt_next + stream->incnt;
260         if (total_bit_left <= 0)
261         {
262             return FALSE;
263         }
264         else if (total_bit_left <= 8)
265         {
266             BitstreamShowBits(stream, total_bit_left, &code);
267             if (code == trailing_bits[total_bit_left])
268             {
269                 return FALSE;
270             }
271         }
272     }
273 
274     return TRUE;
275 }
276 
277