xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_nal.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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