xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_parse_slice.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar  *******************************************************************************
20*c83a76b0SSuyog Pawar  * @file
21*c83a76b0SSuyog Pawar  *  ihevcd_parse_slice.c
22*c83a76b0SSuyog Pawar  *
23*c83a76b0SSuyog Pawar  * @brief
24*c83a76b0SSuyog Pawar  *  Contains functions for parsing slice data
25*c83a76b0SSuyog Pawar  *
26*c83a76b0SSuyog Pawar  * @author
27*c83a76b0SSuyog Pawar  *  Harish
28*c83a76b0SSuyog Pawar  *
29*c83a76b0SSuyog Pawar  * @par List of Functions:
30*c83a76b0SSuyog Pawar  *
31*c83a76b0SSuyog Pawar  * @remarks
32*c83a76b0SSuyog Pawar  *  None
33*c83a76b0SSuyog Pawar  *
34*c83a76b0SSuyog Pawar  *******************************************************************************
35*c83a76b0SSuyog Pawar  */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* File Includes                                                             */
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar #include <stdio.h>
40*c83a76b0SSuyog Pawar #include <stddef.h>
41*c83a76b0SSuyog Pawar #include <stdlib.h>
42*c83a76b0SSuyog Pawar #include <string.h>
43*c83a76b0SSuyog Pawar #include <assert.h>
44*c83a76b0SSuyog Pawar 
45*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
46*c83a76b0SSuyog Pawar #include "iv.h"
47*c83a76b0SSuyog Pawar #include "ivd.h"
48*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
49*c83a76b0SSuyog Pawar #include "ithread.h"
50*c83a76b0SSuyog Pawar 
51*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
52*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
53*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
54*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
55*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
56*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
57*c83a76b0SSuyog Pawar 
58*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
59*c83a76b0SSuyog Pawar #include "ihevc_error.h"
60*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
61*c83a76b0SSuyog Pawar 
62*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
63*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
64*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
65*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
67*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_utils.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_parse_slice.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_parse_residual.h"
72*c83a76b0SSuyog Pawar #include "ihevcd_cabac.h"
73*c83a76b0SSuyog Pawar #include "ihevcd_job_queue.h"
74*c83a76b0SSuyog Pawar #include "ihevcd_intra_pred_mode_prediction.h"
75*c83a76b0SSuyog Pawar #include "ihevcd_common_tables.h"
76*c83a76b0SSuyog Pawar #include "ihevcd_process_slice.h"
77*c83a76b0SSuyog Pawar #include "ihevcd_debug.h"
78*c83a76b0SSuyog Pawar #include "ihevcd_get_mv.h"
79*c83a76b0SSuyog Pawar #include "ihevcd_boundary_strength.h"
80*c83a76b0SSuyog Pawar #include "ihevcd_ilf_padding.h"
81*c83a76b0SSuyog Pawar #include "ihevcd_statistics.h"
82*c83a76b0SSuyog Pawar /* Bit stream offset threshold */
83*c83a76b0SSuyog Pawar #define BITSTRM_OFF_THRS 8
84*c83a76b0SSuyog Pawar 
85*c83a76b0SSuyog Pawar #define MIN_CU_QP_DELTA_ABS(x) (-26 + ((x) * 6) / 2)
86*c83a76b0SSuyog Pawar #define MAX_CU_QP_DELTA_ABS(x) (25 + ((x) * 6) / 2)
87*c83a76b0SSuyog Pawar 
88*c83a76b0SSuyog Pawar /**
89*c83a76b0SSuyog Pawar  * Table used to decode part_mode if AMP is enabled and current CU is not min CU
90*c83a76b0SSuyog Pawar  */
91*c83a76b0SSuyog Pawar const UWORD8 gau1_part_mode_amp[] = { PART_nLx2N, PART_nRx2N, PART_Nx2N, 0xFF, PART_2NxnU, PART_2NxnD, PART_2NxN, 0xFF };
92*c83a76b0SSuyog Pawar 
93*c83a76b0SSuyog Pawar const UWORD32 gau4_ct_depth_mask[] = { 0x0, 0x55555555, 0xAAAAAAAA, 0xFFFFFFFF };
94*c83a76b0SSuyog Pawar 
95*c83a76b0SSuyog Pawar 
96*c83a76b0SSuyog Pawar 
97*c83a76b0SSuyog Pawar /**
98*c83a76b0SSuyog Pawar  *******************************************************************************
99*c83a76b0SSuyog Pawar  *
100*c83a76b0SSuyog Pawar  * @brief
101*c83a76b0SSuyog Pawar  *  Parses Transform tree syntax
102*c83a76b0SSuyog Pawar  *
103*c83a76b0SSuyog Pawar  * @par Description:
104*c83a76b0SSuyog Pawar  *  Parses Transform tree syntax as per Section:7.3.9.8
105*c83a76b0SSuyog Pawar  *
106*c83a76b0SSuyog Pawar  * @param[in] ps_codec
107*c83a76b0SSuyog Pawar  *  Pointer to codec context
108*c83a76b0SSuyog Pawar  *
109*c83a76b0SSuyog Pawar  * @returns  Status
110*c83a76b0SSuyog Pawar  *
111*c83a76b0SSuyog Pawar  * @remarks
112*c83a76b0SSuyog Pawar  *
113*c83a76b0SSuyog Pawar  *
114*c83a76b0SSuyog Pawar  *******************************************************************************
115*c83a76b0SSuyog Pawar  */
116*c83a76b0SSuyog Pawar 
ihevcd_parse_transform_tree(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 cu_x_base,WORD32 cu_y_base,WORD32 log2_trafo_size,WORD32 trafo_depth,WORD32 blk_idx,WORD32 intra_pred_mode)117*c83a76b0SSuyog Pawar WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
118*c83a76b0SSuyog Pawar                                    WORD32 x0, WORD32 y0,
119*c83a76b0SSuyog Pawar                                    WORD32 cu_x_base, WORD32 cu_y_base,
120*c83a76b0SSuyog Pawar                                    WORD32 log2_trafo_size,
121*c83a76b0SSuyog Pawar                                    WORD32 trafo_depth,
122*c83a76b0SSuyog Pawar                                    WORD32 blk_idx,
123*c83a76b0SSuyog Pawar                                    WORD32 intra_pred_mode)
124*c83a76b0SSuyog Pawar {
125*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
126*c83a76b0SSuyog Pawar     sps_t *ps_sps;
127*c83a76b0SSuyog Pawar     pps_t *ps_pps;
128*c83a76b0SSuyog Pawar     WORD32 value;
129*c83a76b0SSuyog Pawar     WORD32 x1, y1;
130*c83a76b0SSuyog Pawar     WORD32 max_trafo_depth;
131*c83a76b0SSuyog Pawar 
132*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
133*c83a76b0SSuyog Pawar     WORD32 intra_split_flag;
134*c83a76b0SSuyog Pawar     WORD32 split_transform_flag;
135*c83a76b0SSuyog Pawar     WORD32 ctxt_idx;
136*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
137*c83a76b0SSuyog Pawar 
138*c83a76b0SSuyog Pawar     max_trafo_depth = ps_codec->s_parse.s_cu.i4_max_trafo_depth;
139*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps;
140*c83a76b0SSuyog Pawar     ps_pps = ps_codec->s_parse.ps_pps;
141*c83a76b0SSuyog Pawar     intra_split_flag = ps_codec->s_parse.s_cu.i4_intra_split_flag;
142*c83a76b0SSuyog Pawar 
143*c83a76b0SSuyog Pawar     {
144*c83a76b0SSuyog Pawar         split_transform_flag = 0;
145*c83a76b0SSuyog Pawar         if((log2_trafo_size <= ps_sps->i1_log2_max_transform_block_size) &&
146*c83a76b0SSuyog Pawar                         (log2_trafo_size > ps_sps->i1_log2_min_transform_block_size) &&
147*c83a76b0SSuyog Pawar                         (trafo_depth < max_trafo_depth) &&
148*c83a76b0SSuyog Pawar                         !(intra_split_flag && (trafo_depth == 0)))
149*c83a76b0SSuyog Pawar         {
150*c83a76b0SSuyog Pawar             /* encode the split transform flag, context derived as per Table9-37 */
151*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_SPLIT_TFM + (5 - log2_trafo_size);
152*c83a76b0SSuyog Pawar 
153*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("split_transform_flag", ps_cabac->u4_range, ctxt_idx);
154*c83a76b0SSuyog Pawar             split_transform_flag = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
155*c83a76b0SSuyog Pawar             AEV_TRACE("split_transform_flag", split_transform_flag,
156*c83a76b0SSuyog Pawar                       ps_cabac->u4_range);
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar         }
159*c83a76b0SSuyog Pawar         else
160*c83a76b0SSuyog Pawar         {
161*c83a76b0SSuyog Pawar             WORD32 inter_split_flag = 0;
162*c83a76b0SSuyog Pawar 
163*c83a76b0SSuyog Pawar             if((0 == ps_sps->i1_max_transform_hierarchy_depth_inter) &&
164*c83a76b0SSuyog Pawar                             (PRED_MODE_INTER == ps_codec->s_parse.s_cu.i4_pred_mode) &&
165*c83a76b0SSuyog Pawar                             (PART_2Nx2N != ps_codec->s_parse.s_cu.i4_part_mode) &&
166*c83a76b0SSuyog Pawar                             (0 == trafo_depth))
167*c83a76b0SSuyog Pawar             {
168*c83a76b0SSuyog Pawar                 inter_split_flag = 1;
169*c83a76b0SSuyog Pawar             }
170*c83a76b0SSuyog Pawar 
171*c83a76b0SSuyog Pawar             if((log2_trafo_size > ps_sps->i1_log2_max_transform_block_size) ||
172*c83a76b0SSuyog Pawar                             ((1 == intra_split_flag) && (0 == trafo_depth)) ||
173*c83a76b0SSuyog Pawar                             (1 == inter_split_flag))
174*c83a76b0SSuyog Pawar             {
175*c83a76b0SSuyog Pawar                 split_transform_flag = 1;
176*c83a76b0SSuyog Pawar             }
177*c83a76b0SSuyog Pawar         }
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar         if(0 == trafo_depth)
180*c83a76b0SSuyog Pawar         {
181*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth] = 0;
182*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth] = 0;
183*c83a76b0SSuyog Pawar         }
184*c83a76b0SSuyog Pawar         else
185*c83a76b0SSuyog Pawar         {
186*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth] = ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth - 1];
187*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth] = ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth - 1];
188*c83a76b0SSuyog Pawar         }
189*c83a76b0SSuyog Pawar         if(trafo_depth == 0 || log2_trafo_size > 2)
190*c83a76b0SSuyog Pawar         {
191*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_CBCR_IDX + trafo_depth;
192*c83a76b0SSuyog Pawar             /* CBF for Cb/Cr is sent only if the parent CBF for Cb/Cr is non-zero */
193*c83a76b0SSuyog Pawar             if((trafo_depth == 0) || ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth - 1])
194*c83a76b0SSuyog Pawar             {
195*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("cbf_cb", ps_cabac->u4_range, ctxt_idx);
196*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
197*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cb", value, ps_cabac->u4_range);
198*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth] = value;
199*c83a76b0SSuyog Pawar             }
200*c83a76b0SSuyog Pawar 
201*c83a76b0SSuyog Pawar             if((trafo_depth == 0) || ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth - 1])
202*c83a76b0SSuyog Pawar             {
203*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("cbf_cr", ps_cabac->u4_range, ctxt_idx);
204*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
205*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cr", value, ps_cabac->u4_range);
206*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth] = value;
207*c83a76b0SSuyog Pawar             }
208*c83a76b0SSuyog Pawar         }
209*c83a76b0SSuyog Pawar         if(split_transform_flag)
210*c83a76b0SSuyog Pawar         {
211*c83a76b0SSuyog Pawar             WORD32 intra_pred_mode_tmp;
212*c83a76b0SSuyog Pawar             x1 = x0 + ((1 << log2_trafo_size) >> 1);
213*c83a76b0SSuyog Pawar             y1 = y0 + ((1 << log2_trafo_size) >> 1);
214*c83a76b0SSuyog Pawar 
215*c83a76b0SSuyog Pawar             /* For transform depth of zero, intra pred mode as decoded at CU */
216*c83a76b0SSuyog Pawar             /* level is sent to the transform tree nodes */
217*c83a76b0SSuyog Pawar             /* When depth is non-zero intra pred mode of parent node is sent */
218*c83a76b0SSuyog Pawar             /* This takes care of passing correct mode to all the child nodes */
219*c83a76b0SSuyog Pawar             intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0];
220*c83a76b0SSuyog Pawar             ret = ihevcd_parse_transform_tree(ps_codec, x0, y0, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 0, intra_pred_mode_tmp);
221*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
222*c83a76b0SSuyog Pawar 
223*c83a76b0SSuyog Pawar             intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[1];
224*c83a76b0SSuyog Pawar             ret = ihevcd_parse_transform_tree(ps_codec, x1, y0, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 1, intra_pred_mode_tmp);
225*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
226*c83a76b0SSuyog Pawar 
227*c83a76b0SSuyog Pawar             intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[2];
228*c83a76b0SSuyog Pawar             ret = ihevcd_parse_transform_tree(ps_codec, x0, y1, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 2, intra_pred_mode_tmp);
229*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
230*c83a76b0SSuyog Pawar 
231*c83a76b0SSuyog Pawar             intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[3];
232*c83a76b0SSuyog Pawar             ret = ihevcd_parse_transform_tree(ps_codec, x1, y1, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 3, intra_pred_mode_tmp);
233*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
234*c83a76b0SSuyog Pawar 
235*c83a76b0SSuyog Pawar         }
236*c83a76b0SSuyog Pawar         else
237*c83a76b0SSuyog Pawar         {
238*c83a76b0SSuyog Pawar             WORD32 ctb_x_base;
239*c83a76b0SSuyog Pawar             WORD32 ctb_y_base;
240*c83a76b0SSuyog Pawar             WORD32 cu_qp_delta_abs;
241*c83a76b0SSuyog Pawar 
242*c83a76b0SSuyog Pawar 
243*c83a76b0SSuyog Pawar 
244*c83a76b0SSuyog Pawar             tu_t *ps_tu = ps_codec->s_parse.ps_tu;
245*c83a76b0SSuyog Pawar             cu_qp_delta_abs = 0;
246*c83a76b0SSuyog Pawar             ctb_x_base = ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size;
247*c83a76b0SSuyog Pawar             ctb_y_base = ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size;
248*c83a76b0SSuyog Pawar 
249*c83a76b0SSuyog Pawar             if((ps_codec->s_parse.s_cu.i4_pred_mode == PRED_MODE_INTRA) ||
250*c83a76b0SSuyog Pawar                             (trafo_depth != 0) ||
251*c83a76b0SSuyog Pawar                             (ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth]) ||
252*c83a76b0SSuyog Pawar                             (ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth]))
253*c83a76b0SSuyog Pawar             {
254*c83a76b0SSuyog Pawar                 ctxt_idx = IHEVC_CAB_CBF_LUMA_IDX;
255*c83a76b0SSuyog Pawar                 ctxt_idx += (trafo_depth == 0) ? 1 : 0;
256*c83a76b0SSuyog Pawar 
257*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("cbf_luma", ps_cabac->u4_range, ctxt_idx);
258*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
259*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_luma", value, ps_cabac->u4_range);
260*c83a76b0SSuyog Pawar 
261*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.i1_cbf_luma = value;
262*c83a76b0SSuyog Pawar             }
263*c83a76b0SSuyog Pawar             else
264*c83a76b0SSuyog Pawar             {
265*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.i1_cbf_luma = 1;
266*c83a76b0SSuyog Pawar             }
267*c83a76b0SSuyog Pawar 
268*c83a76b0SSuyog Pawar             /* Initialize ps_tu to default values */
269*c83a76b0SSuyog Pawar             /* If required change this to WORD32 packed write */
270*c83a76b0SSuyog Pawar             ps_tu->b1_cb_cbf = 0;
271*c83a76b0SSuyog Pawar             ps_tu->b1_cr_cbf = 0;
272*c83a76b0SSuyog Pawar             ps_tu->b1_y_cbf = 0;
273*c83a76b0SSuyog Pawar             ps_tu->b4_pos_x = ((x0 - ctb_x_base) >> 2);
274*c83a76b0SSuyog Pawar             ps_tu->b4_pos_y = ((y0 - ctb_y_base) >> 2);
275*c83a76b0SSuyog Pawar             ps_tu->b1_transquant_bypass = ps_codec->s_parse.s_cu.i4_cu_transquant_bypass;
276*c83a76b0SSuyog Pawar             ps_tu->b3_size = (log2_trafo_size - 2);
277*c83a76b0SSuyog Pawar             ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
278*c83a76b0SSuyog Pawar 
279*c83a76b0SSuyog Pawar             ps_tu->b6_luma_intra_mode = intra_pred_mode;
280*c83a76b0SSuyog Pawar             ps_tu->b3_chroma_intra_mode_idx = ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx;
281*c83a76b0SSuyog Pawar 
282*c83a76b0SSuyog Pawar             /* Section:7.3.12  Transform unit syntax inlined here */
283*c83a76b0SSuyog Pawar             if(ps_codec->s_parse.s_cu.i1_cbf_luma ||
284*c83a76b0SSuyog Pawar                             ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth] ||
285*c83a76b0SSuyog Pawar                             ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth])
286*c83a76b0SSuyog Pawar             {
287*c83a76b0SSuyog Pawar                 WORD32 intra_pred_mode_chroma;
288*c83a76b0SSuyog Pawar                 if(ps_pps->i1_cu_qp_delta_enabled_flag && !ps_codec->s_parse.i4_is_cu_qp_delta_coded)
289*c83a76b0SSuyog Pawar                 {
290*c83a76b0SSuyog Pawar 
291*c83a76b0SSuyog Pawar 
292*c83a76b0SSuyog Pawar                     WORD32 c_max        = TU_MAX_QP_DELTA_ABS;
293*c83a76b0SSuyog Pawar                     WORD32 ctxt_inc     = IHEVC_CAB_QP_DELTA_ABS;
294*c83a76b0SSuyog Pawar                     WORD32 ctxt_inc_max = CTXT_MAX_QP_DELTA_ABS;
295*c83a76b0SSuyog Pawar 
296*c83a76b0SSuyog Pawar                     TRACE_CABAC_CTXT("cu_qp_delta_abs", ps_cabac->u4_range, ctxt_inc);
297*c83a76b0SSuyog Pawar                     /* qp_delta_abs is coded as combination of tunary and eg0 code  */
298*c83a76b0SSuyog Pawar                     /* See Table 9-32 and Table 9-37 for details on cu_qp_delta_abs */
299*c83a76b0SSuyog Pawar                     cu_qp_delta_abs = ihevcd_cabac_decode_bins_tunary(ps_cabac,
300*c83a76b0SSuyog Pawar                                                                       ps_bitstrm,
301*c83a76b0SSuyog Pawar                                                                       c_max,
302*c83a76b0SSuyog Pawar                                                                       ctxt_inc,
303*c83a76b0SSuyog Pawar                                                                       0,
304*c83a76b0SSuyog Pawar                                                                       ctxt_inc_max);
305*c83a76b0SSuyog Pawar                     if(cu_qp_delta_abs >= c_max)
306*c83a76b0SSuyog Pawar                     {
307*c83a76b0SSuyog Pawar                         value = ihevcd_cabac_decode_bypass_bins_egk(ps_cabac, ps_bitstrm, 0);
308*c83a76b0SSuyog Pawar                         cu_qp_delta_abs += value;
309*c83a76b0SSuyog Pawar                     }
310*c83a76b0SSuyog Pawar                     AEV_TRACE("cu_qp_delta_abs", cu_qp_delta_abs, ps_cabac->u4_range);
311*c83a76b0SSuyog Pawar 
312*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_is_cu_qp_delta_coded = 1;
313*c83a76b0SSuyog Pawar 
314*c83a76b0SSuyog Pawar 
315*c83a76b0SSuyog Pawar                     if(cu_qp_delta_abs)
316*c83a76b0SSuyog Pawar                     {
317*c83a76b0SSuyog Pawar                         value = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
318*c83a76b0SSuyog Pawar                         AEV_TRACE("cu_qp_delta_sign", value, ps_cabac->u4_range);
319*c83a76b0SSuyog Pawar 
320*c83a76b0SSuyog Pawar                         if(value)
321*c83a76b0SSuyog Pawar                             cu_qp_delta_abs = -cu_qp_delta_abs;
322*c83a76b0SSuyog Pawar 
323*c83a76b0SSuyog Pawar                     }
324*c83a76b0SSuyog Pawar 
325*c83a76b0SSuyog Pawar                     if (cu_qp_delta_abs < MIN_CU_QP_DELTA_ABS(ps_sps->i1_bit_depth_luma_minus8)
326*c83a76b0SSuyog Pawar                                     || cu_qp_delta_abs > MAX_CU_QP_DELTA_ABS(ps_sps->i1_bit_depth_luma_minus8))
327*c83a76b0SSuyog Pawar                     {
328*c83a76b0SSuyog Pawar                         return IHEVCD_INVALID_PARAMETER;
329*c83a76b0SSuyog Pawar                     }
330*c83a76b0SSuyog Pawar 
331*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_cu.i4_cu_qp_delta = cu_qp_delta_abs;
332*c83a76b0SSuyog Pawar 
333*c83a76b0SSuyog Pawar                 }
334*c83a76b0SSuyog Pawar 
335*c83a76b0SSuyog Pawar                 if(ps_codec->s_parse.s_cu.i1_cbf_luma)
336*c83a76b0SSuyog Pawar                 {
337*c83a76b0SSuyog Pawar                     ps_tu->b1_y_cbf = 1;
338*c83a76b0SSuyog Pawar                     ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size, 0, intra_pred_mode);
339*c83a76b0SSuyog Pawar                 }
340*c83a76b0SSuyog Pawar 
341*c83a76b0SSuyog Pawar                 if(4 == ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx)
342*c83a76b0SSuyog Pawar                     intra_pred_mode_chroma = ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0];
343*c83a76b0SSuyog Pawar                 else
344*c83a76b0SSuyog Pawar                 {
345*c83a76b0SSuyog Pawar                     intra_pred_mode_chroma = gau1_intra_pred_chroma_modes[ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx];
346*c83a76b0SSuyog Pawar 
347*c83a76b0SSuyog Pawar                     if(intra_pred_mode_chroma ==
348*c83a76b0SSuyog Pawar                                     ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0])
349*c83a76b0SSuyog Pawar                     {
350*c83a76b0SSuyog Pawar                         intra_pred_mode_chroma = INTRA_ANGULAR(34);
351*c83a76b0SSuyog Pawar                     }
352*c83a76b0SSuyog Pawar 
353*c83a76b0SSuyog Pawar                 }
354*c83a76b0SSuyog Pawar                 if(log2_trafo_size > 2)
355*c83a76b0SSuyog Pawar                 {
356*c83a76b0SSuyog Pawar                     if(ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth])
357*c83a76b0SSuyog Pawar                     {
358*c83a76b0SSuyog Pawar                         ps_tu->b1_cb_cbf = 1;
359*c83a76b0SSuyog Pawar                         ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size - 1, 1, intra_pred_mode_chroma);
360*c83a76b0SSuyog Pawar                     }
361*c83a76b0SSuyog Pawar 
362*c83a76b0SSuyog Pawar                     if(ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth])
363*c83a76b0SSuyog Pawar                     {
364*c83a76b0SSuyog Pawar                         ps_tu->b1_cr_cbf = 1;
365*c83a76b0SSuyog Pawar                         ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size - 1, 2, intra_pred_mode_chroma);
366*c83a76b0SSuyog Pawar                     }
367*c83a76b0SSuyog Pawar                 }
368*c83a76b0SSuyog Pawar                 else if(blk_idx == 3)
369*c83a76b0SSuyog Pawar                 {
370*c83a76b0SSuyog Pawar                     if(ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth])
371*c83a76b0SSuyog Pawar                     {
372*c83a76b0SSuyog Pawar                         ps_tu->b1_cb_cbf = 1;
373*c83a76b0SSuyog Pawar                         ihevcd_parse_residual_coding(ps_codec, cu_x_base, cu_y_base, log2_trafo_size, 1, intra_pred_mode_chroma);
374*c83a76b0SSuyog Pawar                     }
375*c83a76b0SSuyog Pawar 
376*c83a76b0SSuyog Pawar                     if(ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth])
377*c83a76b0SSuyog Pawar                     {
378*c83a76b0SSuyog Pawar                         ps_tu->b1_cr_cbf = 1;
379*c83a76b0SSuyog Pawar                         ihevcd_parse_residual_coding(ps_codec, cu_x_base, cu_y_base, log2_trafo_size, 2, intra_pred_mode_chroma);
380*c83a76b0SSuyog Pawar                     }
381*c83a76b0SSuyog Pawar                 }
382*c83a76b0SSuyog Pawar                 else
383*c83a76b0SSuyog Pawar                 {
384*c83a76b0SSuyog Pawar                     //ps_tu->b1_chroma_present = 0;
385*c83a76b0SSuyog Pawar                     ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
386*c83a76b0SSuyog Pawar                 }
387*c83a76b0SSuyog Pawar             }
388*c83a76b0SSuyog Pawar             else
389*c83a76b0SSuyog Pawar             {
390*c83a76b0SSuyog Pawar                 if((3 != blk_idx) && (2 == log2_trafo_size))
391*c83a76b0SSuyog Pawar                 {
392*c83a76b0SSuyog Pawar                     ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
393*c83a76b0SSuyog Pawar                 }
394*c83a76b0SSuyog Pawar             }
395*c83a76b0SSuyog Pawar 
396*c83a76b0SSuyog Pawar             /* Set the first TU in CU flag */
397*c83a76b0SSuyog Pawar             {
398*c83a76b0SSuyog Pawar                 if((ps_codec->s_parse.s_cu.i4_pos_x << 3) == (ps_tu->b4_pos_x << 2) &&
399*c83a76b0SSuyog Pawar                                 (ps_codec->s_parse.s_cu.i4_pos_y << 3) == (ps_tu->b4_pos_y << 2))
400*c83a76b0SSuyog Pawar                 {
401*c83a76b0SSuyog Pawar                     ps_tu->b1_first_tu_in_cu = 1;
402*c83a76b0SSuyog Pawar                 }
403*c83a76b0SSuyog Pawar                 else
404*c83a76b0SSuyog Pawar                 {
405*c83a76b0SSuyog Pawar                     ps_tu->b1_first_tu_in_cu = 0;
406*c83a76b0SSuyog Pawar                 }
407*c83a76b0SSuyog Pawar             }
408*c83a76b0SSuyog Pawar             ps_codec->s_parse.ps_tu++;
409*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.i4_tu_cnt++;
410*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_pic_tu_idx++;
411*c83a76b0SSuyog Pawar         }
412*c83a76b0SSuyog Pawar     }
413*c83a76b0SSuyog Pawar     return ret;
414*c83a76b0SSuyog Pawar }
415*c83a76b0SSuyog Pawar /**
416*c83a76b0SSuyog Pawar  *******************************************************************************
417*c83a76b0SSuyog Pawar  *
418*c83a76b0SSuyog Pawar  * @brief
419*c83a76b0SSuyog Pawar  *  Parses Motion vector difference
420*c83a76b0SSuyog Pawar  *
421*c83a76b0SSuyog Pawar  * @par Description:
422*c83a76b0SSuyog Pawar  *  Parses Motion vector difference as per Section:7.3.9.9
423*c83a76b0SSuyog Pawar  *
424*c83a76b0SSuyog Pawar  * @param[in] ps_codec
425*c83a76b0SSuyog Pawar  *  Pointer to codec context
426*c83a76b0SSuyog Pawar  *
427*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
428*c83a76b0SSuyog Pawar  *
429*c83a76b0SSuyog Pawar  * @remarks
430*c83a76b0SSuyog Pawar  *
431*c83a76b0SSuyog Pawar  *
432*c83a76b0SSuyog Pawar  *******************************************************************************
433*c83a76b0SSuyog Pawar  */
ihevcd_parse_mvd(codec_t * ps_codec,mv_t * ps_mv)434*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_mvd(codec_t *ps_codec, mv_t *ps_mv)
435*c83a76b0SSuyog Pawar {
436*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
437*c83a76b0SSuyog Pawar     WORD32 value;
438*c83a76b0SSuyog Pawar     WORD32 abs_mvd;
439*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
440*c83a76b0SSuyog Pawar     WORD32 abs_mvd_greater0_flag[2];
441*c83a76b0SSuyog Pawar     WORD32 abs_mvd_greater1_flag[2];
442*c83a76b0SSuyog Pawar     WORD32 ctxt_idx;
443*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
444*c83a76b0SSuyog Pawar 
445*c83a76b0SSuyog Pawar 
446*c83a76b0SSuyog Pawar     ctxt_idx  = IHEVC_CAB_MVD_GRT0;
447*c83a76b0SSuyog Pawar     /* encode absmvd_x > 0 */
448*c83a76b0SSuyog Pawar     TRACE_CABAC_CTXT("abs_mvd_greater0_flag[0]", ps_cabac->u4_range, ctxt_idx);
449*c83a76b0SSuyog Pawar     abs_mvd_greater0_flag[0] = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
450*c83a76b0SSuyog Pawar     AEV_TRACE("abs_mvd_greater0_flag[0]", abs_mvd_greater0_flag[0], ps_cabac->u4_range);
451*c83a76b0SSuyog Pawar 
452*c83a76b0SSuyog Pawar     /* encode absmvd_y > 0 */
453*c83a76b0SSuyog Pawar     TRACE_CABAC_CTXT("abs_mvd_greater0_flag[1]", ps_cabac->u4_range, ctxt_idx);
454*c83a76b0SSuyog Pawar     abs_mvd_greater0_flag[1] = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
455*c83a76b0SSuyog Pawar     AEV_TRACE("abs_mvd_greater0_flag[1]", abs_mvd_greater0_flag[1], ps_cabac->u4_range);
456*c83a76b0SSuyog Pawar 
457*c83a76b0SSuyog Pawar     ctxt_idx  = IHEVC_CAB_MVD_GRT1;
458*c83a76b0SSuyog Pawar     abs_mvd_greater1_flag[0] = 0;
459*c83a76b0SSuyog Pawar     abs_mvd_greater1_flag[1] = 0;
460*c83a76b0SSuyog Pawar 
461*c83a76b0SSuyog Pawar     if(abs_mvd_greater0_flag[0])
462*c83a76b0SSuyog Pawar     {
463*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("abs_mvd_greater1_flag[0]", ps_cabac->u4_range, ctxt_idx);
464*c83a76b0SSuyog Pawar         abs_mvd_greater1_flag[0] = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
465*c83a76b0SSuyog Pawar         AEV_TRACE("abs_mvd_greater1_flag[0]", abs_mvd_greater1_flag[0], ps_cabac->u4_range);
466*c83a76b0SSuyog Pawar     }
467*c83a76b0SSuyog Pawar     if(abs_mvd_greater0_flag[1])
468*c83a76b0SSuyog Pawar     {
469*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("abs_mvd_greater1_flag[1]", ps_cabac->u4_range, ctxt_idx);
470*c83a76b0SSuyog Pawar         abs_mvd_greater1_flag[1] = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
471*c83a76b0SSuyog Pawar         AEV_TRACE("abs_mvd_greater1_flag[1]", abs_mvd_greater1_flag[1], ps_cabac->u4_range);
472*c83a76b0SSuyog Pawar     }
473*c83a76b0SSuyog Pawar     abs_mvd = 0;
474*c83a76b0SSuyog Pawar     if(abs_mvd_greater0_flag[0])
475*c83a76b0SSuyog Pawar     {
476*c83a76b0SSuyog Pawar         abs_mvd = 1;
477*c83a76b0SSuyog Pawar         if(abs_mvd_greater1_flag[0])
478*c83a76b0SSuyog Pawar         {
479*c83a76b0SSuyog Pawar             value = ihevcd_cabac_decode_bypass_bins_egk(ps_cabac, ps_bitstrm, 1);
480*c83a76b0SSuyog Pawar             AEV_TRACE("abs_mvd_minus2[0]", value, ps_cabac->u4_range);
481*c83a76b0SSuyog Pawar             abs_mvd = value + 2;
482*c83a76b0SSuyog Pawar         }
483*c83a76b0SSuyog Pawar         value = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
484*c83a76b0SSuyog Pawar         AEV_TRACE("mvd_sign_flag[0]", value, ps_cabac->u4_range);
485*c83a76b0SSuyog Pawar         if(value)
486*c83a76b0SSuyog Pawar         {
487*c83a76b0SSuyog Pawar             abs_mvd = -abs_mvd;
488*c83a76b0SSuyog Pawar         }
489*c83a76b0SSuyog Pawar 
490*c83a76b0SSuyog Pawar     }
491*c83a76b0SSuyog Pawar     ps_mv->i2_mvx = abs_mvd;
492*c83a76b0SSuyog Pawar     abs_mvd = 0;
493*c83a76b0SSuyog Pawar     if(abs_mvd_greater0_flag[1])
494*c83a76b0SSuyog Pawar     {
495*c83a76b0SSuyog Pawar         abs_mvd = 1;
496*c83a76b0SSuyog Pawar         if(abs_mvd_greater1_flag[1])
497*c83a76b0SSuyog Pawar         {
498*c83a76b0SSuyog Pawar             value = ihevcd_cabac_decode_bypass_bins_egk(ps_cabac, ps_bitstrm, 1);
499*c83a76b0SSuyog Pawar             AEV_TRACE("abs_mvd_minus2[1]", value, ps_cabac->u4_range);
500*c83a76b0SSuyog Pawar             abs_mvd = value + 2;
501*c83a76b0SSuyog Pawar 
502*c83a76b0SSuyog Pawar         }
503*c83a76b0SSuyog Pawar         value = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
504*c83a76b0SSuyog Pawar         AEV_TRACE("mvd_sign_flag[1]", value, ps_cabac->u4_range);
505*c83a76b0SSuyog Pawar 
506*c83a76b0SSuyog Pawar         if(value)
507*c83a76b0SSuyog Pawar         {
508*c83a76b0SSuyog Pawar             abs_mvd = -abs_mvd;
509*c83a76b0SSuyog Pawar         }
510*c83a76b0SSuyog Pawar     }
511*c83a76b0SSuyog Pawar     ps_mv->i2_mvy = abs_mvd;
512*c83a76b0SSuyog Pawar 
513*c83a76b0SSuyog Pawar     return ret;
514*c83a76b0SSuyog Pawar }
515*c83a76b0SSuyog Pawar 
516*c83a76b0SSuyog Pawar /**
517*c83a76b0SSuyog Pawar  *******************************************************************************
518*c83a76b0SSuyog Pawar  *
519*c83a76b0SSuyog Pawar  * @brief
520*c83a76b0SSuyog Pawar  *  Parses PCM sample
521*c83a76b0SSuyog Pawar  *
522*c83a76b0SSuyog Pawar  *
523*c83a76b0SSuyog Pawar  * @par Description:
524*c83a76b0SSuyog Pawar  *  Parses PCM sample as per Section:7.3.9.7 Pcm sample syntax
525*c83a76b0SSuyog Pawar  *
526*c83a76b0SSuyog Pawar  * @param[in] ps_codec
527*c83a76b0SSuyog Pawar  *  Pointer to codec context
528*c83a76b0SSuyog Pawar  *
529*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
530*c83a76b0SSuyog Pawar  *
531*c83a76b0SSuyog Pawar  * @remarks
532*c83a76b0SSuyog Pawar  *
533*c83a76b0SSuyog Pawar  *
534*c83a76b0SSuyog Pawar  *******************************************************************************
535*c83a76b0SSuyog Pawar  */
536*c83a76b0SSuyog Pawar 
ihevcd_parse_pcm_sample(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 log2_cb_size)537*c83a76b0SSuyog Pawar IHEVCD_ERROR_T  ihevcd_parse_pcm_sample(codec_t *ps_codec,
538*c83a76b0SSuyog Pawar                                         WORD32 x0,
539*c83a76b0SSuyog Pawar                                         WORD32 y0,
540*c83a76b0SSuyog Pawar                                         WORD32 log2_cb_size)
541*c83a76b0SSuyog Pawar {
542*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
543*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
544*c83a76b0SSuyog Pawar     sps_t *ps_sps;
545*c83a76b0SSuyog Pawar 
546*c83a76b0SSuyog Pawar     WORD32 value;
547*c83a76b0SSuyog Pawar     WORD32 i;
548*c83a76b0SSuyog Pawar 
549*c83a76b0SSuyog Pawar     WORD32 num_bits;
550*c83a76b0SSuyog Pawar     UWORD32 u4_sig_coeff_map;
551*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
552*c83a76b0SSuyog Pawar     tu_t *ps_tu = ps_codec->s_parse.ps_tu;
553*c83a76b0SSuyog Pawar     tu_sblk_coeff_data_t *ps_tu_sblk_coeff_data;
554*c83a76b0SSuyog Pawar     UWORD8 *pu1_coeff_data;
555*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps;
556*c83a76b0SSuyog Pawar 
557*c83a76b0SSuyog Pawar     UNUSED(value);
558*c83a76b0SSuyog Pawar     UNUSED(ps_tu);
559*c83a76b0SSuyog Pawar     UNUSED(ps_cabac);
560*c83a76b0SSuyog Pawar     UNUSED(x0);
561*c83a76b0SSuyog Pawar     UNUSED(y0);
562*c83a76b0SSuyog Pawar 
563*c83a76b0SSuyog Pawar     {
564*c83a76b0SSuyog Pawar         WORD8 *pi1_scan_idx;
565*c83a76b0SSuyog Pawar         WORD8 *pi1_buf = (WORD8 *)ps_codec->s_parse.pv_tu_coeff_data;
566*c83a76b0SSuyog Pawar         WORD8 *pi1_num_coded_subblks;
567*c83a76b0SSuyog Pawar 
568*c83a76b0SSuyog Pawar         /* First WORD8 gives number of coded subblocks */
569*c83a76b0SSuyog Pawar         pi1_num_coded_subblks = pi1_buf++;
570*c83a76b0SSuyog Pawar 
571*c83a76b0SSuyog Pawar         /* Set number of coded subblocks in the current TU to zero */
572*c83a76b0SSuyog Pawar         /* For PCM there will be only one subblock which is the same size as CU */
573*c83a76b0SSuyog Pawar         *pi1_num_coded_subblks = 1;
574*c83a76b0SSuyog Pawar 
575*c83a76b0SSuyog Pawar         /* Second WORD8 gives (scan idx << 1) | trans_skip */
576*c83a76b0SSuyog Pawar         pi1_scan_idx = pi1_buf++;
577*c83a76b0SSuyog Pawar         *pi1_scan_idx = (0 << 1) | 1;
578*c83a76b0SSuyog Pawar 
579*c83a76b0SSuyog Pawar         /* Store the incremented pointer in pv_tu_coeff_data */
580*c83a76b0SSuyog Pawar         ps_codec->s_parse.pv_tu_coeff_data = pi1_buf;
581*c83a76b0SSuyog Pawar 
582*c83a76b0SSuyog Pawar     }
583*c83a76b0SSuyog Pawar 
584*c83a76b0SSuyog Pawar     u4_sig_coeff_map = 0xFFFFFFFF;
585*c83a76b0SSuyog Pawar     ps_tu_sblk_coeff_data = (tu_sblk_coeff_data_t *)ps_codec->s_parse.pv_tu_coeff_data;
586*c83a76b0SSuyog Pawar     ps_tu_sblk_coeff_data->u2_sig_coeff_map = u4_sig_coeff_map;
587*c83a76b0SSuyog Pawar     ps_tu_sblk_coeff_data->u2_subblk_pos = 0;
588*c83a76b0SSuyog Pawar 
589*c83a76b0SSuyog Pawar     pu1_coeff_data = (UWORD8 *)&ps_tu_sblk_coeff_data->ai2_level[0];
590*c83a76b0SSuyog Pawar 
591*c83a76b0SSuyog Pawar     num_bits = ps_sps->i1_pcm_sample_bit_depth_luma;
592*c83a76b0SSuyog Pawar 
593*c83a76b0SSuyog Pawar     for(i = 0; i < 1 << (log2_cb_size << 1); i++)
594*c83a76b0SSuyog Pawar     {
595*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("pcm_sample_luma", ps_cabac->u4_range, 0);
596*c83a76b0SSuyog Pawar         BITS_PARSE("pcm_sample_luma", value, ps_bitstrm, num_bits);
597*c83a76b0SSuyog Pawar 
598*c83a76b0SSuyog Pawar         //ps_pcmsample_t->i1_pcm_sample_luma[i] = value;
599*c83a76b0SSuyog Pawar         *pu1_coeff_data++ = value << (BIT_DEPTH_LUMA - num_bits);
600*c83a76b0SSuyog Pawar     }
601*c83a76b0SSuyog Pawar 
602*c83a76b0SSuyog Pawar     num_bits = ps_sps->i1_pcm_sample_bit_depth_chroma;
603*c83a76b0SSuyog Pawar 
604*c83a76b0SSuyog Pawar     for(i = 0; i < (1 << (log2_cb_size << 1)) >> 1; i++)
605*c83a76b0SSuyog Pawar     {
606*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("pcm_sample_chroma", ps_cabac->u4_range, 0);
607*c83a76b0SSuyog Pawar         BITS_PARSE("pcm_sample_chroma", value, ps_bitstrm, num_bits);
608*c83a76b0SSuyog Pawar 
609*c83a76b0SSuyog Pawar         // ps_pcmsample_t->i1_pcm_sample_chroma[i] = value;
610*c83a76b0SSuyog Pawar         *pu1_coeff_data++ = value << (BIT_DEPTH_CHROMA - num_bits);
611*c83a76b0SSuyog Pawar     }
612*c83a76b0SSuyog Pawar 
613*c83a76b0SSuyog Pawar     ps_codec->s_parse.pv_tu_coeff_data = pu1_coeff_data;
614*c83a76b0SSuyog Pawar 
615*c83a76b0SSuyog Pawar     return ret;
616*c83a76b0SSuyog Pawar }
617*c83a76b0SSuyog Pawar /**
618*c83a76b0SSuyog Pawar  *******************************************************************************
619*c83a76b0SSuyog Pawar  *
620*c83a76b0SSuyog Pawar  * @brief
621*c83a76b0SSuyog Pawar  *  Parses Prediction unit
622*c83a76b0SSuyog Pawar  *
623*c83a76b0SSuyog Pawar  * @par Description:
624*c83a76b0SSuyog Pawar  *  Parses Prediction unit as per Section:7.3.9.6
625*c83a76b0SSuyog Pawar  *
626*c83a76b0SSuyog Pawar  * @param[in] ps_codec
627*c83a76b0SSuyog Pawar  *  Pointer to codec context
628*c83a76b0SSuyog Pawar  *
629*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
630*c83a76b0SSuyog Pawar  *
631*c83a76b0SSuyog Pawar  * @remarks
632*c83a76b0SSuyog Pawar  *
633*c83a76b0SSuyog Pawar  *
634*c83a76b0SSuyog Pawar  *******************************************************************************
635*c83a76b0SSuyog Pawar  */
636*c83a76b0SSuyog Pawar 
ihevcd_parse_pu_mvp(codec_t * ps_codec,pu_t * ps_pu)637*c83a76b0SSuyog Pawar IHEVCD_ERROR_T  ihevcd_parse_pu_mvp(codec_t *ps_codec, pu_t *ps_pu)
638*c83a76b0SSuyog Pawar {
639*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
640*c83a76b0SSuyog Pawar     WORD32 value;
641*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
642*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
643*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
644*c83a76b0SSuyog Pawar     WORD32 inter_pred_idc;
645*c83a76b0SSuyog Pawar 
646*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
647*c83a76b0SSuyog Pawar 
648*c83a76b0SSuyog Pawar     if(ps_slice_hdr->i1_slice_type == BSLICE)
649*c83a76b0SSuyog Pawar     {
650*c83a76b0SSuyog Pawar         WORD32 pu_w_plus_pu_h;
651*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
652*c83a76b0SSuyog Pawar         /* required to check if w+h==12 case */
653*c83a76b0SSuyog Pawar         pu_w_plus_pu_h = ((ps_pu->b4_wd + 1) << 2) + ((ps_pu->b4_ht + 1) << 2);
654*c83a76b0SSuyog Pawar         if(12 == pu_w_plus_pu_h)
655*c83a76b0SSuyog Pawar         {
656*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_INTER_PRED_IDC + 4;
657*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("inter_pred_idc", ps_cabac->u4_range, ctxt_idx);
658*c83a76b0SSuyog Pawar             inter_pred_idc = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm,
659*c83a76b0SSuyog Pawar                                                      ctxt_idx);
660*c83a76b0SSuyog Pawar         }
661*c83a76b0SSuyog Pawar         else
662*c83a76b0SSuyog Pawar         {
663*c83a76b0SSuyog Pawar             /* larger PUs can be encoded as bi_pred/l0/l1 inter_pred_idc */
664*c83a76b0SSuyog Pawar             WORD32 is_bipred;
665*c83a76b0SSuyog Pawar 
666*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_INTER_PRED_IDC + ps_codec->s_parse.i4_ct_depth;
667*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("inter_pred_idc", ps_cabac->u4_range, ctxt_idx);
668*c83a76b0SSuyog Pawar             is_bipred = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
669*c83a76b0SSuyog Pawar             inter_pred_idc = PRED_BI;
670*c83a76b0SSuyog Pawar             if(!is_bipred)
671*c83a76b0SSuyog Pawar             {
672*c83a76b0SSuyog Pawar                 ctxt_idx = IHEVC_CAB_INTER_PRED_IDC + 4;
673*c83a76b0SSuyog Pawar                 inter_pred_idc = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm,
674*c83a76b0SSuyog Pawar                                                          ctxt_idx);
675*c83a76b0SSuyog Pawar             }
676*c83a76b0SSuyog Pawar         }
677*c83a76b0SSuyog Pawar 
678*c83a76b0SSuyog Pawar         AEV_TRACE("inter_pred_idc", inter_pred_idc, ps_cabac->u4_range);
679*c83a76b0SSuyog Pawar     }
680*c83a76b0SSuyog Pawar     else
681*c83a76b0SSuyog Pawar         inter_pred_idc = PRED_L0;
682*c83a76b0SSuyog Pawar     ps_pu->mv.i1_l0_ref_idx = 0;
683*c83a76b0SSuyog Pawar     ps_pu->mv.i1_l1_ref_idx = 0;
684*c83a76b0SSuyog Pawar     /* Decode MVD for L0 for PRED_L0 or PRED_BI */
685*c83a76b0SSuyog Pawar     if(inter_pred_idc != PRED_L1)
686*c83a76b0SSuyog Pawar     {
687*c83a76b0SSuyog Pawar         WORD32 active_refs = ps_slice_hdr->i1_num_ref_idx_l0_active;
688*c83a76b0SSuyog Pawar         WORD32 ref_idx = 0;
689*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
690*c83a76b0SSuyog Pawar 
691*c83a76b0SSuyog Pawar         if(active_refs > 1)
692*c83a76b0SSuyog Pawar         {
693*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_INTER_REF_IDX;
694*c83a76b0SSuyog Pawar             /* encode the context modelled first bin */
695*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("ref_idx", ps_cabac->u4_range, ctxt_idx);
696*c83a76b0SSuyog Pawar             ref_idx = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
697*c83a76b0SSuyog Pawar 
698*c83a76b0SSuyog Pawar             if((active_refs > 2) && ref_idx)
699*c83a76b0SSuyog Pawar             {
700*c83a76b0SSuyog Pawar                 WORD32 value;
701*c83a76b0SSuyog Pawar                 /* encode the context modelled second bin */
702*c83a76b0SSuyog Pawar                 ctxt_idx++;
703*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
704*c83a76b0SSuyog Pawar                 ref_idx += value;
705*c83a76b0SSuyog Pawar                 if((active_refs > 3) && value)
706*c83a76b0SSuyog Pawar                 {
707*c83a76b0SSuyog Pawar                     /* encode remaining bypass bins */
708*c83a76b0SSuyog Pawar                     ref_idx = ihevcd_cabac_decode_bypass_bins_tunary(ps_cabac,
709*c83a76b0SSuyog Pawar                                                                      ps_bitstrm,
710*c83a76b0SSuyog Pawar                                                                      (active_refs - 3)
711*c83a76b0SSuyog Pawar                     );
712*c83a76b0SSuyog Pawar                     ref_idx += 2;
713*c83a76b0SSuyog Pawar                 }
714*c83a76b0SSuyog Pawar             }
715*c83a76b0SSuyog Pawar             AEV_TRACE("ref_idx", ref_idx, ps_cabac->u4_range);
716*c83a76b0SSuyog Pawar         }
717*c83a76b0SSuyog Pawar 
718*c83a76b0SSuyog Pawar         ref_idx = CLIP3(ref_idx, 0, MAX_DPB_SIZE - 1);
719*c83a76b0SSuyog Pawar         ps_pu->mv.i1_l0_ref_idx = ref_idx;
720*c83a76b0SSuyog Pawar 
721*c83a76b0SSuyog Pawar         ihevcd_parse_mvd(ps_codec, &ps_pu->mv.s_l0_mv);
722*c83a76b0SSuyog Pawar 
723*c83a76b0SSuyog Pawar         ctxt_idx = IHEVC_CAB_MVP_L0L1;
724*c83a76b0SSuyog Pawar         value = ihevcd_cabac_decode_bin(ps_cabac,
725*c83a76b0SSuyog Pawar                                         ps_bitstrm,
726*c83a76b0SSuyog Pawar                                         ctxt_idx);
727*c83a76b0SSuyog Pawar 
728*c83a76b0SSuyog Pawar         AEV_TRACE("mvp_l0/l1_flag", value, ps_cabac->u4_range);
729*c83a76b0SSuyog Pawar 
730*c83a76b0SSuyog Pawar         ps_pu->b1_l0_mvp_idx = value;
731*c83a76b0SSuyog Pawar 
732*c83a76b0SSuyog Pawar     }
733*c83a76b0SSuyog Pawar     /* Decode MVD for L1 for PRED_L1 or PRED_BI */
734*c83a76b0SSuyog Pawar     if(inter_pred_idc != PRED_L0)
735*c83a76b0SSuyog Pawar     {
736*c83a76b0SSuyog Pawar         WORD32 active_refs = ps_slice_hdr->i1_num_ref_idx_l1_active;
737*c83a76b0SSuyog Pawar         WORD32 ref_idx = 0;
738*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
739*c83a76b0SSuyog Pawar 
740*c83a76b0SSuyog Pawar         if(active_refs > 1)
741*c83a76b0SSuyog Pawar         {
742*c83a76b0SSuyog Pawar 
743*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_INTER_REF_IDX;
744*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("ref_idx", ps_cabac->u4_range, ctxt_idx);
745*c83a76b0SSuyog Pawar             /* encode the context modelled first bin */
746*c83a76b0SSuyog Pawar             ref_idx = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
747*c83a76b0SSuyog Pawar 
748*c83a76b0SSuyog Pawar             if((active_refs > 2) && ref_idx)
749*c83a76b0SSuyog Pawar             {
750*c83a76b0SSuyog Pawar                 WORD32 value;
751*c83a76b0SSuyog Pawar                 /* encode the context modelled second bin */
752*c83a76b0SSuyog Pawar                 ctxt_idx++;
753*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
754*c83a76b0SSuyog Pawar                 ref_idx += value;
755*c83a76b0SSuyog Pawar                 if((active_refs > 3) && value)
756*c83a76b0SSuyog Pawar                 {
757*c83a76b0SSuyog Pawar                     /* encode remaining bypass bins */
758*c83a76b0SSuyog Pawar                     ref_idx = ihevcd_cabac_decode_bypass_bins_tunary(ps_cabac,
759*c83a76b0SSuyog Pawar                                                                      ps_bitstrm,
760*c83a76b0SSuyog Pawar                                                                      (active_refs - 3)
761*c83a76b0SSuyog Pawar                     );
762*c83a76b0SSuyog Pawar                     ref_idx += 2;
763*c83a76b0SSuyog Pawar                 }
764*c83a76b0SSuyog Pawar             }
765*c83a76b0SSuyog Pawar 
766*c83a76b0SSuyog Pawar             AEV_TRACE("ref_idx", ref_idx, ps_cabac->u4_range);
767*c83a76b0SSuyog Pawar         }
768*c83a76b0SSuyog Pawar 
769*c83a76b0SSuyog Pawar         ref_idx = CLIP3(ref_idx, 0, MAX_DPB_SIZE - 1);
770*c83a76b0SSuyog Pawar         ps_pu->mv.i1_l1_ref_idx = ref_idx;
771*c83a76b0SSuyog Pawar 
772*c83a76b0SSuyog Pawar         if(ps_slice_hdr->i1_mvd_l1_zero_flag && inter_pred_idc == PRED_BI)
773*c83a76b0SSuyog Pawar         {
774*c83a76b0SSuyog Pawar             ps_pu->mv.s_l1_mv.i2_mvx = 0;
775*c83a76b0SSuyog Pawar             ps_pu->mv.s_l1_mv.i2_mvy = 0;
776*c83a76b0SSuyog Pawar         }
777*c83a76b0SSuyog Pawar         else
778*c83a76b0SSuyog Pawar         {
779*c83a76b0SSuyog Pawar             ihevcd_parse_mvd(ps_codec, &ps_pu->mv.s_l1_mv);
780*c83a76b0SSuyog Pawar         }
781*c83a76b0SSuyog Pawar 
782*c83a76b0SSuyog Pawar         ctxt_idx = IHEVC_CAB_MVP_L0L1;
783*c83a76b0SSuyog Pawar         value = ihevcd_cabac_decode_bin(ps_cabac,
784*c83a76b0SSuyog Pawar                                         ps_bitstrm,
785*c83a76b0SSuyog Pawar                                         ctxt_idx);
786*c83a76b0SSuyog Pawar 
787*c83a76b0SSuyog Pawar         AEV_TRACE("mvp_l0/l1_flag", value, ps_cabac->u4_range);
788*c83a76b0SSuyog Pawar         ps_pu->b1_l1_mvp_idx = value;
789*c83a76b0SSuyog Pawar 
790*c83a76b0SSuyog Pawar     }
791*c83a76b0SSuyog Pawar 
792*c83a76b0SSuyog Pawar     ps_pu->b2_pred_mode = inter_pred_idc;
793*c83a76b0SSuyog Pawar     return ret;
794*c83a76b0SSuyog Pawar }
795*c83a76b0SSuyog Pawar /**
796*c83a76b0SSuyog Pawar  *******************************************************************************
797*c83a76b0SSuyog Pawar  *
798*c83a76b0SSuyog Pawar  * @brief
799*c83a76b0SSuyog Pawar  *  Parses Prediction unit
800*c83a76b0SSuyog Pawar  *
801*c83a76b0SSuyog Pawar  * @par Description:
802*c83a76b0SSuyog Pawar  *  Parses Prediction unit as per Section:7.3.9.6
803*c83a76b0SSuyog Pawar  *
804*c83a76b0SSuyog Pawar  * @param[in] ps_codec
805*c83a76b0SSuyog Pawar  *  Pointer to codec context
806*c83a76b0SSuyog Pawar  *
807*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
808*c83a76b0SSuyog Pawar  *
809*c83a76b0SSuyog Pawar  * @remarks
810*c83a76b0SSuyog Pawar  *
811*c83a76b0SSuyog Pawar  *
812*c83a76b0SSuyog Pawar  *******************************************************************************
813*c83a76b0SSuyog Pawar  */
814*c83a76b0SSuyog Pawar 
ihevcd_parse_prediction_unit(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 wd,WORD32 ht)815*c83a76b0SSuyog Pawar IHEVCD_ERROR_T  ihevcd_parse_prediction_unit(codec_t *ps_codec,
816*c83a76b0SSuyog Pawar                                              WORD32 x0,
817*c83a76b0SSuyog Pawar                                              WORD32 y0,
818*c83a76b0SSuyog Pawar                                              WORD32 wd,
819*c83a76b0SSuyog Pawar                                              WORD32 ht)
820*c83a76b0SSuyog Pawar {
821*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
822*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
823*c83a76b0SSuyog Pawar     sps_t *ps_sps;
824*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
825*c83a76b0SSuyog Pawar     WORD32 ctb_x_base;
826*c83a76b0SSuyog Pawar     WORD32 ctb_y_base;
827*c83a76b0SSuyog Pawar 
828*c83a76b0SSuyog Pawar     pu_t *ps_pu = ps_codec->s_parse.ps_pu;
829*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
830*c83a76b0SSuyog Pawar 
831*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
832*c83a76b0SSuyog Pawar 
833*c83a76b0SSuyog Pawar     /* Set PU structure to default values */
834*c83a76b0SSuyog Pawar     memset(ps_pu, 0, sizeof(pu_t));
835*c83a76b0SSuyog Pawar 
836*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps;
837*c83a76b0SSuyog Pawar     ctb_x_base = ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size;
838*c83a76b0SSuyog Pawar     ctb_y_base = ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size;
839*c83a76b0SSuyog Pawar 
840*c83a76b0SSuyog Pawar     ps_pu->b4_pos_x = (x0 - ctb_x_base) >> 2;
841*c83a76b0SSuyog Pawar     ps_pu->b4_pos_y = (y0 - ctb_y_base) >> 2;
842*c83a76b0SSuyog Pawar     ps_pu->b4_wd = (wd >> 2) - 1;
843*c83a76b0SSuyog Pawar     ps_pu->b4_ht = (ht >> 2) - 1;
844*c83a76b0SSuyog Pawar 
845*c83a76b0SSuyog Pawar     ps_pu->b1_intra_flag = 0;
846*c83a76b0SSuyog Pawar     ps_pu->b3_part_mode = ps_codec->s_parse.s_cu.i4_part_mode;
847*c83a76b0SSuyog Pawar 
848*c83a76b0SSuyog Pawar     if(PRED_MODE_SKIP == ps_codec->s_parse.s_cu.i4_pred_mode)
849*c83a76b0SSuyog Pawar     {
850*c83a76b0SSuyog Pawar         WORD32 merge_idx = 0;
851*c83a76b0SSuyog Pawar         if(ps_slice_hdr->i1_max_num_merge_cand > 1)
852*c83a76b0SSuyog Pawar         {
853*c83a76b0SSuyog Pawar             WORD32 ctxt_idx = IHEVC_CAB_MERGE_IDX_EXT;
854*c83a76b0SSuyog Pawar             WORD32 bin;
855*c83a76b0SSuyog Pawar 
856*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("merge_idx", ps_cabac->u4_range, ctxt_idx);
857*c83a76b0SSuyog Pawar             bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
858*c83a76b0SSuyog Pawar             if(bin)
859*c83a76b0SSuyog Pawar             {
860*c83a76b0SSuyog Pawar                 if(ps_slice_hdr->i1_max_num_merge_cand > 2)
861*c83a76b0SSuyog Pawar                 {
862*c83a76b0SSuyog Pawar                     merge_idx = ihevcd_cabac_decode_bypass_bins_tunary(
863*c83a76b0SSuyog Pawar                                     ps_cabac, ps_bitstrm,
864*c83a76b0SSuyog Pawar                                     (ps_slice_hdr->i1_max_num_merge_cand - 2));
865*c83a76b0SSuyog Pawar                 }
866*c83a76b0SSuyog Pawar                 merge_idx++;
867*c83a76b0SSuyog Pawar             }
868*c83a76b0SSuyog Pawar             AEV_TRACE("merge_idx", merge_idx, ps_cabac->u4_range);
869*c83a76b0SSuyog Pawar         }
870*c83a76b0SSuyog Pawar         ps_pu->b1_merge_flag = 1;
871*c83a76b0SSuyog Pawar         ps_pu->b3_merge_idx = merge_idx;
872*c83a76b0SSuyog Pawar 
873*c83a76b0SSuyog Pawar     }
874*c83a76b0SSuyog Pawar     else
875*c83a76b0SSuyog Pawar     {
876*c83a76b0SSuyog Pawar         /* MODE_INTER */
877*c83a76b0SSuyog Pawar         WORD32 merge_flag;
878*c83a76b0SSuyog Pawar         WORD32 ctxt_idx = IHEVC_CAB_MERGE_FLAG_EXT;
879*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("merge_flag", ps_cabac->u4_range, ctxt_idx);
880*c83a76b0SSuyog Pawar         merge_flag = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
881*c83a76b0SSuyog Pawar         AEV_TRACE("merge_flag", merge_flag, ps_cabac->u4_range);
882*c83a76b0SSuyog Pawar 
883*c83a76b0SSuyog Pawar         ps_pu->b1_merge_flag = merge_flag;
884*c83a76b0SSuyog Pawar 
885*c83a76b0SSuyog Pawar         if(merge_flag)
886*c83a76b0SSuyog Pawar         {
887*c83a76b0SSuyog Pawar             WORD32 merge_idx = 0;
888*c83a76b0SSuyog Pawar             if(ps_slice_hdr->i1_max_num_merge_cand > 1)
889*c83a76b0SSuyog Pawar             {
890*c83a76b0SSuyog Pawar                 WORD32 ctxt_idx = IHEVC_CAB_MERGE_IDX_EXT;
891*c83a76b0SSuyog Pawar                 WORD32 bin;
892*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("merge_idx", ps_cabac->u4_range, ctxt_idx);
893*c83a76b0SSuyog Pawar                 bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
894*c83a76b0SSuyog Pawar                 if(bin)
895*c83a76b0SSuyog Pawar                 {
896*c83a76b0SSuyog Pawar                     if(ps_slice_hdr->i1_max_num_merge_cand > 2)
897*c83a76b0SSuyog Pawar                     {
898*c83a76b0SSuyog Pawar                         merge_idx = ihevcd_cabac_decode_bypass_bins_tunary(
899*c83a76b0SSuyog Pawar                                         ps_cabac, ps_bitstrm,
900*c83a76b0SSuyog Pawar                                         (ps_slice_hdr->i1_max_num_merge_cand - 2));
901*c83a76b0SSuyog Pawar                     }
902*c83a76b0SSuyog Pawar                     merge_idx++;
903*c83a76b0SSuyog Pawar                 }
904*c83a76b0SSuyog Pawar                 AEV_TRACE("merge_idx", merge_idx, ps_cabac->u4_range);
905*c83a76b0SSuyog Pawar             }
906*c83a76b0SSuyog Pawar 
907*c83a76b0SSuyog Pawar             ps_pu->b3_merge_idx = merge_idx;
908*c83a76b0SSuyog Pawar         }
909*c83a76b0SSuyog Pawar         else
910*c83a76b0SSuyog Pawar         {
911*c83a76b0SSuyog Pawar             ihevcd_parse_pu_mvp(ps_codec, ps_pu);
912*c83a76b0SSuyog Pawar         }
913*c83a76b0SSuyog Pawar 
914*c83a76b0SSuyog Pawar     }
915*c83a76b0SSuyog Pawar     STATS_UPDATE_PU_SIZE(ps_pu);
916*c83a76b0SSuyog Pawar     /* Increment PU pointer */
917*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_pu++;
918*c83a76b0SSuyog Pawar     ps_codec->s_parse.i4_pic_pu_idx++;
919*c83a76b0SSuyog Pawar     return ret;
920*c83a76b0SSuyog Pawar }
921*c83a76b0SSuyog Pawar 
922*c83a76b0SSuyog Pawar 
ihevcd_parse_part_mode_amp(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm)923*c83a76b0SSuyog Pawar WORD32 ihevcd_parse_part_mode_amp(cab_ctxt_t *ps_cabac, bitstrm_t *ps_bitstrm)
924*c83a76b0SSuyog Pawar {
925*c83a76b0SSuyog Pawar     WORD32 ctxt_idx = IHEVC_CAB_PART_MODE;
926*c83a76b0SSuyog Pawar     WORD32 part_mode_idx;
927*c83a76b0SSuyog Pawar     WORD32 part_mode;
928*c83a76b0SSuyog Pawar     WORD32 bin;
929*c83a76b0SSuyog Pawar 
930*c83a76b0SSuyog Pawar     part_mode = 0;
931*c83a76b0SSuyog Pawar     TRACE_CABAC_CTXT("part_mode", ps_cabac->u4_range, ctxt_idx);
932*c83a76b0SSuyog Pawar     bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx++);
933*c83a76b0SSuyog Pawar 
934*c83a76b0SSuyog Pawar     if(!bin)
935*c83a76b0SSuyog Pawar     {
936*c83a76b0SSuyog Pawar         bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx++);
937*c83a76b0SSuyog Pawar         part_mode_idx = bin;
938*c83a76b0SSuyog Pawar         part_mode_idx <<= 1;
939*c83a76b0SSuyog Pawar 
940*c83a76b0SSuyog Pawar         /* Following takes of handling context increment for 3rd bin in part_mode */
941*c83a76b0SSuyog Pawar         /* When AMP is enabled and the current is not min CB */
942*c83a76b0SSuyog Pawar         /* Context for 3rd bin is 3 and not 2 */
943*c83a76b0SSuyog Pawar         ctxt_idx += 1;
944*c83a76b0SSuyog Pawar 
945*c83a76b0SSuyog Pawar         bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
946*c83a76b0SSuyog Pawar         part_mode_idx |= bin;
947*c83a76b0SSuyog Pawar 
948*c83a76b0SSuyog Pawar         part_mode_idx <<= 1;
949*c83a76b0SSuyog Pawar         if(!bin)
950*c83a76b0SSuyog Pawar         {
951*c83a76b0SSuyog Pawar 
952*c83a76b0SSuyog Pawar             bin = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
953*c83a76b0SSuyog Pawar             part_mode_idx |= bin;
954*c83a76b0SSuyog Pawar         }
955*c83a76b0SSuyog Pawar         part_mode = gau1_part_mode_amp[part_mode_idx];
956*c83a76b0SSuyog Pawar     }
957*c83a76b0SSuyog Pawar     return part_mode;
958*c83a76b0SSuyog Pawar }
ihevcd_parse_coding_unit_intra(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 log2_cb_size)959*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_coding_unit_intra(codec_t *ps_codec,
960*c83a76b0SSuyog Pawar                                               WORD32 x0,
961*c83a76b0SSuyog Pawar                                               WORD32 y0,
962*c83a76b0SSuyog Pawar                                               WORD32 log2_cb_size)
963*c83a76b0SSuyog Pawar {
964*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
965*c83a76b0SSuyog Pawar     sps_t *ps_sps;
966*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
967*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
968*c83a76b0SSuyog Pawar     WORD32 pcm_flag;
969*c83a76b0SSuyog Pawar     WORD32 value;
970*c83a76b0SSuyog Pawar     WORD32 cb_size = 1 << log2_cb_size;
971*c83a76b0SSuyog Pawar     WORD32 part_mode =  ps_codec->s_parse.s_cu.i4_part_mode;
972*c83a76b0SSuyog Pawar     tu_t *ps_tu = ps_codec->s_parse.ps_tu;
973*c83a76b0SSuyog Pawar     pu_t *ps_pu = ps_codec->s_parse.ps_pu;
974*c83a76b0SSuyog Pawar     WORD32 ctb_x_base;
975*c83a76b0SSuyog Pawar     WORD32 ctb_y_base;
976*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps;
977*c83a76b0SSuyog Pawar     ctb_x_base = ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size;
978*c83a76b0SSuyog Pawar     ctb_y_base = ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size;
979*c83a76b0SSuyog Pawar 
980*c83a76b0SSuyog Pawar     memset(ps_pu, 0, sizeof(pu_t));
981*c83a76b0SSuyog Pawar     ps_pu->b1_intra_flag = 1;
982*c83a76b0SSuyog Pawar     ps_pu->b4_wd = (cb_size >> 2) - 1;
983*c83a76b0SSuyog Pawar     ps_pu->b4_ht = (cb_size >> 2) - 1;
984*c83a76b0SSuyog Pawar     ps_pu->b4_pos_x = (x0 - ctb_x_base) >> 2;
985*c83a76b0SSuyog Pawar     ps_pu->b4_pos_y = (y0 - ctb_y_base) >> 2;
986*c83a76b0SSuyog Pawar 
987*c83a76b0SSuyog Pawar     pcm_flag = 0;
988*c83a76b0SSuyog Pawar     if((PART_2Nx2N == part_mode) && (ps_sps->i1_pcm_enabled_flag)
989*c83a76b0SSuyog Pawar                     && (log2_cb_size
990*c83a76b0SSuyog Pawar                                     >= ps_sps->i1_log2_min_pcm_coding_block_size)
991*c83a76b0SSuyog Pawar                     && (log2_cb_size
992*c83a76b0SSuyog Pawar                                     <= (ps_sps->i1_log2_min_pcm_coding_block_size + ps_sps->i1_log2_diff_max_min_pcm_coding_block_size)))
993*c83a76b0SSuyog Pawar     {
994*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("pcm_flag", ps_cabac->u4_range, 0);
995*c83a76b0SSuyog Pawar         pcm_flag = ihevcd_cabac_decode_terminate(ps_cabac, ps_bitstrm);
996*c83a76b0SSuyog Pawar         AEV_TRACE("pcm_flag", pcm_flag, ps_cabac->u4_range);
997*c83a76b0SSuyog Pawar     }
998*c83a76b0SSuyog Pawar 
999*c83a76b0SSuyog Pawar     ps_codec->s_parse.i4_cu_pcm_flag = pcm_flag;
1000*c83a76b0SSuyog Pawar     if(pcm_flag)
1001*c83a76b0SSuyog Pawar     {
1002*c83a76b0SSuyog Pawar         UWORD8 *pu1_luma_intra_pred_mode_top, *pu1_luma_intra_pred_mode_left;
1003*c83a76b0SSuyog Pawar         WORD32 i,  num_pred_blocks;
1004*c83a76b0SSuyog Pawar 
1005*c83a76b0SSuyog Pawar         if(ps_codec->s_parse.s_bitstrm.u4_bit_ofst % 8)
1006*c83a76b0SSuyog Pawar         {
1007*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("pcm_alignment_zero_bit", ps_cabac->u4_range, 0);
1008*c83a76b0SSuyog Pawar             ihevcd_bits_flush_to_byte_boundary(&ps_codec->s_parse.s_bitstrm);
1009*c83a76b0SSuyog Pawar             AEV_TRACE("pcm_alignment_zero_bit", 0, ps_cabac->u4_range);
1010*c83a76b0SSuyog Pawar         }
1011*c83a76b0SSuyog Pawar 
1012*c83a76b0SSuyog Pawar         ihevcd_parse_pcm_sample(ps_codec, x0, y0, log2_cb_size);
1013*c83a76b0SSuyog Pawar 
1014*c83a76b0SSuyog Pawar         ihevcd_cabac_reset(&ps_codec->s_parse.s_cabac,
1015*c83a76b0SSuyog Pawar                            &ps_codec->s_parse.s_bitstrm);
1016*c83a76b0SSuyog Pawar 
1017*c83a76b0SSuyog Pawar         ps_tu = ps_codec->s_parse.ps_tu;
1018*c83a76b0SSuyog Pawar         ps_tu->b1_cb_cbf = 1;
1019*c83a76b0SSuyog Pawar         ps_tu->b1_cr_cbf = 1;
1020*c83a76b0SSuyog Pawar         ps_tu->b1_y_cbf = 1;
1021*c83a76b0SSuyog Pawar         ps_tu->b4_pos_x = ((x0 - ctb_x_base) >> 2);
1022*c83a76b0SSuyog Pawar         ps_tu->b4_pos_y = ((y0 - ctb_y_base) >> 2);
1023*c83a76b0SSuyog Pawar         ps_tu->b1_transquant_bypass = 1;
1024*c83a76b0SSuyog Pawar         ps_tu->b3_size = (log2_cb_size - 2);
1025*c83a76b0SSuyog Pawar         ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
1026*c83a76b0SSuyog Pawar         ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
1027*c83a76b0SSuyog Pawar         ps_tu->b6_luma_intra_mode   = INTRA_PRED_NONE;
1028*c83a76b0SSuyog Pawar 
1029*c83a76b0SSuyog Pawar         /* Set the first TU in CU flag */
1030*c83a76b0SSuyog Pawar         {
1031*c83a76b0SSuyog Pawar             if((ps_codec->s_parse.s_cu.i4_pos_x << 3) == (ps_tu->b4_pos_x << 2) &&
1032*c83a76b0SSuyog Pawar                             (ps_codec->s_parse.s_cu.i4_pos_y << 3) == (ps_tu->b4_pos_y << 2))
1033*c83a76b0SSuyog Pawar             {
1034*c83a76b0SSuyog Pawar                 ps_tu->b1_first_tu_in_cu = 1;
1035*c83a76b0SSuyog Pawar             }
1036*c83a76b0SSuyog Pawar             else
1037*c83a76b0SSuyog Pawar             {
1038*c83a76b0SSuyog Pawar                 ps_tu->b1_first_tu_in_cu = 0;
1039*c83a76b0SSuyog Pawar             }
1040*c83a76b0SSuyog Pawar         }
1041*c83a76b0SSuyog Pawar 
1042*c83a76b0SSuyog Pawar         /* Update the intra pred mode for PCM to INTRA_DC(default mode) */
1043*c83a76b0SSuyog Pawar         pu1_luma_intra_pred_mode_top = ps_codec->s_parse.pu1_luma_intra_pred_mode_top
1044*c83a76b0SSuyog Pawar                         + (ps_codec->s_parse.s_cu.i4_pos_x * 2);
1045*c83a76b0SSuyog Pawar 
1046*c83a76b0SSuyog Pawar         pu1_luma_intra_pred_mode_left = ps_codec->s_parse.pu1_luma_intra_pred_mode_left
1047*c83a76b0SSuyog Pawar                         + (ps_codec->s_parse.s_cu.i4_pos_y * 2);
1048*c83a76b0SSuyog Pawar 
1049*c83a76b0SSuyog Pawar         num_pred_blocks = 1; /* Because PCM part mode will be 2Nx2N */
1050*c83a76b0SSuyog Pawar 
1051*c83a76b0SSuyog Pawar         ps_codec->s_func_selector.ihevc_memset_fptr(pu1_luma_intra_pred_mode_left, INTRA_DC, (cb_size / num_pred_blocks) / MIN_PU_SIZE);
1052*c83a76b0SSuyog Pawar         ps_codec->s_func_selector.ihevc_memset_fptr(pu1_luma_intra_pred_mode_top, INTRA_DC, (cb_size / num_pred_blocks) / MIN_PU_SIZE);
1053*c83a76b0SSuyog Pawar 
1054*c83a76b0SSuyog Pawar 
1055*c83a76b0SSuyog Pawar         /* Set no_loop_filter appropriately */
1056*c83a76b0SSuyog Pawar         if(1 == ps_sps->i1_pcm_loop_filter_disable_flag)
1057*c83a76b0SSuyog Pawar         {
1058*c83a76b0SSuyog Pawar             UWORD8 *pu1_pic_no_loop_filter_flag;
1059*c83a76b0SSuyog Pawar             WORD32 numbytes_row;
1060*c83a76b0SSuyog Pawar             UWORD32 u4_mask;
1061*c83a76b0SSuyog Pawar 
1062*c83a76b0SSuyog Pawar             pu1_pic_no_loop_filter_flag = ps_codec->s_parse.pu1_pic_no_loop_filter_flag;
1063*c83a76b0SSuyog Pawar             numbytes_row =  (ps_sps->i2_pic_width_in_luma_samples + 63) / 64;
1064*c83a76b0SSuyog Pawar             pu1_pic_no_loop_filter_flag += (y0 / 8) * numbytes_row;
1065*c83a76b0SSuyog Pawar             pu1_pic_no_loop_filter_flag += (x0 / 64);
1066*c83a76b0SSuyog Pawar             /* Generate (cb_size / 8) number of 1s */
1067*c83a76b0SSuyog Pawar             /* i.e (log2_cb_size - 2) number of 1s */
1068*c83a76b0SSuyog Pawar             u4_mask = LSB_ONES((cb_size >> 3));
1069*c83a76b0SSuyog Pawar             for(i = 0; i < (cb_size / 8); i++)
1070*c83a76b0SSuyog Pawar             {
1071*c83a76b0SSuyog Pawar                 *pu1_pic_no_loop_filter_flag |= (u4_mask << (((x0) / 8) % 8));
1072*c83a76b0SSuyog Pawar                 pu1_pic_no_loop_filter_flag += numbytes_row;
1073*c83a76b0SSuyog Pawar             }
1074*c83a76b0SSuyog Pawar         }
1075*c83a76b0SSuyog Pawar         /* Increment ps_tu and tu_idx */
1076*c83a76b0SSuyog Pawar         ps_codec->s_parse.ps_tu++;
1077*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_tu_cnt++;
1078*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_pic_tu_idx++;
1079*c83a76b0SSuyog Pawar 
1080*c83a76b0SSuyog Pawar     }
1081*c83a76b0SSuyog Pawar     else
1082*c83a76b0SSuyog Pawar     {
1083*c83a76b0SSuyog Pawar         WORD32 cnt = 0;
1084*c83a76b0SSuyog Pawar         WORD32 i;
1085*c83a76b0SSuyog Pawar         WORD32 part_cnt;
1086*c83a76b0SSuyog Pawar 
1087*c83a76b0SSuyog Pawar         part_cnt = (part_mode == PART_NxN) ? 4 : 1;
1088*c83a76b0SSuyog Pawar 
1089*c83a76b0SSuyog Pawar         for(i = 0; i < part_cnt; i++)
1090*c83a76b0SSuyog Pawar         {
1091*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("prev_intra_pred_luma_flag", ps_cabac->u4_range, IHEVC_CAB_INTRA_LUMA_PRED_FLAG);
1092*c83a76b0SSuyog Pawar             value = ihevcd_cabac_decode_bin(ps_cabac,
1093*c83a76b0SSuyog Pawar                                             ps_bitstrm,
1094*c83a76b0SSuyog Pawar                                             IHEVC_CAB_INTRA_LUMA_PRED_FLAG);
1095*c83a76b0SSuyog Pawar 
1096*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.ai4_prev_intra_luma_pred_flag[i] =
1097*c83a76b0SSuyog Pawar                             value;
1098*c83a76b0SSuyog Pawar             AEV_TRACE("prev_intra_pred_luma_flag", value, ps_cabac->u4_range);
1099*c83a76b0SSuyog Pawar         }
1100*c83a76b0SSuyog Pawar 
1101*c83a76b0SSuyog Pawar         for(i = 0; i < part_cnt; i++)
1102*c83a76b0SSuyog Pawar         {
1103*c83a76b0SSuyog Pawar             if(ps_codec->s_parse.s_cu.ai4_prev_intra_luma_pred_flag[cnt])
1104*c83a76b0SSuyog Pawar             {
1105*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bypass_bins_tunary(ps_cabac, ps_bitstrm, 2);
1106*c83a76b0SSuyog Pawar                 AEV_TRACE("mpm_idx", value, ps_cabac->u4_range);
1107*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.ai4_mpm_idx[cnt] = value;
1108*c83a76b0SSuyog Pawar             }
1109*c83a76b0SSuyog Pawar             else
1110*c83a76b0SSuyog Pawar             {
1111*c83a76b0SSuyog Pawar                 value = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, 5);
1112*c83a76b0SSuyog Pawar                 AEV_TRACE("rem_intra_luma_pred_mode", value,
1113*c83a76b0SSuyog Pawar                           ps_cabac->u4_range);
1114*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.ai4_rem_intra_luma_pred_mode[cnt] =
1115*c83a76b0SSuyog Pawar                                 value;
1116*c83a76b0SSuyog Pawar             }
1117*c83a76b0SSuyog Pawar             cnt++;
1118*c83a76b0SSuyog Pawar         }
1119*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("intra_chroma_pred_mode", ps_cabac->u4_range, IHEVC_CAB_CHROMA_PRED_MODE);
1120*c83a76b0SSuyog Pawar         value = ihevcd_cabac_decode_bin(ps_cabac,
1121*c83a76b0SSuyog Pawar                                         ps_bitstrm,
1122*c83a76b0SSuyog Pawar                                         IHEVC_CAB_CHROMA_PRED_MODE);
1123*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx = 4;
1124*c83a76b0SSuyog Pawar         if(value)
1125*c83a76b0SSuyog Pawar         {
1126*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx =
1127*c83a76b0SSuyog Pawar                             ihevcd_cabac_decode_bypass_bins(ps_cabac,
1128*c83a76b0SSuyog Pawar                                                             ps_bitstrm, 2);
1129*c83a76b0SSuyog Pawar         }
1130*c83a76b0SSuyog Pawar         AEV_TRACE("intra_chroma_pred_mode",
1131*c83a76b0SSuyog Pawar                   ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx,
1132*c83a76b0SSuyog Pawar                   ps_cabac->u4_range);
1133*c83a76b0SSuyog Pawar 
1134*c83a76b0SSuyog Pawar 
1135*c83a76b0SSuyog Pawar         ihevcd_intra_pred_mode_prediction(ps_codec, log2_cb_size, x0, y0);
1136*c83a76b0SSuyog Pawar     }
1137*c83a76b0SSuyog Pawar     STATS_UPDATE_PU_SIZE(ps_pu);
1138*c83a76b0SSuyog Pawar     /* Increment PU pointer */
1139*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_pu++;
1140*c83a76b0SSuyog Pawar     ps_codec->s_parse.i4_pic_pu_idx++;
1141*c83a76b0SSuyog Pawar 
1142*c83a76b0SSuyog Pawar     return ret;
1143*c83a76b0SSuyog Pawar }
1144*c83a76b0SSuyog Pawar /**
1145*c83a76b0SSuyog Pawar  *******************************************************************************
1146*c83a76b0SSuyog Pawar  *
1147*c83a76b0SSuyog Pawar  * @brief
1148*c83a76b0SSuyog Pawar  *  Parses coding unit
1149*c83a76b0SSuyog Pawar  *
1150*c83a76b0SSuyog Pawar  * @par Description:
1151*c83a76b0SSuyog Pawar  *  Parses coding unit as per Section:7.3.9.5
1152*c83a76b0SSuyog Pawar  *
1153*c83a76b0SSuyog Pawar  * @param[in] ps_codec
1154*c83a76b0SSuyog Pawar  *  Pointer to codec context
1155*c83a76b0SSuyog Pawar  *
1156*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
1157*c83a76b0SSuyog Pawar  *
1158*c83a76b0SSuyog Pawar  * @remarks
1159*c83a76b0SSuyog Pawar  *
1160*c83a76b0SSuyog Pawar  *
1161*c83a76b0SSuyog Pawar  *******************************************************************************
1162*c83a76b0SSuyog Pawar  */
1163*c83a76b0SSuyog Pawar 
ihevcd_parse_coding_unit(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 log2_cb_size)1164*c83a76b0SSuyog Pawar IHEVCD_ERROR_T  ihevcd_parse_coding_unit(codec_t *ps_codec,
1165*c83a76b0SSuyog Pawar                                          WORD32 x0,
1166*c83a76b0SSuyog Pawar                                          WORD32 y0,
1167*c83a76b0SSuyog Pawar                                          WORD32 log2_cb_size)
1168*c83a76b0SSuyog Pawar {
1169*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1170*c83a76b0SSuyog Pawar     sps_t *ps_sps;
1171*c83a76b0SSuyog Pawar     pps_t *ps_pps;
1172*c83a76b0SSuyog Pawar     WORD32 cb_size;
1173*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
1174*c83a76b0SSuyog Pawar     WORD32 skip_flag;
1175*c83a76b0SSuyog Pawar     WORD32 pcm_flag;
1176*c83a76b0SSuyog Pawar     UWORD32 *pu4_skip_top = ps_codec->s_parse.pu4_skip_cu_top;
1177*c83a76b0SSuyog Pawar     UWORD32 u4_skip_left = ps_codec->s_parse.u4_skip_cu_left;
1178*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
1179*c83a76b0SSuyog Pawar     tu_t *ps_tu = ps_codec->s_parse.ps_tu;
1180*c83a76b0SSuyog Pawar 
1181*c83a76b0SSuyog Pawar     WORD32 cu_pos_x;
1182*c83a76b0SSuyog Pawar     WORD32 cu_pos_y;
1183*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
1184*c83a76b0SSuyog Pawar 
1185*c83a76b0SSuyog Pawar     ASSERT(0 == (x0 % 8));
1186*c83a76b0SSuyog Pawar     ASSERT(0 == (y0 % 8));
1187*c83a76b0SSuyog Pawar 
1188*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_tu_cnt = 0;
1189*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps;
1190*c83a76b0SSuyog Pawar     ps_pps = ps_codec->s_parse.ps_pps;
1191*c83a76b0SSuyog Pawar 
1192*c83a76b0SSuyog Pawar     cu_pos_x = ps_codec->s_parse.s_cu.i4_pos_x;
1193*c83a76b0SSuyog Pawar     cu_pos_y = ps_codec->s_parse.s_cu.i4_pos_y;
1194*c83a76b0SSuyog Pawar 
1195*c83a76b0SSuyog Pawar 
1196*c83a76b0SSuyog Pawar 
1197*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
1198*c83a76b0SSuyog Pawar 
1199*c83a76b0SSuyog Pawar 
1200*c83a76b0SSuyog Pawar     cb_size = 1 << log2_cb_size;
1201*c83a76b0SSuyog Pawar 
1202*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_cu_transquant_bypass = 0;
1203*c83a76b0SSuyog Pawar 
1204*c83a76b0SSuyog Pawar     if(ps_pps->i1_transquant_bypass_enable_flag)
1205*c83a76b0SSuyog Pawar     {
1206*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("cu_transquant_bypass_flag", ps_cabac->u4_range, IHEVC_CAB_CU_TQ_BYPASS_FLAG);
1207*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_cu_transquant_bypass =
1208*c83a76b0SSuyog Pawar                         ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm,
1209*c83a76b0SSuyog Pawar                                                 IHEVC_CAB_CU_TQ_BYPASS_FLAG);
1210*c83a76b0SSuyog Pawar         /* Update transquant_bypass in ps_tu */
1211*c83a76b0SSuyog Pawar 
1212*c83a76b0SSuyog Pawar         AEV_TRACE("cu_transquant_bypass_flag", ps_codec->s_parse.s_cu.i4_cu_transquant_bypass,
1213*c83a76b0SSuyog Pawar                   ps_cabac->u4_range);
1214*c83a76b0SSuyog Pawar 
1215*c83a76b0SSuyog Pawar         if(ps_codec->s_parse.s_cu.i4_cu_transquant_bypass)
1216*c83a76b0SSuyog Pawar         {
1217*c83a76b0SSuyog Pawar             UWORD8 *pu1_pic_no_loop_filter_flag = ps_codec->s_parse.pu1_pic_no_loop_filter_flag;
1218*c83a76b0SSuyog Pawar             UWORD32 u4_mask;
1219*c83a76b0SSuyog Pawar             WORD32 i;
1220*c83a76b0SSuyog Pawar             WORD32 numbytes_row;
1221*c83a76b0SSuyog Pawar             numbytes_row =  (ps_sps->i2_pic_width_in_luma_samples + 63) / 64;
1222*c83a76b0SSuyog Pawar             pu1_pic_no_loop_filter_flag += (y0 / 8) * numbytes_row;
1223*c83a76b0SSuyog Pawar             pu1_pic_no_loop_filter_flag += (x0 / 64);
1224*c83a76b0SSuyog Pawar 
1225*c83a76b0SSuyog Pawar             /* Generate (cb_size / 8) number of 1s */
1226*c83a76b0SSuyog Pawar             /* i.e (log2_cb_size - 2) number of 1s */
1227*c83a76b0SSuyog Pawar             u4_mask = LSB_ONES((cb_size >> 3));
1228*c83a76b0SSuyog Pawar             for(i = 0; i < (cb_size / 8); i++)
1229*c83a76b0SSuyog Pawar             {
1230*c83a76b0SSuyog Pawar                 *pu1_pic_no_loop_filter_flag |= (u4_mask << (((x0) / 8) % 8));
1231*c83a76b0SSuyog Pawar                 pu1_pic_no_loop_filter_flag += numbytes_row;
1232*c83a76b0SSuyog Pawar             }
1233*c83a76b0SSuyog Pawar         }
1234*c83a76b0SSuyog Pawar     }
1235*c83a76b0SSuyog Pawar 
1236*c83a76b0SSuyog Pawar     {
1237*c83a76b0SSuyog Pawar         UWORD32 u4_skip_top = 0;
1238*c83a76b0SSuyog Pawar         UWORD32 u4_mask;
1239*c83a76b0SSuyog Pawar         UWORD32 u4_top_mask, u4_left_mask;
1240*c83a76b0SSuyog Pawar         UWORD32 u4_min_cu_x = x0 / 8;
1241*c83a76b0SSuyog Pawar         UWORD32 u4_min_cu_y = y0 / 8;
1242*c83a76b0SSuyog Pawar 
1243*c83a76b0SSuyog Pawar         pu4_skip_top += (u4_min_cu_x / 32);
1244*c83a76b0SSuyog Pawar 
1245*c83a76b0SSuyog Pawar 
1246*c83a76b0SSuyog Pawar         if(ps_slice_hdr->i1_slice_type != ISLICE)
1247*c83a76b0SSuyog Pawar         {
1248*c83a76b0SSuyog Pawar             WORD32 ctx_idx_inc;
1249*c83a76b0SSuyog Pawar             ctx_idx_inc = 0;
1250*c83a76b0SSuyog Pawar 
1251*c83a76b0SSuyog Pawar             if((0 != cu_pos_y) ||
1252*c83a76b0SSuyog Pawar                             ((0 != ps_codec->s_parse.i4_ctb_slice_y) &&
1253*c83a76b0SSuyog Pawar                                             (0 != ps_codec->s_parse.i4_ctb_tile_y)))
1254*c83a76b0SSuyog Pawar             {
1255*c83a76b0SSuyog Pawar                 u4_skip_top = *pu4_skip_top;
1256*c83a76b0SSuyog Pawar                 u4_skip_top >>= (u4_min_cu_x % 32);
1257*c83a76b0SSuyog Pawar                 if(u4_skip_top & 1)
1258*c83a76b0SSuyog Pawar                     ctx_idx_inc++;
1259*c83a76b0SSuyog Pawar             }
1260*c83a76b0SSuyog Pawar 
1261*c83a76b0SSuyog Pawar             /*****************************************************************/
1262*c83a76b0SSuyog Pawar             /* If cu_pos_x is non-zero then left is available                */
1263*c83a76b0SSuyog Pawar             /* If cu_pos_x is zero then ensure both the following are true   */
1264*c83a76b0SSuyog Pawar             /*    Current CTB is not the first CTB in a tile row             */
1265*c83a76b0SSuyog Pawar             /*    Current CTB is not the first CTB in a slice                */
1266*c83a76b0SSuyog Pawar             /*****************************************************************/
1267*c83a76b0SSuyog Pawar             if((0 != cu_pos_x) ||
1268*c83a76b0SSuyog Pawar                             (((0 != ps_codec->s_parse.i4_ctb_slice_x) || (0 != ps_codec->s_parse.i4_ctb_slice_y)) &&
1269*c83a76b0SSuyog Pawar                                             (0 != ps_codec->s_parse.i4_ctb_tile_x)))
1270*c83a76b0SSuyog Pawar             {
1271*c83a76b0SSuyog Pawar                 u4_skip_left >>= (u4_min_cu_y % 32);
1272*c83a76b0SSuyog Pawar                 if(u4_skip_left & 1)
1273*c83a76b0SSuyog Pawar                     ctx_idx_inc++;
1274*c83a76b0SSuyog Pawar             }
1275*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("cu_skip_flag", ps_cabac->u4_range, (IHEVC_CAB_SKIP_FLAG + ctx_idx_inc));
1276*c83a76b0SSuyog Pawar             skip_flag = ihevcd_cabac_decode_bin(ps_cabac,
1277*c83a76b0SSuyog Pawar                                                 ps_bitstrm,
1278*c83a76b0SSuyog Pawar                                                 (IHEVC_CAB_SKIP_FLAG + ctx_idx_inc));
1279*c83a76b0SSuyog Pawar 
1280*c83a76b0SSuyog Pawar             AEV_TRACE("cu_skip_flag", skip_flag, ps_cabac->u4_range);
1281*c83a76b0SSuyog Pawar         }
1282*c83a76b0SSuyog Pawar         else
1283*c83a76b0SSuyog Pawar             skip_flag = 0;
1284*c83a76b0SSuyog Pawar 
1285*c83a76b0SSuyog Pawar         /* Update top skip_flag */
1286*c83a76b0SSuyog Pawar         u4_skip_top = *pu4_skip_top;
1287*c83a76b0SSuyog Pawar         /* Since Max cb_size is 64, maximum of 8 bits will be set or reset */
1288*c83a76b0SSuyog Pawar         /* Also since Coding block will be within 64x64 grid, only 8bits within a WORD32
1289*c83a76b0SSuyog Pawar          * need to be updated. These 8 bits will not cross 8 bit boundaries
1290*c83a76b0SSuyog Pawar          */
1291*c83a76b0SSuyog Pawar         u4_mask = LSB_ONES(cb_size / 8);
1292*c83a76b0SSuyog Pawar         u4_top_mask = u4_mask << (u4_min_cu_x % 32);
1293*c83a76b0SSuyog Pawar 
1294*c83a76b0SSuyog Pawar 
1295*c83a76b0SSuyog Pawar         if(skip_flag)
1296*c83a76b0SSuyog Pawar         {
1297*c83a76b0SSuyog Pawar             u4_skip_top |= u4_top_mask;
1298*c83a76b0SSuyog Pawar         }
1299*c83a76b0SSuyog Pawar         else
1300*c83a76b0SSuyog Pawar         {
1301*c83a76b0SSuyog Pawar             u4_skip_top &= ~u4_top_mask;
1302*c83a76b0SSuyog Pawar         }
1303*c83a76b0SSuyog Pawar         *pu4_skip_top = u4_skip_top;
1304*c83a76b0SSuyog Pawar 
1305*c83a76b0SSuyog Pawar         /* Update left skip_flag */
1306*c83a76b0SSuyog Pawar         u4_skip_left = ps_codec->s_parse.u4_skip_cu_left;
1307*c83a76b0SSuyog Pawar         u4_mask = LSB_ONES(cb_size / 8);
1308*c83a76b0SSuyog Pawar         u4_left_mask = u4_mask << (u4_min_cu_y % 32);
1309*c83a76b0SSuyog Pawar 
1310*c83a76b0SSuyog Pawar         if(skip_flag)
1311*c83a76b0SSuyog Pawar         {
1312*c83a76b0SSuyog Pawar             u4_skip_left |= u4_left_mask;
1313*c83a76b0SSuyog Pawar         }
1314*c83a76b0SSuyog Pawar         else
1315*c83a76b0SSuyog Pawar         {
1316*c83a76b0SSuyog Pawar             u4_skip_left &= ~u4_left_mask;
1317*c83a76b0SSuyog Pawar         }
1318*c83a76b0SSuyog Pawar         ps_codec->s_parse.u4_skip_cu_left = u4_skip_left;
1319*c83a76b0SSuyog Pawar     }
1320*c83a76b0SSuyog Pawar     ps_codec->s_parse.i4_cu_pcm_flag = 0;
1321*c83a76b0SSuyog Pawar 
1322*c83a76b0SSuyog Pawar     if(skip_flag)
1323*c83a76b0SSuyog Pawar     {
1324*c83a76b0SSuyog Pawar         WORD32 ctb_x_base;
1325*c83a76b0SSuyog Pawar         WORD32 ctb_y_base;
1326*c83a76b0SSuyog Pawar 
1327*c83a76b0SSuyog Pawar         ctb_x_base = ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size;
1328*c83a76b0SSuyog Pawar         ctb_y_base = ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size;
1329*c83a76b0SSuyog Pawar 
1330*c83a76b0SSuyog Pawar         ps_tu->b1_cb_cbf = 0;
1331*c83a76b0SSuyog Pawar         ps_tu->b1_cr_cbf = 0;
1332*c83a76b0SSuyog Pawar         ps_tu->b1_y_cbf = 0;
1333*c83a76b0SSuyog Pawar         ps_tu->b4_pos_x = ((x0 - ctb_x_base) >> 2);
1334*c83a76b0SSuyog Pawar         ps_tu->b4_pos_y = ((y0 - ctb_y_base) >> 2);
1335*c83a76b0SSuyog Pawar         ps_tu->b1_transquant_bypass = 0;
1336*c83a76b0SSuyog Pawar         ps_tu->b3_size = (log2_cb_size - 2);
1337*c83a76b0SSuyog Pawar         ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
1338*c83a76b0SSuyog Pawar         ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
1339*c83a76b0SSuyog Pawar         ps_tu->b6_luma_intra_mode   = INTRA_PRED_NONE;
1340*c83a76b0SSuyog Pawar 
1341*c83a76b0SSuyog Pawar         /* Set the first TU in CU flag */
1342*c83a76b0SSuyog Pawar         {
1343*c83a76b0SSuyog Pawar             if((ps_codec->s_parse.s_cu.i4_pos_x << 3) == (ps_tu->b4_pos_x << 2) &&
1344*c83a76b0SSuyog Pawar                             (ps_codec->s_parse.s_cu.i4_pos_y << 3) == (ps_tu->b4_pos_y << 2))
1345*c83a76b0SSuyog Pawar             {
1346*c83a76b0SSuyog Pawar                 ps_tu->b1_first_tu_in_cu = 1;
1347*c83a76b0SSuyog Pawar             }
1348*c83a76b0SSuyog Pawar             else
1349*c83a76b0SSuyog Pawar             {
1350*c83a76b0SSuyog Pawar                 ps_tu->b1_first_tu_in_cu = 0;
1351*c83a76b0SSuyog Pawar             }
1352*c83a76b0SSuyog Pawar         }
1353*c83a76b0SSuyog Pawar 
1354*c83a76b0SSuyog Pawar         ps_codec->s_parse.ps_tu++;
1355*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_tu_cnt++;
1356*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_pic_tu_idx++;
1357*c83a76b0SSuyog Pawar 
1358*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_pred_mode = PRED_MODE_SKIP;
1359*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_part_mode = PART_2Nx2N;
1360*c83a76b0SSuyog Pawar         {
1361*c83a76b0SSuyog Pawar             pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1362*c83a76b0SSuyog Pawar             ps_pu->b2_part_idx = 0;
1363*c83a76b0SSuyog Pawar             ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size, cb_size);
1364*c83a76b0SSuyog Pawar             STATS_UPDATE_PU_SKIP_SIZE(ps_pu);
1365*c83a76b0SSuyog Pawar         }
1366*c83a76b0SSuyog Pawar     }
1367*c83a76b0SSuyog Pawar     else
1368*c83a76b0SSuyog Pawar     {
1369*c83a76b0SSuyog Pawar         WORD32 pred_mode;
1370*c83a76b0SSuyog Pawar         WORD32 part_mode;
1371*c83a76b0SSuyog Pawar         WORD32 intra_split_flag;
1372*c83a76b0SSuyog Pawar         WORD32 is_mincb;
1373*c83a76b0SSuyog Pawar         cb_size = (1 << log2_cb_size);
1374*c83a76b0SSuyog Pawar         is_mincb = (cb_size == (1 << ps_sps->i1_log2_min_coding_block_size));
1375*c83a76b0SSuyog Pawar         pcm_flag = 0;
1376*c83a76b0SSuyog Pawar         if(ps_slice_hdr->i1_slice_type != ISLICE)
1377*c83a76b0SSuyog Pawar         {
1378*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("pred_mode_flag", ps_cabac->u4_range, IHEVC_CAB_PRED_MODE);
1379*c83a76b0SSuyog Pawar             pred_mode = ihevcd_cabac_decode_bin(ps_cabac,
1380*c83a76b0SSuyog Pawar                                                 ps_bitstrm,
1381*c83a76b0SSuyog Pawar                                                 IHEVC_CAB_PRED_MODE);
1382*c83a76b0SSuyog Pawar 
1383*c83a76b0SSuyog Pawar             AEV_TRACE("pred_mode_flag", pred_mode, ps_cabac->u4_range);
1384*c83a76b0SSuyog Pawar         }
1385*c83a76b0SSuyog Pawar         else
1386*c83a76b0SSuyog Pawar         {
1387*c83a76b0SSuyog Pawar             pred_mode = PRED_MODE_INTRA;
1388*c83a76b0SSuyog Pawar         }
1389*c83a76b0SSuyog Pawar 
1390*c83a76b0SSuyog Pawar         /* If current CU is intra then set corresponging bit in picture level intra map */
1391*c83a76b0SSuyog Pawar         if(PRED_MODE_INTRA == pred_mode)
1392*c83a76b0SSuyog Pawar         {
1393*c83a76b0SSuyog Pawar             UWORD8 *pu1_pic_intra_flag = ps_codec->s_parse.pu1_pic_intra_flag;
1394*c83a76b0SSuyog Pawar             UWORD32 u4_mask;
1395*c83a76b0SSuyog Pawar             WORD32 i;
1396*c83a76b0SSuyog Pawar             WORD32 numbytes_row;
1397*c83a76b0SSuyog Pawar             numbytes_row =  (ps_sps->i2_pic_width_in_luma_samples + 63) / 64;
1398*c83a76b0SSuyog Pawar             pu1_pic_intra_flag += (y0 / 8) * numbytes_row;
1399*c83a76b0SSuyog Pawar             pu1_pic_intra_flag += (x0 / 64);
1400*c83a76b0SSuyog Pawar 
1401*c83a76b0SSuyog Pawar             /* Generate (cb_size / 8) number of 1s */
1402*c83a76b0SSuyog Pawar             /* i.e (log2_cb_size - 2) number of 1s */
1403*c83a76b0SSuyog Pawar             u4_mask = LSB_ONES((cb_size >> 3));
1404*c83a76b0SSuyog Pawar             for(i = 0; i < (cb_size / 8); i++)
1405*c83a76b0SSuyog Pawar             {
1406*c83a76b0SSuyog Pawar                 *pu1_pic_intra_flag |= (u4_mask << (((x0) / 8) % 8));
1407*c83a76b0SSuyog Pawar                 pu1_pic_intra_flag += numbytes_row;
1408*c83a76b0SSuyog Pawar             }
1409*c83a76b0SSuyog Pawar         }
1410*c83a76b0SSuyog Pawar 
1411*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_pred_mode = pred_mode;
1412*c83a76b0SSuyog Pawar         intra_split_flag = 0;
1413*c83a76b0SSuyog Pawar         if((PRED_MODE_INTRA != pred_mode) ||
1414*c83a76b0SSuyog Pawar                         is_mincb)
1415*c83a76b0SSuyog Pawar         {
1416*c83a76b0SSuyog Pawar             UWORD32 bin;
1417*c83a76b0SSuyog Pawar             if(PRED_MODE_INTRA == pred_mode)
1418*c83a76b0SSuyog Pawar             {
1419*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("part_mode", ps_cabac->u4_range, IHEVC_CAB_PART_MODE);
1420*c83a76b0SSuyog Pawar                 bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, IHEVC_CAB_PART_MODE);
1421*c83a76b0SSuyog Pawar                 part_mode = (bin) ? PART_2Nx2N : PART_NxN;
1422*c83a76b0SSuyog Pawar             }
1423*c83a76b0SSuyog Pawar             else
1424*c83a76b0SSuyog Pawar             {
1425*c83a76b0SSuyog Pawar                 WORD32 amp_enabled = ps_sps->i1_amp_enabled_flag;
1426*c83a76b0SSuyog Pawar 
1427*c83a76b0SSuyog Pawar                 UWORD32 u4_max_bin_cnt = 0;
1428*c83a76b0SSuyog Pawar 
1429*c83a76b0SSuyog Pawar 
1430*c83a76b0SSuyog Pawar 
1431*c83a76b0SSuyog Pawar                 if(amp_enabled && !is_mincb)
1432*c83a76b0SSuyog Pawar                 {
1433*c83a76b0SSuyog Pawar                     part_mode = ihevcd_parse_part_mode_amp(ps_cabac, ps_bitstrm);
1434*c83a76b0SSuyog Pawar                 }
1435*c83a76b0SSuyog Pawar                 else
1436*c83a76b0SSuyog Pawar                 {
1437*c83a76b0SSuyog Pawar                     WORD32 ctxt_inc = IHEVC_CAB_PART_MODE;
1438*c83a76b0SSuyog Pawar 
1439*c83a76b0SSuyog Pawar                     u4_max_bin_cnt = 2;
1440*c83a76b0SSuyog Pawar                     if((is_mincb) && (cb_size > 8))
1441*c83a76b0SSuyog Pawar                     {
1442*c83a76b0SSuyog Pawar                         u4_max_bin_cnt++;
1443*c83a76b0SSuyog Pawar                     }
1444*c83a76b0SSuyog Pawar 
1445*c83a76b0SSuyog Pawar                     part_mode = -1;
1446*c83a76b0SSuyog Pawar                     TRACE_CABAC_CTXT("part_mode", ps_cabac->u4_range, IHEVC_CAB_PART_MODE);
1447*c83a76b0SSuyog Pawar                     do
1448*c83a76b0SSuyog Pawar                     {
1449*c83a76b0SSuyog Pawar                         bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm,
1450*c83a76b0SSuyog Pawar                                                       ctxt_inc++);
1451*c83a76b0SSuyog Pawar                         part_mode++;
1452*c83a76b0SSuyog Pawar                     }while(--u4_max_bin_cnt && !bin);
1453*c83a76b0SSuyog Pawar 
1454*c83a76b0SSuyog Pawar                     /* If the last bin was zero, then increment part mode by 1 */
1455*c83a76b0SSuyog Pawar                     if(!bin)
1456*c83a76b0SSuyog Pawar                         part_mode++;
1457*c83a76b0SSuyog Pawar                 }
1458*c83a76b0SSuyog Pawar 
1459*c83a76b0SSuyog Pawar 
1460*c83a76b0SSuyog Pawar             }
1461*c83a76b0SSuyog Pawar 
1462*c83a76b0SSuyog Pawar             AEV_TRACE("part_mode", part_mode, ps_cabac->u4_range);
1463*c83a76b0SSuyog Pawar 
1464*c83a76b0SSuyog Pawar         }
1465*c83a76b0SSuyog Pawar         else
1466*c83a76b0SSuyog Pawar         {
1467*c83a76b0SSuyog Pawar             part_mode = 0;
1468*c83a76b0SSuyog Pawar             intra_split_flag = 0;
1469*c83a76b0SSuyog Pawar         }
1470*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_part_mode = part_mode;
1471*c83a76b0SSuyog Pawar 
1472*c83a76b0SSuyog Pawar         if((PRED_MODE_INTRA == ps_codec->s_parse.s_cu.i4_pred_mode) &&
1473*c83a76b0SSuyog Pawar                         (PART_NxN == ps_codec->s_parse.s_cu.i4_part_mode))
1474*c83a76b0SSuyog Pawar         {
1475*c83a76b0SSuyog Pawar             intra_split_flag = 1;
1476*c83a76b0SSuyog Pawar         }
1477*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_part_mode = part_mode;
1478*c83a76b0SSuyog Pawar         ps_codec->s_parse.s_cu.i4_intra_split_flag = intra_split_flag;
1479*c83a76b0SSuyog Pawar         if(pred_mode == PRED_MODE_INTRA)
1480*c83a76b0SSuyog Pawar         {
1481*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_cu_pcm_flag = 0;
1482*c83a76b0SSuyog Pawar             ihevcd_parse_coding_unit_intra(ps_codec, x0, y0, log2_cb_size);
1483*c83a76b0SSuyog Pawar             pcm_flag = ps_codec->s_parse.i4_cu_pcm_flag;
1484*c83a76b0SSuyog Pawar 
1485*c83a76b0SSuyog Pawar         }
1486*c83a76b0SSuyog Pawar         else
1487*c83a76b0SSuyog Pawar         {
1488*c83a76b0SSuyog Pawar             if(part_mode == PART_2Nx2N)
1489*c83a76b0SSuyog Pawar             {
1490*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1491*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size, cb_size);
1492*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1493*c83a76b0SSuyog Pawar             }
1494*c83a76b0SSuyog Pawar             else if(part_mode == PART_2NxN)
1495*c83a76b0SSuyog Pawar             {
1496*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1497*c83a76b0SSuyog Pawar 
1498*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size, cb_size / 2);
1499*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1500*c83a76b0SSuyog Pawar 
1501*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1502*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0 + (cb_size / 2), cb_size, cb_size / 2);
1503*c83a76b0SSuyog Pawar 
1504*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1505*c83a76b0SSuyog Pawar             }
1506*c83a76b0SSuyog Pawar             else if(part_mode == PART_Nx2N)
1507*c83a76b0SSuyog Pawar             {
1508*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1509*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size / 2, cb_size);
1510*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1511*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1512*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0 + (cb_size / 2), y0, cb_size / 2, cb_size);
1513*c83a76b0SSuyog Pawar 
1514*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1515*c83a76b0SSuyog Pawar             }
1516*c83a76b0SSuyog Pawar             else if(part_mode == PART_2NxnU)
1517*c83a76b0SSuyog Pawar             {
1518*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1519*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size, cb_size / 4);
1520*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1521*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1522*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0 + (cb_size / 4), cb_size, cb_size * 3 / 4);
1523*c83a76b0SSuyog Pawar 
1524*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1525*c83a76b0SSuyog Pawar             }
1526*c83a76b0SSuyog Pawar             else if(part_mode == PART_2NxnD)
1527*c83a76b0SSuyog Pawar             {
1528*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1529*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size, cb_size * 3 / 4);
1530*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1531*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1532*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0 + (cb_size * 3 / 4), cb_size, cb_size / 4);
1533*c83a76b0SSuyog Pawar 
1534*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1535*c83a76b0SSuyog Pawar             }
1536*c83a76b0SSuyog Pawar             else if(part_mode == PART_nLx2N)
1537*c83a76b0SSuyog Pawar             {
1538*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1539*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size / 4, cb_size);
1540*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1541*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1542*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0 + (cb_size / 4), y0, cb_size * 3 / 4, cb_size);
1543*c83a76b0SSuyog Pawar 
1544*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1545*c83a76b0SSuyog Pawar             }
1546*c83a76b0SSuyog Pawar             else if(part_mode == PART_nRx2N)
1547*c83a76b0SSuyog Pawar             {
1548*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1549*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size * 3 / 4, cb_size);
1550*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1551*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1552*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0 + (cb_size * 3 / 4), y0, cb_size / 4, cb_size);
1553*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1554*c83a76b0SSuyog Pawar             }
1555*c83a76b0SSuyog Pawar             else
1556*c83a76b0SSuyog Pawar             { /* PART_NxN */
1557*c83a76b0SSuyog Pawar                 pu_t *ps_pu = ps_codec->s_parse.ps_pu;
1558*c83a76b0SSuyog Pawar 
1559*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0, cb_size / 2, cb_size / 2);
1560*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 0;
1561*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1562*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0 + (cb_size / 2), y0, cb_size / 2, cb_size / 2);
1563*c83a76b0SSuyog Pawar 
1564*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 1;
1565*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1566*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0, y0 + (cb_size / 2), cb_size / 2, cb_size / 2);
1567*c83a76b0SSuyog Pawar 
1568*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 2;
1569*c83a76b0SSuyog Pawar                 ps_pu = ps_codec->s_parse.ps_pu;
1570*c83a76b0SSuyog Pawar                 ihevcd_parse_prediction_unit(ps_codec, x0 + (cb_size / 2), y0 + (cb_size / 2), cb_size / 2, cb_size / 2);
1571*c83a76b0SSuyog Pawar 
1572*c83a76b0SSuyog Pawar                 ps_pu->b2_part_idx = 3;
1573*c83a76b0SSuyog Pawar             }
1574*c83a76b0SSuyog Pawar         }
1575*c83a76b0SSuyog Pawar 
1576*c83a76b0SSuyog Pawar         if(!pcm_flag)
1577*c83a76b0SSuyog Pawar         {
1578*c83a76b0SSuyog Pawar             WORD32 no_residual_syntax_flag = 0;
1579*c83a76b0SSuyog Pawar             pu_t *ps_pu;
1580*c83a76b0SSuyog Pawar             /* Since ps_pu is incremented for each PU parsed, decrement by 1 to
1581*c83a76b0SSuyog Pawar              *  access last decoded PU
1582*c83a76b0SSuyog Pawar              */
1583*c83a76b0SSuyog Pawar             ps_pu = ps_codec->s_parse.ps_pu - 1;
1584*c83a76b0SSuyog Pawar             if((PRED_MODE_INTRA != pred_mode) &&
1585*c83a76b0SSuyog Pawar                             (!((part_mode == PART_2Nx2N) && ps_pu->b1_merge_flag)))
1586*c83a76b0SSuyog Pawar             {
1587*c83a76b0SSuyog Pawar 
1588*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("rqt_root_cbf", ps_cabac->u4_range, IHEVC_CAB_NORES_IDX);
1589*c83a76b0SSuyog Pawar                 no_residual_syntax_flag = ihevcd_cabac_decode_bin(ps_cabac,
1590*c83a76b0SSuyog Pawar                                                                   ps_bitstrm,
1591*c83a76b0SSuyog Pawar                                                                   IHEVC_CAB_NORES_IDX);
1592*c83a76b0SSuyog Pawar 
1593*c83a76b0SSuyog Pawar                 AEV_TRACE("rqt_root_cbf", no_residual_syntax_flag,
1594*c83a76b0SSuyog Pawar                           ps_cabac->u4_range);
1595*c83a76b0SSuyog Pawar                 /* TODO: HACK FOR COMPLIANCE WITH HM REFERENCE DECODER */
1596*c83a76b0SSuyog Pawar                 /*********************************************************/
1597*c83a76b0SSuyog Pawar                 /* currently the HM decoder expects qtroot cbf instead of */
1598*c83a76b0SSuyog Pawar                 /* no_residue_flag which has opposite meaning             */
1599*c83a76b0SSuyog Pawar                 /* This will be fixed once the software / spec is fixed   */
1600*c83a76b0SSuyog Pawar                 /*********************************************************/
1601*c83a76b0SSuyog Pawar                 no_residual_syntax_flag = 1 - no_residual_syntax_flag;
1602*c83a76b0SSuyog Pawar             }
1603*c83a76b0SSuyog Pawar 
1604*c83a76b0SSuyog Pawar             if(!no_residual_syntax_flag)
1605*c83a76b0SSuyog Pawar             {
1606*c83a76b0SSuyog Pawar 
1607*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.i4_max_trafo_depth = (pred_mode == PRED_MODE_INTRA) ?
1608*c83a76b0SSuyog Pawar                                 (ps_sps->i1_max_transform_hierarchy_depth_intra + intra_split_flag) :
1609*c83a76b0SSuyog Pawar                                 (ps_sps->i1_max_transform_hierarchy_depth_inter);
1610*c83a76b0SSuyog Pawar                 ret = ihevcd_parse_transform_tree(ps_codec, x0, y0, x0, y0,
1611*c83a76b0SSuyog Pawar                                                   log2_cb_size, 0, 0,
1612*c83a76b0SSuyog Pawar                                                   ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0]);
1613*c83a76b0SSuyog Pawar                 RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
1614*c83a76b0SSuyog Pawar             }
1615*c83a76b0SSuyog Pawar             else
1616*c83a76b0SSuyog Pawar             {
1617*c83a76b0SSuyog Pawar                 WORD32 ctb_x_base;
1618*c83a76b0SSuyog Pawar                 WORD32 ctb_y_base;
1619*c83a76b0SSuyog Pawar 
1620*c83a76b0SSuyog Pawar                 ctb_x_base = ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size;
1621*c83a76b0SSuyog Pawar                 ctb_y_base = ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size;
1622*c83a76b0SSuyog Pawar 
1623*c83a76b0SSuyog Pawar                 ps_tu = ps_codec->s_parse.ps_tu;
1624*c83a76b0SSuyog Pawar                 ps_tu->b1_cb_cbf = 0;
1625*c83a76b0SSuyog Pawar                 ps_tu->b1_cr_cbf = 0;
1626*c83a76b0SSuyog Pawar                 ps_tu->b1_y_cbf = 0;
1627*c83a76b0SSuyog Pawar                 ps_tu->b4_pos_x = ((x0 - ctb_x_base) >> 2);
1628*c83a76b0SSuyog Pawar                 ps_tu->b4_pos_y = ((y0 - ctb_y_base) >> 2);
1629*c83a76b0SSuyog Pawar                 ps_tu->b1_transquant_bypass = 0;
1630*c83a76b0SSuyog Pawar                 ps_tu->b3_size = (log2_cb_size - 2);
1631*c83a76b0SSuyog Pawar                 ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
1632*c83a76b0SSuyog Pawar                 ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
1633*c83a76b0SSuyog Pawar                 ps_tu->b6_luma_intra_mode   = ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0];
1634*c83a76b0SSuyog Pawar 
1635*c83a76b0SSuyog Pawar                 /* Set the first TU in CU flag */
1636*c83a76b0SSuyog Pawar                 {
1637*c83a76b0SSuyog Pawar                     if((ps_codec->s_parse.s_cu.i4_pos_x << 3) == (ps_tu->b4_pos_x << 2) &&
1638*c83a76b0SSuyog Pawar                                     (ps_codec->s_parse.s_cu.i4_pos_y << 3) == (ps_tu->b4_pos_y << 2))
1639*c83a76b0SSuyog Pawar                     {
1640*c83a76b0SSuyog Pawar                         ps_tu->b1_first_tu_in_cu = 1;
1641*c83a76b0SSuyog Pawar                     }
1642*c83a76b0SSuyog Pawar                     else
1643*c83a76b0SSuyog Pawar                     {
1644*c83a76b0SSuyog Pawar                         ps_tu->b1_first_tu_in_cu = 0;
1645*c83a76b0SSuyog Pawar                     }
1646*c83a76b0SSuyog Pawar                 }
1647*c83a76b0SSuyog Pawar                 ps_codec->s_parse.ps_tu++;
1648*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.i4_tu_cnt++;
1649*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_pic_tu_idx++;
1650*c83a76b0SSuyog Pawar 
1651*c83a76b0SSuyog Pawar             }
1652*c83a76b0SSuyog Pawar         }
1653*c83a76b0SSuyog Pawar 
1654*c83a76b0SSuyog Pawar     }
1655*c83a76b0SSuyog Pawar 
1656*c83a76b0SSuyog Pawar 
1657*c83a76b0SSuyog Pawar 
1658*c83a76b0SSuyog Pawar 
1659*c83a76b0SSuyog Pawar     return ret;
1660*c83a76b0SSuyog Pawar }
1661*c83a76b0SSuyog Pawar 
1662*c83a76b0SSuyog Pawar 
1663*c83a76b0SSuyog Pawar 
1664*c83a76b0SSuyog Pawar 
1665*c83a76b0SSuyog Pawar /**
1666*c83a76b0SSuyog Pawar  *******************************************************************************
1667*c83a76b0SSuyog Pawar  *
1668*c83a76b0SSuyog Pawar  * @brief
1669*c83a76b0SSuyog Pawar  *  Parses Coding Quad Tree
1670*c83a76b0SSuyog Pawar  *
1671*c83a76b0SSuyog Pawar  * @par Description:
1672*c83a76b0SSuyog Pawar  *  Parses Coding Quad Tree as per Section:7.3.9.4
1673*c83a76b0SSuyog Pawar  *
1674*c83a76b0SSuyog Pawar  * @param[in] ps_codec
1675*c83a76b0SSuyog Pawar  *  Pointer to codec context
1676*c83a76b0SSuyog Pawar  *
1677*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
1678*c83a76b0SSuyog Pawar  *
1679*c83a76b0SSuyog Pawar  * @remarks
1680*c83a76b0SSuyog Pawar  *
1681*c83a76b0SSuyog Pawar  *
1682*c83a76b0SSuyog Pawar  *******************************************************************************
1683*c83a76b0SSuyog Pawar  */
ihevcd_parse_coding_quadtree(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 log2_cb_size,WORD32 ct_depth)1684*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_coding_quadtree(codec_t *ps_codec,
1685*c83a76b0SSuyog Pawar                                             WORD32 x0,
1686*c83a76b0SSuyog Pawar                                             WORD32 y0,
1687*c83a76b0SSuyog Pawar                                             WORD32 log2_cb_size,
1688*c83a76b0SSuyog Pawar                                             WORD32 ct_depth)
1689*c83a76b0SSuyog Pawar {
1690*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1691*c83a76b0SSuyog Pawar     sps_t *ps_sps;
1692*c83a76b0SSuyog Pawar     pps_t *ps_pps;
1693*c83a76b0SSuyog Pawar     WORD32 split_cu_flag;
1694*c83a76b0SSuyog Pawar     WORD32 x1, y1;
1695*c83a76b0SSuyog Pawar     WORD32 cu_pos_x;
1696*c83a76b0SSuyog Pawar     WORD32 cu_pos_y;
1697*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
1698*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
1699*c83a76b0SSuyog Pawar     WORD32 cb_size = 1 << log2_cb_size;
1700*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps;
1701*c83a76b0SSuyog Pawar     ps_pps = ps_codec->s_parse.ps_pps;
1702*c83a76b0SSuyog Pawar 
1703*c83a76b0SSuyog Pawar     /* Compute CU position with respect to current CTB in (8x8) units */
1704*c83a76b0SSuyog Pawar     cu_pos_x = (x0 - (ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size)) >> 3;
1705*c83a76b0SSuyog Pawar     cu_pos_y = (y0 - (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size)) >> 3;
1706*c83a76b0SSuyog Pawar 
1707*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_pos_x = cu_pos_x;
1708*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_pos_y = cu_pos_y;
1709*c83a76b0SSuyog Pawar 
1710*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_log2_cb_size = log2_cb_size;
1711*c83a76b0SSuyog Pawar 
1712*c83a76b0SSuyog Pawar     ps_codec->s_parse.i4_ct_depth = ct_depth;
1713*c83a76b0SSuyog Pawar     {
1714*c83a76b0SSuyog Pawar         UWORD32 *pu4_ct_depth_top = ps_codec->s_parse.pu4_ct_depth_top;
1715*c83a76b0SSuyog Pawar         UWORD32 u4_ct_depth_left = ps_codec->s_parse.u4_ct_depth_left;
1716*c83a76b0SSuyog Pawar         UWORD32 u4_ct_depth_top = 0;
1717*c83a76b0SSuyog Pawar         UWORD32 u4_mask;
1718*c83a76b0SSuyog Pawar         UWORD32 u4_top_mask, u4_left_mask;
1719*c83a76b0SSuyog Pawar         WORD32  ctxt_idx;
1720*c83a76b0SSuyog Pawar         UWORD32 u4_min_cu_x = x0 / 8;
1721*c83a76b0SSuyog Pawar         UWORD32 u4_min_cu_y = y0 / 8;
1722*c83a76b0SSuyog Pawar 
1723*c83a76b0SSuyog Pawar         pu4_ct_depth_top += (u4_min_cu_x / 16);
1724*c83a76b0SSuyog Pawar 
1725*c83a76b0SSuyog Pawar 
1726*c83a76b0SSuyog Pawar 
1727*c83a76b0SSuyog Pawar 
1728*c83a76b0SSuyog Pawar         if(((x0 + (1 << log2_cb_size)) <= ps_sps->i2_pic_width_in_luma_samples) &&
1729*c83a76b0SSuyog Pawar                         ((y0 + (1 << log2_cb_size)) <= ps_sps->i2_pic_height_in_luma_samples) &&
1730*c83a76b0SSuyog Pawar                         (log2_cb_size > ps_sps->i1_log2_min_coding_block_size))
1731*c83a76b0SSuyog Pawar         {
1732*c83a76b0SSuyog Pawar 
1733*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_SPLIT_CU_FLAG;
1734*c83a76b0SSuyog Pawar             /* Split cu context increment is decided based on left and top Coding tree
1735*c83a76b0SSuyog Pawar              * depth which is stored at frame level
1736*c83a76b0SSuyog Pawar              */
1737*c83a76b0SSuyog Pawar             /* Check if the CTB is in first row in the current slice or tile */
1738*c83a76b0SSuyog Pawar             if((0 != cu_pos_y) ||
1739*c83a76b0SSuyog Pawar                             ((0 != ps_codec->s_parse.i4_ctb_slice_y) &&
1740*c83a76b0SSuyog Pawar                                             (0 != ps_codec->s_parse.i4_ctb_tile_y)))
1741*c83a76b0SSuyog Pawar             {
1742*c83a76b0SSuyog Pawar                 u4_ct_depth_top = *pu4_ct_depth_top;
1743*c83a76b0SSuyog Pawar                 u4_ct_depth_top >>= ((u4_min_cu_x % 16) * 2);
1744*c83a76b0SSuyog Pawar                 u4_ct_depth_top &= 3;
1745*c83a76b0SSuyog Pawar 
1746*c83a76b0SSuyog Pawar                 if((WORD32)u4_ct_depth_top > ct_depth)
1747*c83a76b0SSuyog Pawar                     ctxt_idx++;
1748*c83a76b0SSuyog Pawar             }
1749*c83a76b0SSuyog Pawar 
1750*c83a76b0SSuyog Pawar             /* Check if the CTB is in first column in the current slice or tile */
1751*c83a76b0SSuyog Pawar             /*****************************************************************/
1752*c83a76b0SSuyog Pawar             /* If cu_pos_x is non-zero then left is available                */
1753*c83a76b0SSuyog Pawar             /* If cu_pos_x is zero then ensure both the following are true   */
1754*c83a76b0SSuyog Pawar             /*    Current CTB is not the first CTB in a tile row             */
1755*c83a76b0SSuyog Pawar             /*    Current CTB is not the first CTB in a slice                */
1756*c83a76b0SSuyog Pawar             /*****************************************************************/
1757*c83a76b0SSuyog Pawar             if((0 != cu_pos_x) ||
1758*c83a76b0SSuyog Pawar                             (((0 != ps_codec->s_parse.i4_ctb_slice_x) || (0 != ps_codec->s_parse.i4_ctb_slice_y)) &&
1759*c83a76b0SSuyog Pawar                                             (0 != ps_codec->s_parse.i4_ctb_tile_x)))
1760*c83a76b0SSuyog Pawar             {
1761*c83a76b0SSuyog Pawar                 u4_ct_depth_left >>= ((u4_min_cu_y % 16) * 2);
1762*c83a76b0SSuyog Pawar                 u4_ct_depth_left &= 3;
1763*c83a76b0SSuyog Pawar                 if((WORD32)u4_ct_depth_left > ct_depth)
1764*c83a76b0SSuyog Pawar                     ctxt_idx++;
1765*c83a76b0SSuyog Pawar             }
1766*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("split_cu_flag", ps_cabac->u4_range, ctxt_idx);
1767*c83a76b0SSuyog Pawar             split_cu_flag = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
1768*c83a76b0SSuyog Pawar             AEV_TRACE("split_cu_flag", split_cu_flag, ps_cabac->u4_range);
1769*c83a76b0SSuyog Pawar         }
1770*c83a76b0SSuyog Pawar         else
1771*c83a76b0SSuyog Pawar         {
1772*c83a76b0SSuyog Pawar             if(log2_cb_size > ps_sps->i1_log2_min_coding_block_size)
1773*c83a76b0SSuyog Pawar                 split_cu_flag = 1;
1774*c83a76b0SSuyog Pawar             else
1775*c83a76b0SSuyog Pawar                 split_cu_flag = 0;
1776*c83a76b0SSuyog Pawar         }
1777*c83a76b0SSuyog Pawar 
1778*c83a76b0SSuyog Pawar         if(0 == split_cu_flag)
1779*c83a76b0SSuyog Pawar         {
1780*c83a76b0SSuyog Pawar             /* Update top ct_depth */
1781*c83a76b0SSuyog Pawar             u4_ct_depth_top = *pu4_ct_depth_top;
1782*c83a76b0SSuyog Pawar             /* Since Max cb_size is 64, maximum of 8 bits will be set or reset */
1783*c83a76b0SSuyog Pawar             /* Also since Coding block will be within 64x64 grid, only 8bits within a WORD32
1784*c83a76b0SSuyog Pawar              * need to be updated. These 8 bits will not cross 8 bit boundaries
1785*c83a76b0SSuyog Pawar              */
1786*c83a76b0SSuyog Pawar             u4_mask = DUP_LSB_11(cb_size / 8);
1787*c83a76b0SSuyog Pawar 
1788*c83a76b0SSuyog Pawar             u4_top_mask = u4_mask << ((u4_min_cu_x % 16) * 2);
1789*c83a76b0SSuyog Pawar             u4_ct_depth_top &= ~u4_top_mask;
1790*c83a76b0SSuyog Pawar 
1791*c83a76b0SSuyog Pawar             if(ct_depth)
1792*c83a76b0SSuyog Pawar             {
1793*c83a76b0SSuyog Pawar                 u4_top_mask = gau4_ct_depth_mask[ct_depth] & u4_mask;
1794*c83a76b0SSuyog Pawar 
1795*c83a76b0SSuyog Pawar                 u4_top_mask = u4_top_mask << ((u4_min_cu_x % 16) * 2);
1796*c83a76b0SSuyog Pawar                 u4_ct_depth_top |= u4_top_mask;
1797*c83a76b0SSuyog Pawar             }
1798*c83a76b0SSuyog Pawar 
1799*c83a76b0SSuyog Pawar             *pu4_ct_depth_top = u4_ct_depth_top;
1800*c83a76b0SSuyog Pawar 
1801*c83a76b0SSuyog Pawar             /* Update left ct_depth */
1802*c83a76b0SSuyog Pawar             u4_ct_depth_left = ps_codec->s_parse.u4_ct_depth_left;
1803*c83a76b0SSuyog Pawar 
1804*c83a76b0SSuyog Pawar             u4_left_mask = u4_mask << ((u4_min_cu_y % 16) * 2);
1805*c83a76b0SSuyog Pawar 
1806*c83a76b0SSuyog Pawar             u4_ct_depth_left &= ~u4_left_mask;
1807*c83a76b0SSuyog Pawar             if(ct_depth)
1808*c83a76b0SSuyog Pawar             {
1809*c83a76b0SSuyog Pawar                 u4_left_mask = gau4_ct_depth_mask[ct_depth] & u4_mask;
1810*c83a76b0SSuyog Pawar 
1811*c83a76b0SSuyog Pawar                 u4_left_mask = u4_left_mask << ((u4_min_cu_y % 16) * 2);
1812*c83a76b0SSuyog Pawar                 u4_ct_depth_left |= u4_left_mask;
1813*c83a76b0SSuyog Pawar             }
1814*c83a76b0SSuyog Pawar 
1815*c83a76b0SSuyog Pawar             ps_codec->s_parse.u4_ct_depth_left = u4_ct_depth_left;
1816*c83a76b0SSuyog Pawar         }
1817*c83a76b0SSuyog Pawar     }
1818*c83a76b0SSuyog Pawar     if((ps_pps->i1_cu_qp_delta_enabled_flag) &&
1819*c83a76b0SSuyog Pawar                     (log2_cb_size >= ps_pps->i1_log2_min_cu_qp_delta_size))
1820*c83a76b0SSuyog Pawar     {
1821*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_is_cu_qp_delta_coded = 0;
1822*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_cu_qp_delta = 0;
1823*c83a76b0SSuyog Pawar     }
1824*c83a76b0SSuyog Pawar     if(split_cu_flag)
1825*c83a76b0SSuyog Pawar     {
1826*c83a76b0SSuyog Pawar         x1 = x0 + ((1 << log2_cb_size) >> 1);
1827*c83a76b0SSuyog Pawar         y1 = y0 + ((1 << log2_cb_size) >> 1);
1828*c83a76b0SSuyog Pawar 
1829*c83a76b0SSuyog Pawar         ret = ihevcd_parse_coding_quadtree(ps_codec, x0, y0, log2_cb_size - 1, ct_depth + 1);
1830*c83a76b0SSuyog Pawar         RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
1831*c83a76b0SSuyog Pawar 
1832*c83a76b0SSuyog Pawar         /* At frame boundaries coding quadtree nodes are sent only if they fall within the frame */
1833*c83a76b0SSuyog Pawar         if(x1 < ps_sps->i2_pic_width_in_luma_samples)
1834*c83a76b0SSuyog Pawar         {
1835*c83a76b0SSuyog Pawar             ret = ihevcd_parse_coding_quadtree(ps_codec, x1, y0, log2_cb_size - 1, ct_depth + 1);
1836*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
1837*c83a76b0SSuyog Pawar         }
1838*c83a76b0SSuyog Pawar 
1839*c83a76b0SSuyog Pawar         if(y1 < ps_sps->i2_pic_height_in_luma_samples)
1840*c83a76b0SSuyog Pawar         {
1841*c83a76b0SSuyog Pawar             ret = ihevcd_parse_coding_quadtree(ps_codec, x0, y1, log2_cb_size - 1, ct_depth + 1);
1842*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
1843*c83a76b0SSuyog Pawar         }
1844*c83a76b0SSuyog Pawar 
1845*c83a76b0SSuyog Pawar         if((x1 < ps_sps->i2_pic_width_in_luma_samples) &&
1846*c83a76b0SSuyog Pawar                         (y1 < ps_sps->i2_pic_height_in_luma_samples))
1847*c83a76b0SSuyog Pawar         {
1848*c83a76b0SSuyog Pawar             ret = ihevcd_parse_coding_quadtree(ps_codec, x1, y1, log2_cb_size - 1, ct_depth + 1);
1849*c83a76b0SSuyog Pawar             RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
1850*c83a76b0SSuyog Pawar         }
1851*c83a76b0SSuyog Pawar     }
1852*c83a76b0SSuyog Pawar     else
1853*c83a76b0SSuyog Pawar     {
1854*c83a76b0SSuyog Pawar         WORD32 qp = ps_codec->s_parse.u4_qp;
1855*c83a76b0SSuyog Pawar         /* Set current group QP if current CU is aligned with the group */
1856*c83a76b0SSuyog Pawar         {
1857*c83a76b0SSuyog Pawar             WORD32 cu_pos_x = ps_codec->s_parse.s_cu.i4_pos_x << 3;
1858*c83a76b0SSuyog Pawar             WORD32 cu_pos_y = ps_codec->s_parse.s_cu.i4_pos_y << 3;
1859*c83a76b0SSuyog Pawar 
1860*c83a76b0SSuyog Pawar             WORD32 qpg_x = (cu_pos_x - (cu_pos_x & ((1 << ps_pps->i1_log2_min_cu_qp_delta_size) - 1)));
1861*c83a76b0SSuyog Pawar             WORD32 qpg_y = (cu_pos_y - (cu_pos_y & ((1 << ps_pps->i1_log2_min_cu_qp_delta_size) - 1)));
1862*c83a76b0SSuyog Pawar 
1863*c83a76b0SSuyog Pawar             if((cu_pos_x == qpg_x) &&
1864*c83a76b0SSuyog Pawar                             (cu_pos_y == qpg_y))
1865*c83a76b0SSuyog Pawar             {
1866*c83a76b0SSuyog Pawar                 ps_codec->s_parse.u4_qpg = ps_codec->s_parse.u4_qp;
1867*c83a76b0SSuyog Pawar 
1868*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.i4_cu_qp_delta = 0;
1869*c83a76b0SSuyog Pawar 
1870*c83a76b0SSuyog Pawar             }
1871*c83a76b0SSuyog Pawar         }
1872*c83a76b0SSuyog Pawar 
1873*c83a76b0SSuyog Pawar         ret = ihevcd_parse_coding_unit(ps_codec, x0, y0, log2_cb_size);
1874*c83a76b0SSuyog Pawar         RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
1875*c83a76b0SSuyog Pawar 
1876*c83a76b0SSuyog Pawar         if(ps_pps->i1_cu_qp_delta_enabled_flag)
1877*c83a76b0SSuyog Pawar         {
1878*c83a76b0SSuyog Pawar             WORD32 qp_pred, qp_left, qp_top;
1879*c83a76b0SSuyog Pawar             WORD32 cu_pos_x;
1880*c83a76b0SSuyog Pawar             WORD32 cu_pos_y;
1881*c83a76b0SSuyog Pawar             WORD32 qpg_x;
1882*c83a76b0SSuyog Pawar             WORD32 qpg_y;
1883*c83a76b0SSuyog Pawar             WORD32 i, j;
1884*c83a76b0SSuyog Pawar             WORD32 cur_cu_offset;
1885*c83a76b0SSuyog Pawar             tu_t *ps_tu = ps_codec->s_parse.ps_tu;
1886*c83a76b0SSuyog Pawar             WORD32 cb_size = 1 << ps_codec->s_parse.s_cu.i4_log2_cb_size;
1887*c83a76b0SSuyog Pawar 
1888*c83a76b0SSuyog Pawar             cu_pos_x = ps_codec->s_parse.s_cu.i4_pos_x << 3;
1889*c83a76b0SSuyog Pawar             cu_pos_y = ps_codec->s_parse.s_cu.i4_pos_y << 3;
1890*c83a76b0SSuyog Pawar 
1891*c83a76b0SSuyog Pawar             qpg_x = (cu_pos_x - (cu_pos_x & ((1 << ps_pps->i1_log2_min_cu_qp_delta_size) - 1))) >> 3;
1892*c83a76b0SSuyog Pawar             qpg_y = (cu_pos_y - (cu_pos_y & ((1 << ps_pps->i1_log2_min_cu_qp_delta_size) - 1))) >> 3;
1893*c83a76b0SSuyog Pawar 
1894*c83a76b0SSuyog Pawar             /*previous coded Qp*/
1895*c83a76b0SSuyog Pawar             qp_left = ps_codec->s_parse.u4_qpg;
1896*c83a76b0SSuyog Pawar             qp_top = ps_codec->s_parse.u4_qpg;
1897*c83a76b0SSuyog Pawar 
1898*c83a76b0SSuyog Pawar             if(qpg_x > 0)
1899*c83a76b0SSuyog Pawar             {
1900*c83a76b0SSuyog Pawar                 qp_left = ps_codec->s_parse.ai1_8x8_cu_qp[qpg_x - 1 + (qpg_y * 8)];
1901*c83a76b0SSuyog Pawar             }
1902*c83a76b0SSuyog Pawar             if(qpg_y > 0)
1903*c83a76b0SSuyog Pawar             {
1904*c83a76b0SSuyog Pawar                 qp_top = ps_codec->s_parse.ai1_8x8_cu_qp[qpg_x + ((qpg_y - 1) * 8)];
1905*c83a76b0SSuyog Pawar             }
1906*c83a76b0SSuyog Pawar 
1907*c83a76b0SSuyog Pawar             qp_pred = (qp_left + qp_top + 1) >> 1;
1908*c83a76b0SSuyog Pawar             /* Since qp_pred + ps_codec->s_parse.s_cu.i4_cu_qp_delta can be negative,
1909*c83a76b0SSuyog Pawar             52 is added before taking modulo 52 */
1910*c83a76b0SSuyog Pawar             qp = (qp_pred + ps_codec->s_parse.s_cu.i4_cu_qp_delta + 52) % 52;
1911*c83a76b0SSuyog Pawar 
1912*c83a76b0SSuyog Pawar             cur_cu_offset = (cu_pos_x >> 3) + cu_pos_y;
1913*c83a76b0SSuyog Pawar             for(i = 0; i < (cb_size >> 3); i++)
1914*c83a76b0SSuyog Pawar             {
1915*c83a76b0SSuyog Pawar                 for(j = 0; j < (cb_size >> 3); j++)
1916*c83a76b0SSuyog Pawar                 {
1917*c83a76b0SSuyog Pawar                     ps_codec->s_parse.ai1_8x8_cu_qp[cur_cu_offset + (i * 8) + j] = qp;
1918*c83a76b0SSuyog Pawar                 }
1919*c83a76b0SSuyog Pawar             }
1920*c83a76b0SSuyog Pawar 
1921*c83a76b0SSuyog Pawar             ps_codec->s_parse.u4_qp = qp;
1922*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.i4_qp = qp;
1923*c83a76b0SSuyog Pawar 
1924*c83a76b0SSuyog Pawar 
1925*c83a76b0SSuyog Pawar             /* When change in QP is signaled, update the QP in TUs that are already parsed in the CU */
1926*c83a76b0SSuyog Pawar             {
1927*c83a76b0SSuyog Pawar                 tu_t *ps_tu_tmp;
1928*c83a76b0SSuyog Pawar                 ps_tu_tmp = ps_tu - ps_codec->s_parse.s_cu.i4_tu_cnt;
1929*c83a76b0SSuyog Pawar                 ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
1930*c83a76b0SSuyog Pawar                 while(ps_tu_tmp != ps_tu)
1931*c83a76b0SSuyog Pawar                 {
1932*c83a76b0SSuyog Pawar                     ps_tu_tmp->b7_qp = ps_codec->s_parse.u4_qp;
1933*c83a76b0SSuyog Pawar 
1934*c83a76b0SSuyog Pawar                     ps_tu_tmp++;
1935*c83a76b0SSuyog Pawar                 }
1936*c83a76b0SSuyog Pawar             }
1937*c83a76b0SSuyog Pawar             if(ps_codec->s_parse.s_cu.i4_cu_qp_delta)
1938*c83a76b0SSuyog Pawar             {
1939*c83a76b0SSuyog Pawar                 WORD32 ctb_indx;
1940*c83a76b0SSuyog Pawar                 ctb_indx = ps_codec->s_parse.i4_ctb_x + ps_sps->i2_pic_wd_in_ctb * ps_codec->s_parse.i4_ctb_y;
1941*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_bs_ctxt.pu1_pic_qp_const_in_ctb[ctb_indx >> 3] &= (~(1 << (ctb_indx & 7)));
1942*c83a76b0SSuyog Pawar             }
1943*c83a76b0SSuyog Pawar 
1944*c83a76b0SSuyog Pawar         }
1945*c83a76b0SSuyog Pawar         /* Populate CU_info maps for current CU*/
1946*c83a76b0SSuyog Pawar         if(ps_codec->u1_enable_cu_info)
1947*c83a76b0SSuyog Pawar         {
1948*c83a76b0SSuyog Pawar             WORD32 cu_info_map_stride = ALIGN64(ps_codec->i4_wd) >> 3;
1949*c83a76b0SSuyog Pawar             UWORD8 num_8x8_blks = 1 << (log2_cb_size - 3);
1950*c83a76b0SSuyog Pawar             WORD32 vert_8x8, horz_8x8;
1951*c83a76b0SSuyog Pawar             UWORD8 *pu1_cur_cu_type_map =
1952*c83a76b0SSuyog Pawar                 ps_codec->as_buf_id_info_map[ps_codec->as_process[0].
1953*c83a76b0SSuyog Pawar                     i4_cur_pic_buf_id].pu1_cu_type_map;
1954*c83a76b0SSuyog Pawar             UWORD8 *pu1_cur_qp_map =
1955*c83a76b0SSuyog Pawar                 ps_codec->as_buf_id_info_map[ps_codec->as_process[0].i4_cur_pic_buf_id].pu1_qp_map;
1956*c83a76b0SSuyog Pawar             UWORD8 *pu1_cur_type_cu = pu1_cur_cu_type_map + (x0 >> 3) +
1957*c83a76b0SSuyog Pawar                 (y0 >> 3) * cu_info_map_stride;
1958*c83a76b0SSuyog Pawar             UWORD8 *pu1_cur_qp_cu = pu1_cur_qp_map + (x0 >> 3) +
1959*c83a76b0SSuyog Pawar                 (y0 >> 3) * cu_info_map_stride;
1960*c83a76b0SSuyog Pawar             for(vert_8x8 = 0; vert_8x8 < num_8x8_blks; vert_8x8++)
1961*c83a76b0SSuyog Pawar             {
1962*c83a76b0SSuyog Pawar                 for(horz_8x8 = 0; horz_8x8 < num_8x8_blks; horz_8x8++)
1963*c83a76b0SSuyog Pawar                 {
1964*c83a76b0SSuyog Pawar                     pu1_cur_qp_cu[horz_8x8] = qp;
1965*c83a76b0SSuyog Pawar                     pu1_cur_type_cu[horz_8x8] = ps_codec->s_parse.s_cu.i4_pred_mode;
1966*c83a76b0SSuyog Pawar                 }
1967*c83a76b0SSuyog Pawar                 pu1_cur_qp_cu += cu_info_map_stride;
1968*c83a76b0SSuyog Pawar                 pu1_cur_type_cu += cu_info_map_stride;
1969*c83a76b0SSuyog Pawar             }
1970*c83a76b0SSuyog Pawar         }
1971*c83a76b0SSuyog Pawar 
1972*c83a76b0SSuyog Pawar     }
1973*c83a76b0SSuyog Pawar 
1974*c83a76b0SSuyog Pawar 
1975*c83a76b0SSuyog Pawar 
1976*c83a76b0SSuyog Pawar 
1977*c83a76b0SSuyog Pawar     return ret;
1978*c83a76b0SSuyog Pawar }
1979*c83a76b0SSuyog Pawar 
1980*c83a76b0SSuyog Pawar 
1981*c83a76b0SSuyog Pawar /**
1982*c83a76b0SSuyog Pawar  *******************************************************************************
1983*c83a76b0SSuyog Pawar  *
1984*c83a76b0SSuyog Pawar  * @brief
1985*c83a76b0SSuyog Pawar  *  Parses SAO (Sample adaptive offset syntax)
1986*c83a76b0SSuyog Pawar  *
1987*c83a76b0SSuyog Pawar  * @par Description:
1988*c83a76b0SSuyog Pawar  *  Parses SAO (Sample adaptive offset syntax) as per  Section:7.3.9.3
1989*c83a76b0SSuyog Pawar  *
1990*c83a76b0SSuyog Pawar  * @param[in] ps_codec
1991*c83a76b0SSuyog Pawar  *  Pointer to codec context
1992*c83a76b0SSuyog Pawar  *
1993*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
1994*c83a76b0SSuyog Pawar  *
1995*c83a76b0SSuyog Pawar  * @remarks
1996*c83a76b0SSuyog Pawar  *
1997*c83a76b0SSuyog Pawar  *
1998*c83a76b0SSuyog Pawar  *******************************************************************************
1999*c83a76b0SSuyog Pawar  */
ihevcd_parse_sao(codec_t * ps_codec)2000*c83a76b0SSuyog Pawar IHEVCD_ERROR_T  ihevcd_parse_sao(codec_t *ps_codec)
2001*c83a76b0SSuyog Pawar {
2002*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2003*c83a76b0SSuyog Pawar     sps_t *ps_sps;
2004*c83a76b0SSuyog Pawar     sao_t *ps_sao;
2005*c83a76b0SSuyog Pawar     WORD32 rx;
2006*c83a76b0SSuyog Pawar     WORD32 ry;
2007*c83a76b0SSuyog Pawar     WORD32 value;
2008*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
2009*c83a76b0SSuyog Pawar     WORD32 sao_merge_left_flag;
2010*c83a76b0SSuyog Pawar     WORD32 sao_merge_up_flag;
2011*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
2012*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
2013*c83a76b0SSuyog Pawar     WORD32 ctxt_idx;
2014*c83a76b0SSuyog Pawar 
2015*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr_base;
2016*c83a76b0SSuyog Pawar     ps_slice_hdr += (ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1));
2017*c83a76b0SSuyog Pawar 
2018*c83a76b0SSuyog Pawar     ps_sps = (ps_codec->s_parse.ps_sps);
2019*c83a76b0SSuyog Pawar     rx = ps_codec->s_parse.i4_ctb_x;
2020*c83a76b0SSuyog Pawar     ry = ps_codec->s_parse.i4_ctb_y;
2021*c83a76b0SSuyog Pawar 
2022*c83a76b0SSuyog Pawar     ps_sao = ps_codec->s_parse.ps_pic_sao + rx + ry * ps_sps->i2_pic_wd_in_ctb;
2023*c83a76b0SSuyog Pawar 
2024*c83a76b0SSuyog Pawar     /* Default values */
2025*c83a76b0SSuyog Pawar     ps_sao->b3_y_type_idx = 0;
2026*c83a76b0SSuyog Pawar     ps_sao->b3_cb_type_idx = 0;
2027*c83a76b0SSuyog Pawar     ps_sao->b3_cr_type_idx = 0;
2028*c83a76b0SSuyog Pawar 
2029*c83a76b0SSuyog Pawar     UNUSED(value);
2030*c83a76b0SSuyog Pawar     ctxt_idx = IHEVC_CAB_SAO_MERGE;
2031*c83a76b0SSuyog Pawar     sao_merge_left_flag = 0;
2032*c83a76b0SSuyog Pawar     sao_merge_up_flag = 0;
2033*c83a76b0SSuyog Pawar     if(rx > 0)
2034*c83a76b0SSuyog Pawar     {
2035*c83a76b0SSuyog Pawar         /*TODO:Implemented only for slice. condition for tile is not tested*/
2036*c83a76b0SSuyog Pawar         if(((0 != ps_codec->s_parse.i4_ctb_slice_x) || (0 != ps_codec->s_parse.i4_ctb_slice_y)) &&
2037*c83a76b0SSuyog Pawar                         (0 != ps_codec->s_parse.i4_ctb_tile_x))
2038*c83a76b0SSuyog Pawar         {
2039*c83a76b0SSuyog Pawar 
2040*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("sao_merge_flag", ps_cabac->u4_range, ctxt_idx);
2041*c83a76b0SSuyog Pawar             sao_merge_left_flag = ihevcd_cabac_decode_bin(ps_cabac,
2042*c83a76b0SSuyog Pawar                                                           ps_bitstrm,
2043*c83a76b0SSuyog Pawar                                                           ctxt_idx);
2044*c83a76b0SSuyog Pawar             AEV_TRACE("sao_merge_flag", sao_merge_left_flag, ps_cabac->u4_range);
2045*c83a76b0SSuyog Pawar         }
2046*c83a76b0SSuyog Pawar 
2047*c83a76b0SSuyog Pawar     }
2048*c83a76b0SSuyog Pawar     if(ry > 0 && !sao_merge_left_flag)
2049*c83a76b0SSuyog Pawar     {
2050*c83a76b0SSuyog Pawar         if((ps_codec->s_parse.i4_ctb_slice_y > 0) && (ps_codec->s_parse.i4_ctb_tile_y > 0))
2051*c83a76b0SSuyog Pawar         {
2052*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("sao_merge_flag", ps_cabac->u4_range, ctxt_idx);
2053*c83a76b0SSuyog Pawar             sao_merge_up_flag = ihevcd_cabac_decode_bin(ps_cabac,
2054*c83a76b0SSuyog Pawar                                                         ps_bitstrm,
2055*c83a76b0SSuyog Pawar                                                         ctxt_idx);
2056*c83a76b0SSuyog Pawar             AEV_TRACE("sao_merge_flag", sao_merge_up_flag, ps_cabac->u4_range);
2057*c83a76b0SSuyog Pawar         }
2058*c83a76b0SSuyog Pawar     }
2059*c83a76b0SSuyog Pawar     ctxt_idx = IHEVC_CAB_SAO_TYPE;
2060*c83a76b0SSuyog Pawar 
2061*c83a76b0SSuyog Pawar     if(sao_merge_left_flag)
2062*c83a76b0SSuyog Pawar     {
2063*c83a76b0SSuyog Pawar         *ps_sao = *(ps_sao - 1);
2064*c83a76b0SSuyog Pawar     }
2065*c83a76b0SSuyog Pawar     else if(sao_merge_up_flag)
2066*c83a76b0SSuyog Pawar     {
2067*c83a76b0SSuyog Pawar         *ps_sao = *(ps_sao - ps_sps->i2_pic_wd_in_ctb);
2068*c83a76b0SSuyog Pawar     }
2069*c83a76b0SSuyog Pawar     else // if(!sao_merge_up_flag && !sao_merge_left_flag)
2070*c83a76b0SSuyog Pawar     {
2071*c83a76b0SSuyog Pawar         WORD32 c_idx;
2072*c83a76b0SSuyog Pawar         WORD32 sao_type_idx = 0;
2073*c83a76b0SSuyog Pawar         for(c_idx = 0; c_idx < 3; c_idx++)
2074*c83a76b0SSuyog Pawar         {
2075*c83a76b0SSuyog Pawar             if((ps_slice_hdr->i1_slice_sao_luma_flag && c_idx == 0) || (ps_slice_hdr->i1_slice_sao_chroma_flag && c_idx > 0))
2076*c83a76b0SSuyog Pawar             {
2077*c83a76b0SSuyog Pawar 
2078*c83a76b0SSuyog Pawar 
2079*c83a76b0SSuyog Pawar                 /* sao_type_idx will be same for c_idx == 1 and c_idx == 2 - hence not initialized to zero for c_idx == 2*/
2080*c83a76b0SSuyog Pawar 
2081*c83a76b0SSuyog Pawar                 if(c_idx == 0)
2082*c83a76b0SSuyog Pawar                 {
2083*c83a76b0SSuyog Pawar                     sao_type_idx = 0;
2084*c83a76b0SSuyog Pawar                     TRACE_CABAC_CTXT("sao_type_idx", ps_cabac->u4_range, ctxt_idx);
2085*c83a76b0SSuyog Pawar                     sao_type_idx = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
2086*c83a76b0SSuyog Pawar 
2087*c83a76b0SSuyog Pawar                     if(sao_type_idx)
2088*c83a76b0SSuyog Pawar                     {
2089*c83a76b0SSuyog Pawar                         sao_type_idx += ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
2090*c83a76b0SSuyog Pawar                     }
2091*c83a76b0SSuyog Pawar                     AEV_TRACE("sao_type_idx", sao_type_idx,  ps_cabac->u4_range);
2092*c83a76b0SSuyog Pawar 
2093*c83a76b0SSuyog Pawar                     ps_sao->b3_y_type_idx = sao_type_idx;
2094*c83a76b0SSuyog Pawar                 }
2095*c83a76b0SSuyog Pawar                 if(c_idx == 1)
2096*c83a76b0SSuyog Pawar                 {
2097*c83a76b0SSuyog Pawar                     sao_type_idx = 0;
2098*c83a76b0SSuyog Pawar                     TRACE_CABAC_CTXT("sao_type_idx", ps_cabac->u4_range, ctxt_idx);
2099*c83a76b0SSuyog Pawar                     sao_type_idx = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_idx);
2100*c83a76b0SSuyog Pawar                     if(sao_type_idx)
2101*c83a76b0SSuyog Pawar                     {
2102*c83a76b0SSuyog Pawar                         sao_type_idx += ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
2103*c83a76b0SSuyog Pawar                     }
2104*c83a76b0SSuyog Pawar 
2105*c83a76b0SSuyog Pawar                     AEV_TRACE("sao_type_idx", sao_type_idx,  ps_cabac->u4_range);
2106*c83a76b0SSuyog Pawar 
2107*c83a76b0SSuyog Pawar                     ps_sao->b3_cb_type_idx = sao_type_idx;
2108*c83a76b0SSuyog Pawar                     ps_sao->b3_cr_type_idx = sao_type_idx;
2109*c83a76b0SSuyog Pawar                 }
2110*c83a76b0SSuyog Pawar 
2111*c83a76b0SSuyog Pawar                 if(sao_type_idx != 0)
2112*c83a76b0SSuyog Pawar                 {
2113*c83a76b0SSuyog Pawar                     WORD32 i;
2114*c83a76b0SSuyog Pawar                     WORD32 sao_offset[4];
2115*c83a76b0SSuyog Pawar                     WORD32 sao_band_position = 0;
2116*c83a76b0SSuyog Pawar                     WORD32 c_max =  (1 << (MIN(BIT_DEPTH, 10) - 5)) - 1;
2117*c83a76b0SSuyog Pawar                     for(i = 0; i < 4; i++)
2118*c83a76b0SSuyog Pawar                     {
2119*c83a76b0SSuyog Pawar                         sao_offset[i] = ihevcd_cabac_decode_bypass_bins_tunary(ps_cabac, ps_bitstrm, c_max);
2120*c83a76b0SSuyog Pawar                         AEV_TRACE("sao_offset_abs", sao_offset[i], ps_cabac->u4_range);
2121*c83a76b0SSuyog Pawar 
2122*c83a76b0SSuyog Pawar                         if((2 == sao_type_idx) && (i > 1))
2123*c83a76b0SSuyog Pawar                         {
2124*c83a76b0SSuyog Pawar                             sao_offset[i] = -sao_offset[i];
2125*c83a76b0SSuyog Pawar                         }
2126*c83a76b0SSuyog Pawar                     }
2127*c83a76b0SSuyog Pawar 
2128*c83a76b0SSuyog Pawar                     if(sao_type_idx == 1)
2129*c83a76b0SSuyog Pawar                     {
2130*c83a76b0SSuyog Pawar                         for(i = 0; i < 4; i++)
2131*c83a76b0SSuyog Pawar                         {
2132*c83a76b0SSuyog Pawar                             if(sao_offset[i] != 0)
2133*c83a76b0SSuyog Pawar                             {
2134*c83a76b0SSuyog Pawar                                 value = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
2135*c83a76b0SSuyog Pawar                                 AEV_TRACE("sao_offset_sign", value, ps_cabac->u4_range);
2136*c83a76b0SSuyog Pawar 
2137*c83a76b0SSuyog Pawar                                 if(value)
2138*c83a76b0SSuyog Pawar                                 {
2139*c83a76b0SSuyog Pawar                                     sao_offset[i] = -sao_offset[i];
2140*c83a76b0SSuyog Pawar                                 }
2141*c83a76b0SSuyog Pawar                             }
2142*c83a76b0SSuyog Pawar                         }
2143*c83a76b0SSuyog Pawar                         value = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, 5);
2144*c83a76b0SSuyog Pawar                         AEV_TRACE("sao_band_position", value, ps_cabac->u4_range);
2145*c83a76b0SSuyog Pawar 
2146*c83a76b0SSuyog Pawar                         sao_band_position = value;
2147*c83a76b0SSuyog Pawar                     }
2148*c83a76b0SSuyog Pawar                     else
2149*c83a76b0SSuyog Pawar                     {
2150*c83a76b0SSuyog Pawar                         if(c_idx == 0)
2151*c83a76b0SSuyog Pawar                         {
2152*c83a76b0SSuyog Pawar                             value = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, 2);
2153*c83a76b0SSuyog Pawar                             AEV_TRACE("sao_eo_class", value, ps_cabac->u4_range);
2154*c83a76b0SSuyog Pawar 
2155*c83a76b0SSuyog Pawar                             ps_sao->b3_y_type_idx += value;
2156*c83a76b0SSuyog Pawar                         }
2157*c83a76b0SSuyog Pawar 
2158*c83a76b0SSuyog Pawar                         if(c_idx == 1)
2159*c83a76b0SSuyog Pawar                         {
2160*c83a76b0SSuyog Pawar                             value = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, 2);
2161*c83a76b0SSuyog Pawar                             AEV_TRACE("sao_eo_class", value, ps_cabac->u4_range);
2162*c83a76b0SSuyog Pawar 
2163*c83a76b0SSuyog Pawar                             ps_sao->b3_cb_type_idx += value;
2164*c83a76b0SSuyog Pawar                             ps_sao->b3_cr_type_idx += value;
2165*c83a76b0SSuyog Pawar                         }
2166*c83a76b0SSuyog Pawar                     }
2167*c83a76b0SSuyog Pawar 
2168*c83a76b0SSuyog Pawar                     if(0 == c_idx)
2169*c83a76b0SSuyog Pawar                     {
2170*c83a76b0SSuyog Pawar                         ps_sao->b4_y_offset_1 = sao_offset[0];
2171*c83a76b0SSuyog Pawar                         ps_sao->b4_y_offset_2 = sao_offset[1];
2172*c83a76b0SSuyog Pawar                         ps_sao->b4_y_offset_3 = sao_offset[2];
2173*c83a76b0SSuyog Pawar                         ps_sao->b4_y_offset_4 = sao_offset[3];
2174*c83a76b0SSuyog Pawar 
2175*c83a76b0SSuyog Pawar                         ps_sao->b5_y_band_pos = sao_band_position;
2176*c83a76b0SSuyog Pawar                     }
2177*c83a76b0SSuyog Pawar                     else if(1 == c_idx)
2178*c83a76b0SSuyog Pawar                     {
2179*c83a76b0SSuyog Pawar                         ps_sao->b4_cb_offset_1 = sao_offset[0];
2180*c83a76b0SSuyog Pawar                         ps_sao->b4_cb_offset_2 = sao_offset[1];
2181*c83a76b0SSuyog Pawar                         ps_sao->b4_cb_offset_3 = sao_offset[2];
2182*c83a76b0SSuyog Pawar                         ps_sao->b4_cb_offset_4 = sao_offset[3];
2183*c83a76b0SSuyog Pawar 
2184*c83a76b0SSuyog Pawar                         ps_sao->b5_cb_band_pos = sao_band_position;
2185*c83a76b0SSuyog Pawar                     }
2186*c83a76b0SSuyog Pawar                     else // 2 == c_idx
2187*c83a76b0SSuyog Pawar                     {
2188*c83a76b0SSuyog Pawar                         ps_sao->b4_cr_offset_1 = sao_offset[0];
2189*c83a76b0SSuyog Pawar                         ps_sao->b4_cr_offset_2 = sao_offset[1];
2190*c83a76b0SSuyog Pawar                         ps_sao->b4_cr_offset_3 = sao_offset[2];
2191*c83a76b0SSuyog Pawar                         ps_sao->b4_cr_offset_4 = sao_offset[3];
2192*c83a76b0SSuyog Pawar 
2193*c83a76b0SSuyog Pawar                         ps_sao->b5_cr_band_pos = sao_band_position;
2194*c83a76b0SSuyog Pawar                     }
2195*c83a76b0SSuyog Pawar                 }
2196*c83a76b0SSuyog Pawar             }
2197*c83a76b0SSuyog Pawar         }
2198*c83a76b0SSuyog Pawar     }
2199*c83a76b0SSuyog Pawar 
2200*c83a76b0SSuyog Pawar     return ret;
2201*c83a76b0SSuyog Pawar }
2202*c83a76b0SSuyog Pawar /**
2203*c83a76b0SSuyog Pawar  *******************************************************************************
2204*c83a76b0SSuyog Pawar  *
2205*c83a76b0SSuyog Pawar  * @brief
2206*c83a76b0SSuyog Pawar  *  Set ctb skip
2207*c83a76b0SSuyog Pawar  *
2208*c83a76b0SSuyog Pawar  * @par Description:
2209*c83a76b0SSuyog Pawar  *  During error, sets tu and pu params of a ctb as skip.
2210*c83a76b0SSuyog Pawar  *
2211*c83a76b0SSuyog Pawar  * @param[in] ps_codec
2212*c83a76b0SSuyog Pawar  *  Pointer to codec context
2213*c83a76b0SSuyog Pawar  *
2214*c83a76b0SSuyog Pawar  * @returns  None
2215*c83a76b0SSuyog Pawar  *
2216*c83a76b0SSuyog Pawar  * @remarks
2217*c83a76b0SSuyog Pawar  *
2218*c83a76b0SSuyog Pawar  *
2219*c83a76b0SSuyog Pawar  *******************************************************************************
2220*c83a76b0SSuyog Pawar  */
ihevcd_set_ctb_skip(codec_t * ps_codec)2221*c83a76b0SSuyog Pawar void ihevcd_set_ctb_skip(codec_t *ps_codec)
2222*c83a76b0SSuyog Pawar {
2223*c83a76b0SSuyog Pawar     tu_t *ps_tu;
2224*c83a76b0SSuyog Pawar     pu_t *ps_pu;
2225*c83a76b0SSuyog Pawar     sps_t *ps_sps = ps_codec->s_parse.ps_sps;
2226*c83a76b0SSuyog Pawar     WORD32 ctb_size = 1 << ps_sps->i1_log2_ctb_size;
2227*c83a76b0SSuyog Pawar     WORD32 ctb_skip_wd, ctb_skip_ht;
2228*c83a76b0SSuyog Pawar     WORD32 rows_remaining, cols_remaining;
2229*c83a76b0SSuyog Pawar     WORD32 tu_abs_x, tu_abs_y;
2230*c83a76b0SSuyog Pawar     WORD32 numbytes_row =  (ps_sps->i2_pic_width_in_luma_samples + 63) / 64;
2231*c83a76b0SSuyog Pawar     UWORD8 *pu1_pic_intra_flag;
2232*c83a76b0SSuyog Pawar     UWORD32 u4_mask;
2233*c83a76b0SSuyog Pawar     WORD32 pu_x,pu_y;
2234*c83a76b0SSuyog Pawar 
2235*c83a76b0SSuyog Pawar     /* Set pu wd and ht based on whether the ctb is complete or not */
2236*c83a76b0SSuyog Pawar     rows_remaining = ps_sps->i2_pic_height_in_luma_samples
2237*c83a76b0SSuyog Pawar                     - (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size);
2238*c83a76b0SSuyog Pawar     ctb_skip_ht = MIN(ctb_size, rows_remaining);
2239*c83a76b0SSuyog Pawar 
2240*c83a76b0SSuyog Pawar     cols_remaining = ps_sps->i2_pic_width_in_luma_samples
2241*c83a76b0SSuyog Pawar                     - (ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size);
2242*c83a76b0SSuyog Pawar     ctb_skip_wd = MIN(ctb_size, cols_remaining);
2243*c83a76b0SSuyog Pawar 
2244*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_pred_mode = PRED_MODE_SKIP;
2245*c83a76b0SSuyog Pawar     ps_codec->s_parse.s_cu.i4_part_mode = PART_2Nx2N;
2246*c83a76b0SSuyog Pawar 
2247*c83a76b0SSuyog Pawar     for (pu_y = 0; pu_y < ctb_skip_ht ; pu_y += MIN_CU_SIZE)
2248*c83a76b0SSuyog Pawar     {
2249*c83a76b0SSuyog Pawar         for (pu_x = 0; pu_x < ctb_skip_wd ; pu_x += MIN_CU_SIZE)
2250*c83a76b0SSuyog Pawar         {
2251*c83a76b0SSuyog Pawar             ps_tu = ps_codec->s_parse.ps_tu;
2252*c83a76b0SSuyog Pawar             ps_tu->b1_cb_cbf = 0;
2253*c83a76b0SSuyog Pawar             ps_tu->b1_cr_cbf = 0;
2254*c83a76b0SSuyog Pawar             ps_tu->b1_y_cbf = 0;
2255*c83a76b0SSuyog Pawar             ps_tu->b4_pos_x = pu_x >> 2;
2256*c83a76b0SSuyog Pawar             ps_tu->b4_pos_y = pu_y >> 2;
2257*c83a76b0SSuyog Pawar             ps_tu->b1_transquant_bypass = 0;
2258*c83a76b0SSuyog Pawar             ps_tu->b3_size = 1;
2259*c83a76b0SSuyog Pawar             ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
2260*c83a76b0SSuyog Pawar             ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
2261*c83a76b0SSuyog Pawar             ps_tu->b6_luma_intra_mode   = INTRA_PRED_NONE;
2262*c83a76b0SSuyog Pawar             ps_tu->b1_first_tu_in_cu = 1;
2263*c83a76b0SSuyog Pawar 
2264*c83a76b0SSuyog Pawar             ps_codec->s_parse.ps_tu++;
2265*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_cu.i4_tu_cnt++;
2266*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_pic_tu_idx++;
2267*c83a76b0SSuyog Pawar 
2268*c83a76b0SSuyog Pawar             tu_abs_x = (ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size) + pu_x;
2269*c83a76b0SSuyog Pawar             tu_abs_y = (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size) + pu_y;
2270*c83a76b0SSuyog Pawar             pu1_pic_intra_flag = ps_codec->s_parse.pu1_pic_intra_flag;
2271*c83a76b0SSuyog Pawar             pu1_pic_intra_flag += (tu_abs_y >> 3) * numbytes_row;
2272*c83a76b0SSuyog Pawar             pu1_pic_intra_flag += (tu_abs_x >> 6);
2273*c83a76b0SSuyog Pawar             u4_mask = (LSB_ONES((MIN_CU_SIZE >> 3)) << (((tu_abs_x) / 8) % 8));
2274*c83a76b0SSuyog Pawar             u4_mask = ~u4_mask;
2275*c83a76b0SSuyog Pawar             *pu1_pic_intra_flag &= u4_mask;
2276*c83a76b0SSuyog Pawar 
2277*c83a76b0SSuyog Pawar             ps_pu = ps_codec->s_parse.ps_pu;
2278*c83a76b0SSuyog Pawar             ps_pu->b2_part_idx = 0;
2279*c83a76b0SSuyog Pawar             ps_pu->b4_pos_x = pu_x >> 2;
2280*c83a76b0SSuyog Pawar             ps_pu->b4_pos_y = pu_y >> 2;
2281*c83a76b0SSuyog Pawar             ps_pu->b4_wd = 1;
2282*c83a76b0SSuyog Pawar             ps_pu->b4_ht = 1;
2283*c83a76b0SSuyog Pawar             ps_pu->b1_intra_flag = 0;
2284*c83a76b0SSuyog Pawar             ps_pu->b3_part_mode = ps_codec->s_parse.s_cu.i4_part_mode;
2285*c83a76b0SSuyog Pawar             ps_pu->b1_merge_flag = 1;
2286*c83a76b0SSuyog Pawar             ps_pu->b3_merge_idx = 0;
2287*c83a76b0SSuyog Pawar 
2288*c83a76b0SSuyog Pawar             ps_codec->s_parse.ps_pu++;
2289*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_pic_pu_idx++;
2290*c83a76b0SSuyog Pawar         }
2291*c83a76b0SSuyog Pawar     }
2292*c83a76b0SSuyog Pawar }
2293*c83a76b0SSuyog Pawar 
2294*c83a76b0SSuyog Pawar /**
2295*c83a76b0SSuyog Pawar  *******************************************************************************
2296*c83a76b0SSuyog Pawar  *
2297*c83a76b0SSuyog Pawar  * @brief
2298*c83a76b0SSuyog Pawar  *  Parses Slice data syntax
2299*c83a76b0SSuyog Pawar  *
2300*c83a76b0SSuyog Pawar  * @par Description:
2301*c83a76b0SSuyog Pawar  *  Parses Slice data syntax as per Section:7.3.9.1
2302*c83a76b0SSuyog Pawar  *
2303*c83a76b0SSuyog Pawar  * @param[in] ps_codec
2304*c83a76b0SSuyog Pawar  *  Pointer to codec context
2305*c83a76b0SSuyog Pawar  *
2306*c83a76b0SSuyog Pawar  * @returns  Error from IHEVCD_ERROR_T
2307*c83a76b0SSuyog Pawar  *
2308*c83a76b0SSuyog Pawar  * @remarks
2309*c83a76b0SSuyog Pawar  *
2310*c83a76b0SSuyog Pawar  *
2311*c83a76b0SSuyog Pawar  *******************************************************************************
2312*c83a76b0SSuyog Pawar  */
ihevcd_parse_slice_data(codec_t * ps_codec)2313*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_slice_data(codec_t *ps_codec)
2314*c83a76b0SSuyog Pawar {
2315*c83a76b0SSuyog Pawar 
2316*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2317*c83a76b0SSuyog Pawar     WORD32 end_of_slice_flag = 0;
2318*c83a76b0SSuyog Pawar     sps_t *ps_sps;
2319*c83a76b0SSuyog Pawar     pps_t *ps_pps;
2320*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
2321*c83a76b0SSuyog Pawar     WORD32 end_of_pic;
2322*c83a76b0SSuyog Pawar     tile_t *ps_tile, *ps_tile_prev;
2323*c83a76b0SSuyog Pawar     WORD32 i;
2324*c83a76b0SSuyog Pawar     WORD32 ctb_addr;
2325*c83a76b0SSuyog Pawar     WORD32 tile_idx;
2326*c83a76b0SSuyog Pawar     WORD32 cabac_init_idc;
2327*c83a76b0SSuyog Pawar     WORD32 ctb_size;
2328*c83a76b0SSuyog Pawar     WORD32 num_ctb_in_row;
2329*c83a76b0SSuyog Pawar     WORD32 num_min4x4_in_ctb;
2330*c83a76b0SSuyog Pawar     WORD32 slice_qp;
2331*c83a76b0SSuyog Pawar     WORD32 slice_start_ctb_idx;
2332*c83a76b0SSuyog Pawar     WORD32 tile_start_ctb_idx;
2333*c83a76b0SSuyog Pawar 
2334*c83a76b0SSuyog Pawar 
2335*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr_base;
2336*c83a76b0SSuyog Pawar     ps_pps = ps_codec->s_parse.ps_pps_base;
2337*c83a76b0SSuyog Pawar     ps_sps = ps_codec->s_parse.ps_sps_base;
2338*c83a76b0SSuyog Pawar 
2339*c83a76b0SSuyog Pawar     /* Get current slice header, pps and sps */
2340*c83a76b0SSuyog Pawar     ps_slice_hdr += (ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1));
2341*c83a76b0SSuyog Pawar     ps_pps  += ps_slice_hdr->i1_pps_id;
2342*c83a76b0SSuyog Pawar     ps_sps  += ps_pps->i1_sps_id;
2343*c83a76b0SSuyog Pawar 
2344*c83a76b0SSuyog Pawar     if(0 != ps_codec->s_parse.i4_cur_slice_idx)
2345*c83a76b0SSuyog Pawar     {
2346*c83a76b0SSuyog Pawar         if(!ps_slice_hdr->i1_dependent_slice_flag)
2347*c83a76b0SSuyog Pawar         {
2348*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_cur_independent_slice_idx =
2349*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1);
2350*c83a76b0SSuyog Pawar         }
2351*c83a76b0SSuyog Pawar     }
2352*c83a76b0SSuyog Pawar 
2353*c83a76b0SSuyog Pawar 
2354*c83a76b0SSuyog Pawar     ctb_size = 1 << ps_sps->i1_log2_ctb_size;
2355*c83a76b0SSuyog Pawar     num_min4x4_in_ctb = (ctb_size / 4) * (ctb_size / 4);
2356*c83a76b0SSuyog Pawar     num_ctb_in_row = ps_sps->i2_pic_wd_in_ctb;
2357*c83a76b0SSuyog Pawar 
2358*c83a76b0SSuyog Pawar     /* Update the parse context */
2359*c83a76b0SSuyog Pawar     if(0 == ps_codec->i4_slice_error)
2360*c83a76b0SSuyog Pawar     {
2361*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_x = ps_slice_hdr->i2_ctb_x;
2362*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_y = ps_slice_hdr->i2_ctb_y;
2363*c83a76b0SSuyog Pawar     }
2364*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_pps = ps_pps;
2365*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_sps = ps_sps;
2366*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_slice_hdr = ps_slice_hdr;
2367*c83a76b0SSuyog Pawar 
2368*c83a76b0SSuyog Pawar     /* Derive Tile positions for the current CTB */
2369*c83a76b0SSuyog Pawar     /* Change this to lookup if required */
2370*c83a76b0SSuyog Pawar     ihevcd_get_tile_pos(ps_pps, ps_sps, ps_codec->s_parse.i4_ctb_x,
2371*c83a76b0SSuyog Pawar                         ps_codec->s_parse.i4_ctb_y,
2372*c83a76b0SSuyog Pawar                         &ps_codec->s_parse.i4_ctb_tile_x,
2373*c83a76b0SSuyog Pawar                         &ps_codec->s_parse.i4_ctb_tile_y,
2374*c83a76b0SSuyog Pawar                         &tile_idx);
2375*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_tile = ps_pps->ps_tile + tile_idx;
2376*c83a76b0SSuyog Pawar     ps_codec->s_parse.i4_cur_tile_idx = tile_idx;
2377*c83a76b0SSuyog Pawar     ps_tile = ps_codec->s_parse.ps_tile;
2378*c83a76b0SSuyog Pawar     if(tile_idx)
2379*c83a76b0SSuyog Pawar         ps_tile_prev = ps_tile - 1;
2380*c83a76b0SSuyog Pawar     else
2381*c83a76b0SSuyog Pawar         ps_tile_prev = ps_tile;
2382*c83a76b0SSuyog Pawar 
2383*c83a76b0SSuyog Pawar     /* If the present slice is dependent, then store the previous
2384*c83a76b0SSuyog Pawar      * independent slices' ctb x and y values for decoding process */
2385*c83a76b0SSuyog Pawar     if(0 == ps_codec->i4_slice_error)
2386*c83a76b0SSuyog Pawar     {
2387*c83a76b0SSuyog Pawar         if(1 == ps_slice_hdr->i1_dependent_slice_flag)
2388*c83a76b0SSuyog Pawar         {
2389*c83a76b0SSuyog Pawar             /*If slice is present at the start of a new tile*/
2390*c83a76b0SSuyog Pawar             if((0 == ps_codec->s_parse.i4_ctb_tile_x) && (0 == ps_codec->s_parse.i4_ctb_tile_y))
2391*c83a76b0SSuyog Pawar             {
2392*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_x = 0;
2393*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_y = 0;
2394*c83a76b0SSuyog Pawar             }
2395*c83a76b0SSuyog Pawar         }
2396*c83a76b0SSuyog Pawar 
2397*c83a76b0SSuyog Pawar         if(!ps_slice_hdr->i1_dependent_slice_flag)
2398*c83a76b0SSuyog Pawar         {
2399*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_ctb_slice_x = 0;
2400*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_ctb_slice_y = 0;
2401*c83a76b0SSuyog Pawar         }
2402*c83a76b0SSuyog Pawar     }
2403*c83a76b0SSuyog Pawar 
2404*c83a76b0SSuyog Pawar     /* Frame level initializations */
2405*c83a76b0SSuyog Pawar     if((0 == ps_codec->s_parse.i4_ctb_y) &&
2406*c83a76b0SSuyog Pawar                     (0 == ps_codec->s_parse.i4_ctb_x))
2407*c83a76b0SSuyog Pawar     {
2408*c83a76b0SSuyog Pawar         ret = ihevcd_parse_pic_init(ps_codec);
2409*c83a76b0SSuyog Pawar         RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
2410*c83a76b0SSuyog Pawar 
2411*c83a76b0SSuyog Pawar         ps_codec->s_parse.pu4_pic_tu_idx[0] = 0;
2412*c83a76b0SSuyog Pawar         ps_codec->s_parse.pu4_pic_pu_idx[0] = 0;
2413*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_cur_independent_slice_idx = 0;
2414*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_tile_x = 0;
2415*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_tile_y = 0;
2416*c83a76b0SSuyog Pawar     }
2417*c83a76b0SSuyog Pawar 
2418*c83a76b0SSuyog Pawar     {
2419*c83a76b0SSuyog Pawar         /* Updating the poc list of current slice to ps_mv_buf */
2420*c83a76b0SSuyog Pawar         mv_buf_t *ps_mv_buf = ps_codec->s_parse.ps_cur_mv_buf;
2421*c83a76b0SSuyog Pawar 
2422*c83a76b0SSuyog Pawar         if(ps_slice_hdr->i1_num_ref_idx_l1_active != 0)
2423*c83a76b0SSuyog Pawar         {
2424*c83a76b0SSuyog Pawar             for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
2425*c83a76b0SSuyog Pawar             {
2426*c83a76b0SSuyog Pawar                 ps_mv_buf->ai4_l1_collocated_poc[(ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1))][i] = ((pic_buf_t *)ps_slice_hdr->as_ref_pic_list1[i].pv_pic_buf)->i4_abs_poc;
2427*c83a76b0SSuyog Pawar                 ps_mv_buf->ai1_l1_collocated_poc_lt[(ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1))][i] = ((pic_buf_t *)ps_slice_hdr->as_ref_pic_list1[i].pv_pic_buf)->u1_used_as_ref;
2428*c83a76b0SSuyog Pawar             }
2429*c83a76b0SSuyog Pawar         }
2430*c83a76b0SSuyog Pawar 
2431*c83a76b0SSuyog Pawar         if(ps_slice_hdr->i1_num_ref_idx_l0_active != 0)
2432*c83a76b0SSuyog Pawar         {
2433*c83a76b0SSuyog Pawar             for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
2434*c83a76b0SSuyog Pawar             {
2435*c83a76b0SSuyog Pawar                 ps_mv_buf->ai4_l0_collocated_poc[(ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1))][i] = ((pic_buf_t *)ps_slice_hdr->as_ref_pic_list0[i].pv_pic_buf)->i4_abs_poc;
2436*c83a76b0SSuyog Pawar                 ps_mv_buf->ai1_l0_collocated_poc_lt[(ps_codec->s_parse.i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1))][i] = ((pic_buf_t *)ps_slice_hdr->as_ref_pic_list0[i].pv_pic_buf)->u1_used_as_ref;
2437*c83a76b0SSuyog Pawar             }
2438*c83a76b0SSuyog Pawar         }
2439*c83a76b0SSuyog Pawar     }
2440*c83a76b0SSuyog Pawar 
2441*c83a76b0SSuyog Pawar     /*Initialize the low delay flag at the beginning of every slice*/
2442*c83a76b0SSuyog Pawar     if((0 == ps_codec->s_parse.i4_ctb_slice_x) || (0 == ps_codec->s_parse.i4_ctb_slice_y))
2443*c83a76b0SSuyog Pawar     {
2444*c83a76b0SSuyog Pawar         /* Lowdelay flag */
2445*c83a76b0SSuyog Pawar         WORD32 cur_poc, ref_list_poc, flag = 1;
2446*c83a76b0SSuyog Pawar         cur_poc = ps_slice_hdr->i4_abs_pic_order_cnt;
2447*c83a76b0SSuyog Pawar         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
2448*c83a76b0SSuyog Pawar         {
2449*c83a76b0SSuyog Pawar             ref_list_poc = ((mv_buf_t *)ps_slice_hdr->as_ref_pic_list0[i].pv_mv_buf)->i4_abs_poc;
2450*c83a76b0SSuyog Pawar             if(ref_list_poc > cur_poc)
2451*c83a76b0SSuyog Pawar             {
2452*c83a76b0SSuyog Pawar                 flag = 0;
2453*c83a76b0SSuyog Pawar                 break;
2454*c83a76b0SSuyog Pawar             }
2455*c83a76b0SSuyog Pawar         }
2456*c83a76b0SSuyog Pawar         if(flag && (ps_slice_hdr->i1_slice_type == BSLICE))
2457*c83a76b0SSuyog Pawar         {
2458*c83a76b0SSuyog Pawar             for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
2459*c83a76b0SSuyog Pawar             {
2460*c83a76b0SSuyog Pawar                 ref_list_poc = ((mv_buf_t *)ps_slice_hdr->as_ref_pic_list1[i].pv_mv_buf)->i4_abs_poc;
2461*c83a76b0SSuyog Pawar                 if(ref_list_poc > cur_poc)
2462*c83a76b0SSuyog Pawar                 {
2463*c83a76b0SSuyog Pawar                     flag = 0;
2464*c83a76b0SSuyog Pawar                     break;
2465*c83a76b0SSuyog Pawar                 }
2466*c83a76b0SSuyog Pawar             }
2467*c83a76b0SSuyog Pawar         }
2468*c83a76b0SSuyog Pawar         ps_slice_hdr->i1_low_delay_flag = flag;
2469*c83a76b0SSuyog Pawar     }
2470*c83a76b0SSuyog Pawar 
2471*c83a76b0SSuyog Pawar     /* initialize the cabac init idc based on slice type */
2472*c83a76b0SSuyog Pawar     if(ps_slice_hdr->i1_slice_type == ISLICE)
2473*c83a76b0SSuyog Pawar     {
2474*c83a76b0SSuyog Pawar         cabac_init_idc = 0;
2475*c83a76b0SSuyog Pawar     }
2476*c83a76b0SSuyog Pawar     else if(ps_slice_hdr->i1_slice_type == PSLICE)
2477*c83a76b0SSuyog Pawar     {
2478*c83a76b0SSuyog Pawar         cabac_init_idc = ps_slice_hdr->i1_cabac_init_flag ? 2 : 1;
2479*c83a76b0SSuyog Pawar     }
2480*c83a76b0SSuyog Pawar     else
2481*c83a76b0SSuyog Pawar     {
2482*c83a76b0SSuyog Pawar         cabac_init_idc = ps_slice_hdr->i1_cabac_init_flag ? 1 : 2;
2483*c83a76b0SSuyog Pawar     }
2484*c83a76b0SSuyog Pawar 
2485*c83a76b0SSuyog Pawar     slice_qp = ps_slice_hdr->i1_slice_qp_delta + ps_pps->i1_pic_init_qp;
2486*c83a76b0SSuyog Pawar     slice_qp = CLIP3(slice_qp, 0, 51);
2487*c83a76b0SSuyog Pawar 
2488*c83a76b0SSuyog Pawar     /*Update QP value for every indepndent slice or for every dependent slice that begins at the start of a new tile*/
2489*c83a76b0SSuyog Pawar     if((0 == ps_slice_hdr->i1_dependent_slice_flag) ||
2490*c83a76b0SSuyog Pawar                     ((1 == ps_slice_hdr->i1_dependent_slice_flag) && ((0 == ps_codec->s_parse.i4_ctb_tile_x) && (0 == ps_codec->s_parse.i4_ctb_tile_y))))
2491*c83a76b0SSuyog Pawar     {
2492*c83a76b0SSuyog Pawar         ps_codec->s_parse.u4_qp = slice_qp;
2493*c83a76b0SSuyog Pawar     }
2494*c83a76b0SSuyog Pawar 
2495*c83a76b0SSuyog Pawar     /*Cabac init at the beginning of a slice*/
2496*c83a76b0SSuyog Pawar     //If the slice is a dependent slice, not present at the start of a tile
2497*c83a76b0SSuyog Pawar     if(0 == ps_codec->i4_slice_error)
2498*c83a76b0SSuyog Pawar     {
2499*c83a76b0SSuyog Pawar         if((1 == ps_slice_hdr->i1_dependent_slice_flag) && (!((ps_codec->s_parse.i4_ctb_tile_x == 0) && (ps_codec->s_parse.i4_ctb_tile_y == 0))))
2500*c83a76b0SSuyog Pawar         {
2501*c83a76b0SSuyog Pawar             if((0 == ps_pps->i1_entropy_coding_sync_enabled_flag) || (ps_pps->i1_entropy_coding_sync_enabled_flag && (0 != ps_codec->s_parse.i4_ctb_x)))
2502*c83a76b0SSuyog Pawar             {
2503*c83a76b0SSuyog Pawar                 ihevcd_cabac_reset(&ps_codec->s_parse.s_cabac,
2504*c83a76b0SSuyog Pawar                                    &ps_codec->s_parse.s_bitstrm);
2505*c83a76b0SSuyog Pawar             }
2506*c83a76b0SSuyog Pawar         }
2507*c83a76b0SSuyog Pawar         else if((0 == ps_pps->i1_entropy_coding_sync_enabled_flag) || (ps_pps->i1_entropy_coding_sync_enabled_flag && (0 != ps_codec->s_parse.i4_ctb_x)))
2508*c83a76b0SSuyog Pawar         {
2509*c83a76b0SSuyog Pawar             ret = ihevcd_cabac_init(&ps_codec->s_parse.s_cabac,
2510*c83a76b0SSuyog Pawar                                     &ps_codec->s_parse.s_bitstrm,
2511*c83a76b0SSuyog Pawar                                     slice_qp,
2512*c83a76b0SSuyog Pawar                                     cabac_init_idc,
2513*c83a76b0SSuyog Pawar                                     &gau1_ihevc_cab_ctxts[cabac_init_idc][slice_qp][0]);
2514*c83a76b0SSuyog Pawar             if(ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
2515*c83a76b0SSuyog Pawar             {
2516*c83a76b0SSuyog Pawar                 ps_codec->i4_slice_error = 1;
2517*c83a76b0SSuyog Pawar                 end_of_slice_flag = 1;
2518*c83a76b0SSuyog Pawar                 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2519*c83a76b0SSuyog Pawar             }
2520*c83a76b0SSuyog Pawar         }
2521*c83a76b0SSuyog Pawar     }
2522*c83a76b0SSuyog Pawar 
2523*c83a76b0SSuyog Pawar 
2524*c83a76b0SSuyog Pawar     do
2525*c83a76b0SSuyog Pawar     {
2526*c83a76b0SSuyog Pawar 
2527*c83a76b0SSuyog Pawar         {
2528*c83a76b0SSuyog Pawar             WORD32 cur_ctb_idx = ps_codec->s_parse.i4_ctb_x
2529*c83a76b0SSuyog Pawar                             + ps_codec->s_parse.i4_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
2530*c83a76b0SSuyog Pawar             if(1 == ps_codec->i4_num_cores && 0 == cur_ctb_idx % RESET_TU_BUF_NCTB)
2531*c83a76b0SSuyog Pawar             {
2532*c83a76b0SSuyog Pawar                 ps_codec->s_parse.ps_tu = ps_codec->s_parse.ps_pic_tu;
2533*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_pic_tu_idx = 0;
2534*c83a76b0SSuyog Pawar             }
2535*c83a76b0SSuyog Pawar         }
2536*c83a76b0SSuyog Pawar 
2537*c83a76b0SSuyog Pawar         end_of_pic = 0;
2538*c83a76b0SSuyog Pawar         /* Section:7.3.7 Coding tree unit syntax */
2539*c83a76b0SSuyog Pawar         /* coding_tree_unit() inlined here */
2540*c83a76b0SSuyog Pawar         /* If number of cores is greater than 1, then add job to the queue */
2541*c83a76b0SSuyog Pawar         //TODO: Dual core implementation might need a different algo for better load balancing
2542*c83a76b0SSuyog Pawar         /* At the start of ctb row parsing in a tile, queue a job for processing the current tile row */
2543*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_num_pcm_blks = 0;
2544*c83a76b0SSuyog Pawar 
2545*c83a76b0SSuyog Pawar 
2546*c83a76b0SSuyog Pawar         /*At the beginning of each tile-which is not the beginning of a slice, cabac context must be initialized.
2547*c83a76b0SSuyog Pawar          * Hence, check for the tile beginning here */
2548*c83a76b0SSuyog Pawar         if(((0 == ps_codec->s_parse.i4_ctb_tile_x) && (0 == ps_codec->s_parse.i4_ctb_tile_y))
2549*c83a76b0SSuyog Pawar                         && (!((ps_tile->u1_pos_x == 0) && (ps_tile->u1_pos_y == 0)))
2550*c83a76b0SSuyog Pawar                         && (!((0 == ps_codec->s_parse.i4_ctb_slice_x) && (0 == ps_codec->s_parse.i4_ctb_slice_y))))
2551*c83a76b0SSuyog Pawar         {
2552*c83a76b0SSuyog Pawar             slice_qp = ps_slice_hdr->i1_slice_qp_delta + ps_pps->i1_pic_init_qp;
2553*c83a76b0SSuyog Pawar             slice_qp = CLIP3(slice_qp, 0, 51);
2554*c83a76b0SSuyog Pawar             ps_codec->s_parse.u4_qp = slice_qp;
2555*c83a76b0SSuyog Pawar 
2556*c83a76b0SSuyog Pawar             ihevcd_get_tile_pos(ps_pps, ps_sps, ps_codec->s_parse.i4_ctb_x,
2557*c83a76b0SSuyog Pawar                                 ps_codec->s_parse.i4_ctb_y,
2558*c83a76b0SSuyog Pawar                                 &ps_codec->s_parse.i4_ctb_tile_x,
2559*c83a76b0SSuyog Pawar                                 &ps_codec->s_parse.i4_ctb_tile_y,
2560*c83a76b0SSuyog Pawar                                 &tile_idx);
2561*c83a76b0SSuyog Pawar 
2562*c83a76b0SSuyog Pawar             ps_codec->s_parse.ps_tile = ps_pps->ps_tile + tile_idx;
2563*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_cur_tile_idx = tile_idx;
2564*c83a76b0SSuyog Pawar             ps_tile_prev = ps_tile - 1;
2565*c83a76b0SSuyog Pawar 
2566*c83a76b0SSuyog Pawar             tile_start_ctb_idx = ps_tile->u1_pos_x
2567*c83a76b0SSuyog Pawar                             + ps_tile->u1_pos_y * (ps_sps->i2_pic_wd_in_ctb);
2568*c83a76b0SSuyog Pawar 
2569*c83a76b0SSuyog Pawar             slice_start_ctb_idx =  ps_slice_hdr->i2_ctb_x
2570*c83a76b0SSuyog Pawar                             + ps_slice_hdr->i2_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
2571*c83a76b0SSuyog Pawar 
2572*c83a76b0SSuyog Pawar             /*For slices that span across multiple tiles*/
2573*c83a76b0SSuyog Pawar             if(slice_start_ctb_idx < tile_start_ctb_idx)
2574*c83a76b0SSuyog Pawar             {       /* 2 Cases
2575*c83a76b0SSuyog Pawar              * 1 - slice spans across frame-width- but does not start from 1st column
2576*c83a76b0SSuyog Pawar              * 2 - Slice spans across multiple tiles anywhere is a frame
2577*c83a76b0SSuyog Pawar              */
2578*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_y = ps_tile->u1_pos_y - ps_slice_hdr->i2_ctb_y;
2579*c83a76b0SSuyog Pawar                 if(!(((ps_slice_hdr->i2_ctb_x + ps_tile_prev->u2_wd) % ps_sps->i2_pic_wd_in_ctb) == ps_tile->u1_pos_x)) //Case 2
2580*c83a76b0SSuyog Pawar                 {
2581*c83a76b0SSuyog Pawar                     if(ps_slice_hdr->i2_ctb_y <= ps_tile->u1_pos_y)
2582*c83a76b0SSuyog Pawar                     {
2583*c83a76b0SSuyog Pawar                         //Check if ctb x is before or after
2584*c83a76b0SSuyog Pawar                         if(ps_slice_hdr->i2_ctb_x > ps_tile->u1_pos_x)
2585*c83a76b0SSuyog Pawar                         {
2586*c83a76b0SSuyog Pawar                             ps_codec->s_parse.i4_ctb_slice_y -= 1;
2587*c83a76b0SSuyog Pawar                         }
2588*c83a76b0SSuyog Pawar                     }
2589*c83a76b0SSuyog Pawar                 }
2590*c83a76b0SSuyog Pawar                 /*ps_codec->s_parse.i4_ctb_slice_y = ps_tile->u1_pos_y - ps_slice_hdr->i2_ctb_y;
2591*c83a76b0SSuyog Pawar                 if (ps_slice_hdr->i2_ctb_y <= ps_tile->u1_pos_y)
2592*c83a76b0SSuyog Pawar                 {
2593*c83a76b0SSuyog Pawar                     //Check if ctb x is before or after
2594*c83a76b0SSuyog Pawar                     if (ps_slice_hdr->i2_ctb_x > ps_tile->u1_pos_x )
2595*c83a76b0SSuyog Pawar                     {
2596*c83a76b0SSuyog Pawar                         ps_codec->s_parse.i4_ctb_slice_y -= 1 ;
2597*c83a76b0SSuyog Pawar                     }
2598*c83a76b0SSuyog Pawar                 }*/
2599*c83a76b0SSuyog Pawar             }
2600*c83a76b0SSuyog Pawar 
2601*c83a76b0SSuyog Pawar             /* Cabac init is done unconditionally at the start of the tile irrespective
2602*c83a76b0SSuyog Pawar              * of whether it is a dependent or an independent slice */
2603*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_slice_error)
2604*c83a76b0SSuyog Pawar             {
2605*c83a76b0SSuyog Pawar                 ret = ihevcd_cabac_init(&ps_codec->s_parse.s_cabac,
2606*c83a76b0SSuyog Pawar                                         &ps_codec->s_parse.s_bitstrm,
2607*c83a76b0SSuyog Pawar                                         slice_qp,
2608*c83a76b0SSuyog Pawar                                         cabac_init_idc,
2609*c83a76b0SSuyog Pawar                                         &gau1_ihevc_cab_ctxts[cabac_init_idc][slice_qp][0]);
2610*c83a76b0SSuyog Pawar                 if(ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
2611*c83a76b0SSuyog Pawar                 {
2612*c83a76b0SSuyog Pawar                     ps_codec->i4_slice_error = 1;
2613*c83a76b0SSuyog Pawar                     end_of_slice_flag = 1;
2614*c83a76b0SSuyog Pawar                     ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2615*c83a76b0SSuyog Pawar                 }
2616*c83a76b0SSuyog Pawar 
2617*c83a76b0SSuyog Pawar             }
2618*c83a76b0SSuyog Pawar         }
2619*c83a76b0SSuyog Pawar         /* If number of cores is greater than 1, then add job to the queue */
2620*c83a76b0SSuyog Pawar         //TODO: Dual core implementation might need a different algo for better load balancing
2621*c83a76b0SSuyog Pawar         /* At the start of ctb row parsing in a tile, queue a job for processing the current tile row */
2622*c83a76b0SSuyog Pawar 
2623*c83a76b0SSuyog Pawar         if(0 == ps_codec->s_parse.i4_ctb_tile_x)
2624*c83a76b0SSuyog Pawar         {
2625*c83a76b0SSuyog Pawar 
2626*c83a76b0SSuyog Pawar             if(1 < ps_codec->i4_num_cores)
2627*c83a76b0SSuyog Pawar             {
2628*c83a76b0SSuyog Pawar                 proc_job_t s_job;
2629*c83a76b0SSuyog Pawar                 IHEVCD_ERROR_T ret;
2630*c83a76b0SSuyog Pawar                 s_job.i4_cmd    = CMD_PROCESS;
2631*c83a76b0SSuyog Pawar                 s_job.i2_ctb_cnt = (WORD16)ps_tile->u2_wd;
2632*c83a76b0SSuyog Pawar                 s_job.i2_ctb_x = (WORD16)ps_codec->s_parse.i4_ctb_x;
2633*c83a76b0SSuyog Pawar                 s_job.i2_ctb_y = (WORD16)ps_codec->s_parse.i4_ctb_y;
2634*c83a76b0SSuyog Pawar                 s_job.i2_slice_idx = (WORD16)ps_codec->s_parse.i4_cur_slice_idx;
2635*c83a76b0SSuyog Pawar                 s_job.i4_tu_coeff_data_ofst = (UWORD8 *)ps_codec->s_parse.pv_tu_coeff_data -
2636*c83a76b0SSuyog Pawar                                 (UWORD8 *)ps_codec->s_parse.pv_pic_tu_coeff_data;
2637*c83a76b0SSuyog Pawar                 ret = ihevcd_jobq_queue((jobq_t *)ps_codec->s_parse.pv_proc_jobq, &s_job, sizeof(proc_job_t), 1);
2638*c83a76b0SSuyog Pawar 
2639*c83a76b0SSuyog Pawar                 if(ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
2640*c83a76b0SSuyog Pawar                     return ret;
2641*c83a76b0SSuyog Pawar             }
2642*c83a76b0SSuyog Pawar             else
2643*c83a76b0SSuyog Pawar             {
2644*c83a76b0SSuyog Pawar                 process_ctxt_t *ps_proc = &ps_codec->as_process[0];
2645*c83a76b0SSuyog Pawar                 WORD32 tu_coeff_data_ofst = (UWORD8 *)ps_codec->s_parse.pv_tu_coeff_data -
2646*c83a76b0SSuyog Pawar                                 (UWORD8 *)ps_codec->s_parse.pv_pic_tu_coeff_data;
2647*c83a76b0SSuyog Pawar 
2648*c83a76b0SSuyog Pawar                 /* If the codec is running in single core mode,
2649*c83a76b0SSuyog Pawar                  * initialize zeroth process context
2650*c83a76b0SSuyog Pawar                  * TODO: Dual core mode might need a different implementation instead of jobq
2651*c83a76b0SSuyog Pawar                  */
2652*c83a76b0SSuyog Pawar 
2653*c83a76b0SSuyog Pawar                 ps_proc->i4_ctb_cnt = ps_tile->u2_wd;
2654*c83a76b0SSuyog Pawar                 ps_proc->i4_ctb_x   = ps_codec->s_parse.i4_ctb_x;
2655*c83a76b0SSuyog Pawar                 ps_proc->i4_ctb_y   = ps_codec->s_parse.i4_ctb_y;
2656*c83a76b0SSuyog Pawar                 ps_proc->i4_cur_slice_idx = ps_codec->s_parse.i4_cur_slice_idx;
2657*c83a76b0SSuyog Pawar 
2658*c83a76b0SSuyog Pawar                 ihevcd_init_proc_ctxt(ps_proc, tu_coeff_data_ofst);
2659*c83a76b0SSuyog Pawar             }
2660*c83a76b0SSuyog Pawar         }
2661*c83a76b0SSuyog Pawar 
2662*c83a76b0SSuyog Pawar 
2663*c83a76b0SSuyog Pawar         /* Restore cabac context model from top right CTB if entropy sync is enabled */
2664*c83a76b0SSuyog Pawar         if(ps_pps->i1_entropy_coding_sync_enabled_flag)
2665*c83a76b0SSuyog Pawar         {
2666*c83a76b0SSuyog Pawar             /*TODO Handle single CTB and top-right belonging to a different slice */
2667*c83a76b0SSuyog Pawar             if(0 == ps_codec->s_parse.i4_ctb_x && 0 == ps_codec->i4_slice_error)
2668*c83a76b0SSuyog Pawar             {
2669*c83a76b0SSuyog Pawar                 //WORD32 size = sizeof(ps_codec->s_parse.s_cabac.au1_ctxt_models);
2670*c83a76b0SSuyog Pawar                 WORD32 default_ctxt = 0;
2671*c83a76b0SSuyog Pawar 
2672*c83a76b0SSuyog Pawar                 if((0 == ps_codec->s_parse.i4_ctb_slice_y) && (!ps_slice_hdr->i1_dependent_slice_flag))
2673*c83a76b0SSuyog Pawar                     default_ctxt = 1;
2674*c83a76b0SSuyog Pawar                 if(1 == ps_sps->i2_pic_wd_in_ctb)
2675*c83a76b0SSuyog Pawar                     default_ctxt = 1;
2676*c83a76b0SSuyog Pawar 
2677*c83a76b0SSuyog Pawar                 ps_codec->s_parse.u4_qp = slice_qp;
2678*c83a76b0SSuyog Pawar                 if(default_ctxt)
2679*c83a76b0SSuyog Pawar                 {
2680*c83a76b0SSuyog Pawar                     //memcpy(&ps_codec->s_parse.s_cabac.au1_ctxt_models, &gau1_ihevc_cab_ctxts[cabac_init_idc][slice_qp][0], size);
2681*c83a76b0SSuyog Pawar                     ret = ihevcd_cabac_init(&ps_codec->s_parse.s_cabac,
2682*c83a76b0SSuyog Pawar                                             &ps_codec->s_parse.s_bitstrm,
2683*c83a76b0SSuyog Pawar                                             slice_qp,
2684*c83a76b0SSuyog Pawar                                             cabac_init_idc,
2685*c83a76b0SSuyog Pawar                                             &gau1_ihevc_cab_ctxts[cabac_init_idc][slice_qp][0]);
2686*c83a76b0SSuyog Pawar 
2687*c83a76b0SSuyog Pawar                     if(ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
2688*c83a76b0SSuyog Pawar                     {
2689*c83a76b0SSuyog Pawar                         ps_codec->i4_slice_error = 1;
2690*c83a76b0SSuyog Pawar                         end_of_slice_flag = 1;
2691*c83a76b0SSuyog Pawar                         ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2692*c83a76b0SSuyog Pawar                     }
2693*c83a76b0SSuyog Pawar                 }
2694*c83a76b0SSuyog Pawar                 else
2695*c83a76b0SSuyog Pawar                 {
2696*c83a76b0SSuyog Pawar                     //memcpy(&ps_codec->s_parse.s_cabac.au1_ctxt_models, &ps_codec->s_parse.s_cabac.au1_ctxt_models_sync, size);
2697*c83a76b0SSuyog Pawar                     ret = ihevcd_cabac_init(&ps_codec->s_parse.s_cabac,
2698*c83a76b0SSuyog Pawar                                             &ps_codec->s_parse.s_bitstrm,
2699*c83a76b0SSuyog Pawar                                             slice_qp,
2700*c83a76b0SSuyog Pawar                                             cabac_init_idc,
2701*c83a76b0SSuyog Pawar                                             (const UWORD8 *)&ps_codec->s_parse.s_cabac.au1_ctxt_models_sync);
2702*c83a76b0SSuyog Pawar 
2703*c83a76b0SSuyog Pawar                     if(ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
2704*c83a76b0SSuyog Pawar                     {
2705*c83a76b0SSuyog Pawar                         ps_codec->i4_slice_error = 1;
2706*c83a76b0SSuyog Pawar                         end_of_slice_flag = 1;
2707*c83a76b0SSuyog Pawar                         ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2708*c83a76b0SSuyog Pawar                     }
2709*c83a76b0SSuyog Pawar                 }
2710*c83a76b0SSuyog Pawar             }
2711*c83a76b0SSuyog Pawar         }
2712*c83a76b0SSuyog Pawar 
2713*c83a76b0SSuyog Pawar 
2714*c83a76b0SSuyog Pawar 
2715*c83a76b0SSuyog Pawar         if(0 == ps_codec->i4_slice_error)
2716*c83a76b0SSuyog Pawar         {
2717*c83a76b0SSuyog Pawar             if(ps_slice_hdr->i1_slice_sao_luma_flag || ps_slice_hdr->i1_slice_sao_chroma_flag)
2718*c83a76b0SSuyog Pawar                 ihevcd_parse_sao(ps_codec);
2719*c83a76b0SSuyog Pawar         }
2720*c83a76b0SSuyog Pawar         else
2721*c83a76b0SSuyog Pawar         {
2722*c83a76b0SSuyog Pawar             sao_t *ps_sao = ps_codec->s_parse.ps_pic_sao +
2723*c83a76b0SSuyog Pawar                             ps_codec->s_parse.i4_ctb_x +
2724*c83a76b0SSuyog Pawar                             ps_codec->s_parse.i4_ctb_y * ps_sps->i2_pic_wd_in_ctb;
2725*c83a76b0SSuyog Pawar 
2726*c83a76b0SSuyog Pawar             /* Default values */
2727*c83a76b0SSuyog Pawar             ps_sao->b3_y_type_idx = 0;
2728*c83a76b0SSuyog Pawar             ps_sao->b3_cb_type_idx = 0;
2729*c83a76b0SSuyog Pawar             ps_sao->b3_cr_type_idx = 0;
2730*c83a76b0SSuyog Pawar         }
2731*c83a76b0SSuyog Pawar 
2732*c83a76b0SSuyog Pawar         //AEV_TRACE("CTB x", ps_codec->s_parse.i4_ctb_x, 0);
2733*c83a76b0SSuyog Pawar         //AEV_TRACE("CTB y", ps_codec->s_parse.i4_ctb_y, 0);
2734*c83a76b0SSuyog Pawar 
2735*c83a76b0SSuyog Pawar         {
2736*c83a76b0SSuyog Pawar             WORD32 ctb_indx;
2737*c83a76b0SSuyog Pawar             ctb_indx = ps_codec->s_parse.i4_ctb_x + ps_sps->i2_pic_wd_in_ctb * ps_codec->s_parse.i4_ctb_y;
2738*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_bs_ctxt.pu1_pic_qp_const_in_ctb[ctb_indx >> 3] |= (1 << (ctb_indx & 7));
2739*c83a76b0SSuyog Pawar             {
2740*c83a76b0SSuyog Pawar                 UWORD16 *pu1_slice_idx = ps_codec->s_parse.pu1_slice_idx;
2741*c83a76b0SSuyog Pawar                 pu1_slice_idx[ctb_indx] = ps_codec->s_parse.i4_cur_independent_slice_idx;
2742*c83a76b0SSuyog Pawar             }
2743*c83a76b0SSuyog Pawar         }
2744*c83a76b0SSuyog Pawar 
2745*c83a76b0SSuyog Pawar         if(0 == ps_codec->i4_slice_error)
2746*c83a76b0SSuyog Pawar         {
2747*c83a76b0SSuyog Pawar             tu_t *ps_tu = ps_codec->s_parse.ps_tu;
2748*c83a76b0SSuyog Pawar             WORD32 i4_tu_cnt = ps_codec->s_parse.s_cu.i4_tu_cnt;
2749*c83a76b0SSuyog Pawar             WORD32 i4_pic_tu_idx = ps_codec->s_parse.i4_pic_tu_idx;
2750*c83a76b0SSuyog Pawar 
2751*c83a76b0SSuyog Pawar             pu_t *ps_pu = ps_codec->s_parse.ps_pu;
2752*c83a76b0SSuyog Pawar             WORD32 i4_pic_pu_idx = ps_codec->s_parse.i4_pic_pu_idx;
2753*c83a76b0SSuyog Pawar 
2754*c83a76b0SSuyog Pawar             UWORD8 *pu1_tu_coeff_data = (UWORD8 *)ps_codec->s_parse.pv_tu_coeff_data;
2755*c83a76b0SSuyog Pawar 
2756*c83a76b0SSuyog Pawar             ret = ihevcd_parse_coding_quadtree(ps_codec,
2757*c83a76b0SSuyog Pawar                                                (ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size),
2758*c83a76b0SSuyog Pawar                                                (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size),
2759*c83a76b0SSuyog Pawar                                                ps_sps->i1_log2_ctb_size,
2760*c83a76b0SSuyog Pawar                                                0);
2761*c83a76b0SSuyog Pawar             /* Check for error */
2762*c83a76b0SSuyog Pawar             if (ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
2763*c83a76b0SSuyog Pawar             {
2764*c83a76b0SSuyog Pawar                 /* Reset tu and pu parameters, and signal current ctb as skip */
2765*c83a76b0SSuyog Pawar                 WORD32 tu_coeff_data_reset_size;
2766*c83a76b0SSuyog Pawar 
2767*c83a76b0SSuyog Pawar                 ps_codec->s_parse.ps_tu = ps_tu;
2768*c83a76b0SSuyog Pawar                 ps_codec->s_parse.s_cu.i4_tu_cnt = i4_tu_cnt;
2769*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_pic_tu_idx = i4_pic_tu_idx;
2770*c83a76b0SSuyog Pawar 
2771*c83a76b0SSuyog Pawar                 ps_codec->s_parse.ps_pu = ps_pu;
2772*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_pic_pu_idx = i4_pic_pu_idx;
2773*c83a76b0SSuyog Pawar 
2774*c83a76b0SSuyog Pawar                 tu_coeff_data_reset_size = (UWORD8 *)ps_codec->s_parse.pv_tu_coeff_data - pu1_tu_coeff_data;
2775*c83a76b0SSuyog Pawar                 memset(pu1_tu_coeff_data, 0, tu_coeff_data_reset_size);
2776*c83a76b0SSuyog Pawar                 ps_codec->s_parse.pv_tu_coeff_data = (void *)pu1_tu_coeff_data;
2777*c83a76b0SSuyog Pawar 
2778*c83a76b0SSuyog Pawar                 ihevcd_set_ctb_skip(ps_codec);
2779*c83a76b0SSuyog Pawar 
2780*c83a76b0SSuyog Pawar                 /* Set slice error to suppress further parsing and
2781*c83a76b0SSuyog Pawar                  * signal end of slice.
2782*c83a76b0SSuyog Pawar                  */
2783*c83a76b0SSuyog Pawar                 ps_codec->i4_slice_error = 1;
2784*c83a76b0SSuyog Pawar                 end_of_slice_flag = 1;
2785*c83a76b0SSuyog Pawar                 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2786*c83a76b0SSuyog Pawar             }
2787*c83a76b0SSuyog Pawar         }
2788*c83a76b0SSuyog Pawar         else
2789*c83a76b0SSuyog Pawar         {
2790*c83a76b0SSuyog Pawar             ihevcd_set_ctb_skip(ps_codec);
2791*c83a76b0SSuyog Pawar         }
2792*c83a76b0SSuyog Pawar 
2793*c83a76b0SSuyog Pawar         if(0 == ps_codec->i4_slice_error)
2794*c83a76b0SSuyog Pawar             end_of_slice_flag = ihevcd_cabac_decode_terminate(&ps_codec->s_parse.s_cabac, &ps_codec->s_parse.s_bitstrm);
2795*c83a76b0SSuyog Pawar 
2796*c83a76b0SSuyog Pawar         AEV_TRACE("end_of_slice_flag", end_of_slice_flag, ps_codec->s_parse.s_cabac.u4_range);
2797*c83a76b0SSuyog Pawar 
2798*c83a76b0SSuyog Pawar 
2799*c83a76b0SSuyog Pawar         /* In case of tiles or entropy sync, terminate cabac and copy cabac context backed up at the end of top-right CTB */
2800*c83a76b0SSuyog Pawar         if(ps_pps->i1_tiles_enabled_flag || ps_pps->i1_entropy_coding_sync_enabled_flag)
2801*c83a76b0SSuyog Pawar         {
2802*c83a76b0SSuyog Pawar             WORD32 end_of_tile = 0;
2803*c83a76b0SSuyog Pawar             WORD32 end_of_tile_row = 0;
2804*c83a76b0SSuyog Pawar 
2805*c83a76b0SSuyog Pawar             /* Take a back up of cabac context models if entropy sync is enabled */
2806*c83a76b0SSuyog Pawar             if(ps_pps->i1_entropy_coding_sync_enabled_flag || ps_pps->i1_tiles_enabled_flag)
2807*c83a76b0SSuyog Pawar             {
2808*c83a76b0SSuyog Pawar                 if(1 == ps_codec->s_parse.i4_ctb_x)
2809*c83a76b0SSuyog Pawar                 {
2810*c83a76b0SSuyog Pawar                     WORD32 size = sizeof(ps_codec->s_parse.s_cabac.au1_ctxt_models);
2811*c83a76b0SSuyog Pawar                     memcpy(&ps_codec->s_parse.s_cabac.au1_ctxt_models_sync, &ps_codec->s_parse.s_cabac.au1_ctxt_models, size);
2812*c83a76b0SSuyog Pawar                 }
2813*c83a76b0SSuyog Pawar             }
2814*c83a76b0SSuyog Pawar 
2815*c83a76b0SSuyog Pawar             /* Since tiles and entropy sync are not enabled simultaneously, the following will not result in any problems */
2816*c83a76b0SSuyog Pawar             if((ps_codec->s_parse.i4_ctb_tile_x + 1) == (ps_tile->u2_wd))
2817*c83a76b0SSuyog Pawar             {
2818*c83a76b0SSuyog Pawar                 end_of_tile_row = 1;
2819*c83a76b0SSuyog Pawar                 if((ps_codec->s_parse.i4_ctb_tile_y + 1) == ps_tile->u2_ht)
2820*c83a76b0SSuyog Pawar                     end_of_tile = 1;
2821*c83a76b0SSuyog Pawar             }
2822*c83a76b0SSuyog Pawar             if((0 == end_of_slice_flag) && (0 == ps_codec->i4_slice_error) &&
2823*c83a76b0SSuyog Pawar                             ((ps_pps->i1_tiles_enabled_flag && end_of_tile) ||
2824*c83a76b0SSuyog Pawar                                             (ps_pps->i1_entropy_coding_sync_enabled_flag && end_of_tile_row)))
2825*c83a76b0SSuyog Pawar             {
2826*c83a76b0SSuyog Pawar                 WORD32 end_of_sub_stream_one_bit;
2827*c83a76b0SSuyog Pawar                 end_of_sub_stream_one_bit = ihevcd_cabac_decode_terminate(&ps_codec->s_parse.s_cabac, &ps_codec->s_parse.s_bitstrm);
2828*c83a76b0SSuyog Pawar                 AEV_TRACE("end_of_sub_stream_one_bit", end_of_sub_stream_one_bit, ps_codec->s_parse.s_cabac.u4_range);
2829*c83a76b0SSuyog Pawar 
2830*c83a76b0SSuyog Pawar                 /* TODO: Remove the check for offset when HM is updated to include a byte unconditionally even for aligned location */
2831*c83a76b0SSuyog Pawar                 /* For Ittiam streams this check should not be there, for HM9.1 streams this should be there */
2832*c83a76b0SSuyog Pawar                 if(ps_codec->s_parse.s_bitstrm.u4_bit_ofst % 8)
2833*c83a76b0SSuyog Pawar                     ihevcd_bits_flush_to_byte_boundary(&ps_codec->s_parse.s_bitstrm);
2834*c83a76b0SSuyog Pawar 
2835*c83a76b0SSuyog Pawar                 UNUSED(end_of_sub_stream_one_bit);
2836*c83a76b0SSuyog Pawar             }
2837*c83a76b0SSuyog Pawar         }
2838*c83a76b0SSuyog Pawar         {
2839*c83a76b0SSuyog Pawar             WORD32 ctb_indx;
2840*c83a76b0SSuyog Pawar 
2841*c83a76b0SSuyog Pawar             ctb_addr = ps_codec->s_parse.i4_ctb_y * num_ctb_in_row + ps_codec->s_parse.i4_ctb_x;
2842*c83a76b0SSuyog Pawar 
2843*c83a76b0SSuyog Pawar             ctb_indx = ++ctb_addr;
2844*c83a76b0SSuyog Pawar 
2845*c83a76b0SSuyog Pawar             /* Store pu_idx for next CTB in frame level pu_idx array */
2846*c83a76b0SSuyog Pawar 
2847*c83a76b0SSuyog Pawar             //In case of multiple tiles, if end-of-tile row is reached
2848*c83a76b0SSuyog Pawar             if((ps_tile->u2_wd == (ps_codec->s_parse.i4_ctb_tile_x + 1)) && (ps_tile->u2_wd != ps_sps->i2_pic_wd_in_ctb))
2849*c83a76b0SSuyog Pawar             {
2850*c83a76b0SSuyog Pawar                 ctb_indx = (ps_sps->i2_pic_wd_in_ctb * (ps_codec->s_parse.i4_ctb_tile_y + 1 + ps_tile->u1_pos_y)) + ps_tile->u1_pos_x; //idx is the beginning of next row in current tile.
2851*c83a76b0SSuyog Pawar                 if(ps_tile->u2_ht == (ps_codec->s_parse.i4_ctb_tile_y + 1))
2852*c83a76b0SSuyog Pawar                 {
2853*c83a76b0SSuyog Pawar                     //If the current ctb is the last tile's last ctb
2854*c83a76b0SSuyog Pawar                     if((ps_tile->u2_wd + ps_tile->u1_pos_x == ps_sps->i2_pic_wd_in_ctb) && ((ps_tile->u2_ht + ps_tile->u1_pos_y == ps_sps->i2_pic_ht_in_ctb)))
2855*c83a76b0SSuyog Pawar                     {
2856*c83a76b0SSuyog Pawar                         ctb_indx = ctb_addr; //Next continuous ctb address
2857*c83a76b0SSuyog Pawar                     }
2858*c83a76b0SSuyog Pawar                     else //Not last tile's end , but a tile end
2859*c83a76b0SSuyog Pawar                     {
2860*c83a76b0SSuyog Pawar                         tile_t *ps_next_tile = ps_codec->s_parse.ps_tile + 1;
2861*c83a76b0SSuyog Pawar                         ctb_indx = ps_next_tile->u1_pos_x + (ps_next_tile->u1_pos_y * ps_sps->i2_pic_wd_in_ctb); //idx is the beginning of first row in next tile.
2862*c83a76b0SSuyog Pawar                     }
2863*c83a76b0SSuyog Pawar                 }
2864*c83a76b0SSuyog Pawar             }
2865*c83a76b0SSuyog Pawar 
2866*c83a76b0SSuyog Pawar             ps_codec->s_parse.pu4_pic_pu_idx[ctb_indx] = ps_codec->s_parse.i4_pic_pu_idx;
2867*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_next_pu_ctb_cnt = ctb_indx;
2868*c83a76b0SSuyog Pawar 
2869*c83a76b0SSuyog Pawar             ps_codec->s_parse.pu1_pu_map += num_min4x4_in_ctb;
2870*c83a76b0SSuyog Pawar 
2871*c83a76b0SSuyog Pawar             /* Store tu_idx for next CTB in frame level tu_idx array */
2872*c83a76b0SSuyog Pawar             if(1 == ps_codec->i4_num_cores)
2873*c83a76b0SSuyog Pawar             {
2874*c83a76b0SSuyog Pawar                 ctb_indx = (0 == ctb_addr % RESET_TU_BUF_NCTB) ?
2875*c83a76b0SSuyog Pawar                                 RESET_TU_BUF_NCTB : ctb_addr % RESET_TU_BUF_NCTB;
2876*c83a76b0SSuyog Pawar 
2877*c83a76b0SSuyog Pawar                 //In case of multiple tiles, if end-of-tile row is reached
2878*c83a76b0SSuyog Pawar                 if((ps_tile->u2_wd == (ps_codec->s_parse.i4_ctb_tile_x + 1)) && (ps_tile->u2_wd != ps_sps->i2_pic_wd_in_ctb))
2879*c83a76b0SSuyog Pawar                 {
2880*c83a76b0SSuyog Pawar                     ctb_indx = (ps_sps->i2_pic_wd_in_ctb * (ps_codec->s_parse.i4_ctb_tile_y + 1 + ps_tile->u1_pos_y)) + ps_tile->u1_pos_x; //idx is the beginning of next row in current tile.
2881*c83a76b0SSuyog Pawar                     if(ps_tile->u2_ht == (ps_codec->s_parse.i4_ctb_tile_y + 1))
2882*c83a76b0SSuyog Pawar                     {
2883*c83a76b0SSuyog Pawar                         //If the current ctb is the last tile's last ctb
2884*c83a76b0SSuyog Pawar                         if((ps_tile->u2_wd + ps_tile->u1_pos_x == ps_sps->i2_pic_wd_in_ctb) && ((ps_tile->u2_ht + ps_tile->u1_pos_y == ps_sps->i2_pic_ht_in_ctb)))
2885*c83a76b0SSuyog Pawar                         {
2886*c83a76b0SSuyog Pawar                             ctb_indx = (0 == ctb_addr % RESET_TU_BUF_NCTB) ?
2887*c83a76b0SSuyog Pawar                                             RESET_TU_BUF_NCTB : ctb_addr % RESET_TU_BUF_NCTB;
2888*c83a76b0SSuyog Pawar                         }
2889*c83a76b0SSuyog Pawar                         else  //Not last tile's end , but a tile end
2890*c83a76b0SSuyog Pawar                         {
2891*c83a76b0SSuyog Pawar                             tile_t *ps_next_tile = ps_codec->s_parse.ps_tile + 1;
2892*c83a76b0SSuyog Pawar                             ctb_indx =  ps_next_tile->u1_pos_x + (ps_next_tile->u1_pos_y * ps_sps->i2_pic_wd_in_ctb); //idx is the beginning of first row in next tile.
2893*c83a76b0SSuyog Pawar                         }
2894*c83a76b0SSuyog Pawar                     }
2895*c83a76b0SSuyog Pawar                 }
2896*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_next_tu_ctb_cnt = ctb_indx;
2897*c83a76b0SSuyog Pawar                 ps_codec->s_parse.pu4_pic_tu_idx[ctb_indx] = ps_codec->s_parse.i4_pic_tu_idx;
2898*c83a76b0SSuyog Pawar             }
2899*c83a76b0SSuyog Pawar             else
2900*c83a76b0SSuyog Pawar             {
2901*c83a76b0SSuyog Pawar                 ctb_indx = ctb_addr;
2902*c83a76b0SSuyog Pawar                 if((ps_tile->u2_wd == (ps_codec->s_parse.i4_ctb_tile_x + 1)) && (ps_tile->u2_wd != ps_sps->i2_pic_wd_in_ctb))
2903*c83a76b0SSuyog Pawar                 {
2904*c83a76b0SSuyog Pawar                     ctb_indx = (ps_sps->i2_pic_wd_in_ctb * (ps_codec->s_parse.i4_ctb_tile_y + 1 + ps_tile->u1_pos_y)) + ps_tile->u1_pos_x; //idx is the beginning of next row in current tile.
2905*c83a76b0SSuyog Pawar                     if(ps_tile->u2_ht == (ps_codec->s_parse.i4_ctb_tile_y + 1))
2906*c83a76b0SSuyog Pawar                     {
2907*c83a76b0SSuyog Pawar                         //If the current ctb is the last tile's last ctb
2908*c83a76b0SSuyog Pawar                         if((ps_tile->u2_wd + ps_tile->u1_pos_x == ps_sps->i2_pic_wd_in_ctb) && ((ps_tile->u2_ht + ps_tile->u1_pos_y == ps_sps->i2_pic_ht_in_ctb)))
2909*c83a76b0SSuyog Pawar                         {
2910*c83a76b0SSuyog Pawar                             ctb_indx = ctb_addr;
2911*c83a76b0SSuyog Pawar                         }
2912*c83a76b0SSuyog Pawar                         else  //Not last tile's end , but a tile end
2913*c83a76b0SSuyog Pawar                         {
2914*c83a76b0SSuyog Pawar                             tile_t *ps_next_tile = ps_codec->s_parse.ps_tile + 1;
2915*c83a76b0SSuyog Pawar                             ctb_indx =  ps_next_tile->u1_pos_x + (ps_next_tile->u1_pos_y * ps_sps->i2_pic_wd_in_ctb); //idx is the beginning of first row in next tile.
2916*c83a76b0SSuyog Pawar                         }
2917*c83a76b0SSuyog Pawar                     }
2918*c83a76b0SSuyog Pawar                 }
2919*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_next_tu_ctb_cnt = ctb_indx;
2920*c83a76b0SSuyog Pawar                 ps_codec->s_parse.pu4_pic_tu_idx[ctb_indx] = ps_codec->s_parse.i4_pic_tu_idx;
2921*c83a76b0SSuyog Pawar             }
2922*c83a76b0SSuyog Pawar             ps_codec->s_parse.pu1_tu_map += num_min4x4_in_ctb;
2923*c83a76b0SSuyog Pawar         }
2924*c83a76b0SSuyog Pawar 
2925*c83a76b0SSuyog Pawar         /* QP array population has to be done if deblocking is enabled in the picture
2926*c83a76b0SSuyog Pawar          * but some of the slices in the pic have it disabled */
2927*c83a76b0SSuyog Pawar         if((0 != ps_codec->i4_disable_deblk_pic) &&
2928*c83a76b0SSuyog Pawar                 (1 == ps_slice_hdr->i1_slice_disable_deblocking_filter_flag))
2929*c83a76b0SSuyog Pawar         {
2930*c83a76b0SSuyog Pawar             bs_ctxt_t *ps_bs_ctxt = &ps_codec->s_parse.s_bs_ctxt;
2931*c83a76b0SSuyog Pawar             WORD32 log2_ctb_size = ps_sps->i1_log2_ctb_size;
2932*c83a76b0SSuyog Pawar             UWORD8 *pu1_qp;
2933*c83a76b0SSuyog Pawar             WORD32 qp_strd;
2934*c83a76b0SSuyog Pawar             WORD32 u4_qp_const_in_ctb;
2935*c83a76b0SSuyog Pawar             WORD32 cur_ctb_idx;
2936*c83a76b0SSuyog Pawar             WORD32 next_ctb_idx;
2937*c83a76b0SSuyog Pawar             WORD32 cur_tu_idx;
2938*c83a76b0SSuyog Pawar             WORD32 i4_ctb_tu_cnt;
2939*c83a76b0SSuyog Pawar             tu_t *ps_tu;
2940*c83a76b0SSuyog Pawar 
2941*c83a76b0SSuyog Pawar             cur_ctb_idx = ps_codec->s_parse.i4_ctb_x + ps_sps->i2_pic_wd_in_ctb * ps_codec->s_parse.i4_ctb_y;
2942*c83a76b0SSuyog Pawar             /* ctb_size/8 elements per CTB */
2943*c83a76b0SSuyog Pawar             qp_strd = ps_sps->i2_pic_wd_in_ctb << (log2_ctb_size - 3);
2944*c83a76b0SSuyog Pawar             pu1_qp = ps_bs_ctxt->pu1_pic_qp + ((ps_codec->s_parse.i4_ctb_x + ps_codec->s_parse.i4_ctb_y * qp_strd) << (log2_ctb_size - 3));
2945*c83a76b0SSuyog Pawar 
2946*c83a76b0SSuyog Pawar             u4_qp_const_in_ctb = ps_bs_ctxt->pu1_pic_qp_const_in_ctb[cur_ctb_idx >> 3] & (1 << (cur_ctb_idx & 7));
2947*c83a76b0SSuyog Pawar 
2948*c83a76b0SSuyog Pawar             next_ctb_idx = ps_codec->s_parse.i4_next_tu_ctb_cnt;
2949*c83a76b0SSuyog Pawar             if(1 == ps_codec->i4_num_cores)
2950*c83a76b0SSuyog Pawar             {
2951*c83a76b0SSuyog Pawar                 i4_ctb_tu_cnt = ps_codec->s_parse.pu4_pic_tu_idx[next_ctb_idx] -
2952*c83a76b0SSuyog Pawar                                 ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx % RESET_TU_BUF_NCTB];
2953*c83a76b0SSuyog Pawar 
2954*c83a76b0SSuyog Pawar                 cur_tu_idx = ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx % RESET_TU_BUF_NCTB];
2955*c83a76b0SSuyog Pawar             }
2956*c83a76b0SSuyog Pawar             else
2957*c83a76b0SSuyog Pawar             {
2958*c83a76b0SSuyog Pawar                 i4_ctb_tu_cnt = ps_codec->s_parse.pu4_pic_tu_idx[next_ctb_idx] -
2959*c83a76b0SSuyog Pawar                                 ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx];
2960*c83a76b0SSuyog Pawar 
2961*c83a76b0SSuyog Pawar                 cur_tu_idx = ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx];
2962*c83a76b0SSuyog Pawar             }
2963*c83a76b0SSuyog Pawar 
2964*c83a76b0SSuyog Pawar             ps_tu = &ps_codec->s_parse.ps_pic_tu[cur_tu_idx];
2965*c83a76b0SSuyog Pawar 
2966*c83a76b0SSuyog Pawar             if(u4_qp_const_in_ctb)
2967*c83a76b0SSuyog Pawar             {
2968*c83a76b0SSuyog Pawar                 pu1_qp[0] = ps_tu->b7_qp;
2969*c83a76b0SSuyog Pawar             }
2970*c83a76b0SSuyog Pawar             else
2971*c83a76b0SSuyog Pawar             {
2972*c83a76b0SSuyog Pawar                 for(i = 0; i < i4_ctb_tu_cnt; i++, ps_tu++)
2973*c83a76b0SSuyog Pawar                 {
2974*c83a76b0SSuyog Pawar                     WORD32 start_pos_x;
2975*c83a76b0SSuyog Pawar                     WORD32 start_pos_y;
2976*c83a76b0SSuyog Pawar                     WORD32 tu_size;
2977*c83a76b0SSuyog Pawar 
2978*c83a76b0SSuyog Pawar                     /* start_pos_x and start_pos_y are in units of min TU size (4x4) */
2979*c83a76b0SSuyog Pawar                     start_pos_x = ps_tu->b4_pos_x;
2980*c83a76b0SSuyog Pawar                     start_pos_y = ps_tu->b4_pos_y;
2981*c83a76b0SSuyog Pawar 
2982*c83a76b0SSuyog Pawar                     tu_size = 1 << (ps_tu->b3_size + 2);
2983*c83a76b0SSuyog Pawar                     tu_size >>= 2; /* TU size divided by 4 */
2984*c83a76b0SSuyog Pawar 
2985*c83a76b0SSuyog Pawar                     if(0 == (start_pos_x & 1) && 0 == (start_pos_y & 1))
2986*c83a76b0SSuyog Pawar                     {
2987*c83a76b0SSuyog Pawar                         WORD32 row, col;
2988*c83a76b0SSuyog Pawar                         for(row = start_pos_y; row < start_pos_y + tu_size; row += 2)
2989*c83a76b0SSuyog Pawar                         {
2990*c83a76b0SSuyog Pawar                             for(col = start_pos_x; col < start_pos_x + tu_size; col += 2)
2991*c83a76b0SSuyog Pawar                             {
2992*c83a76b0SSuyog Pawar                                 pu1_qp[(row >> 1) * qp_strd + (col >> 1)] = ps_tu->b7_qp;
2993*c83a76b0SSuyog Pawar                             }
2994*c83a76b0SSuyog Pawar                         }
2995*c83a76b0SSuyog Pawar                     }
2996*c83a76b0SSuyog Pawar                 }
2997*c83a76b0SSuyog Pawar             }
2998*c83a76b0SSuyog Pawar         }
2999*c83a76b0SSuyog Pawar 
3000*c83a76b0SSuyog Pawar         if(ps_codec->i4_num_cores <= MV_PRED_NUM_CORES_THRESHOLD)
3001*c83a76b0SSuyog Pawar         {
3002*c83a76b0SSuyog Pawar             /*************************************************/
3003*c83a76b0SSuyog Pawar             /****************   MV pred **********************/
3004*c83a76b0SSuyog Pawar             /*************************************************/
3005*c83a76b0SSuyog Pawar             WORD8 u1_top_ctb_avail = 1;
3006*c83a76b0SSuyog Pawar             WORD8 u1_left_ctb_avail = 1;
3007*c83a76b0SSuyog Pawar             WORD8 u1_top_lt_ctb_avail = 1;
3008*c83a76b0SSuyog Pawar             WORD8 u1_top_rt_ctb_avail = 1;
3009*c83a76b0SSuyog Pawar             WORD16 i2_wd_in_ctb;
3010*c83a76b0SSuyog Pawar 
3011*c83a76b0SSuyog Pawar             tile_start_ctb_idx = ps_tile->u1_pos_x
3012*c83a76b0SSuyog Pawar                             + ps_tile->u1_pos_y * (ps_sps->i2_pic_wd_in_ctb);
3013*c83a76b0SSuyog Pawar 
3014*c83a76b0SSuyog Pawar             slice_start_ctb_idx =  ps_slice_hdr->i2_ctb_x
3015*c83a76b0SSuyog Pawar                             + ps_slice_hdr->i2_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
3016*c83a76b0SSuyog Pawar 
3017*c83a76b0SSuyog Pawar             if((slice_start_ctb_idx < tile_start_ctb_idx))
3018*c83a76b0SSuyog Pawar             {
3019*c83a76b0SSuyog Pawar                 //Slices span across multiple tiles.
3020*c83a76b0SSuyog Pawar                 i2_wd_in_ctb = ps_sps->i2_pic_wd_in_ctb;
3021*c83a76b0SSuyog Pawar             }
3022*c83a76b0SSuyog Pawar             else
3023*c83a76b0SSuyog Pawar             {
3024*c83a76b0SSuyog Pawar                 i2_wd_in_ctb = ps_tile->u2_wd;
3025*c83a76b0SSuyog Pawar             }
3026*c83a76b0SSuyog Pawar             /* slice and tile boundaries */
3027*c83a76b0SSuyog Pawar             if((0 == ps_codec->s_parse.i4_ctb_y) || (0 == ps_codec->s_parse.i4_ctb_tile_y))
3028*c83a76b0SSuyog Pawar             {
3029*c83a76b0SSuyog Pawar                 u1_top_ctb_avail = 0;
3030*c83a76b0SSuyog Pawar                 u1_top_lt_ctb_avail = 0;
3031*c83a76b0SSuyog Pawar                 u1_top_rt_ctb_avail = 0;
3032*c83a76b0SSuyog Pawar             }
3033*c83a76b0SSuyog Pawar 
3034*c83a76b0SSuyog Pawar             if((0 == ps_codec->s_parse.i4_ctb_x) || (0 == ps_codec->s_parse.i4_ctb_tile_x))
3035*c83a76b0SSuyog Pawar             {
3036*c83a76b0SSuyog Pawar                 u1_left_ctb_avail = 0;
3037*c83a76b0SSuyog Pawar                 u1_top_lt_ctb_avail = 0;
3038*c83a76b0SSuyog Pawar                 if((0 == ps_codec->s_parse.i4_ctb_slice_y) || (0 == ps_codec->s_parse.i4_ctb_tile_y))
3039*c83a76b0SSuyog Pawar                 {
3040*c83a76b0SSuyog Pawar                     u1_top_ctb_avail = 0;
3041*c83a76b0SSuyog Pawar                     if((i2_wd_in_ctb - 1) != ps_codec->s_parse.i4_ctb_slice_x) //TODO: For tile, not implemented
3042*c83a76b0SSuyog Pawar                     {
3043*c83a76b0SSuyog Pawar                         u1_top_rt_ctb_avail = 0;
3044*c83a76b0SSuyog Pawar                     }
3045*c83a76b0SSuyog Pawar                 }
3046*c83a76b0SSuyog Pawar             }
3047*c83a76b0SSuyog Pawar             /*For slices not beginning at start of a ctb row*/
3048*c83a76b0SSuyog Pawar             else if(ps_codec->s_parse.i4_ctb_x > 0)
3049*c83a76b0SSuyog Pawar             {
3050*c83a76b0SSuyog Pawar                 if((0 == ps_codec->s_parse.i4_ctb_slice_y) || (0 == ps_codec->s_parse.i4_ctb_tile_y))
3051*c83a76b0SSuyog Pawar                 {
3052*c83a76b0SSuyog Pawar                     u1_top_ctb_avail = 0;
3053*c83a76b0SSuyog Pawar                     u1_top_lt_ctb_avail = 0;
3054*c83a76b0SSuyog Pawar                     if(0 == ps_codec->s_parse.i4_ctb_slice_x)
3055*c83a76b0SSuyog Pawar                     {
3056*c83a76b0SSuyog Pawar                         u1_left_ctb_avail = 0;
3057*c83a76b0SSuyog Pawar                     }
3058*c83a76b0SSuyog Pawar                     if((i2_wd_in_ctb - 1) != ps_codec->s_parse.i4_ctb_slice_x)
3059*c83a76b0SSuyog Pawar                     {
3060*c83a76b0SSuyog Pawar                         u1_top_rt_ctb_avail = 0;
3061*c83a76b0SSuyog Pawar                     }
3062*c83a76b0SSuyog Pawar                 }
3063*c83a76b0SSuyog Pawar                 else if((1 == ps_codec->s_parse.i4_ctb_slice_y) && (0 == ps_codec->s_parse.i4_ctb_slice_x))
3064*c83a76b0SSuyog Pawar                 {
3065*c83a76b0SSuyog Pawar                     u1_top_lt_ctb_avail = 0;
3066*c83a76b0SSuyog Pawar                 }
3067*c83a76b0SSuyog Pawar             }
3068*c83a76b0SSuyog Pawar 
3069*c83a76b0SSuyog Pawar             if(((ps_sps->i2_pic_wd_in_ctb - 1) == ps_codec->s_parse.i4_ctb_x) || ((ps_tile->u2_wd - 1) == ps_codec->s_parse.i4_ctb_tile_x))
3070*c83a76b0SSuyog Pawar             {
3071*c83a76b0SSuyog Pawar                 u1_top_rt_ctb_avail = 0;
3072*c83a76b0SSuyog Pawar             }
3073*c83a76b0SSuyog Pawar 
3074*c83a76b0SSuyog Pawar             if(PSLICE == ps_slice_hdr->i1_slice_type
3075*c83a76b0SSuyog Pawar                             || BSLICE == ps_slice_hdr->i1_slice_type)
3076*c83a76b0SSuyog Pawar             {
3077*c83a76b0SSuyog Pawar                 mv_ctxt_t s_mv_ctxt;
3078*c83a76b0SSuyog Pawar                 process_ctxt_t *ps_proc;
3079*c83a76b0SSuyog Pawar                 UWORD32 *pu4_ctb_top_pu_idx;
3080*c83a76b0SSuyog Pawar                 UWORD32 *pu4_ctb_left_pu_idx;
3081*c83a76b0SSuyog Pawar                 UWORD32 *pu4_ctb_top_left_pu_idx;
3082*c83a76b0SSuyog Pawar                 WORD32 i4_ctb_pu_cnt;
3083*c83a76b0SSuyog Pawar                 WORD32 cur_ctb_idx;
3084*c83a76b0SSuyog Pawar                 WORD32 next_ctb_idx;
3085*c83a76b0SSuyog Pawar                 WORD32 cur_pu_idx;
3086*c83a76b0SSuyog Pawar                 ps_proc = &ps_codec->as_process[(ps_codec->i4_num_cores == 1) ? 1 : (ps_codec->i4_num_cores - 1)];
3087*c83a76b0SSuyog Pawar                 cur_ctb_idx = ps_codec->s_parse.i4_ctb_x
3088*c83a76b0SSuyog Pawar                                 + ps_codec->s_parse.i4_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
3089*c83a76b0SSuyog Pawar                 next_ctb_idx = ps_codec->s_parse.i4_next_pu_ctb_cnt;
3090*c83a76b0SSuyog Pawar                 i4_ctb_pu_cnt = ps_codec->s_parse.pu4_pic_pu_idx[next_ctb_idx]
3091*c83a76b0SSuyog Pawar                                 - ps_codec->s_parse.pu4_pic_pu_idx[cur_ctb_idx];
3092*c83a76b0SSuyog Pawar 
3093*c83a76b0SSuyog Pawar                 cur_pu_idx = ps_codec->s_parse.pu4_pic_pu_idx[cur_ctb_idx];
3094*c83a76b0SSuyog Pawar 
3095*c83a76b0SSuyog Pawar                 pu4_ctb_top_pu_idx = ps_proc->pu4_pic_pu_idx_top
3096*c83a76b0SSuyog Pawar                                 + (ps_codec->s_parse.i4_ctb_x * ctb_size / MIN_PU_SIZE);
3097*c83a76b0SSuyog Pawar                 pu4_ctb_left_pu_idx = ps_proc->pu4_pic_pu_idx_left;
3098*c83a76b0SSuyog Pawar                 pu4_ctb_top_left_pu_idx = &ps_proc->u4_ctb_top_left_pu_idx;
3099*c83a76b0SSuyog Pawar 
3100*c83a76b0SSuyog Pawar                 /* Initializing s_mv_ctxt */
3101*c83a76b0SSuyog Pawar                 {
3102*c83a76b0SSuyog Pawar                     s_mv_ctxt.ps_pps = ps_pps;
3103*c83a76b0SSuyog Pawar                     s_mv_ctxt.ps_sps = ps_sps;
3104*c83a76b0SSuyog Pawar                     s_mv_ctxt.ps_slice_hdr = ps_slice_hdr;
3105*c83a76b0SSuyog Pawar                     s_mv_ctxt.i4_ctb_x = ps_codec->s_parse.i4_ctb_x;
3106*c83a76b0SSuyog Pawar                     s_mv_ctxt.i4_ctb_y = ps_codec->s_parse.i4_ctb_y;
3107*c83a76b0SSuyog Pawar                     s_mv_ctxt.ps_pu = &ps_codec->s_parse.ps_pic_pu[cur_pu_idx];
3108*c83a76b0SSuyog Pawar                     s_mv_ctxt.ps_pic_pu = ps_codec->s_parse.ps_pic_pu;
3109*c83a76b0SSuyog Pawar                     s_mv_ctxt.ps_tile = ps_tile;
3110*c83a76b0SSuyog Pawar                     s_mv_ctxt.pu4_pic_pu_idx_map = ps_proc->pu4_pic_pu_idx_map;
3111*c83a76b0SSuyog Pawar                     s_mv_ctxt.pu4_pic_pu_idx = ps_codec->s_parse.pu4_pic_pu_idx;
3112*c83a76b0SSuyog Pawar                     s_mv_ctxt.pu1_pic_pu_map = ps_codec->s_parse.pu1_pic_pu_map;
3113*c83a76b0SSuyog Pawar                     s_mv_ctxt.i4_ctb_pu_cnt = i4_ctb_pu_cnt;
3114*c83a76b0SSuyog Pawar                     s_mv_ctxt.i4_ctb_start_pu_idx = cur_pu_idx;
3115*c83a76b0SSuyog Pawar                     s_mv_ctxt.u1_top_ctb_avail = u1_top_ctb_avail;
3116*c83a76b0SSuyog Pawar                     s_mv_ctxt.u1_top_rt_ctb_avail = u1_top_rt_ctb_avail;
3117*c83a76b0SSuyog Pawar                     s_mv_ctxt.u1_top_lt_ctb_avail = u1_top_lt_ctb_avail;
3118*c83a76b0SSuyog Pawar                     s_mv_ctxt.u1_left_ctb_avail = u1_left_ctb_avail;
3119*c83a76b0SSuyog Pawar                 }
3120*c83a76b0SSuyog Pawar 
3121*c83a76b0SSuyog Pawar                 ihevcd_get_mv_ctb(&s_mv_ctxt, pu4_ctb_top_pu_idx,
3122*c83a76b0SSuyog Pawar                                   pu4_ctb_left_pu_idx, pu4_ctb_top_left_pu_idx);
3123*c83a76b0SSuyog Pawar 
3124*c83a76b0SSuyog Pawar             }
3125*c83a76b0SSuyog Pawar             else
3126*c83a76b0SSuyog Pawar             {
3127*c83a76b0SSuyog Pawar                 WORD32 num_minpu_in_ctb = (ctb_size / MIN_PU_SIZE) * (ctb_size / MIN_PU_SIZE);
3128*c83a76b0SSuyog Pawar                 UWORD8 *pu1_pic_pu_map_ctb = ps_codec->s_parse.pu1_pic_pu_map +
3129*c83a76b0SSuyog Pawar                                 (ps_codec->s_parse.i4_ctb_x + ps_codec->s_parse.i4_ctb_y * ps_sps->i2_pic_wd_in_ctb) * num_minpu_in_ctb;
3130*c83a76b0SSuyog Pawar                 process_ctxt_t *ps_proc = &ps_codec->as_process[(ps_codec->i4_num_cores == 1) ? 1 : (ps_codec->i4_num_cores - 1)];
3131*c83a76b0SSuyog Pawar                 WORD32 row, col;
3132*c83a76b0SSuyog Pawar                 WORD32 pu_cnt;
3133*c83a76b0SSuyog Pawar                 WORD32 num_pu_per_ctb;
3134*c83a76b0SSuyog Pawar                 WORD32 cur_ctb_idx;
3135*c83a76b0SSuyog Pawar                 WORD32 next_ctb_idx;
3136*c83a76b0SSuyog Pawar                 WORD32 ctb_start_pu_idx;
3137*c83a76b0SSuyog Pawar                 UWORD32 *pu4_nbr_pu_idx = ps_proc->pu4_pic_pu_idx_map;
3138*c83a76b0SSuyog Pawar                 WORD32 nbr_pu_idx_strd = MAX_CTB_SIZE / MIN_PU_SIZE + 2;
3139*c83a76b0SSuyog Pawar                 pu_t *ps_pu;
3140*c83a76b0SSuyog Pawar                 WORD32 ctb_size_in_min_pu = (ctb_size / MIN_PU_SIZE);
3141*c83a76b0SSuyog Pawar 
3142*c83a76b0SSuyog Pawar                 /* Neighbor PU idx update inside CTB */
3143*c83a76b0SSuyog Pawar                 /* 1byte per 4x4. Indicates the PU idx that 4x4 block belongs to */
3144*c83a76b0SSuyog Pawar 
3145*c83a76b0SSuyog Pawar                 cur_ctb_idx = ps_codec->s_parse.i4_ctb_x
3146*c83a76b0SSuyog Pawar                                 + ps_codec->s_parse.i4_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
3147*c83a76b0SSuyog Pawar                 next_ctb_idx = ps_codec->s_parse.i4_next_pu_ctb_cnt;
3148*c83a76b0SSuyog Pawar                 num_pu_per_ctb = ps_codec->s_parse.pu4_pic_pu_idx[next_ctb_idx]
3149*c83a76b0SSuyog Pawar                                 - ps_codec->s_parse.pu4_pic_pu_idx[cur_ctb_idx];
3150*c83a76b0SSuyog Pawar                 ctb_start_pu_idx = ps_codec->s_parse.pu4_pic_pu_idx[cur_ctb_idx];
3151*c83a76b0SSuyog Pawar                 ps_pu = &ps_codec->s_parse.ps_pic_pu[ctb_start_pu_idx];
3152*c83a76b0SSuyog Pawar 
3153*c83a76b0SSuyog Pawar                 for(pu_cnt = 0; pu_cnt < num_pu_per_ctb; pu_cnt++, ps_pu++)
3154*c83a76b0SSuyog Pawar                 {
3155*c83a76b0SSuyog Pawar                     UWORD32 cur_pu_idx;
3156*c83a76b0SSuyog Pawar                     WORD32 pu_ht = (ps_pu->b4_ht + 1) << 2;
3157*c83a76b0SSuyog Pawar                     WORD32 pu_wd = (ps_pu->b4_wd + 1) << 2;
3158*c83a76b0SSuyog Pawar 
3159*c83a76b0SSuyog Pawar                     cur_pu_idx = ctb_start_pu_idx + pu_cnt;
3160*c83a76b0SSuyog Pawar 
3161*c83a76b0SSuyog Pawar                     for(row = 0; row < pu_ht / MIN_PU_SIZE; row++)
3162*c83a76b0SSuyog Pawar                         for(col = 0; col < pu_wd / MIN_PU_SIZE; col++)
3163*c83a76b0SSuyog Pawar                             pu4_nbr_pu_idx[(1 + ps_pu->b4_pos_x + col)
3164*c83a76b0SSuyog Pawar                                             + (1 + ps_pu->b4_pos_y + row)
3165*c83a76b0SSuyog Pawar                                             * nbr_pu_idx_strd] =
3166*c83a76b0SSuyog Pawar                                             cur_pu_idx;
3167*c83a76b0SSuyog Pawar                 }
3168*c83a76b0SSuyog Pawar 
3169*c83a76b0SSuyog Pawar                 /* Updating Top and Left pointers */
3170*c83a76b0SSuyog Pawar                 {
3171*c83a76b0SSuyog Pawar                     WORD32 rows_remaining = ps_sps->i2_pic_height_in_luma_samples
3172*c83a76b0SSuyog Pawar                                     - (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size);
3173*c83a76b0SSuyog Pawar                     WORD32 ctb_size_left = MIN(ctb_size, rows_remaining);
3174*c83a76b0SSuyog Pawar 
3175*c83a76b0SSuyog Pawar                     /* Top Left */
3176*c83a76b0SSuyog Pawar                     /* saving top left before updating top ptr, as updating top ptr will overwrite the top left for the next ctb */
3177*c83a76b0SSuyog Pawar                     ps_proc->u4_ctb_top_left_pu_idx = ps_proc->pu4_pic_pu_idx_top[(ps_codec->s_parse.i4_ctb_x * ctb_size / MIN_PU_SIZE) + ctb_size / MIN_PU_SIZE - 1];
3178*c83a76b0SSuyog Pawar                     for(i = 0; i < ctb_size / MIN_PU_SIZE; i++)
3179*c83a76b0SSuyog Pawar                     {
3180*c83a76b0SSuyog Pawar                         /* Left */
3181*c83a76b0SSuyog Pawar                         /* Last column of au4_nbr_pu_idx */
3182*c83a76b0SSuyog Pawar                         ps_proc->pu4_pic_pu_idx_left[i] = pu4_nbr_pu_idx[(ctb_size / MIN_PU_SIZE)
3183*c83a76b0SSuyog Pawar                                         + (i + 1) * nbr_pu_idx_strd];
3184*c83a76b0SSuyog Pawar                         /* Top */
3185*c83a76b0SSuyog Pawar                         /* Last row of au4_nbr_pu_idx */
3186*c83a76b0SSuyog Pawar                         ps_proc->pu4_pic_pu_idx_top[(ps_codec->s_parse.i4_ctb_x * ctb_size / MIN_PU_SIZE) + i] =
3187*c83a76b0SSuyog Pawar                                         pu4_nbr_pu_idx[(ctb_size_left / MIN_PU_SIZE) * nbr_pu_idx_strd + i + 1];
3188*c83a76b0SSuyog Pawar 
3189*c83a76b0SSuyog Pawar                     }
3190*c83a76b0SSuyog Pawar                 }
3191*c83a76b0SSuyog Pawar 
3192*c83a76b0SSuyog Pawar                 /* Updating the CTB level PU idx (Used for collocated MV pred)*/
3193*c83a76b0SSuyog Pawar                 {
3194*c83a76b0SSuyog Pawar                     WORD32 ctb_row, ctb_col, index_pic_map, index_nbr_map;
3195*c83a76b0SSuyog Pawar                     WORD32 first_pu_of_ctb;
3196*c83a76b0SSuyog Pawar                     first_pu_of_ctb = pu4_nbr_pu_idx[1 + nbr_pu_idx_strd];
3197*c83a76b0SSuyog Pawar                     UWORD32 cur_ctb_ht_in_min_pu = MIN(((ps_sps->i2_pic_height_in_luma_samples
3198*c83a76b0SSuyog Pawar                             - (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu);
3199*c83a76b0SSuyog Pawar                     UWORD32 cur_ctb_wd_in_min_pu = MIN(((ps_sps->i2_pic_width_in_luma_samples
3200*c83a76b0SSuyog Pawar                                 - (ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu);
3201*c83a76b0SSuyog Pawar 
3202*c83a76b0SSuyog Pawar                     index_pic_map = 0 * ctb_size_in_min_pu + 0;
3203*c83a76b0SSuyog Pawar                     index_nbr_map = (0 + 1) * nbr_pu_idx_strd + (0 + 1);
3204*c83a76b0SSuyog Pawar 
3205*c83a76b0SSuyog Pawar                     for(ctb_row = 0; ctb_row < cur_ctb_ht_in_min_pu; ctb_row++)
3206*c83a76b0SSuyog Pawar                     {
3207*c83a76b0SSuyog Pawar                         for(ctb_col = 0; ctb_col < cur_ctb_wd_in_min_pu; ctb_col++)
3208*c83a76b0SSuyog Pawar                         {
3209*c83a76b0SSuyog Pawar                             pu1_pic_pu_map_ctb[index_pic_map + ctb_col] = pu4_nbr_pu_idx[index_nbr_map + ctb_col]
3210*c83a76b0SSuyog Pawar                                             - first_pu_of_ctb;
3211*c83a76b0SSuyog Pawar                         }
3212*c83a76b0SSuyog Pawar                         index_pic_map += ctb_size_in_min_pu;
3213*c83a76b0SSuyog Pawar                         index_nbr_map += nbr_pu_idx_strd;
3214*c83a76b0SSuyog Pawar                     }
3215*c83a76b0SSuyog Pawar                 }
3216*c83a76b0SSuyog Pawar             }
3217*c83a76b0SSuyog Pawar 
3218*c83a76b0SSuyog Pawar             /*************************************************/
3219*c83a76b0SSuyog Pawar             /******************  BS, QP  *********************/
3220*c83a76b0SSuyog Pawar             /*************************************************/
3221*c83a76b0SSuyog Pawar             /* Check if deblock is disabled for the current slice or if it is disabled for the current picture
3222*c83a76b0SSuyog Pawar              * because of disable deblock api
3223*c83a76b0SSuyog Pawar              */
3224*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_disable_deblk_pic)
3225*c83a76b0SSuyog Pawar             {
3226*c83a76b0SSuyog Pawar                 /* Boundary strength calculation is done irrespective of whether deblocking is disabled
3227*c83a76b0SSuyog Pawar                  * in the slice or not, to handle deblocking slice boundaries */
3228*c83a76b0SSuyog Pawar                 if((0 == ps_codec->i4_slice_error))
3229*c83a76b0SSuyog Pawar                 {
3230*c83a76b0SSuyog Pawar                     WORD32 i4_ctb_tu_cnt;
3231*c83a76b0SSuyog Pawar                     WORD32 cur_ctb_idx, next_ctb_idx;
3232*c83a76b0SSuyog Pawar                     WORD32 cur_pu_idx;
3233*c83a76b0SSuyog Pawar                     WORD32 cur_tu_idx;
3234*c83a76b0SSuyog Pawar                     process_ctxt_t *ps_proc;
3235*c83a76b0SSuyog Pawar 
3236*c83a76b0SSuyog Pawar                     ps_proc = &ps_codec->as_process[(ps_codec->i4_num_cores == 1) ? 1 : (ps_codec->i4_num_cores - 1)];
3237*c83a76b0SSuyog Pawar                     cur_ctb_idx = ps_codec->s_parse.i4_ctb_x
3238*c83a76b0SSuyog Pawar                                     + ps_codec->s_parse.i4_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
3239*c83a76b0SSuyog Pawar 
3240*c83a76b0SSuyog Pawar                     cur_pu_idx = ps_codec->s_parse.pu4_pic_pu_idx[cur_ctb_idx];
3241*c83a76b0SSuyog Pawar                     next_ctb_idx = ps_codec->s_parse.i4_next_tu_ctb_cnt;
3242*c83a76b0SSuyog Pawar                     if(1 == ps_codec->i4_num_cores)
3243*c83a76b0SSuyog Pawar                     {
3244*c83a76b0SSuyog Pawar                         i4_ctb_tu_cnt = ps_codec->s_parse.pu4_pic_tu_idx[next_ctb_idx] -
3245*c83a76b0SSuyog Pawar                                         ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx % RESET_TU_BUF_NCTB];
3246*c83a76b0SSuyog Pawar 
3247*c83a76b0SSuyog Pawar                         cur_tu_idx = ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx % RESET_TU_BUF_NCTB];
3248*c83a76b0SSuyog Pawar                     }
3249*c83a76b0SSuyog Pawar                     else
3250*c83a76b0SSuyog Pawar                     {
3251*c83a76b0SSuyog Pawar                         i4_ctb_tu_cnt = ps_codec->s_parse.pu4_pic_tu_idx[next_ctb_idx] -
3252*c83a76b0SSuyog Pawar                                         ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx];
3253*c83a76b0SSuyog Pawar 
3254*c83a76b0SSuyog Pawar                         cur_tu_idx = ps_codec->s_parse.pu4_pic_tu_idx[cur_ctb_idx];
3255*c83a76b0SSuyog Pawar                     }
3256*c83a76b0SSuyog Pawar 
3257*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_pps = ps_codec->s_parse.ps_pps;
3258*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_sps = ps_codec->s_parse.ps_sps;
3259*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_codec = ps_codec;
3260*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_tu_cnt = i4_ctb_tu_cnt;
3261*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_x = ps_codec->s_parse.i4_ctb_x;
3262*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_y = ps_codec->s_parse.i4_ctb_y;
3263*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_tile_x = ps_codec->s_parse.i4_ctb_tile_x;
3264*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_tile_y = ps_codec->s_parse.i4_ctb_tile_y;
3265*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_slice_x = ps_codec->s_parse.i4_ctb_slice_x;
3266*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_ctb_slice_y = ps_codec->s_parse.i4_ctb_slice_y;
3267*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_tu = &ps_codec->s_parse.ps_pic_tu[cur_tu_idx];
3268*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_pu = &ps_codec->s_parse.ps_pic_pu[cur_pu_idx];
3269*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.pu4_pic_pu_idx_map = ps_proc->pu4_pic_pu_idx_map;
3270*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_next_pu_ctb_cnt = ps_codec->s_parse.i4_next_pu_ctb_cnt;
3271*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.i4_next_tu_ctb_cnt = ps_codec->s_parse.i4_next_tu_ctb_cnt;
3272*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.pu1_slice_idx = ps_codec->s_parse.pu1_slice_idx;
3273*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
3274*c83a76b0SSuyog Pawar                     ps_codec->s_parse.s_bs_ctxt.ps_tile = ps_codec->s_parse.ps_tile;
3275*c83a76b0SSuyog Pawar 
3276*c83a76b0SSuyog Pawar                     if(ISLICE == ps_slice_hdr->i1_slice_type)
3277*c83a76b0SSuyog Pawar                     {
3278*c83a76b0SSuyog Pawar                         ihevcd_ctb_boundary_strength_islice(&ps_codec->s_parse.s_bs_ctxt);
3279*c83a76b0SSuyog Pawar                     }
3280*c83a76b0SSuyog Pawar                     else
3281*c83a76b0SSuyog Pawar                     {
3282*c83a76b0SSuyog Pawar                         ihevcd_ctb_boundary_strength_pbslice(&ps_codec->s_parse.s_bs_ctxt);
3283*c83a76b0SSuyog Pawar                     }
3284*c83a76b0SSuyog Pawar                 }
3285*c83a76b0SSuyog Pawar 
3286*c83a76b0SSuyog Pawar                 /* Boundary strength is set to zero if deblocking is disabled for the current slice */
3287*c83a76b0SSuyog Pawar                 if(0 != ps_slice_hdr->i1_slice_disable_deblocking_filter_flag)
3288*c83a76b0SSuyog Pawar                 {
3289*c83a76b0SSuyog Pawar                     WORD32 bs_strd = (ps_sps->i2_pic_wd_in_ctb + 1) * (ctb_size * ctb_size / 8 / 16);
3290*c83a76b0SSuyog Pawar 
3291*c83a76b0SSuyog Pawar                     UWORD32 *pu4_vert_bs = (UWORD32 *)((UWORD8 *)ps_codec->s_parse.s_bs_ctxt.pu4_pic_vert_bs +
3292*c83a76b0SSuyog Pawar                                     ps_codec->s_parse.i4_ctb_x * (ctb_size * ctb_size / 8 / 16) +
3293*c83a76b0SSuyog Pawar                                     ps_codec->s_parse.i4_ctb_y * bs_strd);
3294*c83a76b0SSuyog Pawar                     UWORD32 *pu4_horz_bs = (UWORD32 *)((UWORD8 *)ps_codec->s_parse.s_bs_ctxt.pu4_pic_horz_bs +
3295*c83a76b0SSuyog Pawar                                     ps_codec->s_parse.i4_ctb_x * (ctb_size * ctb_size / 8 / 16) +
3296*c83a76b0SSuyog Pawar                                     ps_codec->s_parse.i4_ctb_y * bs_strd);
3297*c83a76b0SSuyog Pawar 
3298*c83a76b0SSuyog Pawar                     memset(pu4_vert_bs, 0, (ctb_size / 8) * (ctb_size / 4) / 8 * 2);
3299*c83a76b0SSuyog Pawar                     memset(pu4_horz_bs, 0, (ctb_size / 8) * (ctb_size / 4) / 8 * 2);
3300*c83a76b0SSuyog Pawar                 }
3301*c83a76b0SSuyog Pawar             }
3302*c83a76b0SSuyog Pawar 
3303*c83a76b0SSuyog Pawar         }
3304*c83a76b0SSuyog Pawar 
3305*c83a76b0SSuyog Pawar         DATA_SYNC();
3306*c83a76b0SSuyog Pawar 
3307*c83a76b0SSuyog Pawar         /* Update the parse status map */
3308*c83a76b0SSuyog Pawar         {
3309*c83a76b0SSuyog Pawar             sps_t *ps_sps = ps_codec->s_parse.ps_sps;
3310*c83a76b0SSuyog Pawar             UWORD8 *pu1_buf;
3311*c83a76b0SSuyog Pawar             WORD32 idx;
3312*c83a76b0SSuyog Pawar             idx = (ps_codec->s_parse.i4_ctb_x);
3313*c83a76b0SSuyog Pawar             idx += ((ps_codec->s_parse.i4_ctb_y) * ps_sps->i2_pic_wd_in_ctb);
3314*c83a76b0SSuyog Pawar             pu1_buf = (ps_codec->pu1_parse_map + idx);
3315*c83a76b0SSuyog Pawar             *pu1_buf = 1;
3316*c83a76b0SSuyog Pawar         }
3317*c83a76b0SSuyog Pawar 
3318*c83a76b0SSuyog Pawar         /* Increment CTB x and y positions */
3319*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_tile_x++;
3320*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_x++;
3321*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_ctb_slice_x++;
3322*c83a76b0SSuyog Pawar 
3323*c83a76b0SSuyog Pawar         /*If tiles are enabled, handle the slice counters differently*/
3324*c83a76b0SSuyog Pawar         if(ps_pps->i1_tiles_enabled_flag)
3325*c83a76b0SSuyog Pawar         {
3326*c83a76b0SSuyog Pawar             //Indicates multiple tiles in a slice case
3327*c83a76b0SSuyog Pawar             tile_start_ctb_idx = ps_tile->u1_pos_x
3328*c83a76b0SSuyog Pawar                             + ps_tile->u1_pos_y * (ps_sps->i2_pic_wd_in_ctb);
3329*c83a76b0SSuyog Pawar 
3330*c83a76b0SSuyog Pawar             slice_start_ctb_idx =  ps_slice_hdr->i2_ctb_x
3331*c83a76b0SSuyog Pawar                             + ps_slice_hdr->i2_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
3332*c83a76b0SSuyog Pawar 
3333*c83a76b0SSuyog Pawar             if((slice_start_ctb_idx < tile_start_ctb_idx))
3334*c83a76b0SSuyog Pawar             {
3335*c83a76b0SSuyog Pawar                 if(ps_codec->s_parse.i4_ctb_slice_x == (ps_tile->u1_pos_x + ps_tile->u2_wd))
3336*c83a76b0SSuyog Pawar                 {
3337*c83a76b0SSuyog Pawar                     /* Reached end of slice row within a tile /frame */
3338*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_slice_y++;
3339*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_slice_x = ps_tile->u1_pos_x; //todo:Check
3340*c83a76b0SSuyog Pawar                 }
3341*c83a76b0SSuyog Pawar             }
3342*c83a76b0SSuyog Pawar             //Indicates multiple slices in a tile case - hence, reset slice_x
3343*c83a76b0SSuyog Pawar             else if(ps_codec->s_parse.i4_ctb_slice_x == (ps_tile->u2_wd))
3344*c83a76b0SSuyog Pawar             {
3345*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_y++;
3346*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_x = 0;
3347*c83a76b0SSuyog Pawar             }
3348*c83a76b0SSuyog Pawar         }
3349*c83a76b0SSuyog Pawar         else
3350*c83a76b0SSuyog Pawar         {
3351*c83a76b0SSuyog Pawar             if(ps_codec->s_parse.i4_ctb_slice_x == ps_tile->u2_wd)
3352*c83a76b0SSuyog Pawar             {
3353*c83a76b0SSuyog Pawar                 /* Reached end of slice row within a tile /frame */
3354*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_y++;
3355*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_slice_x = 0;
3356*c83a76b0SSuyog Pawar             }
3357*c83a76b0SSuyog Pawar         }
3358*c83a76b0SSuyog Pawar 
3359*c83a76b0SSuyog Pawar 
3360*c83a76b0SSuyog Pawar         if(ps_codec->s_parse.i4_ctb_tile_x == (ps_tile->u2_wd))
3361*c83a76b0SSuyog Pawar         {
3362*c83a76b0SSuyog Pawar             /* Reached end of tile row */
3363*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_ctb_tile_x = 0;
3364*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_ctb_x = ps_tile->u1_pos_x;
3365*c83a76b0SSuyog Pawar 
3366*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_ctb_tile_y++;
3367*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_ctb_y++;
3368*c83a76b0SSuyog Pawar 
3369*c83a76b0SSuyog Pawar             if(ps_codec->s_parse.i4_ctb_tile_y == (ps_tile->u2_ht))
3370*c83a76b0SSuyog Pawar             {
3371*c83a76b0SSuyog Pawar                 /* Reached End of Tile */
3372*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_tile_y = 0;
3373*c83a76b0SSuyog Pawar                 ps_codec->s_parse.i4_ctb_tile_x = 0;
3374*c83a76b0SSuyog Pawar                 ps_codec->s_parse.ps_tile++;
3375*c83a76b0SSuyog Pawar 
3376*c83a76b0SSuyog Pawar                 if((ps_tile->u2_ht + ps_tile->u1_pos_y  ==  ps_sps->i2_pic_ht_in_ctb) && (ps_tile->u2_wd + ps_tile->u1_pos_x  ==  ps_sps->i2_pic_wd_in_ctb))
3377*c83a76b0SSuyog Pawar                 {
3378*c83a76b0SSuyog Pawar                     /* Reached end of frame */
3379*c83a76b0SSuyog Pawar                     end_of_pic = 1;
3380*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_x = 0;
3381*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_y = ps_sps->i2_pic_ht_in_ctb;
3382*c83a76b0SSuyog Pawar                 }
3383*c83a76b0SSuyog Pawar                 else
3384*c83a76b0SSuyog Pawar                 {
3385*c83a76b0SSuyog Pawar                     /* Initialize ctb_x and ctb_y to start of next tile */
3386*c83a76b0SSuyog Pawar                     ps_tile = ps_codec->s_parse.ps_tile;
3387*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_x = ps_tile->u1_pos_x;
3388*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_y = ps_tile->u1_pos_y;
3389*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_tile_y = 0;
3390*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_tile_x = 0;
3391*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_slice_x = ps_tile->u1_pos_x;
3392*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_ctb_slice_y = ps_tile->u1_pos_y;
3393*c83a76b0SSuyog Pawar 
3394*c83a76b0SSuyog Pawar                 }
3395*c83a76b0SSuyog Pawar             }
3396*c83a76b0SSuyog Pawar 
3397*c83a76b0SSuyog Pawar         }
3398*c83a76b0SSuyog Pawar 
3399*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_next_ctb_indx = ps_codec->s_parse.i4_ctb_x +
3400*c83a76b0SSuyog Pawar                         ps_codec->s_parse.i4_ctb_y * ps_sps->i2_pic_wd_in_ctb;
3401*c83a76b0SSuyog Pawar 
3402*c83a76b0SSuyog Pawar         /* If the current slice is in error, check if the next slice's address
3403*c83a76b0SSuyog Pawar          * is reached and mark the end_of_slice flag */
3404*c83a76b0SSuyog Pawar         if(ps_codec->i4_slice_error)
3405*c83a76b0SSuyog Pawar         {
3406*c83a76b0SSuyog Pawar             slice_header_t *ps_slice_hdr_next = ps_slice_hdr + 1;
3407*c83a76b0SSuyog Pawar             WORD32 next_slice_addr = ps_slice_hdr_next->i2_ctb_x +
3408*c83a76b0SSuyog Pawar                             ps_slice_hdr_next->i2_ctb_y * ps_sps->i2_pic_wd_in_ctb;
3409*c83a76b0SSuyog Pawar 
3410*c83a76b0SSuyog Pawar             if(ps_codec->s_parse.i4_next_ctb_indx == next_slice_addr)
3411*c83a76b0SSuyog Pawar                 end_of_slice_flag = 1;
3412*c83a76b0SSuyog Pawar         }
3413*c83a76b0SSuyog Pawar 
3414*c83a76b0SSuyog Pawar         /* If the codec is running in single core mode
3415*c83a76b0SSuyog Pawar          * then call process function for current CTB
3416*c83a76b0SSuyog Pawar          */
3417*c83a76b0SSuyog Pawar         if((1 == ps_codec->i4_num_cores) && (ps_codec->s_parse.i4_ctb_tile_x == 0))
3418*c83a76b0SSuyog Pawar         {
3419*c83a76b0SSuyog Pawar             process_ctxt_t *ps_proc = &ps_codec->as_process[0];
3420*c83a76b0SSuyog Pawar //          ps_proc->i4_ctb_cnt = ihevcd_nctb_cnt(ps_codec, ps_sps);
3421*c83a76b0SSuyog Pawar             ps_proc->i4_ctb_cnt = ps_proc->ps_tile->u2_wd;
3422*c83a76b0SSuyog Pawar             ihevcd_process(ps_proc);
3423*c83a76b0SSuyog Pawar         }
3424*c83a76b0SSuyog Pawar 
3425*c83a76b0SSuyog Pawar         /* If the bytes for the current slice are exhausted
3426*c83a76b0SSuyog Pawar          * set end_of_slice flag to 1
3427*c83a76b0SSuyog Pawar          * This slice will be treated as incomplete */
3428*c83a76b0SSuyog Pawar         if((UWORD8 *)ps_codec->s_parse.s_bitstrm.pu1_buf_max + BITSTRM_OFF_THRS <
3429*c83a76b0SSuyog Pawar                                         ((UWORD8 *)ps_codec->s_parse.s_bitstrm.pu4_buf + (ps_codec->s_parse.s_bitstrm.u4_bit_ofst / 8)))
3430*c83a76b0SSuyog Pawar         {
3431*c83a76b0SSuyog Pawar             // end_of_slice_flag = ps_codec->i4_slice_error ? 0 : 1;
3432*c83a76b0SSuyog Pawar 
3433*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_slice_error)
3434*c83a76b0SSuyog Pawar                 end_of_slice_flag = 1;
3435*c83a76b0SSuyog Pawar         }
3436*c83a76b0SSuyog Pawar 
3437*c83a76b0SSuyog Pawar 
3438*c83a76b0SSuyog Pawar         if(end_of_pic)
3439*c83a76b0SSuyog Pawar             break;
3440*c83a76b0SSuyog Pawar     } while(!end_of_slice_flag);
3441*c83a76b0SSuyog Pawar 
3442*c83a76b0SSuyog Pawar     /* Reset slice error */
3443*c83a76b0SSuyog Pawar     ps_codec->i4_slice_error = 0;
3444*c83a76b0SSuyog Pawar 
3445*c83a76b0SSuyog Pawar     /* Increment the slice index for parsing next slice */
3446*c83a76b0SSuyog Pawar     if(0 == end_of_pic)
3447*c83a76b0SSuyog Pawar     {
3448*c83a76b0SSuyog Pawar         while(1)
3449*c83a76b0SSuyog Pawar         {
3450*c83a76b0SSuyog Pawar 
3451*c83a76b0SSuyog Pawar             WORD32 parse_slice_idx;
3452*c83a76b0SSuyog Pawar             parse_slice_idx = ps_codec->s_parse.i4_cur_slice_idx;
3453*c83a76b0SSuyog Pawar             parse_slice_idx++;
3454*c83a76b0SSuyog Pawar 
3455*c83a76b0SSuyog Pawar             {
3456*c83a76b0SSuyog Pawar                 /* If the next slice header is not initialized, update cur_slice_idx and break */
3457*c83a76b0SSuyog Pawar                 if((1 == ps_codec->i4_num_cores) || (0 != (parse_slice_idx & (MAX_SLICE_HDR_CNT - 1))))
3458*c83a76b0SSuyog Pawar                 {
3459*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_cur_slice_idx = parse_slice_idx;
3460*c83a76b0SSuyog Pawar                     break;
3461*c83a76b0SSuyog Pawar                 }
3462*c83a76b0SSuyog Pawar 
3463*c83a76b0SSuyog Pawar                 /* If the next slice header is initialised, wait for the parsed slices to be processed */
3464*c83a76b0SSuyog Pawar                 else
3465*c83a76b0SSuyog Pawar                 {
3466*c83a76b0SSuyog Pawar                     WORD32 ctb_indx = 0;
3467*c83a76b0SSuyog Pawar 
3468*c83a76b0SSuyog Pawar                     while(ctb_indx != ps_sps->i4_pic_size_in_ctb)
3469*c83a76b0SSuyog Pawar                     {
3470*c83a76b0SSuyog Pawar                         WORD32 parse_status = *(ps_codec->pu1_parse_map + ctb_indx);
3471*c83a76b0SSuyog Pawar                         volatile WORD32 proc_status = *(ps_codec->pu1_proc_map + ctb_indx) & 1;
3472*c83a76b0SSuyog Pawar 
3473*c83a76b0SSuyog Pawar                         if(parse_status == proc_status)
3474*c83a76b0SSuyog Pawar                             ctb_indx++;
3475*c83a76b0SSuyog Pawar                     }
3476*c83a76b0SSuyog Pawar                     ps_codec->s_parse.i4_cur_slice_idx = parse_slice_idx;
3477*c83a76b0SSuyog Pawar                     break;
3478*c83a76b0SSuyog Pawar                 }
3479*c83a76b0SSuyog Pawar 
3480*c83a76b0SSuyog Pawar             }
3481*c83a76b0SSuyog Pawar         }
3482*c83a76b0SSuyog Pawar 
3483*c83a76b0SSuyog Pawar     }
3484*c83a76b0SSuyog Pawar     else
3485*c83a76b0SSuyog Pawar     {
3486*c83a76b0SSuyog Pawar #if FRAME_ILF_PAD
3487*c83a76b0SSuyog Pawar         if(FRAME_ILF_PAD && 1 == ps_codec->i4_num_cores)
3488*c83a76b0SSuyog Pawar         {
3489*c83a76b0SSuyog Pawar             if(ps_slice_hdr->i4_abs_pic_order_cnt == 0)
3490*c83a76b0SSuyog Pawar             {
3491*c83a76b0SSuyog Pawar                 DUMP_PRE_ILF(ps_codec->as_process[0].pu1_cur_pic_luma,
3492*c83a76b0SSuyog Pawar                              ps_codec->as_process[0].pu1_cur_pic_chroma,
3493*c83a76b0SSuyog Pawar                              ps_sps->i2_pic_width_in_luma_samples,
3494*c83a76b0SSuyog Pawar                              ps_sps->i2_pic_height_in_luma_samples,
3495*c83a76b0SSuyog Pawar                              ps_codec->i4_strd);
3496*c83a76b0SSuyog Pawar 
3497*c83a76b0SSuyog Pawar                 DUMP_BS(ps_codec->as_process[0].s_bs_ctxt.pu4_pic_vert_bs,
3498*c83a76b0SSuyog Pawar                         ps_codec->as_process[0].s_bs_ctxt.pu4_pic_horz_bs,
3499*c83a76b0SSuyog Pawar                         ps_sps->i2_pic_wd_in_ctb * (ctb_size * ctb_size / 8 / 16) * ps_sps->i2_pic_ht_in_ctb,
3500*c83a76b0SSuyog Pawar                         (ps_sps->i2_pic_wd_in_ctb + 1) * (ctb_size * ctb_size / 8 / 16) * ps_sps->i2_pic_ht_in_ctb);
3501*c83a76b0SSuyog Pawar 
3502*c83a76b0SSuyog Pawar                 DUMP_QP(ps_codec->as_process[0].s_bs_ctxt.pu1_pic_qp,
3503*c83a76b0SSuyog Pawar                         (ps_sps->i2_pic_height_in_luma_samples * ps_sps->i2_pic_width_in_luma_samples) / (MIN_CU_SIZE * MIN_CU_SIZE));
3504*c83a76b0SSuyog Pawar 
3505*c83a76b0SSuyog Pawar                 DUMP_QP_CONST_IN_CTB(ps_codec->as_process[0].s_bs_ctxt.pu1_pic_qp_const_in_ctb,
3506*c83a76b0SSuyog Pawar                                      (ps_sps->i2_pic_height_in_luma_samples * ps_sps->i2_pic_width_in_luma_samples) / (MIN_CTB_SIZE * MIN_CTB_SIZE) / 8);
3507*c83a76b0SSuyog Pawar 
3508*c83a76b0SSuyog Pawar                 DUMP_NO_LOOP_FILTER(ps_codec->as_process[0].pu1_pic_no_loop_filter_flag,
3509*c83a76b0SSuyog Pawar                                     (ps_sps->i2_pic_width_in_luma_samples / MIN_CU_SIZE) * (ps_sps->i2_pic_height_in_luma_samples / MIN_CU_SIZE) / 8);
3510*c83a76b0SSuyog Pawar 
3511*c83a76b0SSuyog Pawar                 DUMP_OFFSETS(ps_slice_hdr->i1_beta_offset_div2,
3512*c83a76b0SSuyog Pawar                              ps_slice_hdr->i1_tc_offset_div2,
3513*c83a76b0SSuyog Pawar                              ps_pps->i1_pic_cb_qp_offset,
3514*c83a76b0SSuyog Pawar                              ps_pps->i1_pic_cr_qp_offset);
3515*c83a76b0SSuyog Pawar             }
3516*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_deblk_ctxt.ps_pps = ps_codec->s_parse.ps_pps;
3517*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_deblk_ctxt.ps_sps = ps_codec->s_parse.ps_sps;
3518*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_deblk_ctxt.ps_codec = ps_codec;
3519*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_deblk_ctxt.ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
3520*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_deblk_ctxt.is_chroma_yuv420sp_vu = (ps_codec->e_ref_chroma_fmt == IV_YUV_420SP_VU);
3521*c83a76b0SSuyog Pawar 
3522*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_sao_ctxt.ps_pps = ps_codec->s_parse.ps_pps;
3523*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_sao_ctxt.ps_sps = ps_codec->s_parse.ps_sps;
3524*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_sao_ctxt.ps_codec = ps_codec;
3525*c83a76b0SSuyog Pawar             ps_codec->s_parse.s_sao_ctxt.ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
3526*c83a76b0SSuyog Pawar 
3527*c83a76b0SSuyog Pawar             ihevcd_ilf_pad_frame(&ps_codec->s_parse.s_deblk_ctxt, &ps_codec->s_parse.s_sao_ctxt);
3528*c83a76b0SSuyog Pawar 
3529*c83a76b0SSuyog Pawar         }
3530*c83a76b0SSuyog Pawar #endif
3531*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_end_of_frame = 1;
3532*c83a76b0SSuyog Pawar     }
3533*c83a76b0SSuyog Pawar     return ret;
3534*c83a76b0SSuyog Pawar }
3535*c83a76b0SSuyog Pawar 
3536*c83a76b0SSuyog Pawar 
3537*c83a76b0SSuyog Pawar 
3538*c83a76b0SSuyog Pawar 
3539*c83a76b0SSuyog Pawar 
3540*c83a76b0SSuyog Pawar 
3541*c83a76b0SSuyog Pawar 
3542*c83a76b0SSuyog Pawar 
3543