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