/src/libavc/decoder/ih264d_nal.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2015 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | /*! |
21 | | ************************************************************************** |
22 | | * \file ih264d_nal.c |
23 | | * |
24 | | * \brief NAL parsing routines |
25 | | * |
26 | | * Detailed_description |
27 | | * |
28 | | * \author |
29 | | * - AI 19 11 2002 Creation |
30 | | ************************************************************************** |
31 | | */ |
32 | | #include "ih264d_bitstrm.h" |
33 | | #include "ih264d_defs.h" |
34 | | #include "ih264_typedefs.h" |
35 | | #include "ih264_macros.h" |
36 | | #include "ih264_platform_macros.h" |
37 | | #include "ih264d_defs.h" |
38 | 143M | #define NUM_OF_ZERO_BYTES_BEFORE_START_CODE 2 |
39 | 1.25M | #define EMULATION_PREVENTION_BYTE 0x03 |
40 | | |
41 | 549k | #define NAL_FIRST_BYTE_SIZE 1 |
42 | | |
43 | | /*! |
44 | | ************************************************************************** |
45 | | * \if Function name : ih264d_find_start_code \endif |
46 | | * |
47 | | * \brief |
48 | | * This function searches for the Start Code Prefix. |
49 | | * |
50 | | * \param pu1_buf : Pointer to char buffer which contains bitstream. |
51 | | * \param u4_cur_pos : Current position in the buffer. |
52 | | * \param u4_max_ofst : Number of bytes in Buffer. |
53 | | * \param pu4_length_of_start_code : Poiter to length of Start Code. |
54 | | * |
55 | | * \return |
56 | | * Returns 0 on success and -1 on error. |
57 | | * |
58 | | ************************************************************************** |
59 | | */ |
60 | | #define START_CODE_NOT_FOUND -1 |
61 | | #define END_OF_STREAM_BUFFER -2 |
62 | | #define END_OF_STREAM -1 |
63 | | |
64 | | void ih264d_check_if_aud(UWORD8 *pu1_buf, |
65 | | UWORD32 u4_cur_pos, |
66 | | UWORD32 u4_max_ofst, |
67 | | UWORD32 *pu4_next_is_aud) |
68 | 793k | { |
69 | 793k | UWORD8 u1_first_byte, u1_nal_unit_type; |
70 | 793k | if(u4_cur_pos + 1 < u4_max_ofst) |
71 | 793k | { |
72 | 793k | u1_first_byte = pu1_buf[u4_cur_pos + 1]; |
73 | 793k | u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte); |
74 | | |
75 | 793k | if(u1_nal_unit_type == ACCESS_UNIT_DELIMITER_RBSP) |
76 | 4.72k | { |
77 | 4.72k | *pu4_next_is_aud = 1; |
78 | 4.72k | } |
79 | 793k | } |
80 | | |
81 | 793k | } |
82 | | WORD32 ih264d_find_start_code(UWORD8 *pu1_buf, |
83 | | UWORD32 u4_cur_pos, |
84 | | UWORD32 u4_max_ofst, |
85 | | UWORD32 *pu4_length_of_start_code, |
86 | | UWORD32 *pu4_next_is_aud) |
87 | 817k | { |
88 | 817k | WORD32 zero_byte_cnt = 0; |
89 | 817k | UWORD32 ui_curPosTemp; |
90 | | |
91 | 817k | *pu4_length_of_start_code = 0; |
92 | | /*Find first start code */ |
93 | 16.0M | while(u4_cur_pos < u4_max_ofst) |
94 | 16.0M | { |
95 | 16.0M | if(pu1_buf[u4_cur_pos] == 0) |
96 | 11.3M | zero_byte_cnt++; |
97 | 4.69M | else if(pu1_buf[u4_cur_pos] |
98 | 4.69M | == 0x01 && zero_byte_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE) |
99 | 815k | { |
100 | | /* Found the start code */ |
101 | 815k | u4_cur_pos++; |
102 | 815k | break; |
103 | 815k | } |
104 | 3.87M | else |
105 | 3.87M | { |
106 | 3.87M | zero_byte_cnt = 0; |
107 | 3.87M | } |
108 | 15.1M | u4_cur_pos++; |
109 | 15.1M | } |
110 | | /*Find Next Start Code */ |
111 | 817k | *pu4_length_of_start_code = u4_cur_pos; |
112 | 817k | zero_byte_cnt = 0; |
113 | 817k | ui_curPosTemp = u4_cur_pos; |
114 | 137M | while(u4_cur_pos < u4_max_ofst) |
115 | 137M | { |
116 | | |
117 | 137M | if(pu1_buf[u4_cur_pos] == 0) |
118 | 35.9M | zero_byte_cnt++; |
119 | 101M | else if(pu1_buf[u4_cur_pos] |
120 | 101M | == 0x01 && zero_byte_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE) |
121 | 793k | { |
122 | | /* Found the start code */ |
123 | 793k | ih264d_check_if_aud(pu1_buf, u4_cur_pos, u4_max_ofst, |
124 | 793k | pu4_next_is_aud); |
125 | 793k | return (u4_cur_pos - zero_byte_cnt - ui_curPosTemp); |
126 | 793k | } |
127 | 100M | else |
128 | 100M | { |
129 | 100M | zero_byte_cnt = 0; |
130 | 100M | } |
131 | 136M | u4_cur_pos++; |
132 | 136M | } |
133 | | |
134 | 23.3k | return (u4_cur_pos - zero_byte_cnt - ui_curPosTemp); //(START_CODE_NOT_FOUND); |
135 | 817k | } |
136 | | |
137 | | /*! |
138 | | ************************************************************************** |
139 | | * \if Function name : ih264d_get_next_nal_unit \endif |
140 | | * |
141 | | * \brief |
142 | | * This function reads one NAl unit. |
143 | | * |
144 | | * \param ps_nalStream : Poiter to NalUnitStream structure. |
145 | | * \param ps_nalUnit : Pointer to NalUnit. |
146 | | * |
147 | | * \return |
148 | | * Returns 0 on success and -1 on error. |
149 | | * |
150 | | ************************************************************************** |
151 | | */ |
152 | | WORD32 ih264d_get_next_nal_unit(UWORD8 *pu1_buf, |
153 | | UWORD32 u4_cur_pos, |
154 | | UWORD32 u4_max_ofst, |
155 | | UWORD32 *pu4_length_of_start_code) |
156 | 0 | { |
157 | |
|
158 | 0 | WORD32 i_length_of_nal_unit = 0; |
159 | 0 | UWORD32 u4_next_is_aud; |
160 | | |
161 | | /* NAL Thread starts */ |
162 | |
|
163 | 0 | ih264d_find_start_code(pu1_buf, u4_cur_pos, u4_max_ofst, |
164 | 0 | pu4_length_of_start_code, &u4_next_is_aud); |
165 | |
|
166 | 0 | return (i_length_of_nal_unit); |
167 | 0 | } |
168 | | |
169 | | /*! |
170 | | ************************************************************************** |
171 | | * \if Function name : ih264d_process_nal_unit \endif |
172 | | * |
173 | | * \brief |
174 | | * This function removes emulation byte "0x03" from bitstream (EBSP to RBSP). |
175 | | * It also converts bytestream format into 32 bit little-endian format. |
176 | | * |
177 | | * \param ps_bitstrm : Poiter to dec_bit_stream_t structure. |
178 | | * \param pu1_nal_unit : Pointer to char buffer of NalUnit. |
179 | | * \param u4_numbytes_in_nal_unit : Number bytes in NalUnit buffer. |
180 | | * |
181 | | * \return |
182 | | * Returns number of bytes in RBSP ps_bitstrm. |
183 | | * |
184 | | * \note |
185 | | * This function is same as nal_unit() of 7.3.1. Apart from nal_unit() |
186 | | * implementation it converts char buffer into 32 bit Buffer. This |
187 | | * facilitates efficient access of bitstream. This has been done taking |
188 | | * into account present processor architectures. |
189 | | * |
190 | | ************************************************************************** |
191 | | */ |
192 | | WORD32 ih264d_process_nal_unit(dec_bit_stream_t *ps_bitstrm, |
193 | | UWORD8 *pu1_nal_unit, |
194 | | UWORD32 u4_numbytes_in_nal_unit) |
195 | 549k | { |
196 | 549k | UWORD32 u4_num_bytes_in_rbsp; |
197 | 549k | UWORD8 u1_cur_byte; |
198 | 549k | WORD32 i = 0; |
199 | 549k | WORD8 c_count; |
200 | 549k | UWORD32 ui_word; |
201 | 549k | UWORD32 *puc_bitstream_buffer = (UWORD32*)pu1_nal_unit; |
202 | 549k | ps_bitstrm->pu4_buffer = puc_bitstream_buffer; |
203 | | |
204 | | /*--------------------------------------------------------------------*/ |
205 | | /* First Byte of the NAL Unit */ |
206 | | /*--------------------------------------------------------------------*/ |
207 | | |
208 | 549k | ui_word = *pu1_nal_unit++; |
209 | | |
210 | | /*--------------------------------------------------------------------*/ |
211 | | /* Convertion of the EBSP to RBSP */ |
212 | | /* ie Remove the emulation_prevention_byte [equal to 0x03] */ |
213 | | /*--------------------------------------------------------------------*/ |
214 | 549k | u4_num_bytes_in_rbsp = 0; |
215 | 549k | c_count = 0; |
216 | | |
217 | | //first iteration |
218 | | |
219 | 549k | u1_cur_byte = *pu1_nal_unit++; |
220 | | |
221 | 549k | ui_word = ((ui_word << 8) | u1_cur_byte); |
222 | | |
223 | 549k | c_count++; |
224 | 549k | if(u1_cur_byte != 0x00) |
225 | 370k | c_count = 0; |
226 | | |
227 | | //second iteration |
228 | | |
229 | 549k | u1_cur_byte = *pu1_nal_unit++; |
230 | | |
231 | 549k | ui_word = ((ui_word << 8) | u1_cur_byte); |
232 | 549k | u4_num_bytes_in_rbsp = 2; |
233 | | |
234 | 549k | c_count++; |
235 | 549k | if(u1_cur_byte != 0x00) |
236 | 366k | c_count = 0; |
237 | | |
238 | 549k | if(u4_numbytes_in_nal_unit > 2) |
239 | 524k | { |
240 | 524k | i = ((u4_numbytes_in_nal_unit - 3)); |
241 | 524k | } |
242 | | |
243 | 17.4M | for(; i > 8; i -= 4) |
244 | 16.9M | { |
245 | | |
246 | | // loop 0 |
247 | 16.9M | u1_cur_byte = *pu1_nal_unit++; |
248 | | |
249 | 16.9M | if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE |
250 | 16.9M | && u1_cur_byte == EMULATION_PREVENTION_BYTE) |
251 | 9.09k | { |
252 | 9.09k | c_count = 0; |
253 | 9.09k | u1_cur_byte = *pu1_nal_unit++; |
254 | 9.09k | i--; |
255 | 9.09k | } |
256 | | |
257 | 16.9M | ui_word = ((ui_word << 8) | u1_cur_byte); |
258 | 16.9M | *puc_bitstream_buffer = ui_word; |
259 | 16.9M | puc_bitstream_buffer++; |
260 | 16.9M | c_count++; |
261 | 16.9M | if(u1_cur_byte != 0x00) |
262 | 14.1M | c_count = 0; |
263 | | |
264 | | // loop 1 |
265 | 16.9M | u1_cur_byte = *pu1_nal_unit++; |
266 | | |
267 | 16.9M | if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE |
268 | 16.9M | && u1_cur_byte == EMULATION_PREVENTION_BYTE) |
269 | 9.31k | { |
270 | 9.31k | c_count = 0; |
271 | 9.31k | u1_cur_byte = *pu1_nal_unit++; |
272 | 9.31k | i--; |
273 | 9.31k | } |
274 | 16.9M | ui_word = ((ui_word << 8) | u1_cur_byte); |
275 | | |
276 | 16.9M | c_count++; |
277 | 16.9M | if(u1_cur_byte != 0x00) |
278 | 14.0M | c_count = 0; |
279 | | |
280 | | // loop 2 |
281 | 16.9M | u1_cur_byte = *pu1_nal_unit++; |
282 | | |
283 | 16.9M | if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE |
284 | 16.9M | && u1_cur_byte == EMULATION_PREVENTION_BYTE) |
285 | 7.29k | { |
286 | 7.29k | c_count = 0; |
287 | 7.29k | u1_cur_byte = *pu1_nal_unit++; |
288 | 7.29k | i--; |
289 | 7.29k | } |
290 | | |
291 | 16.9M | ui_word = ((ui_word << 8) | u1_cur_byte); |
292 | | |
293 | 16.9M | c_count++; |
294 | 16.9M | if(u1_cur_byte != 0x00) |
295 | 13.9M | c_count = 0; |
296 | | |
297 | | // loop 3 |
298 | 16.9M | u1_cur_byte = *pu1_nal_unit++; |
299 | | |
300 | 16.9M | if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE |
301 | 16.9M | && u1_cur_byte == EMULATION_PREVENTION_BYTE) |
302 | 8.76k | { |
303 | 8.76k | c_count = 0; |
304 | 8.76k | u1_cur_byte = *pu1_nal_unit++; |
305 | 8.76k | i--; |
306 | 8.76k | } |
307 | | |
308 | 16.9M | ui_word = ((ui_word << 8) | u1_cur_byte); |
309 | | |
310 | 16.9M | c_count++; |
311 | 16.9M | if(u1_cur_byte != 0x00) |
312 | 13.9M | c_count = 0; |
313 | | |
314 | 16.9M | u4_num_bytes_in_rbsp += 4; |
315 | | |
316 | 16.9M | } |
317 | | |
318 | 3.48M | for(; i > 0; i--) |
319 | 2.93M | { |
320 | 2.93M | u1_cur_byte = *pu1_nal_unit++; |
321 | | |
322 | 2.93M | if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE |
323 | 2.93M | && u1_cur_byte == EMULATION_PREVENTION_BYTE) |
324 | 2.41k | { |
325 | 2.41k | c_count = 0; |
326 | 2.41k | i--; |
327 | 2.41k | u1_cur_byte = *pu1_nal_unit++; |
328 | 2.41k | } |
329 | | |
330 | 2.93M | ui_word = ((ui_word << 8) | u1_cur_byte); |
331 | 2.93M | u4_num_bytes_in_rbsp++; |
332 | | |
333 | 2.93M | if((u4_num_bytes_in_rbsp & 0x03) == 0x03) |
334 | 943k | { |
335 | 943k | *puc_bitstream_buffer = ui_word; |
336 | 943k | puc_bitstream_buffer++; |
337 | 943k | } |
338 | 2.93M | c_count++; |
339 | 2.93M | if(u1_cur_byte != 0x00) |
340 | 2.51M | c_count = 0; |
341 | | |
342 | 2.93M | } |
343 | | |
344 | 549k | *puc_bitstream_buffer = (ui_word |
345 | 549k | << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3)); |
346 | 549k | ps_bitstrm->u4_ofst = 0; |
347 | 549k | ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + NAL_FIRST_BYTE_SIZE) << 3); |
348 | | |
349 | 549k | return (u4_num_bytes_in_rbsp); |
350 | 549k | } |
351 | | |
352 | | |
353 | | /*! |
354 | | ************************************************************************** |
355 | | * \if Function name : ih264d_rbsp_to_sodb \endif |
356 | | * |
357 | | * \brief |
358 | | * This function converts RBSP to SODB. |
359 | | * |
360 | | * \param ps_bitstrm : Poiter to dec_bit_stream_t structure. |
361 | | * |
362 | | * \return |
363 | | * None. |
364 | | * |
365 | | ************************************************************************** |
366 | | */ |
367 | | void ih264d_rbsp_to_sodb(dec_bit_stream_t *ps_bitstrm) |
368 | 384k | { |
369 | 384k | UWORD32 ui_lastWord; |
370 | 384k | UWORD32 ui_word; |
371 | 384k | UWORD8 uc_lastByte; |
372 | 384k | WORD8 i; |
373 | | |
374 | 384k | ui_lastWord = (ps_bitstrm->u4_max_ofst >> 5); |
375 | 384k | i = (ps_bitstrm->u4_max_ofst >> 3) & 0x03; |
376 | | |
377 | 384k | if(i) |
378 | 289k | { |
379 | 289k | ui_word = ps_bitstrm->pu4_buffer[ui_lastWord]; |
380 | 289k | uc_lastByte = ((ui_word << ((i - 1) << 3)) >> 24); |
381 | 289k | } |
382 | 95.3k | else |
383 | 95.3k | { |
384 | 95.3k | ui_word = ps_bitstrm->pu4_buffer[ui_lastWord - 1]; |
385 | 95.3k | uc_lastByte = ((ui_word << 24) >> 24); |
386 | 95.3k | } |
387 | | /*--------------------------------------------------------------------*/ |
388 | | /* Find out the rbsp_stop_bit position in the last byte of rbsp */ |
389 | | /*--------------------------------------------------------------------*/ |
390 | 1.09M | for(i = 0; (i < 8) && !CHECKBIT(uc_lastByte, i); ++i) |
391 | 705k | ; |
392 | 384k | ps_bitstrm->u4_max_ofst = ps_bitstrm->u4_max_ofst - (i + 1); |
393 | 384k | } |