blob: 48450c89aa4445834e11ad7a94f1112e4a0baa3e [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
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#define NUM_OF_ZERO_BYTES_BEFORE_START_CODE 2
39#define EMULATION_PREVENTION_BYTE 0x03
40
41#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
64void ih264d_check_if_aud(UWORD8 *pu1_buf,
65 UWORD32 u4_cur_pos,
66 UWORD32 u4_max_ofst,
67 UWORD32 *pu4_next_is_aud)
68{
69 UWORD8 u1_first_byte, u1_nal_unit_type;
70 if(u4_cur_pos + 1 < u4_max_ofst)
71 {
72 u1_first_byte = pu1_buf[u4_cur_pos + 1];
73 u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
74
75 if(u1_nal_unit_type == ACCESS_UNIT_DELIMITER_RBSP)
76 {
77 *pu4_next_is_aud = 1;
78 }
79 }
80
81}
82WORD32 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{
88 WORD32 zero_byte_cnt = 0;
89 UWORD32 ui_curPosTemp;
90
91 *pu4_length_of_start_code = 0;
92 /*Find first start code */
93 while(u4_cur_pos < u4_max_ofst)
94 {
95 if(pu1_buf[u4_cur_pos] == 0)
96 zero_byte_cnt++;
97 else if(pu1_buf[u4_cur_pos]
98 == 0x01 && zero_byte_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE)
99 {
100 /* Found the start code */
101 u4_cur_pos++;
102 break;
103 }
104 else
105 {
106 zero_byte_cnt = 0;
107 }
108 u4_cur_pos++;
109 }
110 /*Find Next Start Code */
111 *pu4_length_of_start_code = u4_cur_pos;
112 zero_byte_cnt = 0;
113 ui_curPosTemp = u4_cur_pos;
114 while(u4_cur_pos < u4_max_ofst)
115 {
116
117 if(pu1_buf[u4_cur_pos] == 0)
118 zero_byte_cnt++;
119 else if(pu1_buf[u4_cur_pos]
120 == 0x01 && zero_byte_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE)
121 {
122 /* Found the start code */
123 ih264d_check_if_aud(pu1_buf, u4_cur_pos, u4_max_ofst,
124 pu4_next_is_aud);
125 return (u4_cur_pos - zero_byte_cnt - ui_curPosTemp);
126 }
127 else
128 {
129 zero_byte_cnt = 0;
130 }
131 u4_cur_pos++;
132 }
133
134 return (u4_cur_pos - zero_byte_cnt - ui_curPosTemp); //(START_CODE_NOT_FOUND);
135}
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 */
152WORD32 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{
157
158 WORD32 i_length_of_nal_unit = 0;
159 UWORD32 u4_next_is_aud;
160
161 /* NAL Thread starts */
162
163 ih264d_find_start_code(pu1_buf, u4_cur_pos, u4_max_ofst,
164 pu4_length_of_start_code, &u4_next_is_aud);
165
166 return (i_length_of_nal_unit);
167}
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 */
192WORD32 ih264d_process_nal_unit(dec_bit_stream_t *ps_bitstrm,
193 UWORD8 *pu1_nal_unit,
194 UWORD32 u4_numbytes_in_nal_unit)
195{
196 UWORD32 u4_num_bytes_in_rbsp;
197 UWORD8 u1_cur_byte;
198 WORD32 i = 0;
199 WORD8 c_count;
200 UWORD32 ui_word;
201 UWORD32 *puc_bitstream_buffer = (UWORD32*)pu1_nal_unit;
202 ps_bitstrm->pu4_buffer = puc_bitstream_buffer;
203
204 /*--------------------------------------------------------------------*/
205 /* First Byte of the NAL Unit */
206 /*--------------------------------------------------------------------*/
207
208 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 u4_num_bytes_in_rbsp = 0;
215 c_count = 0;
216
217//first iteration
218
219 u1_cur_byte = *pu1_nal_unit++;
220
221 ui_word = ((ui_word << 8) | u1_cur_byte);
222
223 c_count++;
224 if(u1_cur_byte != 0x00)
225 c_count = 0;
226
227//second iteration
228
229 u1_cur_byte = *pu1_nal_unit++;
230
231 ui_word = ((ui_word << 8) | u1_cur_byte);
232 u4_num_bytes_in_rbsp = 2;
233
234 c_count++;
235 if(u1_cur_byte != 0x00)
236 c_count = 0;
237
238 if(u4_numbytes_in_nal_unit > 2)
239 {
240 i = ((u4_numbytes_in_nal_unit - 3));
241 }
242
243 for(; i > 8; i -= 4)
244 {
245
246// loop 0
247 u1_cur_byte = *pu1_nal_unit++;
248
249 if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
250 && u1_cur_byte == EMULATION_PREVENTION_BYTE)
251 {
252 c_count = 0;
253 u1_cur_byte = *pu1_nal_unit++;
254 i--;
255 }
256
257 ui_word = ((ui_word << 8) | u1_cur_byte);
258 *puc_bitstream_buffer = ui_word;
259 puc_bitstream_buffer++;
260 c_count++;
261 if(u1_cur_byte != 0x00)
262 c_count = 0;
263
264// loop 1
265 u1_cur_byte = *pu1_nal_unit++;
266
267 if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
268 && u1_cur_byte == EMULATION_PREVENTION_BYTE)
269 {
270 c_count = 0;
271 u1_cur_byte = *pu1_nal_unit++;
272 i--;
273 }
274 ui_word = ((ui_word << 8) | u1_cur_byte);
275
276 c_count++;
277 if(u1_cur_byte != 0x00)
278 c_count = 0;
279
280// loop 2
281 u1_cur_byte = *pu1_nal_unit++;
282
283 if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
284 && u1_cur_byte == EMULATION_PREVENTION_BYTE)
285 {
286 c_count = 0;
287 u1_cur_byte = *pu1_nal_unit++;
288 i--;
289 }
290
291 ui_word = ((ui_word << 8) | u1_cur_byte);
292
293 c_count++;
294 if(u1_cur_byte != 0x00)
295 c_count = 0;
296
297// loop 3
298 u1_cur_byte = *pu1_nal_unit++;
299
300 if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
301 && u1_cur_byte == EMULATION_PREVENTION_BYTE)
302 {
303 c_count = 0;
304 u1_cur_byte = *pu1_nal_unit++;
305 i--;
306 }
307
308 ui_word = ((ui_word << 8) | u1_cur_byte);
309
310 c_count++;
311 if(u1_cur_byte != 0x00)
312 c_count = 0;
313
314 u4_num_bytes_in_rbsp += 4;
315
316 }
317
318 for(; i > 0; i--)
319 {
320 u1_cur_byte = *pu1_nal_unit++;
321
322 if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
323 && u1_cur_byte == EMULATION_PREVENTION_BYTE)
324 {
325 c_count = 0;
326 i--;
327 u1_cur_byte = *pu1_nal_unit++;
328 }
329
330 ui_word = ((ui_word << 8) | u1_cur_byte);
331 u4_num_bytes_in_rbsp++;
332
333 if((u4_num_bytes_in_rbsp & 0x03) == 0x03)
334 {
335 *puc_bitstream_buffer = ui_word;
336 puc_bitstream_buffer++;
337 }
338 c_count++;
339 if(u1_cur_byte != 0x00)
340 c_count = 0;
341
342 }
343
344 *puc_bitstream_buffer = (ui_word
345 << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3));
346 ps_bitstrm->u4_ofst = 0;
347 ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + NAL_FIRST_BYTE_SIZE) << 3);
348
349 return (u4_num_bytes_in_rbsp);
350}
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 */
367void ih264d_rbsp_to_sodb(dec_bit_stream_t *ps_bitstrm)
368{
369 UWORD32 ui_lastWord;
370 UWORD32 ui_word;
371 UWORD8 uc_lastByte;
372 WORD8 i;
373
374 ui_lastWord = (ps_bitstrm->u4_max_ofst >> 5);
375 i = (ps_bitstrm->u4_max_ofst >> 3) & 0x03;
376
377 if(i)
378 {
379 ui_word = ps_bitstrm->pu4_buffer[ui_lastWord];
380 uc_lastByte = ((ui_word << ((i - 1) << 3)) >> 24);
381 }
382 else
383 {
384 ui_word = ps_bitstrm->pu4_buffer[ui_lastWord - 1];
385 uc_lastByte = ((ui_word << 24) >> 24);
386 }
387 /*--------------------------------------------------------------------*/
388 /* Find out the rbsp_stop_bit position in the last byte of rbsp */
389 /*--------------------------------------------------------------------*/
390 for(i = 0; (i < 8) && !CHECKBIT(uc_lastByte, i); ++i)
391 ;
392 ps_bitstrm->u4_max_ofst = ps_bitstrm->u4_max_ofst - (i + 1);
393}