1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2022 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 isvcd_nal.c
23*495ae853SAndroid Build Coastguard Worker *
24*495ae853SAndroid Build Coastguard Worker * \brief
25*495ae853SAndroid Build Coastguard Worker * Contains routines that resample for SVC resampling
26*495ae853SAndroid Build Coastguard Worker *
27*495ae853SAndroid Build Coastguard Worker * Detailed_description
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * \date
30*495ae853SAndroid Build Coastguard Worker *
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * \author : Kishore
33*495ae853SAndroid Build Coastguard Worker **************************************************************************
34*495ae853SAndroid Build Coastguard Worker */
35*495ae853SAndroid Build Coastguard Worker
36*495ae853SAndroid Build Coastguard Worker /******************************************************************************
37*495ae853SAndroid Build Coastguard Worker *
38*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
39*495ae853SAndroid Build Coastguard Worker *
40*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
41*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
42*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
43*495ae853SAndroid Build Coastguard Worker *
44*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
45*495ae853SAndroid Build Coastguard Worker *
46*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
47*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
48*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
49*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
50*495ae853SAndroid Build Coastguard Worker * limitations under the License.
51*495ae853SAndroid Build Coastguard Worker *
52*495ae853SAndroid Build Coastguard Worker *****************************************************************************
53*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
54*495ae853SAndroid Build Coastguard Worker */
55*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
56*495ae853SAndroid Build Coastguard Worker /* */
57*495ae853SAndroid Build Coastguard Worker /* File Name : isvcd_nal.c */
58*495ae853SAndroid Build Coastguard Worker /* */
59*495ae853SAndroid Build Coastguard Worker /* Description : Contains fucntions which help in NAL extraction from */
60*495ae853SAndroid Build Coastguard Worker /* the bitstream */
61*495ae853SAndroid Build Coastguard Worker /* */
62*495ae853SAndroid Build Coastguard Worker /* List of Functions : isvcd_nal_find_start_code, */
63*495ae853SAndroid Build Coastguard Worker /* isvcd_get_annex_b_nal_unit, */
64*495ae853SAndroid Build Coastguard Worker /* isvcd_get_rfc_nal_unit, */
65*495ae853SAndroid Build Coastguard Worker /* isvcd_nal_rbsp_to_sodb, */
66*495ae853SAndroid Build Coastguard Worker /* isvcd_reset_emulation_ctxt, */
67*495ae853SAndroid Build Coastguard Worker /* isvcd_nal_byte_swap_emulation, */
68*495ae853SAndroid Build Coastguard Worker /* isvcd_set_default_nal_header_prms, */
69*495ae853SAndroid Build Coastguard Worker /* isvcd_dec_nal_hdr, */
70*495ae853SAndroid Build Coastguard Worker /* isvcd_parse_part_slice_hdr, */
71*495ae853SAndroid Build Coastguard Worker /* isvcd_get_int_tgt_lyr_attr, */
72*495ae853SAndroid Build Coastguard Worker /* isvcd_discard_nal */
73*495ae853SAndroid Build Coastguard Worker /* */
74*495ae853SAndroid Build Coastguard Worker /* Issues / Problems : None */
75*495ae853SAndroid Build Coastguard Worker /* */
76*495ae853SAndroid Build Coastguard Worker /* Revision History: */
77*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes */
78*495ae853SAndroid Build Coastguard Worker /* 14 09 2021 Kishore Draft */
79*495ae853SAndroid Build Coastguard Worker /* */
80*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
81*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
82*495ae853SAndroid Build Coastguard Worker /* File Includes */
83*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
84*495ae853SAndroid Build Coastguard Worker
85*495ae853SAndroid Build Coastguard Worker /* System include files */
86*495ae853SAndroid Build Coastguard Worker
87*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
88*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
89*495ae853SAndroid Build Coastguard Worker #include <string.h>
90*495ae853SAndroid Build Coastguard Worker #include <limits.h>
91*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
92*495ae853SAndroid Build Coastguard Worker #include <assert.h>
93*495ae853SAndroid Build Coastguard Worker
94*495ae853SAndroid Build Coastguard Worker /* standard interface include files */
95*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
96*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
97*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
98*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
99*495ae853SAndroid Build Coastguard Worker #include "iv.h"
100*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
101*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
102*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
103*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
104*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
105*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
106*495ae853SAndroid Build Coastguard Worker #include "ih264d_nal.h"
107*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
108*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
109*495ae853SAndroid Build Coastguard Worker
110*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
111*495ae853SAndroid Build Coastguard Worker /*Extern Variable Declarations */
112*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
113*495ae853SAndroid Build Coastguard Worker
114*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
115*495ae853SAndroid Build Coastguard Worker /* Global Variable Definitions */
116*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
117*495ae853SAndroid Build Coastguard Worker
118*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
119*495ae853SAndroid Build Coastguard Worker /* Static Global Variable Definitions */
120*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
121*495ae853SAndroid Build Coastguard Worker
122*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
123*495ae853SAndroid Build Coastguard Worker /* Static function Definitions */
124*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
125*495ae853SAndroid Build Coastguard Worker
126*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
127*495ae853SAndroid Build Coastguard Worker /* */
128*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_reset_nal_buf */
129*495ae853SAndroid Build Coastguard Worker /* */
130*495ae853SAndroid Build Coastguard Worker /* Description : Performs the reset of NAL buffer structure */
131*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Pointer to NAL buffer structure */
132*495ae853SAndroid Build Coastguard Worker /* Globals : None */
133*495ae853SAndroid Build Coastguard Worker /* Processing : Updates different fields of the structure */
134*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
135*495ae853SAndroid Build Coastguard Worker /* Returns : */
136*495ae853SAndroid Build Coastguard Worker /* */
137*495ae853SAndroid Build Coastguard Worker /* Issues : None */
138*495ae853SAndroid Build Coastguard Worker /* */
139*495ae853SAndroid Build Coastguard Worker /* Revision History: */
140*495ae853SAndroid Build Coastguard Worker /* */
141*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
142*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
143*495ae853SAndroid Build Coastguard Worker /* */
144*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_nal_buf_reset(void * pv_nal_buf)145*495ae853SAndroid Build Coastguard Worker void isvcd_nal_buf_reset(void *pv_nal_buf)
146*495ae853SAndroid Build Coastguard Worker {
147*495ae853SAndroid Build Coastguard Worker nal_buf_t *ps_nal_buf = pv_nal_buf;
148*495ae853SAndroid Build Coastguard Worker
149*495ae853SAndroid Build Coastguard Worker ps_nal_buf->i4_valid_flag = SVCD_FALSE;
150*495ae853SAndroid Build Coastguard Worker ps_nal_buf->i4_buf_size = 0;
151*495ae853SAndroid Build Coastguard Worker ps_nal_buf->u4_max_bits = 0;
152*495ae853SAndroid Build Coastguard Worker ps_nal_buf->pu1_buf = NULL;
153*495ae853SAndroid Build Coastguard Worker }
154*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
155*495ae853SAndroid Build Coastguard Worker /* */
156*495ae853SAndroid Build Coastguard Worker /* Function Name :svcd_nal_find_start_code */
157*495ae853SAndroid Build Coastguard Worker /* */
158*495ae853SAndroid Build Coastguard Worker /* Description : Finds the position of the start code in the stream */
159*495ae853SAndroid Build Coastguard Worker /* */
160*495ae853SAndroid Build Coastguard Worker /* */
161*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Pointer to buffer start */
162*495ae853SAndroid Build Coastguard Worker /* 2. start position */
163*495ae853SAndroid Build Coastguard Worker /* 3. Maximum number of bytes in the buffer */
164*495ae853SAndroid Build Coastguard Worker /* 4. pointer to zero byte count */
165*495ae853SAndroid Build Coastguard Worker /* 5. pointer to bytes consumed variable */
166*495ae853SAndroid Build Coastguard Worker /* Globals : */
167*495ae853SAndroid Build Coastguard Worker /* Processing : Searches for the start code in the bitstream and updates */
168*495ae853SAndroid Build Coastguard Worker /* consumed variable */
169*495ae853SAndroid Build Coastguard Worker /* */
170*495ae853SAndroid Build Coastguard Worker /* Outputs : Bytes consumed variable */
171*495ae853SAndroid Build Coastguard Worker /* Returns : If start code is found then it returns SC_FOUND otherwise*/
172*495ae853SAndroid Build Coastguard Worker /* it returns SC_NOT_FOUND */
173*495ae853SAndroid Build Coastguard Worker /* */
174*495ae853SAndroid Build Coastguard Worker /* Issues : None */
175*495ae853SAndroid Build Coastguard Worker /* */
176*495ae853SAndroid Build Coastguard Worker /* Revision History: */
177*495ae853SAndroid Build Coastguard Worker /* */
178*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
179*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
180*495ae853SAndroid Build Coastguard Worker /* */
181*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_nal_find_start_code(UWORD8 * pu1_buf_start,WORD32 i4_cur_pos,WORD32 i4_max_num_bytes,WORD32 * pi4_zero_cnt,UWORD32 * pu4_bytes_consumed)182*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_nal_find_start_code(UWORD8 *pu1_buf_start, WORD32 i4_cur_pos, WORD32 i4_max_num_bytes,
183*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_zero_cnt, UWORD32 *pu4_bytes_consumed)
184*495ae853SAndroid Build Coastguard Worker {
185*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf = pu1_buf_start + i4_cur_pos;
186*495ae853SAndroid Build Coastguard Worker WORD32 i4_i;
187*495ae853SAndroid Build Coastguard Worker
188*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < (i4_max_num_bytes - i4_cur_pos); i4_i++)
189*495ae853SAndroid Build Coastguard Worker {
190*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
191*495ae853SAndroid Build Coastguard Worker /* If zero increment the zero byte counter */
192*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
193*495ae853SAndroid Build Coastguard Worker if(0 == *pu1_buf)
194*495ae853SAndroid Build Coastguard Worker {
195*495ae853SAndroid Build Coastguard Worker (*pi4_zero_cnt)++;
196*495ae853SAndroid Build Coastguard Worker }
197*495ae853SAndroid Build Coastguard Worker
198*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
199*495ae853SAndroid Build Coastguard Worker /* If start code found then increment the byte consumed and return */
200*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
201*495ae853SAndroid Build Coastguard Worker else if(0x01 == *pu1_buf && *pi4_zero_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE)
202*495ae853SAndroid Build Coastguard Worker {
203*495ae853SAndroid Build Coastguard Worker (*pu4_bytes_consumed)++;
204*495ae853SAndroid Build Coastguard Worker return (SC_FOUND);
205*495ae853SAndroid Build Coastguard Worker }
206*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
207*495ae853SAndroid Build Coastguard Worker /* If non zero byte and value is not equal to 1 a then reset zero */
208*495ae853SAndroid Build Coastguard Worker /* byte counter */
209*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
210*495ae853SAndroid Build Coastguard Worker else
211*495ae853SAndroid Build Coastguard Worker {
212*495ae853SAndroid Build Coastguard Worker *pi4_zero_cnt = 0;
213*495ae853SAndroid Build Coastguard Worker }
214*495ae853SAndroid Build Coastguard Worker
215*495ae853SAndroid Build Coastguard Worker (*pu4_bytes_consumed)++;
216*495ae853SAndroid Build Coastguard Worker pu1_buf++;
217*495ae853SAndroid Build Coastguard Worker }
218*495ae853SAndroid Build Coastguard Worker
219*495ae853SAndroid Build Coastguard Worker return (SC_NOT_FOUND);
220*495ae853SAndroid Build Coastguard Worker }
221*495ae853SAndroid Build Coastguard Worker
222*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
223*495ae853SAndroid Build Coastguard Worker /* */
224*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_get_first_start_code */
225*495ae853SAndroid Build Coastguard Worker /* */
226*495ae853SAndroid Build Coastguard Worker /* Description : Searches for the first start code in the bitstream */
227*495ae853SAndroid Build Coastguard Worker /* */
228*495ae853SAndroid Build Coastguard Worker /* */
229*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. input buffer structure */
230*495ae853SAndroid Build Coastguard Worker /* 2. Bytes consumed variable */
231*495ae853SAndroid Build Coastguard Worker /* Globals : None */
232*495ae853SAndroid Build Coastguard Worker /* Processing : None */
233*495ae853SAndroid Build Coastguard Worker /* */
234*495ae853SAndroid Build Coastguard Worker /* Outputs : Updates bytes consumed variable */
235*495ae853SAndroid Build Coastguard Worker /* Returns : Start code is found or not */
236*495ae853SAndroid Build Coastguard Worker /* */
237*495ae853SAndroid Build Coastguard Worker /* Issues : None */
238*495ae853SAndroid Build Coastguard Worker /* */
239*495ae853SAndroid Build Coastguard Worker /* Revision History: */
240*495ae853SAndroid Build Coastguard Worker /* */
241*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
242*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
243*495ae853SAndroid Build Coastguard Worker /* */
244*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
245*495ae853SAndroid Build Coastguard Worker
isvcd_get_first_start_code(UWORD8 * pu1_stream_buffer,UWORD32 * pu4_bytes_consumed,UWORD32 * pu4_num_bytes)246*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_first_start_code(UWORD8 *pu1_stream_buffer, UWORD32 *pu4_bytes_consumed,
247*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_num_bytes)
248*495ae853SAndroid Build Coastguard Worker {
249*495ae853SAndroid Build Coastguard Worker WORD32 i4_zero_cnt = 0, i4_status;
250*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bytes_consumed_temp = 0;
251*495ae853SAndroid Build Coastguard Worker
252*495ae853SAndroid Build Coastguard Worker i4_status = isvcd_nal_find_start_code(pu1_stream_buffer, 0, *pu4_num_bytes, &i4_zero_cnt,
253*495ae853SAndroid Build Coastguard Worker &u4_bytes_consumed_temp);
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
256*495ae853SAndroid Build Coastguard Worker /* If start code is not found then return and start searching for it */
257*495ae853SAndroid Build Coastguard Worker /* again in the next process call. This process is repeated till we */
258*495ae853SAndroid Build Coastguard Worker /* get a start code */
259*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
260*495ae853SAndroid Build Coastguard Worker if(SC_NOT_FOUND == i4_status)
261*495ae853SAndroid Build Coastguard Worker {
262*495ae853SAndroid Build Coastguard Worker *pu4_bytes_consumed += u4_bytes_consumed_temp;
263*495ae853SAndroid Build Coastguard Worker return (i4_status);
264*495ae853SAndroid Build Coastguard Worker }
265*495ae853SAndroid Build Coastguard Worker else
266*495ae853SAndroid Build Coastguard Worker {
267*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
268*495ae853SAndroid Build Coastguard Worker /* If start code found then proceed with bitstream extraction */
269*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
270*495ae853SAndroid Build Coastguard Worker *pu4_bytes_consumed += u4_bytes_consumed_temp;
271*495ae853SAndroid Build Coastguard Worker return (i4_status);
272*495ae853SAndroid Build Coastguard Worker }
273*495ae853SAndroid Build Coastguard Worker }
274*495ae853SAndroid Build Coastguard Worker
275*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
276*495ae853SAndroid Build Coastguard Worker /* */
277*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_get_annex_b_nal_unit */
278*495ae853SAndroid Build Coastguard Worker /* */
279*495ae853SAndroid Build Coastguard Worker /* Description : This function gets one NAL unit from the Annex B based */
280*495ae853SAndroid Build Coastguard Worker /* input bitstream */
281*495ae853SAndroid Build Coastguard Worker /* */
282*495ae853SAndroid Build Coastguard Worker /* */
283*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Input buffer pointer */
284*495ae853SAndroid Build Coastguard Worker /* 2. Current position in the input buffer */
285*495ae853SAndroid Build Coastguard Worker /* 3. Input buffer size */
286*495ae853SAndroid Build Coastguard Worker /* 4. Pointer to state of NAL boundary detection variable */
287*495ae853SAndroid Build Coastguard Worker /* 5. Pointer to bytes consumed variable */
288*495ae853SAndroid Build Coastguard Worker /* 6. pointer to nal structure */
289*495ae853SAndroid Build Coastguard Worker /* Globals : */
290*495ae853SAndroid Build Coastguard Worker /* Processing : This fucntion searches for start code from the current */
291*495ae853SAndroid Build Coastguard Worker /* position and once gets one start code it searches for */
292*495ae853SAndroid Build Coastguard Worker /* another start code to get a NAL unit. */
293*495ae853SAndroid Build Coastguard Worker /* */
294*495ae853SAndroid Build Coastguard Worker /* Outputs : Updates the state of NAL boundary detection logic */
295*495ae853SAndroid Build Coastguard Worker /* Updates the bytes consumed variable from 0 to bytes */
296*495ae853SAndroid Build Coastguard Worker /* consumed in this call */
297*495ae853SAndroid Build Coastguard Worker /* Returns : start of nal flag */
298*495ae853SAndroid Build Coastguard Worker /* */
299*495ae853SAndroid Build Coastguard Worker /* Issues : None */
300*495ae853SAndroid Build Coastguard Worker /* */
301*495ae853SAndroid Build Coastguard Worker /* Revision History: */
302*495ae853SAndroid Build Coastguard Worker /* */
303*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
304*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
305*495ae853SAndroid Build Coastguard Worker /* */
306*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
307*495ae853SAndroid Build Coastguard Worker
isvcd_get_annex_b_nal_unit(UWORD8 * pu1_buf_start,WORD32 i4_cur_pos,WORD32 i4_max_num_bytes,WORD32 * pi4_state,WORD32 * pi4_zero_byte_cnt,UWORD32 * pu4_bytes_consumed,void * pv_nal_unit,WORD32 * pi4_more_data_flag)308*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_annex_b_nal_unit(UWORD8 *pu1_buf_start, WORD32 i4_cur_pos, WORD32 i4_max_num_bytes,
309*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_state, WORD32 *pi4_zero_byte_cnt,
310*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bytes_consumed, void *pv_nal_unit,
311*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_more_data_flag)
312*495ae853SAndroid Build Coastguard Worker {
313*495ae853SAndroid Build Coastguard Worker nal_unit_t *ps_nal_unit = (nal_unit_t *) pv_nal_unit;
314*495ae853SAndroid Build Coastguard Worker WORD32 i4_status, i4_nal_start_flag = SVCD_FALSE;
315*495ae853SAndroid Build Coastguard Worker
316*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
317*495ae853SAndroid Build Coastguard Worker /* Initialization */
318*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
319*495ae853SAndroid Build Coastguard Worker *pu4_bytes_consumed = 0;
320*495ae853SAndroid Build Coastguard Worker *pi4_more_data_flag = SVCD_TRUE;
321*495ae853SAndroid Build Coastguard Worker
322*495ae853SAndroid Build Coastguard Worker /*------------------------ check ----------------------------------------*/
323*495ae853SAndroid Build Coastguard Worker /* Assumptions is that this fucntion should not be called with this state*/
324*495ae853SAndroid Build Coastguard Worker /* hence it is responsibility of the caller to reset the state after the */
325*495ae853SAndroid Build Coastguard Worker /* NAL_END. */
326*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
327*495ae853SAndroid Build Coastguard Worker if(NAL_END == *pi4_state)
328*495ae853SAndroid Build Coastguard Worker {
329*495ae853SAndroid Build Coastguard Worker return i4_nal_start_flag;
330*495ae853SAndroid Build Coastguard Worker }
331*495ae853SAndroid Build Coastguard Worker
332*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
333*495ae853SAndroid Build Coastguard Worker /* ps_nal_unit->apu1_bufs[0] is expected to point to start of buffer of */
334*495ae853SAndroid Build Coastguard Worker /* current NAL unit of the current process call. If a NAL unit is frag- */
335*495ae853SAndroid Build Coastguard Worker /* -mented across multiple process call then this buffer should point to */
336*495ae853SAndroid Build Coastguard Worker /* start address of buffers. But when start of NAL is present in the */
337*495ae853SAndroid Build Coastguard Worker /* buffer of current process call then ps_nal_unit->apu1_bufs[0] is */
338*495ae853SAndroid Build Coastguard Worker /* expected to point to start adress of NAL unit (should be pointing to) */
339*495ae853SAndroid Build Coastguard Worker /* NAL header) */
340*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
341*495ae853SAndroid Build Coastguard Worker ps_nal_unit->pu1_bufs = pu1_buf_start + i4_cur_pos;
342*495ae853SAndroid Build Coastguard Worker
343*495ae853SAndroid Build Coastguard Worker if(NAL_START == *pi4_state)
344*495ae853SAndroid Build Coastguard Worker {
345*495ae853SAndroid Build Coastguard Worker if(0 != *pi4_zero_byte_cnt)
346*495ae853SAndroid Build Coastguard Worker {
347*495ae853SAndroid Build Coastguard Worker return i4_nal_start_flag;
348*495ae853SAndroid Build Coastguard Worker }
349*495ae853SAndroid Build Coastguard Worker i4_nal_start_flag = SVCD_TRUE;
350*495ae853SAndroid Build Coastguard Worker ps_nal_unit->i4_num_bufs = 1;
351*495ae853SAndroid Build Coastguard Worker ps_nal_unit->i4_buf_sizes = 0;
352*495ae853SAndroid Build Coastguard Worker *pi4_state = FIND_NAL_END;
353*495ae853SAndroid Build Coastguard Worker }
354*495ae853SAndroid Build Coastguard Worker
355*495ae853SAndroid Build Coastguard Worker i4_status = isvcd_nal_find_start_code(pu1_buf_start, i4_cur_pos, i4_max_num_bytes,
356*495ae853SAndroid Build Coastguard Worker pi4_zero_byte_cnt, pu4_bytes_consumed);
357*495ae853SAndroid Build Coastguard Worker
358*495ae853SAndroid Build Coastguard Worker if(SC_NOT_FOUND == i4_status)
359*495ae853SAndroid Build Coastguard Worker {
360*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
361*495ae853SAndroid Build Coastguard Worker /* If start code is not found then there are 2 possibilities */
362*495ae853SAndroid Build Coastguard Worker /* 1. We are in the middle of decoding the start code. This means */
363*495ae853SAndroid Build Coastguard Worker /* that we might have decoded the one or 2 zeroes of the start */
364*495ae853SAndroid Build Coastguard Worker /* code. In such cases, we should not consume these bytes. Though */
365*495ae853SAndroid Build Coastguard Worker /* doing so we might encounter spurious cases where 0's are not */
366*495ae853SAndroid Build Coastguard Worker /* actually corresponds to start code but these will not harm us */
367*495ae853SAndroid Build Coastguard Worker /* 2. Not of above case. Straightforward one */
368*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
369*495ae853SAndroid Build Coastguard Worker ps_nal_unit->i4_buf_sizes = *pu4_bytes_consumed;
370*495ae853SAndroid Build Coastguard Worker *pi4_more_data_flag = SVCD_FALSE;
371*495ae853SAndroid Build Coastguard Worker
372*495ae853SAndroid Build Coastguard Worker return (i4_nal_start_flag);
373*495ae853SAndroid Build Coastguard Worker }
374*495ae853SAndroid Build Coastguard Worker else
375*495ae853SAndroid Build Coastguard Worker {
376*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
377*495ae853SAndroid Build Coastguard Worker /* If NAL END is found then increment the bytes consumed appropriatly*/
378*495ae853SAndroid Build Coastguard Worker /* reset the zero byte counter */
379*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
380*495ae853SAndroid Build Coastguard Worker *pi4_state = NAL_END;
381*495ae853SAndroid Build Coastguard Worker ps_nal_unit->i4_buf_sizes = *pu4_bytes_consumed - 1;
382*495ae853SAndroid Build Coastguard Worker *pi4_zero_byte_cnt = 0;
383*495ae853SAndroid Build Coastguard Worker return (i4_nal_start_flag);
384*495ae853SAndroid Build Coastguard Worker }
385*495ae853SAndroid Build Coastguard Worker }
386*495ae853SAndroid Build Coastguard Worker
387*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
388*495ae853SAndroid Build Coastguard Worker /* */
389*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_nal_rbsp_to_sodb */
390*495ae853SAndroid Build Coastguard Worker /* */
391*495ae853SAndroid Build Coastguard Worker /* Description : Converts the RBSP data to SODB data */
392*495ae853SAndroid Build Coastguard Worker /* */
393*495ae853SAndroid Build Coastguard Worker /* */
394*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Input buffer containing the NAL unit */
395*495ae853SAndroid Build Coastguard Worker /* 2. Length of NAL unit (in bytes) */
396*495ae853SAndroid Build Coastguard Worker /* Globals : None */
397*495ae853SAndroid Build Coastguard Worker /* Processing : Finds the RBSP stop bit, if present then finds the length*/
398*495ae853SAndroid Build Coastguard Worker /* of SODB data */
399*495ae853SAndroid Build Coastguard Worker /* */
400*495ae853SAndroid Build Coastguard Worker /* Outputs : */
401*495ae853SAndroid Build Coastguard Worker /* Returns : Number of bits in the SODB data */
402*495ae853SAndroid Build Coastguard Worker /* */
403*495ae853SAndroid Build Coastguard Worker /* Issues : */
404*495ae853SAndroid Build Coastguard Worker /* */
405*495ae853SAndroid Build Coastguard Worker /* Revision History: */
406*495ae853SAndroid Build Coastguard Worker /* */
407*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
408*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
409*495ae853SAndroid Build Coastguard Worker /* */
410*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
411*495ae853SAndroid Build Coastguard Worker
isvcd_nal_rbsp_to_sodb(UWORD8 * pu1_buf,WORD32 i4_nal_len_in_bytes,UWORD8 u1_ecd_mode)412*495ae853SAndroid Build Coastguard Worker UWORD32 isvcd_nal_rbsp_to_sodb(UWORD8 *pu1_buf, WORD32 i4_nal_len_in_bytes, UWORD8 u1_ecd_mode)
413*495ae853SAndroid Build Coastguard Worker {
414*495ae853SAndroid Build Coastguard Worker UWORD32 u4_last_word_pos;
415*495ae853SAndroid Build Coastguard Worker UWORD32 u4_word, u4_max_bit_offset;
416*495ae853SAndroid Build Coastguard Worker UWORD8 i4_num_bits;
417*495ae853SAndroid Build Coastguard Worker WORD32 i4_i;
418*495ae853SAndroid Build Coastguard Worker WORD64 i8_nal_len;
419*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_buf;
420*495ae853SAndroid Build Coastguard Worker
421*495ae853SAndroid Build Coastguard Worker if(0 >= i4_nal_len_in_bytes)
422*495ae853SAndroid Build Coastguard Worker {
423*495ae853SAndroid Build Coastguard Worker return (0);
424*495ae853SAndroid Build Coastguard Worker }
425*495ae853SAndroid Build Coastguard Worker
426*495ae853SAndroid Build Coastguard Worker /* Get offset in bits */
427*495ae853SAndroid Build Coastguard Worker i8_nal_len = (WORD64) i4_nal_len_in_bytes << 3;
428*495ae853SAndroid Build Coastguard Worker u4_max_bit_offset = (UWORD32) i8_nal_len;
429*495ae853SAndroid Build Coastguard Worker
430*495ae853SAndroid Build Coastguard Worker /* If NAL is coded in CABAC then SODB */
431*495ae853SAndroid Build Coastguard Worker /* length has to account for CABAC */
432*495ae853SAndroid Build Coastguard Worker /* ZERO WORDS also */
433*495ae853SAndroid Build Coastguard Worker if(1 == u1_ecd_mode)
434*495ae853SAndroid Build Coastguard Worker {
435*495ae853SAndroid Build Coastguard Worker return (u4_max_bit_offset);
436*495ae853SAndroid Build Coastguard Worker }
437*495ae853SAndroid Build Coastguard Worker
438*495ae853SAndroid Build Coastguard Worker /* Calculate the position of last word */
439*495ae853SAndroid Build Coastguard Worker u4_last_word_pos = i4_nal_len_in_bytes >> 2;
440*495ae853SAndroid Build Coastguard Worker
441*495ae853SAndroid Build Coastguard Worker /* Load the last word */
442*495ae853SAndroid Build Coastguard Worker i4_i = i4_nal_len_in_bytes & 0x03;
443*495ae853SAndroid Build Coastguard Worker if(0 != i4_i)
444*495ae853SAndroid Build Coastguard Worker {
445*495ae853SAndroid Build Coastguard Worker pu4_buf = (UWORD32 *) pu1_buf;
446*495ae853SAndroid Build Coastguard Worker pu4_buf += u4_last_word_pos;
447*495ae853SAndroid Build Coastguard Worker u4_word = *pu4_buf;
448*495ae853SAndroid Build Coastguard Worker i4_num_bits = i4_i << 3;
449*495ae853SAndroid Build Coastguard Worker u4_word >>= (32 - i4_num_bits);
450*495ae853SAndroid Build Coastguard Worker }
451*495ae853SAndroid Build Coastguard Worker else
452*495ae853SAndroid Build Coastguard Worker {
453*495ae853SAndroid Build Coastguard Worker pu4_buf = (UWORD32 *) pu1_buf;
454*495ae853SAndroid Build Coastguard Worker pu4_buf += (u4_last_word_pos - 1);
455*495ae853SAndroid Build Coastguard Worker u4_word = *pu4_buf;
456*495ae853SAndroid Build Coastguard Worker i4_num_bits = 32;
457*495ae853SAndroid Build Coastguard Worker }
458*495ae853SAndroid Build Coastguard Worker
459*495ae853SAndroid Build Coastguard Worker /* Search for RBSP stop bit */
460*495ae853SAndroid Build Coastguard Worker do
461*495ae853SAndroid Build Coastguard Worker {
462*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; (i4_i < i4_num_bits) && !CHECKBIT(u4_word, i4_i); i4_i++)
463*495ae853SAndroid Build Coastguard Worker ;
464*495ae853SAndroid Build Coastguard Worker
465*495ae853SAndroid Build Coastguard Worker u4_max_bit_offset -= i4_i;
466*495ae853SAndroid Build Coastguard Worker
467*495ae853SAndroid Build Coastguard Worker /* RBSP stop bit is found then */
468*495ae853SAndroid Build Coastguard Worker /* come out of the loop */
469*495ae853SAndroid Build Coastguard Worker if(0 != CHECKBIT(u4_word, i4_i))
470*495ae853SAndroid Build Coastguard Worker {
471*495ae853SAndroid Build Coastguard Worker /* Remove RBSP stop bit */
472*495ae853SAndroid Build Coastguard Worker u4_max_bit_offset -= 1;
473*495ae853SAndroid Build Coastguard Worker break;
474*495ae853SAndroid Build Coastguard Worker }
475*495ae853SAndroid Build Coastguard Worker
476*495ae853SAndroid Build Coastguard Worker pu4_buf -= 1;
477*495ae853SAndroid Build Coastguard Worker u4_word = *pu4_buf;
478*495ae853SAndroid Build Coastguard Worker i4_num_bits = 32;
479*495ae853SAndroid Build Coastguard Worker } while(u4_max_bit_offset > 0);
480*495ae853SAndroid Build Coastguard Worker
481*495ae853SAndroid Build Coastguard Worker return (u4_max_bit_offset);
482*495ae853SAndroid Build Coastguard Worker }
483*495ae853SAndroid Build Coastguard Worker
484*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
485*495ae853SAndroid Build Coastguard Worker /* */
486*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_reset_emulation_ctxt */
487*495ae853SAndroid Build Coastguard Worker /* */
488*495ae853SAndroid Build Coastguard Worker /* Description : Resets the emulation prevention context structure */
489*495ae853SAndroid Build Coastguard Worker /* */
490*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_emulation_ctxt - pointer to emulation prevention */
491*495ae853SAndroid Build Coastguard Worker /* context structure */
492*495ae853SAndroid Build Coastguard Worker /* */
493*495ae853SAndroid Build Coastguard Worker /* Globals : None */
494*495ae853SAndroid Build Coastguard Worker /* */
495*495ae853SAndroid Build Coastguard Worker /* Processing : None */
496*495ae853SAndroid Build Coastguard Worker /* */
497*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
498*495ae853SAndroid Build Coastguard Worker /* */
499*495ae853SAndroid Build Coastguard Worker /* Returns : None */
500*495ae853SAndroid Build Coastguard Worker /* */
501*495ae853SAndroid Build Coastguard Worker /* Issues : None */
502*495ae853SAndroid Build Coastguard Worker /* */
503*495ae853SAndroid Build Coastguard Worker /* Revision History: */
504*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes */
505*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
506*495ae853SAndroid Build Coastguard Worker /* */
507*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
508*495ae853SAndroid Build Coastguard Worker
isvcd_reset_emulation_ctxt(void * pv_emulation_ctxt)509*495ae853SAndroid Build Coastguard Worker void isvcd_reset_emulation_ctxt(void *pv_emulation_ctxt)
510*495ae853SAndroid Build Coastguard Worker {
511*495ae853SAndroid Build Coastguard Worker emulation_prevent_ctxt_t *ps_emulation_ctxt = (emulation_prevent_ctxt_t *) pv_emulation_ctxt;
512*495ae853SAndroid Build Coastguard Worker
513*495ae853SAndroid Build Coastguard Worker /*! Reset the emulation prevention context */
514*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_state = NOT_STUFFED_BYTE;
515*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_zeroes_cnt = 0;
516*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->u4_bytes_in_word = 0;
517*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->u4_word = 0;
518*495ae853SAndroid Build Coastguard Worker }
519*495ae853SAndroid Build Coastguard Worker
520*495ae853SAndroid Build Coastguard Worker /****************************************************************************/
521*495ae853SAndroid Build Coastguard Worker /* */
522*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_nal_byte_swap_emulation */
523*495ae853SAndroid Build Coastguard Worker /* */
524*495ae853SAndroid Build Coastguard Worker /* Description : This function is does byte swap or emulation or both */
525*495ae853SAndroid Build Coastguard Worker /* in the stream. */
526*495ae853SAndroid Build Coastguard Worker /* */
527*495ae853SAndroid Build Coastguard Worker /* Inputs : pu4_out_stream : Pointer to bitstream out buffer */
528*495ae853SAndroid Build Coastguard Worker /* pu4_out_len : Pointer to variable for out len */
529*495ae853SAndroid Build Coastguard Worker /* pu1_in_stream : Pointer to bitstream in buffer */
530*495ae853SAndroid Build Coastguard Worker /* u4_in_len : Input bitstream buffer length */
531*495ae853SAndroid Build Coastguard Worker /* u4_prev_0s : In case of fragemented NAL 0s in last */
532*495ae853SAndroid Build Coastguard Worker /* fragmented unit */
533*495ae853SAndroid Build Coastguard Worker /* u4_0s_bfr_sc : Number of zeros before start code */
534*495ae853SAndroid Build Coastguard Worker /* u4_bytes : Number of bytes in last fragmented */
535*495ae853SAndroid Build Coastguard Worker /* word */
536*495ae853SAndroid Build Coastguard Worker /* u4_word : Last fragmented word */
537*495ae853SAndroid Build Coastguard Worker /* */
538*495ae853SAndroid Build Coastguard Worker /* Globals : None */
539*495ae853SAndroid Build Coastguard Worker /* */
540*495ae853SAndroid Build Coastguard Worker /* Processing : It has three mode of operations */
541*495ae853SAndroid Build Coastguard Worker /* 1. Byte Swap and Emulation for H.264 WMV9 AP DEC */
542*495ae853SAndroid Build Coastguard Worker /* supports both fragmented and non fragmented packets */
543*495ae853SAndroid Build Coastguard Worker /* set u4_prev_0s = last valid zeros for this operation*/
544*495ae853SAndroid Build Coastguard Worker /* 2. Byte Swap only for MPEG2 and MPEG4 WMV9 MP DEC */
545*495ae853SAndroid Build Coastguard Worker /* supports both fragmented and non fragmented packets */
546*495ae853SAndroid Build Coastguard Worker /* set u4_prev_0s = 0 and u4_0s_bfr_sc = u4_in_len */
547*495ae853SAndroid Build Coastguard Worker /* 3. Annex B stream */
548*495ae853SAndroid Build Coastguard Worker /* only non fragmented */
549*495ae853SAndroid Build Coastguard Worker /* set u4_prev_0s = 0 for this operation */
550*495ae853SAndroid Build Coastguard Worker /* Outputs : pu4_out_len output length of the bit stream */
551*495ae853SAndroid Build Coastguard Worker /* */
552*495ae853SAndroid Build Coastguard Worker /* Returns : Number of zeros in case of framented start code */
553*495ae853SAndroid Build Coastguard Worker /* */
554*495ae853SAndroid Build Coastguard Worker /* Known Issues : */
555*495ae853SAndroid Build Coastguard Worker /* */
556*495ae853SAndroid Build Coastguard Worker /* Revision History */
557*495ae853SAndroid Build Coastguard Worker /* */
558*495ae853SAndroid Build Coastguard Worker /* DD MM YY Author Changes */
559*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay */
560*495ae853SAndroid Build Coastguard Worker /****************************************************************************/
isvcd_nal_byte_swap_emulation(UWORD32 * pu4_out_stream,UWORD32 * pu4_out_len,UWORD8 * pu1_in_stream,UWORD32 u4_in_len,WORD32 i4_0s_bfr_sc,void * pv_emulation_ctxt)561*495ae853SAndroid Build Coastguard Worker UWORD32 isvcd_nal_byte_swap_emulation(UWORD32 *pu4_out_stream, UWORD32 *pu4_out_len,
562*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_in_stream, UWORD32 u4_in_len, WORD32 i4_0s_bfr_sc,
563*495ae853SAndroid Build Coastguard Worker void *pv_emulation_ctxt)
564*495ae853SAndroid Build Coastguard Worker {
565*495ae853SAndroid Build Coastguard Worker UWORD32 u4_i, u4_num_bytes, u4_offset;
566*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cur_byte;
567*495ae853SAndroid Build Coastguard Worker emulation_prevent_ctxt_t *ps_emulation_ctxt = (emulation_prevent_ctxt_t *) pv_emulation_ctxt;
568*495ae853SAndroid Build Coastguard Worker
569*495ae853SAndroid Build Coastguard Worker u4_offset = ps_emulation_ctxt->u4_bytes_in_word;
570*495ae853SAndroid Build Coastguard Worker u4_num_bytes = ps_emulation_ctxt->u4_bytes_in_word;
571*495ae853SAndroid Build Coastguard Worker
572*495ae853SAndroid Build Coastguard Worker for(u4_i = 0; u4_i < u4_in_len; u4_i++)
573*495ae853SAndroid Build Coastguard Worker {
574*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cur_byte_emu, u1_cur_byte_sc;
575*495ae853SAndroid Build Coastguard Worker UWORD64 u8_sft_word;
576*495ae853SAndroid Build Coastguard Worker
577*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_in_stream++;
578*495ae853SAndroid Build Coastguard Worker u1_cur_byte_emu = (EMULATION_PREVENTION_BYTE == u1_cur_byte);
579*495ae853SAndroid Build Coastguard Worker u1_cur_byte_sc = (START_CODE_BYTE == u1_cur_byte);
580*495ae853SAndroid Build Coastguard Worker
581*495ae853SAndroid Build Coastguard Worker if((ps_emulation_ctxt->i4_zeroes_cnt >= i4_0s_bfr_sc) & (u1_cur_byte_emu | u1_cur_byte_sc) &
582*495ae853SAndroid Build Coastguard Worker (NOT_STUFFED_BYTE == ps_emulation_ctxt->i4_state))
583*495ae853SAndroid Build Coastguard Worker {
584*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte_sc)
585*495ae853SAndroid Build Coastguard Worker {
586*495ae853SAndroid Build Coastguard Worker break;
587*495ae853SAndroid Build Coastguard Worker }
588*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_zeroes_cnt = 0;
589*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_state = STUFFED_BYTE;
590*495ae853SAndroid Build Coastguard Worker continue;
591*495ae853SAndroid Build Coastguard Worker }
592*495ae853SAndroid Build Coastguard Worker
593*495ae853SAndroid Build Coastguard Worker u8_sft_word = (UWORD64) ps_emulation_ctxt->u4_word << 8;
594*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->u4_word = (UWORD32) (u8_sft_word | u1_cur_byte);
595*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->u4_bytes_in_word++;
596*495ae853SAndroid Build Coastguard Worker u4_num_bytes++;
597*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_zeroes_cnt++;
598*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00)
599*495ae853SAndroid Build Coastguard Worker {
600*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_zeroes_cnt = 0;
601*495ae853SAndroid Build Coastguard Worker }
602*495ae853SAndroid Build Coastguard Worker
603*495ae853SAndroid Build Coastguard Worker if((u4_num_bytes & 0x03) == 0x00)
604*495ae853SAndroid Build Coastguard Worker {
605*495ae853SAndroid Build Coastguard Worker *pu4_out_stream = ps_emulation_ctxt->u4_word;
606*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->u4_bytes_in_word = 0;
607*495ae853SAndroid Build Coastguard Worker pu4_out_stream++;
608*495ae853SAndroid Build Coastguard Worker }
609*495ae853SAndroid Build Coastguard Worker
610*495ae853SAndroid Build Coastguard Worker ps_emulation_ctxt->i4_state = NOT_STUFFED_BYTE;
611*495ae853SAndroid Build Coastguard Worker }
612*495ae853SAndroid Build Coastguard Worker
613*495ae853SAndroid Build Coastguard Worker if(ps_emulation_ctxt->u4_bytes_in_word)
614*495ae853SAndroid Build Coastguard Worker {
615*495ae853SAndroid Build Coastguard Worker UWORD64 temp_out_stream = (UWORD64) ps_emulation_ctxt->u4_word
616*495ae853SAndroid Build Coastguard Worker << ((4 - ps_emulation_ctxt->u4_bytes_in_word) << 3);
617*495ae853SAndroid Build Coastguard Worker *pu4_out_stream = (UWORD32) temp_out_stream;
618*495ae853SAndroid Build Coastguard Worker }
619*495ae853SAndroid Build Coastguard Worker
620*495ae853SAndroid Build Coastguard Worker *pu4_out_len = (u4_num_bytes - u4_offset);
621*495ae853SAndroid Build Coastguard Worker return ((u4_num_bytes & 0xFFFFFFFC));
622*495ae853SAndroid Build Coastguard Worker }
623*495ae853SAndroid Build Coastguard Worker
624*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
625*495ae853SAndroid Build Coastguard Worker /* */
626*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_set_default_nal_header_prms */
627*495ae853SAndroid Build Coastguard Worker /* */
628*495ae853SAndroid Build Coastguard Worker /* Description : Sets the members of NAL header structures to default */
629*495ae853SAndroid Build Coastguard Worker /* values */
630*495ae853SAndroid Build Coastguard Worker /* */
631*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_nal_prms - pointer nal header prms structure */
632*495ae853SAndroid Build Coastguard Worker /* i4_temp_id - default value of temporal id */
633*495ae853SAndroid Build Coastguard Worker /* */
634*495ae853SAndroid Build Coastguard Worker /* Globals : None */
635*495ae853SAndroid Build Coastguard Worker /* */
636*495ae853SAndroid Build Coastguard Worker /* Processing : None */
637*495ae853SAndroid Build Coastguard Worker /* */
638*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
639*495ae853SAndroid Build Coastguard Worker /* */
640*495ae853SAndroid Build Coastguard Worker /* Returns : None */
641*495ae853SAndroid Build Coastguard Worker /* */
642*495ae853SAndroid Build Coastguard Worker /* Issues : None */
643*495ae853SAndroid Build Coastguard Worker /* */
644*495ae853SAndroid Build Coastguard Worker /* Revision History: */
645*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes */
646*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
647*495ae853SAndroid Build Coastguard Worker /* */
648*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_default_nal_prms(void * pv_nal_prms)649*495ae853SAndroid Build Coastguard Worker void isvcd_set_default_nal_prms(void *pv_nal_prms)
650*495ae853SAndroid Build Coastguard Worker {
651*495ae853SAndroid Build Coastguard Worker nal_prms_t *ps_nal_prms;
652*495ae853SAndroid Build Coastguard Worker ps_nal_prms = (nal_prms_t *) pv_nal_prms;
653*495ae853SAndroid Build Coastguard Worker
654*495ae853SAndroid Build Coastguard Worker /* Set default values */
655*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_dependency_id = 0;
656*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_derived_nal_type = 0xFF;
657*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_flag = SVCD_FALSE;
658*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_nal_header_len = 0;
659*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_nal_ref_idc = 0xFF;
660*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_nal_unit_type = 0xFF;
661*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_no_int_lyr_pred = 1;
662*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_priority_id = 0;
663*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_quality_id = 0;
664*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_discard_flag = 0;
665*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_dqid = 0;
666*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_use_ref_base_pic_flag = 0;
667*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_temporal_id = 0;
668*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_num = 0;
669*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u2_frm_num = 0;
670*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_poc_lsb = 0;
671*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_delta_poc_bot = 0;
672*495ae853SAndroid Build Coastguard Worker ps_nal_prms->ai4_delta_poc[0] = 0;
673*495ae853SAndroid Build Coastguard Worker ps_nal_prms->ai4_delta_poc[1] = 0;
674*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u1_pps_id = 0;
675*495ae853SAndroid Build Coastguard Worker }
676*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
677*495ae853SAndroid Build Coastguard Worker /* */
678*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_dec_nal_hdr */
679*495ae853SAndroid Build Coastguard Worker /* */
680*495ae853SAndroid Build Coastguard Worker /* Description : None */
681*495ae853SAndroid Build Coastguard Worker /* */
682*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_buf_ptr - Pointer to buffer constaining start of NAL */
683*495ae853SAndroid Build Coastguard Worker /* pv_nal_header_buf - Temporray working buffer */
684*495ae853SAndroid Build Coastguard Worker /* pv_nal_prms - Pointer to nal header prms */
685*495ae853SAndroid Build Coastguard Worker /* structure */
686*495ae853SAndroid Build Coastguard Worker /* */
687*495ae853SAndroid Build Coastguard Worker /* Globals : None */
688*495ae853SAndroid Build Coastguard Worker /* */
689*495ae853SAndroid Build Coastguard Worker /* Processing : None */
690*495ae853SAndroid Build Coastguard Worker /* */
691*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
692*495ae853SAndroid Build Coastguard Worker /* */
693*495ae853SAndroid Build Coastguard Worker /* Returns : None */
694*495ae853SAndroid Build Coastguard Worker /* */
695*495ae853SAndroid Build Coastguard Worker /* Issues : None */
696*495ae853SAndroid Build Coastguard Worker /* */
697*495ae853SAndroid Build Coastguard Worker /* Revision History: */
698*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes */
699*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
700*495ae853SAndroid Build Coastguard Worker /* */
701*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_dec_nal_hdr(void * pv_buf_ptr,WORD32 i4_buf_size,void * pv_nal_header_buf,void * pv_nal_prms,void * pv_prefix_nal_buf,void * pv_prefix_nal_prms,UWORD32 * pu4_err_code)702*495ae853SAndroid Build Coastguard Worker void isvcd_dec_nal_hdr(void *pv_buf_ptr, WORD32 i4_buf_size, void *pv_nal_header_buf,
703*495ae853SAndroid Build Coastguard Worker void *pv_nal_prms, void *pv_prefix_nal_buf, void *pv_prefix_nal_prms,
704*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_err_code)
705*495ae853SAndroid Build Coastguard Worker {
706*495ae853SAndroid Build Coastguard Worker nal_prms_t *ps_nal_prms;
707*495ae853SAndroid Build Coastguard Worker nal_prms_t *ps_prefix_nal_prms;
708*495ae853SAndroid Build Coastguard Worker nal_buf_t *ps_prefix_nal_buf;
709*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t s_stream_ctxt = {0};
710*495ae853SAndroid Build Coastguard Worker WORD32 i4_forbidden_zero_bit;
711*495ae853SAndroid Build Coastguard Worker
712*495ae853SAndroid Build Coastguard Worker /* byte swapping */
713*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf = (UWORD8 *) pv_nal_header_buf;
714*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src = (UWORD8 *) pv_buf_ptr;
715*495ae853SAndroid Build Coastguard Worker
716*495ae853SAndroid Build Coastguard Worker ps_nal_prms = (nal_prms_t *) pv_nal_prms;
717*495ae853SAndroid Build Coastguard Worker ps_prefix_nal_prms = (nal_prms_t *) pv_prefix_nal_prms;
718*495ae853SAndroid Build Coastguard Worker ps_prefix_nal_buf = (nal_buf_t *) pv_prefix_nal_buf;
719*495ae853SAndroid Build Coastguard Worker
720*495ae853SAndroid Build Coastguard Worker /* The NAL header syntax elements are read through bitstream fucntions. */
721*495ae853SAndroid Build Coastguard Worker /* Hence bitstream context structure initializaton is needed before */
722*495ae853SAndroid Build Coastguard Worker /* parsing from the bitstream */
723*495ae853SAndroid Build Coastguard Worker /* Also bitstream fucntions assume the buffer is byteswapped. Hence the */
724*495ae853SAndroid Build Coastguard Worker /* byte swapping is also done for 4 bytes */
725*495ae853SAndroid Build Coastguard Worker s_stream_ctxt.u4_ofst = 0;
726*495ae853SAndroid Build Coastguard Worker s_stream_ctxt.pu4_buffer = pv_nal_header_buf;
727*495ae853SAndroid Build Coastguard Worker s_stream_ctxt.u4_max_ofst = (i4_buf_size << 3);
728*495ae853SAndroid Build Coastguard Worker
729*495ae853SAndroid Build Coastguard Worker *pu4_err_code = 0;
730*495ae853SAndroid Build Coastguard Worker
731*495ae853SAndroid Build Coastguard Worker /* Check the size of bitstream buffer */
732*495ae853SAndroid Build Coastguard Worker if(s_stream_ctxt.u4_max_ofst < 8)
733*495ae853SAndroid Build Coastguard Worker {
734*495ae853SAndroid Build Coastguard Worker *pu4_err_code = (UWORD32) NAL_INSUFFICIENT_DATA;
735*495ae853SAndroid Build Coastguard Worker return;
736*495ae853SAndroid Build Coastguard Worker }
737*495ae853SAndroid Build Coastguard Worker
738*495ae853SAndroid Build Coastguard Worker if(s_stream_ctxt.u4_max_ofst >= 32)
739*495ae853SAndroid Build Coastguard Worker {
740*495ae853SAndroid Build Coastguard Worker *pu1_buf++ = *(pu1_src + 3);
741*495ae853SAndroid Build Coastguard Worker *pu1_buf++ = *(pu1_src + 2);
742*495ae853SAndroid Build Coastguard Worker *pu1_buf++ = *(pu1_src + 1);
743*495ae853SAndroid Build Coastguard Worker *pu1_buf++ = *pu1_src;
744*495ae853SAndroid Build Coastguard Worker }
745*495ae853SAndroid Build Coastguard Worker else
746*495ae853SAndroid Build Coastguard Worker {
747*495ae853SAndroid Build Coastguard Worker *pu1_buf++ = *pu1_src;
748*495ae853SAndroid Build Coastguard Worker }
749*495ae853SAndroid Build Coastguard Worker
750*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
751*495ae853SAndroid Build Coastguard Worker /*! Parse the NAL header and update the NAL header structure members */
752*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
753*495ae853SAndroid Build Coastguard Worker /* Read forbidden 0 bit */
754*495ae853SAndroid Build Coastguard Worker i4_forbidden_zero_bit = ih264d_get_bit_h264(&s_stream_ctxt);
755*495ae853SAndroid Build Coastguard Worker
756*495ae853SAndroid Build Coastguard Worker if(0 != i4_forbidden_zero_bit)
757*495ae853SAndroid Build Coastguard Worker {
758*495ae853SAndroid Build Coastguard Worker *pu4_err_code = (UWORD32) NAL_CORRUPT_DATA;
759*495ae853SAndroid Build Coastguard Worker return;
760*495ae853SAndroid Build Coastguard Worker }
761*495ae853SAndroid Build Coastguard Worker
762*495ae853SAndroid Build Coastguard Worker /*---------------- Read NAL ref idc -----------------------------*/
763*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_nal_ref_idc = ih264d_get_bits_h264(&s_stream_ctxt, 2);
764*495ae853SAndroid Build Coastguard Worker
765*495ae853SAndroid Build Coastguard Worker /*----------------- Read NAL type -------------------------------*/
766*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_nal_unit_type = ih264d_get_bits_h264(&s_stream_ctxt, 5);
767*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_nal_unit_type > CODED_SLICE_EXTENSION_NAL)
768*495ae853SAndroid Build Coastguard Worker {
769*495ae853SAndroid Build Coastguard Worker *pu4_err_code = (UWORD32) NAL_CORRUPT_DATA;
770*495ae853SAndroid Build Coastguard Worker return;
771*495ae853SAndroid Build Coastguard Worker }
772*495ae853SAndroid Build Coastguard Worker if(ACCESS_UNIT_DELIMITER_RBSP == ps_nal_prms->i4_nal_unit_type)
773*495ae853SAndroid Build Coastguard Worker {
774*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_derived_nal_type = NON_VCL_NAL;
775*495ae853SAndroid Build Coastguard Worker return;
776*495ae853SAndroid Build Coastguard Worker }
777*495ae853SAndroid Build Coastguard Worker
778*495ae853SAndroid Build Coastguard Worker /* set idr pic flag */
779*495ae853SAndroid Build Coastguard Worker if(IDR_SLICE_NAL == ps_nal_prms->i4_nal_unit_type)
780*495ae853SAndroid Build Coastguard Worker {
781*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_flag = SVCD_TRUE;
782*495ae853SAndroid Build Coastguard Worker }
783*495ae853SAndroid Build Coastguard Worker else
784*495ae853SAndroid Build Coastguard Worker {
785*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_flag = SVCD_FALSE;
786*495ae853SAndroid Build Coastguard Worker }
787*495ae853SAndroid Build Coastguard Worker
788*495ae853SAndroid Build Coastguard Worker /*----------------- Read SVC extension NAL header ---------------*/
789*495ae853SAndroid Build Coastguard Worker if(CODED_SLICE_EXTENSION_NAL == ps_nal_prms->i4_nal_unit_type ||
790*495ae853SAndroid Build Coastguard Worker PREFIX_UNIT_NAL == ps_nal_prms->i4_nal_unit_type)
791*495ae853SAndroid Build Coastguard Worker {
792*495ae853SAndroid Build Coastguard Worker WORD32 i4_svc_extension_flag, i4_idr_flag;
793*495ae853SAndroid Build Coastguard Worker
794*495ae853SAndroid Build Coastguard Worker /* check the size of the buffer */
795*495ae853SAndroid Build Coastguard Worker if(s_stream_ctxt.u4_max_ofst < 32)
796*495ae853SAndroid Build Coastguard Worker {
797*495ae853SAndroid Build Coastguard Worker *pu4_err_code = (UWORD32) NAL_INSUFFICIENT_DATA;
798*495ae853SAndroid Build Coastguard Worker return;
799*495ae853SAndroid Build Coastguard Worker }
800*495ae853SAndroid Build Coastguard Worker
801*495ae853SAndroid Build Coastguard Worker i4_svc_extension_flag = ih264d_get_bit_h264(&s_stream_ctxt);
802*495ae853SAndroid Build Coastguard Worker UNUSED(i4_svc_extension_flag);
803*495ae853SAndroid Build Coastguard Worker
804*495ae853SAndroid Build Coastguard Worker i4_idr_flag = ih264d_get_bit_h264(&s_stream_ctxt);
805*495ae853SAndroid Build Coastguard Worker
806*495ae853SAndroid Build Coastguard Worker /* Set idr pic flag based on idr flag */
807*495ae853SAndroid Build Coastguard Worker if(1 == i4_idr_flag)
808*495ae853SAndroid Build Coastguard Worker {
809*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_flag = SVCD_TRUE;
810*495ae853SAndroid Build Coastguard Worker }
811*495ae853SAndroid Build Coastguard Worker else
812*495ae853SAndroid Build Coastguard Worker {
813*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_flag = SVCD_FALSE;
814*495ae853SAndroid Build Coastguard Worker }
815*495ae853SAndroid Build Coastguard Worker
816*495ae853SAndroid Build Coastguard Worker /* parse priorit id */
817*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_priority_id = ih264d_get_bits_h264(&s_stream_ctxt, 6);
818*495ae853SAndroid Build Coastguard Worker
819*495ae853SAndroid Build Coastguard Worker /* parse the no inter layer prediction flag */
820*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_no_int_lyr_pred = ih264d_get_bit_h264(&s_stream_ctxt);
821*495ae853SAndroid Build Coastguard Worker
822*495ae853SAndroid Build Coastguard Worker /* parse dependency id */
823*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_dependency_id = ih264d_get_bits_h264(&s_stream_ctxt, 3);
824*495ae853SAndroid Build Coastguard Worker
825*495ae853SAndroid Build Coastguard Worker /* parse quality id */
826*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_quality_id = ih264d_get_bits_h264(&s_stream_ctxt, 4);
827*495ae853SAndroid Build Coastguard Worker
828*495ae853SAndroid Build Coastguard Worker if((ps_nal_prms->i4_quality_id > 0) || (ps_nal_prms->i4_dependency_id > 2))
829*495ae853SAndroid Build Coastguard Worker {
830*495ae853SAndroid Build Coastguard Worker *pu4_err_code = (UWORD32) NAL_CORRUPT_DATA;
831*495ae853SAndroid Build Coastguard Worker return;
832*495ae853SAndroid Build Coastguard Worker }
833*495ae853SAndroid Build Coastguard Worker /* parse temporal id */
834*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_temporal_id = ih264d_get_bits_h264(&s_stream_ctxt, 3);
835*495ae853SAndroid Build Coastguard Worker
836*495ae853SAndroid Build Coastguard Worker /* parse use ref base pic flag */
837*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_use_ref_base_pic_flag = ih264d_get_bit_h264(&s_stream_ctxt);
838*495ae853SAndroid Build Coastguard Worker
839*495ae853SAndroid Build Coastguard Worker if(0 != ps_nal_prms->i4_use_ref_base_pic_flag)
840*495ae853SAndroid Build Coastguard Worker {
841*495ae853SAndroid Build Coastguard Worker *pu4_err_code = (UWORD32) NAL_CORRUPT_DATA;
842*495ae853SAndroid Build Coastguard Worker return;
843*495ae853SAndroid Build Coastguard Worker }
844*495ae853SAndroid Build Coastguard Worker /* parse discrad flag */
845*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_discard_flag = ih264d_get_bit_h264(&s_stream_ctxt);
846*495ae853SAndroid Build Coastguard Worker
847*495ae853SAndroid Build Coastguard Worker /* parse the reserved bits */
848*495ae853SAndroid Build Coastguard Worker ih264d_get_bits_h264(&s_stream_ctxt, 3);
849*495ae853SAndroid Build Coastguard Worker }
850*495ae853SAndroid Build Coastguard Worker
851*495ae853SAndroid Build Coastguard Worker /* update NAL hedaer length in bytes */
852*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_nal_header_len = s_stream_ctxt.u4_ofst >> 3;
853*495ae853SAndroid Build Coastguard Worker
854*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
855*495ae853SAndroid Build Coastguard Worker /* PREFIX NAL UNIT ASSOCIATION WITH ASSOCIATED NAL UNIT */
856*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
857*495ae853SAndroid Build Coastguard Worker
858*495ae853SAndroid Build Coastguard Worker /* if current NAL is not a AVC NAL unit then */
859*495ae853SAndroid Build Coastguard Worker /* discard the prefix NAL unit if present */
860*495ae853SAndroid Build Coastguard Worker if(CODED_SLICE_EXTENSION_NAL == ps_nal_prms->i4_nal_unit_type)
861*495ae853SAndroid Build Coastguard Worker {
862*495ae853SAndroid Build Coastguard Worker isvcd_nal_buf_reset(ps_prefix_nal_buf);
863*495ae853SAndroid Build Coastguard Worker }
864*495ae853SAndroid Build Coastguard Worker
865*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_prefix_nal_buf->i4_valid_flag)
866*495ae853SAndroid Build Coastguard Worker {
867*495ae853SAndroid Build Coastguard Worker /* Copy the required parameters from the prefix NAL unit */
868*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_dependency_id = ps_prefix_nal_prms->i4_dependency_id;
869*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_quality_id = ps_prefix_nal_prms->i4_quality_id;
870*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_priority_id = ps_prefix_nal_prms->i4_priority_id;
871*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_temporal_id = ps_prefix_nal_prms->i4_temporal_id;
872*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_no_int_lyr_pred = ps_prefix_nal_prms->i4_no_int_lyr_pred;
873*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_use_ref_base_pic_flag = ps_prefix_nal_prms->i4_use_ref_base_pic_flag;
874*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_discard_flag = ps_prefix_nal_prms->i4_discard_flag;
875*495ae853SAndroid Build Coastguard Worker }
876*495ae853SAndroid Build Coastguard Worker
877*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
878*495ae853SAndroid Build Coastguard Worker /* Set the derived NAL unit type and also update the DQID for VCL NAL */
879*495ae853SAndroid Build Coastguard Worker /* units */
880*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------*/
881*495ae853SAndroid Build Coastguard Worker if(CODED_SLICE_EXTENSION_NAL == ps_nal_prms->i4_nal_unit_type ||
882*495ae853SAndroid Build Coastguard Worker SLICE_NAL == ps_nal_prms->i4_nal_unit_type ||
883*495ae853SAndroid Build Coastguard Worker IDR_SLICE_NAL == ps_nal_prms->i4_nal_unit_type ||
884*495ae853SAndroid Build Coastguard Worker PREFIX_UNIT_NAL == ps_nal_prms->i4_nal_unit_type)
885*495ae853SAndroid Build Coastguard Worker {
886*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_derived_nal_type = VCL_NAL;
887*495ae853SAndroid Build Coastguard Worker
888*495ae853SAndroid Build Coastguard Worker /* calculate the DQID and modified DQID */
889*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_dqid = (ps_nal_prms->i4_dependency_id << 4) + ps_nal_prms->i4_quality_id;
890*495ae853SAndroid Build Coastguard Worker }
891*495ae853SAndroid Build Coastguard Worker else
892*495ae853SAndroid Build Coastguard Worker {
893*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_derived_nal_type = NON_VCL_NAL;
894*495ae853SAndroid Build Coastguard Worker }
895*495ae853SAndroid Build Coastguard Worker }
896*495ae853SAndroid Build Coastguard Worker
897*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
898*495ae853SAndroid Build Coastguard Worker /* */
899*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_parse_part_slice_hdr */
900*495ae853SAndroid Build Coastguard Worker /* */
901*495ae853SAndroid Build Coastguard Worker /* Description : This routine parses the slice till POC parameters */
902*495ae853SAndroid Build Coastguard Worker /* */
903*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Pointer to input bitstream */
904*495ae853SAndroid Build Coastguard Worker /* 2. Temporary input buffer */
905*495ae853SAndroid Build Coastguard Worker /* 3. PPS start buffer */
906*495ae853SAndroid Build Coastguard Worker /* 4. SPS start buffer */
907*495ae853SAndroid Build Coastguard Worker /* 5. Pointer to NAL paramter structure */
908*495ae853SAndroid Build Coastguard Worker /* 6. Place holder for error code */
909*495ae853SAndroid Build Coastguard Worker /* Globals : None */
910*495ae853SAndroid Build Coastguard Worker /* Processing : Parses the slice header */
911*495ae853SAndroid Build Coastguard Worker /* */
912*495ae853SAndroid Build Coastguard Worker /* Outputs : Updated NAL prms structure */
913*495ae853SAndroid Build Coastguard Worker /* Updated error code */
914*495ae853SAndroid Build Coastguard Worker /* Returns : status */
915*495ae853SAndroid Build Coastguard Worker /* */
916*495ae853SAndroid Build Coastguard Worker /* Issues : Does not support interlaced content */
917*495ae853SAndroid Build Coastguard Worker /* */
918*495ae853SAndroid Build Coastguard Worker /* Revision History: */
919*495ae853SAndroid Build Coastguard Worker /* */
920*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
921*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
922*495ae853SAndroid Build Coastguard Worker /* */
923*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_parse_part_slice_hdr(UWORD8 * pu1_input_buf,WORD32 i4_input_buf_size,UWORD8 * pu1_temp_buf,void * pv_sps,void * pv_pps,nal_prms_t * ps_nal_prms,UWORD32 * pu4_err_code,WORD32 * pi4_sps_pps_status)924*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_parse_part_slice_hdr(UWORD8 *pu1_input_buf, WORD32 i4_input_buf_size,
925*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_temp_buf, void *pv_sps, void *pv_pps,
926*495ae853SAndroid Build Coastguard Worker nal_prms_t *ps_nal_prms, UWORD32 *pu4_err_code,
927*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_sps_pps_status)
928*495ae853SAndroid Build Coastguard Worker {
929*495ae853SAndroid Build Coastguard Worker UWORD32 u4_slice_type;
930*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps = (dec_seq_params_t *) pv_sps;
931*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pps = (dec_pic_params_t *) pv_pps;
932*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t s_stream_ctxt = {0};
933*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_stream_ctxt;
934*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf;
935*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_ofst;
936*495ae853SAndroid Build Coastguard Worker
937*495ae853SAndroid Build Coastguard Worker *pi4_sps_pps_status = NAL_CORRUPT_DATA;
938*495ae853SAndroid Build Coastguard Worker /* Perform the emulation prevention and byte swap */
939*495ae853SAndroid Build Coastguard Worker {
940*495ae853SAndroid Build Coastguard Worker emulation_prevent_ctxt_t s_emulation_ctxt = {0};
941*495ae853SAndroid Build Coastguard Worker WORD32 i4_size, i4_temp;
942*495ae853SAndroid Build Coastguard Worker
943*495ae853SAndroid Build Coastguard Worker isvcd_reset_emulation_ctxt((void *) &s_emulation_ctxt);
944*495ae853SAndroid Build Coastguard Worker i4_size = MIN(i4_input_buf_size, HEADER_BUFFER_LEN_BEFORE_EP);
945*495ae853SAndroid Build Coastguard Worker
946*495ae853SAndroid Build Coastguard Worker isvcd_nal_byte_swap_emulation((UWORD32 *) pu1_temp_buf, (UWORD32 *) &i4_temp, pu1_input_buf,
947*495ae853SAndroid Build Coastguard Worker (UWORD32) i4_size, NUM_OF_ZERO_BYTES_BEFORE_START_CODE,
948*495ae853SAndroid Build Coastguard Worker &s_emulation_ctxt);
949*495ae853SAndroid Build Coastguard Worker
950*495ae853SAndroid Build Coastguard Worker /* Initialize the stream context structure */
951*495ae853SAndroid Build Coastguard Worker s_stream_ctxt.pu4_buffer = (UWORD32 *) pu1_temp_buf;
952*495ae853SAndroid Build Coastguard Worker s_stream_ctxt.u4_ofst = 0;
953*495ae853SAndroid Build Coastguard Worker s_stream_ctxt.u4_max_ofst = (i4_size << 3);
954*495ae853SAndroid Build Coastguard Worker }
955*495ae853SAndroid Build Coastguard Worker
956*495ae853SAndroid Build Coastguard Worker ps_stream_ctxt = &s_stream_ctxt;
957*495ae853SAndroid Build Coastguard Worker
958*495ae853SAndroid Build Coastguard Worker /* Parse the first mb address in slice */
959*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf = ps_stream_ctxt->pu4_buffer;
960*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_ofst = &ps_stream_ctxt->u4_ofst;
961*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u4_first_mb_addr = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
962*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->u4_first_mb_addr >= (MAX_MBS_LEVEL_51))
963*495ae853SAndroid Build Coastguard Worker {
964*495ae853SAndroid Build Coastguard Worker return ERROR_CORRUPTED_SLICE;
965*495ae853SAndroid Build Coastguard Worker }
966*495ae853SAndroid Build Coastguard Worker /* Parse slice type */
967*495ae853SAndroid Build Coastguard Worker u4_slice_type = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
968*495ae853SAndroid Build Coastguard Worker
969*495ae853SAndroid Build Coastguard Worker if(u4_slice_type > 9) return ERROR_INV_SLC_TYPE_T;
970*495ae853SAndroid Build Coastguard Worker
971*495ae853SAndroid Build Coastguard Worker /* Check the validity of slice prms */
972*495ae853SAndroid Build Coastguard Worker switch(u4_slice_type)
973*495ae853SAndroid Build Coastguard Worker {
974*495ae853SAndroid Build Coastguard Worker case 0:
975*495ae853SAndroid Build Coastguard Worker case 5:
976*495ae853SAndroid Build Coastguard Worker u4_slice_type = P_SLICE;
977*495ae853SAndroid Build Coastguard Worker /* P slice */
978*495ae853SAndroid Build Coastguard Worker break;
979*495ae853SAndroid Build Coastguard Worker case 1:
980*495ae853SAndroid Build Coastguard Worker case 6:
981*495ae853SAndroid Build Coastguard Worker u4_slice_type = B_SLICE;
982*495ae853SAndroid Build Coastguard Worker /* B slice */
983*495ae853SAndroid Build Coastguard Worker break;
984*495ae853SAndroid Build Coastguard Worker case 2:
985*495ae853SAndroid Build Coastguard Worker case 7:
986*495ae853SAndroid Build Coastguard Worker /* I slice */
987*495ae853SAndroid Build Coastguard Worker u4_slice_type = I_SLICE;
988*495ae853SAndroid Build Coastguard Worker break;
989*495ae853SAndroid Build Coastguard Worker default:
990*495ae853SAndroid Build Coastguard Worker break;
991*495ae853SAndroid Build Coastguard Worker }
992*495ae853SAndroid Build Coastguard Worker
993*495ae853SAndroid Build Coastguard Worker /* Parse the pps id */
994*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u1_pps_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
995*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->u1_pps_id & MASK_ERR_PIC_SET_ID) return ERROR_INV_SLICE_HDR_T;
996*495ae853SAndroid Build Coastguard Worker
997*495ae853SAndroid Build Coastguard Worker /* validate pps id */
998*495ae853SAndroid Build Coastguard Worker ps_pps += ps_nal_prms->u1_pps_id;
999*495ae853SAndroid Build Coastguard Worker if(0 == ps_pps->u1_is_valid)
1000*495ae853SAndroid Build Coastguard Worker {
1001*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1002*495ae853SAndroid Build Coastguard Worker }
1003*495ae853SAndroid Build Coastguard Worker /* Derive sps id */
1004*495ae853SAndroid Build Coastguard Worker ps_sps = ps_pps->ps_sps;
1005*495ae853SAndroid Build Coastguard Worker
1006*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u1_sps_id = ps_sps->u1_seq_parameter_set_id;
1007*495ae853SAndroid Build Coastguard Worker if(CODED_SLICE_EXTENSION_NAL == ps_nal_prms->i4_nal_unit_type)
1008*495ae853SAndroid Build Coastguard Worker {
1009*495ae853SAndroid Build Coastguard Worker ps_sps += MAX_NUM_SEQ_PARAMS;
1010*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u1_sps_id = ps_sps->u1_seq_parameter_set_id;
1011*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u1_sps_id += MAX_NUM_SEQ_PARAMS;
1012*495ae853SAndroid Build Coastguard Worker }
1013*495ae853SAndroid Build Coastguard Worker
1014*495ae853SAndroid Build Coastguard Worker if(NULL == ps_sps)
1015*495ae853SAndroid Build Coastguard Worker {
1016*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1017*495ae853SAndroid Build Coastguard Worker }
1018*495ae853SAndroid Build Coastguard Worker if(FALSE == ps_sps->u1_is_valid)
1019*495ae853SAndroid Build Coastguard Worker {
1020*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SLICE_HDR_T;
1021*495ae853SAndroid Build Coastguard Worker }
1022*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->u4_first_mb_addr > (ps_sps->u2_frm_ht_in_mbs * ps_sps->u2_frm_wd_in_mbs))
1023*495ae853SAndroid Build Coastguard Worker {
1024*495ae853SAndroid Build Coastguard Worker return ERROR_CORRUPTED_SLICE;
1025*495ae853SAndroid Build Coastguard Worker }
1026*495ae853SAndroid Build Coastguard Worker *pi4_sps_pps_status = 0;
1027*495ae853SAndroid Build Coastguard Worker
1028*495ae853SAndroid Build Coastguard Worker /* Parse frame number */
1029*495ae853SAndroid Build Coastguard Worker ps_nal_prms->u2_frm_num = ih264d_get_bits_h264(ps_stream_ctxt, ps_sps->u1_bits_in_frm_num);
1030*495ae853SAndroid Build Coastguard Worker
1031*495ae853SAndroid Build Coastguard Worker /* IDR picture number */
1032*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_nal_prms->i4_idr_pic_flag)
1033*495ae853SAndroid Build Coastguard Worker {
1034*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_idr_pic_num = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1035*495ae853SAndroid Build Coastguard Worker
1036*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_idr_pic_num > 65535) return ERROR_INV_SLICE_HDR_T;
1037*495ae853SAndroid Build Coastguard Worker }
1038*495ae853SAndroid Build Coastguard Worker
1039*495ae853SAndroid Build Coastguard Worker /* Poc lsb */
1040*495ae853SAndroid Build Coastguard Worker if(0 == ps_sps->u1_pic_order_cnt_type)
1041*495ae853SAndroid Build Coastguard Worker {
1042*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_poc_lsb =
1043*495ae853SAndroid Build Coastguard Worker ih264d_get_bits_h264(ps_stream_ctxt, ps_sps->u1_log2_max_pic_order_cnt_lsb_minus);
1044*495ae853SAndroid Build Coastguard Worker
1045*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_poc_lsb < 0 ||
1046*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_poc_lsb >= ps_sps->i4_max_pic_order_cntLsb)
1047*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SLICE_HDR_T;
1048*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_pps->u1_pic_order_present_flag)
1049*495ae853SAndroid Build Coastguard Worker {
1050*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_delta_poc_bot = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1051*495ae853SAndroid Build Coastguard Worker }
1052*495ae853SAndroid Build Coastguard Worker }
1053*495ae853SAndroid Build Coastguard Worker else if((1 == ps_sps->u1_pic_order_cnt_type) && (!ps_sps->u1_delta_pic_order_always_zero_flag))
1054*495ae853SAndroid Build Coastguard Worker {
1055*495ae853SAndroid Build Coastguard Worker ps_nal_prms->ai4_delta_poc[0] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1056*495ae853SAndroid Build Coastguard Worker
1057*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_pps->u1_pic_order_present_flag)
1058*495ae853SAndroid Build Coastguard Worker {
1059*495ae853SAndroid Build Coastguard Worker ps_nal_prms->ai4_delta_poc[1] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1060*495ae853SAndroid Build Coastguard Worker }
1061*495ae853SAndroid Build Coastguard Worker }
1062*495ae853SAndroid Build Coastguard Worker
1063*495ae853SAndroid Build Coastguard Worker *pu4_err_code = 0;
1064*495ae853SAndroid Build Coastguard Worker return (OK);
1065*495ae853SAndroid Build Coastguard Worker }
1066*495ae853SAndroid Build Coastguard Worker
1067*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1068*495ae853SAndroid Build Coastguard Worker /* */
1069*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_get_int_tgt_lyr_attr */
1070*495ae853SAndroid Build Coastguard Worker /* */
1071*495ae853SAndroid Build Coastguard Worker /* Description : This routine returns the target layer attributes */
1072*495ae853SAndroid Build Coastguard Worker /* (dependency id, temporal id and quality id) */
1073*495ae853SAndroid Build Coastguard Worker /* */
1074*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Application attributes */
1075*495ae853SAndroid Build Coastguard Worker /* 2. Internal attributes (input and output) */
1076*495ae853SAndroid Build Coastguard Worker /* 3. Nal prms structure */
1077*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1078*495ae853SAndroid Build Coastguard Worker /* Processing : */
1079*495ae853SAndroid Build Coastguard Worker /* */
1080*495ae853SAndroid Build Coastguard Worker /* Outputs : Updated internal target layer attributes */
1081*495ae853SAndroid Build Coastguard Worker /* Returns : status */
1082*495ae853SAndroid Build Coastguard Worker /* */
1083*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1084*495ae853SAndroid Build Coastguard Worker /* */
1085*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1086*495ae853SAndroid Build Coastguard Worker /* */
1087*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1088*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
1089*495ae853SAndroid Build Coastguard Worker /* */
1090*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_int_tgt_lyr_attr(target_lyr_attr_t * ps_app_attr,target_lyr_attr_t * ps_int_attr,nal_prms_t * ps_nal_prms)1091*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_int_tgt_lyr_attr(target_lyr_attr_t *ps_app_attr, target_lyr_attr_t *ps_int_attr,
1092*495ae853SAndroid Build Coastguard Worker nal_prms_t *ps_nal_prms)
1093*495ae853SAndroid Build Coastguard Worker {
1094*495ae853SAndroid Build Coastguard Worker WORD32 i4_dep_id;
1095*495ae853SAndroid Build Coastguard Worker WORD32 i4_quality_id;
1096*495ae853SAndroid Build Coastguard Worker WORD32 i4_temp_id;
1097*495ae853SAndroid Build Coastguard Worker WORD32 i4_prior_id;
1098*495ae853SAndroid Build Coastguard Worker
1099*495ae853SAndroid Build Coastguard Worker /* sanity checks */
1100*495ae853SAndroid Build Coastguard Worker if((NULL == ps_app_attr) || (NULL == ps_int_attr) || (NULL == ps_nal_prms))
1101*495ae853SAndroid Build Coastguard Worker {
1102*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1103*495ae853SAndroid Build Coastguard Worker }
1104*495ae853SAndroid Build Coastguard Worker
1105*495ae853SAndroid Build Coastguard Worker i4_dep_id = ps_int_attr->i4_dependency_id;
1106*495ae853SAndroid Build Coastguard Worker i4_quality_id = ps_int_attr->i4_quality_id;
1107*495ae853SAndroid Build Coastguard Worker i4_temp_id = ps_int_attr->i4_temporal_id;
1108*495ae853SAndroid Build Coastguard Worker i4_prior_id = ps_int_attr->i4_priority_id;
1109*495ae853SAndroid Build Coastguard Worker
1110*495ae853SAndroid Build Coastguard Worker /* check for idr pic flag */
1111*495ae853SAndroid Build Coastguard Worker /* dependency & temporal id is updated only for IDR picture */
1112*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_nal_prms->i4_idr_pic_flag)
1113*495ae853SAndroid Build Coastguard Worker {
1114*495ae853SAndroid Build Coastguard Worker if(ps_int_attr->i4_dependency_id < ps_app_attr->i4_dependency_id)
1115*495ae853SAndroid Build Coastguard Worker {
1116*495ae853SAndroid Build Coastguard Worker /* update the internal attributes only if */
1117*495ae853SAndroid Build Coastguard Worker /* current dep_id -1 == highest dep id decoded so far */
1118*495ae853SAndroid Build Coastguard Worker /* and quality id is equal to 0 */
1119*495ae853SAndroid Build Coastguard Worker if((ps_nal_prms->i4_dependency_id - 1 == ps_int_attr->i4_dependency_id) &&
1120*495ae853SAndroid Build Coastguard Worker (0 == ps_nal_prms->i4_quality_id))
1121*495ae853SAndroid Build Coastguard Worker {
1122*495ae853SAndroid Build Coastguard Worker /* Set revised target dependency id */
1123*495ae853SAndroid Build Coastguard Worker i4_dep_id = ps_nal_prms->i4_dependency_id;
1124*495ae853SAndroid Build Coastguard Worker i4_temp_id = ps_app_attr->i4_temporal_id;
1125*495ae853SAndroid Build Coastguard Worker i4_prior_id = ps_app_attr->i4_priority_id;
1126*495ae853SAndroid Build Coastguard Worker }
1127*495ae853SAndroid Build Coastguard Worker }
1128*495ae853SAndroid Build Coastguard Worker else
1129*495ae853SAndroid Build Coastguard Worker {
1130*495ae853SAndroid Build Coastguard Worker /* cases when the curr dep is greater than or equal to app dep */
1131*495ae853SAndroid Build Coastguard Worker i4_dep_id = ps_app_attr->i4_dependency_id;
1132*495ae853SAndroid Build Coastguard Worker i4_temp_id = ps_app_attr->i4_temporal_id;
1133*495ae853SAndroid Build Coastguard Worker i4_prior_id = ps_app_attr->i4_priority_id;
1134*495ae853SAndroid Build Coastguard Worker }
1135*495ae853SAndroid Build Coastguard Worker }
1136*495ae853SAndroid Build Coastguard Worker
1137*495ae853SAndroid Build Coastguard Worker /* Set quality id */
1138*495ae853SAndroid Build Coastguard Worker if(i4_dep_id == ps_app_attr->i4_dependency_id)
1139*495ae853SAndroid Build Coastguard Worker {
1140*495ae853SAndroid Build Coastguard Worker i4_quality_id = ps_app_attr->i4_quality_id;
1141*495ae853SAndroid Build Coastguard Worker }
1142*495ae853SAndroid Build Coastguard Worker else
1143*495ae853SAndroid Build Coastguard Worker {
1144*495ae853SAndroid Build Coastguard Worker i4_quality_id = MAX_QUALITY_ID;
1145*495ae853SAndroid Build Coastguard Worker }
1146*495ae853SAndroid Build Coastguard Worker
1147*495ae853SAndroid Build Coastguard Worker /* Update the internal attributes */
1148*495ae853SAndroid Build Coastguard Worker ps_int_attr->i4_dependency_id = i4_dep_id;
1149*495ae853SAndroid Build Coastguard Worker ps_int_attr->i4_quality_id = i4_quality_id;
1150*495ae853SAndroid Build Coastguard Worker ps_int_attr->i4_temporal_id = i4_temp_id;
1151*495ae853SAndroid Build Coastguard Worker ps_int_attr->i4_priority_id = i4_prior_id;
1152*495ae853SAndroid Build Coastguard Worker
1153*495ae853SAndroid Build Coastguard Worker return (OK);
1154*495ae853SAndroid Build Coastguard Worker }
1155*495ae853SAndroid Build Coastguard Worker
1156*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1157*495ae853SAndroid Build Coastguard Worker /* */
1158*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_discard_nal */
1159*495ae853SAndroid Build Coastguard Worker /* */
1160*495ae853SAndroid Build Coastguard Worker /* Description : Determines whether current NAL unit has to be discarded */
1161*495ae853SAndroid Build Coastguard Worker /* or not */
1162*495ae853SAndroid Build Coastguard Worker /* */
1163*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_nal_prms - Pointer to NAL header prms */
1164*495ae853SAndroid Build Coastguard Worker /* structure */
1165*495ae853SAndroid Build Coastguard Worker /* pv_app_lyr_attr - Pointer to application target layer */
1166*495ae853SAndroid Build Coastguard Worker /* attributes structure */
1167*495ae853SAndroid Build Coastguard Worker /* pv_app_lyr_attr - Pointer to internal target layer */
1168*495ae853SAndroid Build Coastguard Worker /* attributes structure */
1169*495ae853SAndroid Build Coastguard Worker /* i4_update_flag - This flag indicates whether the internal*/
1170*495ae853SAndroid Build Coastguard Worker /* target attrbutes should be updated or not */
1171*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1172*495ae853SAndroid Build Coastguard Worker /* */
1173*495ae853SAndroid Build Coastguard Worker /* Processing : None */
1174*495ae853SAndroid Build Coastguard Worker /* */
1175*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
1176*495ae853SAndroid Build Coastguard Worker /* */
1177*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1178*495ae853SAndroid Build Coastguard Worker /* */
1179*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1180*495ae853SAndroid Build Coastguard Worker /* */
1181*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1182*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes */
1183*495ae853SAndroid Build Coastguard Worker /* 06 09 2021 Vijay Draft */
1184*495ae853SAndroid Build Coastguard Worker /* */
1185*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_discard_nal(void * pv_nal_prms,void * pv_app_attr,void * pv_int_attr,WORD32 i4_update_flag)1186*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_discard_nal(void *pv_nal_prms, void *pv_app_attr, void *pv_int_attr,
1187*495ae853SAndroid Build Coastguard Worker WORD32 i4_update_flag)
1188*495ae853SAndroid Build Coastguard Worker {
1189*495ae853SAndroid Build Coastguard Worker WORD32 i4_discard_nal_flag;
1190*495ae853SAndroid Build Coastguard Worker nal_prms_t *ps_nal_prms;
1191*495ae853SAndroid Build Coastguard Worker target_lyr_attr_t *ps_app_attr;
1192*495ae853SAndroid Build Coastguard Worker target_lyr_attr_t *ps_int_attr;
1193*495ae853SAndroid Build Coastguard Worker WORD32 i4_status;
1194*495ae853SAndroid Build Coastguard Worker
1195*495ae853SAndroid Build Coastguard Worker ps_nal_prms = (nal_prms_t *) pv_nal_prms;
1196*495ae853SAndroid Build Coastguard Worker ps_app_attr = (target_lyr_attr_t *) pv_app_attr;
1197*495ae853SAndroid Build Coastguard Worker ps_int_attr = (target_lyr_attr_t *) pv_int_attr;
1198*495ae853SAndroid Build Coastguard Worker
1199*495ae853SAndroid Build Coastguard Worker /* Get the updated target layer attributes */
1200*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == i4_update_flag)
1201*495ae853SAndroid Build Coastguard Worker {
1202*495ae853SAndroid Build Coastguard Worker i4_status = isvcd_get_int_tgt_lyr_attr(ps_app_attr, ps_int_attr, ps_nal_prms);
1203*495ae853SAndroid Build Coastguard Worker if(OK != i4_status)
1204*495ae853SAndroid Build Coastguard Worker {
1205*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1206*495ae853SAndroid Build Coastguard Worker }
1207*495ae853SAndroid Build Coastguard Worker }
1208*495ae853SAndroid Build Coastguard Worker
1209*495ae853SAndroid Build Coastguard Worker i4_discard_nal_flag = SVCD_FALSE;
1210*495ae853SAndroid Build Coastguard Worker
1211*495ae853SAndroid Build Coastguard Worker if(VCL_NAL == ps_nal_prms->i4_derived_nal_type)
1212*495ae853SAndroid Build Coastguard Worker {
1213*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
1214*495ae853SAndroid Build Coastguard Worker /*!Discard VCL NAL if any of following is true */
1215*495ae853SAndroid Build Coastguard Worker /*! - Dependency id is greater than target dependency id */
1216*495ae853SAndroid Build Coastguard Worker /*! - Dependency id is equal to target dependency id but quality id */
1217*495ae853SAndroid Build Coastguard Worker /*! is greater than target quality id */
1218*495ae853SAndroid Build Coastguard Worker /*! - priority id is greater than target priority id */
1219*495ae853SAndroid Build Coastguard Worker /*! - Temporal id is greater than target temporal id */
1220*495ae853SAndroid Build Coastguard Worker /*! - If dependency id is greater than a NAL unit for which discard */
1221*495ae853SAndroid Build Coastguard Worker /*! flag of the NAL header is set */
1222*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
1223*495ae853SAndroid Build Coastguard Worker if(PREFIX_UNIT_NAL != ps_nal_prms->i4_nal_unit_type)
1224*495ae853SAndroid Build Coastguard Worker {
1225*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_dependency_id > ps_int_attr->i4_dependency_id)
1226*495ae853SAndroid Build Coastguard Worker {
1227*495ae853SAndroid Build Coastguard Worker i4_discard_nal_flag = SVCD_TRUE;
1228*495ae853SAndroid Build Coastguard Worker }
1229*495ae853SAndroid Build Coastguard Worker
1230*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_dependency_id == ps_int_attr->i4_dependency_id &&
1231*495ae853SAndroid Build Coastguard Worker ps_nal_prms->i4_quality_id > ps_int_attr->i4_quality_id)
1232*495ae853SAndroid Build Coastguard Worker {
1233*495ae853SAndroid Build Coastguard Worker i4_discard_nal_flag = SVCD_TRUE;
1234*495ae853SAndroid Build Coastguard Worker }
1235*495ae853SAndroid Build Coastguard Worker
1236*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_temporal_id > ps_int_attr->i4_temporal_id)
1237*495ae853SAndroid Build Coastguard Worker {
1238*495ae853SAndroid Build Coastguard Worker i4_discard_nal_flag = SVCD_TRUE;
1239*495ae853SAndroid Build Coastguard Worker }
1240*495ae853SAndroid Build Coastguard Worker
1241*495ae853SAndroid Build Coastguard Worker if(ps_nal_prms->i4_priority_id > ps_int_attr->i4_priority_id)
1242*495ae853SAndroid Build Coastguard Worker {
1243*495ae853SAndroid Build Coastguard Worker i4_discard_nal_flag = SVCD_TRUE;
1244*495ae853SAndroid Build Coastguard Worker }
1245*495ae853SAndroid Build Coastguard Worker }
1246*495ae853SAndroid Build Coastguard Worker else
1247*495ae853SAndroid Build Coastguard Worker {
1248*495ae853SAndroid Build Coastguard Worker if(0 == ps_int_attr->i4_quality_id && 0 == ps_int_attr->i4_dependency_id)
1249*495ae853SAndroid Build Coastguard Worker {
1250*495ae853SAndroid Build Coastguard Worker i4_discard_nal_flag = SVCD_TRUE;
1251*495ae853SAndroid Build Coastguard Worker }
1252*495ae853SAndroid Build Coastguard Worker }
1253*495ae853SAndroid Build Coastguard Worker }
1254*495ae853SAndroid Build Coastguard Worker
1255*495ae853SAndroid Build Coastguard Worker return (i4_discard_nal_flag);
1256*495ae853SAndroid Build Coastguard Worker }
1257