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