xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_inter_pred.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  *  ihevc_inter_pred.c
22*c83a76b0SSuyog Pawar  *
23*c83a76b0SSuyog Pawar  * @brief
24*c83a76b0SSuyog Pawar  *  Calculates the prediction samples for a given cbt
25*c83a76b0SSuyog Pawar  *
26*c83a76b0SSuyog Pawar  * @author
27*c83a76b0SSuyog Pawar  *  Srinivas T
28*c83a76b0SSuyog Pawar  *
29*c83a76b0SSuyog Pawar  * @par List of Functions:
30*c83a76b0SSuyog Pawar  *   - ihevc_inter_pred()
31*c83a76b0SSuyog Pawar  *
32*c83a76b0SSuyog Pawar  * @remarks
33*c83a76b0SSuyog Pawar  *  None
34*c83a76b0SSuyog Pawar  *
35*c83a76b0SSuyog Pawar  *******************************************************************************
36*c83a76b0SSuyog Pawar  */
37*c83a76b0SSuyog Pawar #include <stdio.h>
38*c83a76b0SSuyog Pawar #include <stddef.h>
39*c83a76b0SSuyog Pawar #include <stdlib.h>
40*c83a76b0SSuyog Pawar #include <string.h>
41*c83a76b0SSuyog Pawar #include <assert.h>
42*c83a76b0SSuyog Pawar 
43*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
44*c83a76b0SSuyog Pawar #include "iv.h"
45*c83a76b0SSuyog Pawar #include "ivd.h"
46*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
47*c83a76b0SSuyog Pawar #include "ithread.h"
48*c83a76b0SSuyog Pawar 
49*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
50*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
51*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
52*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
53*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
54*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
55*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
56*c83a76b0SSuyog Pawar 
57*c83a76b0SSuyog Pawar #include "ihevc_error.h"
58*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
59*c83a76b0SSuyog Pawar 
60*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
61*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
62*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
63*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
64*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
65*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
67*c83a76b0SSuyog Pawar #include "ihevcd_job_queue.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_utils.h"
69*c83a76b0SSuyog Pawar 
70*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_profile.h"
72*c83a76b0SSuyog Pawar 
73*c83a76b0SSuyog Pawar static WORD8 gai1_luma_filter[4][NTAPS_LUMA] =
74*c83a76b0SSuyog Pawar {
75*c83a76b0SSuyog Pawar     { 0, 0, 0, 64, 0, 0, 0, 0 },
76*c83a76b0SSuyog Pawar     { -1, 4, -10, 58, 17, -5, 1, 0 },
77*c83a76b0SSuyog Pawar     { -1, 4, -11, 40, 40, -11, 4, -1 },
78*c83a76b0SSuyog Pawar     { 0, 1, -5, 17, 58, -10, 4, -1 } };
79*c83a76b0SSuyog Pawar 
80*c83a76b0SSuyog Pawar /* The filter uses only the first four elements in each array */
81*c83a76b0SSuyog Pawar static WORD8 gai1_chroma_filter[8][NTAPS_LUMA] =
82*c83a76b0SSuyog Pawar {
83*c83a76b0SSuyog Pawar     { 0, 64, 0, 0, 0, 0, 0, 0 },
84*c83a76b0SSuyog Pawar     { -2, 58, 10, -2, 0, 0, 0, 0 },
85*c83a76b0SSuyog Pawar     { -4, 54, 16, -2, 0, 0, 0, 0 },
86*c83a76b0SSuyog Pawar     { -6, 46, 28, -4, 0, 0, 0, 0 },
87*c83a76b0SSuyog Pawar     { -4, 36, 36, -4, 0, 0, 0, 0 },
88*c83a76b0SSuyog Pawar     { -4, 28, 46, -6, 0, 0, 0, 0 },
89*c83a76b0SSuyog Pawar     { -2, 16, 54, -4, 0, 0, 0, 0 },
90*c83a76b0SSuyog Pawar     { -2, 10, 58, -2, 0, 0, 0, 0 } };
91*c83a76b0SSuyog Pawar 
92*c83a76b0SSuyog Pawar /**
93*c83a76b0SSuyog Pawar *******************************************************************************
94*c83a76b0SSuyog Pawar *
95*c83a76b0SSuyog Pawar * @brief
96*c83a76b0SSuyog Pawar *  Inter prediction CTB level function
97*c83a76b0SSuyog Pawar *
98*c83a76b0SSuyog Pawar * @par Description:
99*c83a76b0SSuyog Pawar *  For a given CTB, Inter prediction followed by weighted  prediction is
100*c83a76b0SSuyog Pawar * done for all the PUs present in the CTB
101*c83a76b0SSuyog Pawar *
102*c83a76b0SSuyog Pawar * @param[in] ps_ctb
103*c83a76b0SSuyog Pawar *  Pointer to the CTB context
104*c83a76b0SSuyog Pawar *
105*c83a76b0SSuyog Pawar * @returns
106*c83a76b0SSuyog Pawar *
107*c83a76b0SSuyog Pawar * @remarks
108*c83a76b0SSuyog Pawar *
109*c83a76b0SSuyog Pawar *
110*c83a76b0SSuyog Pawar *******************************************************************************
111*c83a76b0SSuyog Pawar */
112*c83a76b0SSuyog Pawar 
ihevcd_inter_pred_ctb(process_ctxt_t * ps_proc)113*c83a76b0SSuyog Pawar void ihevcd_inter_pred_ctb(process_ctxt_t *ps_proc)
114*c83a76b0SSuyog Pawar {
115*c83a76b0SSuyog Pawar     UWORD8 *ref_pic_luma_l0, *ref_pic_chroma_l0;
116*c83a76b0SSuyog Pawar     UWORD8 *ref_pic_luma_l1, *ref_pic_chroma_l1;
117*c83a76b0SSuyog Pawar 
118*c83a76b0SSuyog Pawar     UWORD8 *ref_pic_l0 = NULL, *ref_pic_l1 = NULL;
119*c83a76b0SSuyog Pawar 
120*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
121*c83a76b0SSuyog Pawar     sps_t *ps_sps;
122*c83a76b0SSuyog Pawar     pps_t *ps_pps;
123*c83a76b0SSuyog Pawar     pu_t *ps_pu;
124*c83a76b0SSuyog Pawar     codec_t *ps_codec;
125*c83a76b0SSuyog Pawar     WORD32 pu_indx;
126*c83a76b0SSuyog Pawar     WORD32 pu_x, pu_y;
127*c83a76b0SSuyog Pawar     WORD32 pu_wd, pu_ht;
128*c83a76b0SSuyog Pawar     WORD32 i4_pu_cnt;
129*c83a76b0SSuyog Pawar     WORD32 cur_ctb_idx;
130*c83a76b0SSuyog Pawar 
131*c83a76b0SSuyog Pawar     WORD32 clr_indx;
132*c83a76b0SSuyog Pawar     WORD32 ntaps;
133*c83a76b0SSuyog Pawar 
134*c83a76b0SSuyog Pawar 
135*c83a76b0SSuyog Pawar 
136*c83a76b0SSuyog Pawar     WORD32 ai2_xint[2] = { 0, 0 }, ai2_yint[2] = { 0, 0 };
137*c83a76b0SSuyog Pawar     WORD32 ai2_xfrac[2] = { 0, 0 }, ai2_yfrac[2] = { 0, 0 };
138*c83a76b0SSuyog Pawar 
139*c83a76b0SSuyog Pawar     WORD32 weighted_pred, bi_pred;
140*c83a76b0SSuyog Pawar 
141*c83a76b0SSuyog Pawar     WORD32 ref_strd;
142*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst_luma, *pu1_dst_chroma;
143*c83a76b0SSuyog Pawar 
144*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst;
145*c83a76b0SSuyog Pawar 
146*c83a76b0SSuyog Pawar     WORD16 *pi2_tmp1, *pi2_tmp2;
147*c83a76b0SSuyog Pawar 
148*c83a76b0SSuyog Pawar     WORD32 luma_weight_l0, luma_weight_l1;
149*c83a76b0SSuyog Pawar     WORD32 chroma_weight_l0_cb, chroma_weight_l1_cb, chroma_weight_l0_cr, chroma_weight_l1_cr;
150*c83a76b0SSuyog Pawar     WORD32 luma_offset_l0, luma_offset_l1;
151*c83a76b0SSuyog Pawar     WORD32 chroma_offset_l0_cb, chroma_offset_l1_cb, chroma_offset_l0_cr, chroma_offset_l1_cr;
152*c83a76b0SSuyog Pawar     WORD32 shift, lvl_shift1, lvl_shift2;
153*c83a76b0SSuyog Pawar 
154*c83a76b0SSuyog Pawar     pf_inter_pred func_ptr1, func_ptr2, func_ptr3, func_ptr4;
155*c83a76b0SSuyog Pawar     WORD32 func_indx1, func_indx2, func_indx3, func_indx4;
156*c83a76b0SSuyog Pawar     void *func_src;
157*c83a76b0SSuyog Pawar     void *func_dst;
158*c83a76b0SSuyog Pawar     WORD32 func_src_strd;
159*c83a76b0SSuyog Pawar     WORD32 func_dst_strd;
160*c83a76b0SSuyog Pawar     WORD8 *func_coeff;
161*c83a76b0SSuyog Pawar     WORD32 func_wd;
162*c83a76b0SSuyog Pawar     WORD32 func_ht;
163*c83a76b0SSuyog Pawar     WORD32 next_ctb_idx;
164*c83a76b0SSuyog Pawar     WORD8(*coeff)[8];
165*c83a76b0SSuyog Pawar     WORD32  chroma_yuv420sp_vu;
166*c83a76b0SSuyog Pawar 
167*c83a76b0SSuyog Pawar     PROFILE_DISABLE_INTER_PRED();
168*c83a76b0SSuyog Pawar     ps_codec = ps_proc->ps_codec;
169*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_proc->ps_slice_hdr;
170*c83a76b0SSuyog Pawar     ps_pps = ps_proc->ps_pps;
171*c83a76b0SSuyog Pawar     ps_sps = ps_proc->ps_sps;
172*c83a76b0SSuyog Pawar     cur_ctb_idx = ps_proc->i4_ctb_x
173*c83a76b0SSuyog Pawar                     + ps_proc->i4_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
174*c83a76b0SSuyog Pawar     /*
175*c83a76b0SSuyog Pawar      * In case of tiles, the next ctb belonging to the same tile must be used to get the PU index
176*c83a76b0SSuyog Pawar      */
177*c83a76b0SSuyog Pawar 
178*c83a76b0SSuyog Pawar     next_ctb_idx = ps_proc->i4_next_pu_ctb_cnt;
179*c83a76b0SSuyog Pawar     i4_pu_cnt = ps_proc->pu4_pic_pu_idx[next_ctb_idx] - ps_proc->pu4_pic_pu_idx[cur_ctb_idx];
180*c83a76b0SSuyog Pawar 
181*c83a76b0SSuyog Pawar     ps_pu = ps_proc->ps_pu;
182*c83a76b0SSuyog Pawar     ref_strd = ps_codec->i4_strd;
183*c83a76b0SSuyog Pawar     pi2_tmp1 = ps_proc->pi2_inter_pred_tmp_buf1;
184*c83a76b0SSuyog Pawar     pi2_tmp2 = ps_proc->pi2_inter_pred_tmp_buf2;
185*c83a76b0SSuyog Pawar     pu1_dst_luma = ps_proc->pu1_cur_pic_luma;
186*c83a76b0SSuyog Pawar     pu1_dst_chroma = ps_proc->pu1_cur_pic_chroma;
187*c83a76b0SSuyog Pawar 
188*c83a76b0SSuyog Pawar     chroma_yuv420sp_vu = (ps_codec->e_ref_chroma_fmt == IV_YUV_420SP_VU);
189*c83a76b0SSuyog Pawar 
190*c83a76b0SSuyog Pawar     ASSERT(PSLICE == ps_slice_hdr->i1_slice_type || BSLICE == ps_slice_hdr->i1_slice_type);
191*c83a76b0SSuyog Pawar 
192*c83a76b0SSuyog Pawar     ref_pic_luma_l0 = NULL;
193*c83a76b0SSuyog Pawar     ref_pic_chroma_l0 = NULL;
194*c83a76b0SSuyog Pawar 
195*c83a76b0SSuyog Pawar     luma_weight_l0 = 0;
196*c83a76b0SSuyog Pawar     chroma_weight_l0_cb = 0;
197*c83a76b0SSuyog Pawar     chroma_weight_l0_cr = 0;
198*c83a76b0SSuyog Pawar 
199*c83a76b0SSuyog Pawar     luma_offset_l0 = 0;
200*c83a76b0SSuyog Pawar     chroma_offset_l0_cb = 0;
201*c83a76b0SSuyog Pawar     chroma_offset_l0_cr = 0;
202*c83a76b0SSuyog Pawar 
203*c83a76b0SSuyog Pawar     ref_pic_luma_l1 = NULL;
204*c83a76b0SSuyog Pawar     ref_pic_chroma_l1 = NULL;
205*c83a76b0SSuyog Pawar 
206*c83a76b0SSuyog Pawar     luma_weight_l1 = 0;
207*c83a76b0SSuyog Pawar     chroma_weight_l1_cb = 0;
208*c83a76b0SSuyog Pawar     chroma_weight_l1_cr = 0;
209*c83a76b0SSuyog Pawar 
210*c83a76b0SSuyog Pawar     luma_offset_l1 = 0;
211*c83a76b0SSuyog Pawar     chroma_offset_l1_cb = 0;
212*c83a76b0SSuyog Pawar     chroma_offset_l1_cr = 0;
213*c83a76b0SSuyog Pawar 
214*c83a76b0SSuyog Pawar     for(pu_indx = 0; pu_indx < i4_pu_cnt; pu_indx++, ps_pu++)
215*c83a76b0SSuyog Pawar     {
216*c83a76b0SSuyog Pawar         /* If the PU is intra then proceed to the next */
217*c83a76b0SSuyog Pawar         if(1 == ps_pu->b1_intra_flag)
218*c83a76b0SSuyog Pawar             continue;
219*c83a76b0SSuyog Pawar         pu_x = (ps_proc->i4_ctb_x << ps_sps->i1_log2_ctb_size) + (ps_pu->b4_pos_x << 2);
220*c83a76b0SSuyog Pawar         pu_y = (ps_proc->i4_ctb_y << ps_sps->i1_log2_ctb_size) + (ps_pu->b4_pos_y << 2);
221*c83a76b0SSuyog Pawar 
222*c83a76b0SSuyog Pawar         pu_wd = (ps_pu->b4_wd + 1) << 2;
223*c83a76b0SSuyog Pawar         pu_ht = (ps_pu->b4_ht + 1) << 2;
224*c83a76b0SSuyog Pawar 
225*c83a76b0SSuyog Pawar         weighted_pred = (ps_slice_hdr->i1_slice_type == PSLICE) ? ps_pps->i1_weighted_pred_flag :
226*c83a76b0SSuyog Pawar                         ps_pps->i1_weighted_bipred_flag;
227*c83a76b0SSuyog Pawar         bi_pred = (ps_pu->b2_pred_mode == PRED_BI);
228*c83a76b0SSuyog Pawar 
229*c83a76b0SSuyog Pawar         if(ps_pu->b2_pred_mode != PRED_L1)
230*c83a76b0SSuyog Pawar         {
231*c83a76b0SSuyog Pawar             pic_buf_t *ps_pic_buf_l0;
232*c83a76b0SSuyog Pawar 
233*c83a76b0SSuyog Pawar             ps_pic_buf_l0 = (pic_buf_t *)((ps_slice_hdr->as_ref_pic_list0[ps_pu->mv.i1_l0_ref_idx].pv_pic_buf));
234*c83a76b0SSuyog Pawar 
235*c83a76b0SSuyog Pawar             ref_pic_luma_l0 = ps_pic_buf_l0->pu1_luma;
236*c83a76b0SSuyog Pawar             ref_pic_chroma_l0 = ps_pic_buf_l0->pu1_chroma;
237*c83a76b0SSuyog Pawar 
238*c83a76b0SSuyog Pawar             luma_weight_l0 = ps_slice_hdr->s_wt_ofst.i2_luma_weight_l0[ps_pu->mv.i1_l0_ref_idx];
239*c83a76b0SSuyog Pawar             chroma_weight_l0_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l0_cb[ps_pu->mv.i1_l0_ref_idx];
240*c83a76b0SSuyog Pawar             chroma_weight_l0_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l0_cr[ps_pu->mv.i1_l0_ref_idx];
241*c83a76b0SSuyog Pawar 
242*c83a76b0SSuyog Pawar             luma_offset_l0 = ps_slice_hdr->s_wt_ofst.i2_luma_offset_l0[ps_pu->mv.i1_l0_ref_idx];
243*c83a76b0SSuyog Pawar             chroma_offset_l0_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l0_cb[ps_pu->mv.i1_l0_ref_idx];
244*c83a76b0SSuyog Pawar             chroma_offset_l0_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l0_cr[ps_pu->mv.i1_l0_ref_idx];
245*c83a76b0SSuyog Pawar         }
246*c83a76b0SSuyog Pawar 
247*c83a76b0SSuyog Pawar         if(ps_pu->b2_pred_mode != PRED_L0)
248*c83a76b0SSuyog Pawar         {
249*c83a76b0SSuyog Pawar             pic_buf_t *ps_pic_buf_l1;
250*c83a76b0SSuyog Pawar             ps_pic_buf_l1 = (pic_buf_t *)((ps_slice_hdr->as_ref_pic_list1[ps_pu->mv.i1_l1_ref_idx].pv_pic_buf));
251*c83a76b0SSuyog Pawar             ref_pic_luma_l1 = ps_pic_buf_l1->pu1_luma;
252*c83a76b0SSuyog Pawar             ref_pic_chroma_l1 = ps_pic_buf_l1->pu1_chroma;
253*c83a76b0SSuyog Pawar 
254*c83a76b0SSuyog Pawar             luma_weight_l1 = ps_slice_hdr->s_wt_ofst.i2_luma_weight_l1[ps_pu->mv.i1_l1_ref_idx];
255*c83a76b0SSuyog Pawar             chroma_weight_l1_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l1_cb[ps_pu->mv.i1_l1_ref_idx];
256*c83a76b0SSuyog Pawar             chroma_weight_l1_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l1_cr[ps_pu->mv.i1_l1_ref_idx];
257*c83a76b0SSuyog Pawar 
258*c83a76b0SSuyog Pawar             luma_offset_l1 = ps_slice_hdr->s_wt_ofst.i2_luma_offset_l1[ps_pu->mv.i1_l1_ref_idx];
259*c83a76b0SSuyog Pawar             chroma_offset_l1_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l1_cb[ps_pu->mv.i1_l1_ref_idx];
260*c83a76b0SSuyog Pawar             chroma_offset_l1_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l1_cr[ps_pu->mv.i1_l1_ref_idx];
261*c83a76b0SSuyog Pawar         }
262*c83a76b0SSuyog Pawar 
263*c83a76b0SSuyog Pawar         /*luma and chroma components*/
264*c83a76b0SSuyog Pawar         for(clr_indx = 0; clr_indx < 2; clr_indx++)
265*c83a76b0SSuyog Pawar         {
266*c83a76b0SSuyog Pawar             PROFILE_DISABLE_INTER_PRED_LUMA(clr_indx);
267*c83a76b0SSuyog Pawar             PROFILE_DISABLE_INTER_PRED_CHROMA(clr_indx);
268*c83a76b0SSuyog Pawar 
269*c83a76b0SSuyog Pawar             if(clr_indx == 0)
270*c83a76b0SSuyog Pawar             {
271*c83a76b0SSuyog Pawar                 WORD32 mv;
272*c83a76b0SSuyog Pawar                 if(ps_pu->b2_pred_mode != PRED_L1)
273*c83a76b0SSuyog Pawar                 {
274*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l0_mv.i2_mvx, (-((MAX_CTB_SIZE + pu_x + 7) << 2)), ((ps_sps->i2_pic_width_in_luma_samples - pu_x + 7) << 2));
275*c83a76b0SSuyog Pawar                     ai2_xint[0] = pu_x + (mv >> 2);
276*c83a76b0SSuyog Pawar                     ai2_xfrac[0] = mv & 3;
277*c83a76b0SSuyog Pawar 
278*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l0_mv.i2_mvy, (-((MAX_CTB_SIZE + pu_y + 7) << 2)), ((ps_sps->i2_pic_height_in_luma_samples - pu_y + 7) << 2));
279*c83a76b0SSuyog Pawar                     ai2_yint[0] = pu_y + (mv >> 2);
280*c83a76b0SSuyog Pawar                     ai2_yfrac[0] = mv & 3;
281*c83a76b0SSuyog Pawar 
282*c83a76b0SSuyog Pawar                     ai2_xfrac[0] &= ps_codec->i4_mv_frac_mask;
283*c83a76b0SSuyog Pawar                     ai2_yfrac[0] &= ps_codec->i4_mv_frac_mask;
284*c83a76b0SSuyog Pawar 
285*c83a76b0SSuyog Pawar 
286*c83a76b0SSuyog Pawar                     ref_pic_l0 = ref_pic_luma_l0 + ai2_yint[0] * ref_strd
287*c83a76b0SSuyog Pawar                                     + ai2_xint[0];
288*c83a76b0SSuyog Pawar                 }
289*c83a76b0SSuyog Pawar 
290*c83a76b0SSuyog Pawar                 if(ps_pu->b2_pred_mode != PRED_L0)
291*c83a76b0SSuyog Pawar                 {
292*c83a76b0SSuyog Pawar 
293*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l1_mv.i2_mvx, (-((MAX_CTB_SIZE + pu_x + 7) << 2)), ((ps_sps->i2_pic_width_in_luma_samples - pu_x + 7) << 2));
294*c83a76b0SSuyog Pawar                     ai2_xint[1] = pu_x + (mv >> 2);
295*c83a76b0SSuyog Pawar                     ai2_xfrac[1] = mv & 3;
296*c83a76b0SSuyog Pawar 
297*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l1_mv.i2_mvy, (-((MAX_CTB_SIZE + pu_y + 7) << 2)), ((ps_sps->i2_pic_height_in_luma_samples - pu_y + 7) << 2));
298*c83a76b0SSuyog Pawar                     ai2_yint[1] = pu_y + (mv >> 2);
299*c83a76b0SSuyog Pawar                     ai2_yfrac[1] = mv & 3;
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar                     ref_pic_l1 = ref_pic_luma_l1 + ai2_yint[1] * ref_strd
302*c83a76b0SSuyog Pawar                                     + ai2_xint[1];
303*c83a76b0SSuyog Pawar                     ai2_xfrac[1] &= ps_codec->i4_mv_frac_mask;
304*c83a76b0SSuyog Pawar                     ai2_yfrac[1] &= ps_codec->i4_mv_frac_mask;
305*c83a76b0SSuyog Pawar 
306*c83a76b0SSuyog Pawar                 }
307*c83a76b0SSuyog Pawar 
308*c83a76b0SSuyog Pawar                 pu1_dst = pu1_dst_luma + pu_y * ref_strd + pu_x;
309*c83a76b0SSuyog Pawar 
310*c83a76b0SSuyog Pawar                 ntaps = NTAPS_LUMA;
311*c83a76b0SSuyog Pawar                 coeff = gai1_luma_filter;
312*c83a76b0SSuyog Pawar             }
313*c83a76b0SSuyog Pawar 
314*c83a76b0SSuyog Pawar             else
315*c83a76b0SSuyog Pawar             {
316*c83a76b0SSuyog Pawar                 WORD32 mv;
317*c83a76b0SSuyog Pawar                 /* xint is upshifted by 1 because the chroma components are  */
318*c83a76b0SSuyog Pawar                 /* interleaved which is not the assumption made by standard  */
319*c83a76b0SSuyog Pawar                 if(ps_pu->b2_pred_mode != PRED_L1)
320*c83a76b0SSuyog Pawar                 {
321*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l0_mv.i2_mvx, (-((MAX_CTB_SIZE + pu_x + 7) << 2)), ((ps_sps->i2_pic_width_in_luma_samples - pu_x + 7) << 2));
322*c83a76b0SSuyog Pawar                     ai2_xint[0] = (pu_x / 2 + (mv >> 3)) << 1;
323*c83a76b0SSuyog Pawar                     ai2_xfrac[0] = mv & 7;
324*c83a76b0SSuyog Pawar 
325*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l0_mv.i2_mvy, (-((MAX_CTB_SIZE + pu_y + 7) << 2)), ((ps_sps->i2_pic_height_in_luma_samples - pu_y + 7) << 2));
326*c83a76b0SSuyog Pawar                     ai2_yint[0] = pu_y / 2 + (mv >> 3);
327*c83a76b0SSuyog Pawar                     ai2_yfrac[0] = mv & 7;
328*c83a76b0SSuyog Pawar 
329*c83a76b0SSuyog Pawar                     ref_pic_l0 = ref_pic_chroma_l0 + ai2_yint[0] * ref_strd
330*c83a76b0SSuyog Pawar                                     + ai2_xint[0];
331*c83a76b0SSuyog Pawar 
332*c83a76b0SSuyog Pawar                     ai2_xfrac[0] &= ps_codec->i4_mv_frac_mask;
333*c83a76b0SSuyog Pawar                     ai2_yfrac[0] &= ps_codec->i4_mv_frac_mask;
334*c83a76b0SSuyog Pawar 
335*c83a76b0SSuyog Pawar                 }
336*c83a76b0SSuyog Pawar 
337*c83a76b0SSuyog Pawar                 if(ps_pu->b2_pred_mode != PRED_L0)
338*c83a76b0SSuyog Pawar                 {
339*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l1_mv.i2_mvx, (-((MAX_CTB_SIZE + pu_x + 7) << 2)), ((ps_sps->i2_pic_width_in_luma_samples - pu_x + 7) << 2));
340*c83a76b0SSuyog Pawar                     ai2_xint[1] = (pu_x / 2 + (mv >> 3)) << 1;
341*c83a76b0SSuyog Pawar                     ai2_xfrac[1] = mv & 7;
342*c83a76b0SSuyog Pawar 
343*c83a76b0SSuyog Pawar                     mv = CLIP3(ps_pu->mv.s_l1_mv.i2_mvy, (-((MAX_CTB_SIZE + pu_y + 7) << 2)), ((ps_sps->i2_pic_height_in_luma_samples - pu_y + 7) << 2));
344*c83a76b0SSuyog Pawar                     ai2_yint[1] = pu_y / 2 + (mv >> 3);
345*c83a76b0SSuyog Pawar                     ai2_yfrac[1] = mv & 7;
346*c83a76b0SSuyog Pawar 
347*c83a76b0SSuyog Pawar                     ref_pic_l1 = ref_pic_chroma_l1 + ai2_yint[1] * ref_strd
348*c83a76b0SSuyog Pawar                                     + ai2_xint[1];
349*c83a76b0SSuyog Pawar                     ai2_xfrac[1] &= ps_codec->i4_mv_frac_mask;
350*c83a76b0SSuyog Pawar                     ai2_yfrac[1] &= ps_codec->i4_mv_frac_mask;
351*c83a76b0SSuyog Pawar 
352*c83a76b0SSuyog Pawar                 }
353*c83a76b0SSuyog Pawar 
354*c83a76b0SSuyog Pawar                 pu1_dst = pu1_dst_chroma + pu_y * ref_strd / 2 + pu_x;
355*c83a76b0SSuyog Pawar 
356*c83a76b0SSuyog Pawar                 ntaps = NTAPS_CHROMA;
357*c83a76b0SSuyog Pawar                 coeff = gai1_chroma_filter;
358*c83a76b0SSuyog Pawar             }
359*c83a76b0SSuyog Pawar 
360*c83a76b0SSuyog Pawar             if(ps_pu->b2_pred_mode != PRED_L1)
361*c83a76b0SSuyog Pawar             {
362*c83a76b0SSuyog Pawar                 func_indx1 = 4 * (weighted_pred || bi_pred) + 1 + 11 * clr_indx;
363*c83a76b0SSuyog Pawar                 func_indx1 += ai2_xfrac[0] ? 2 : 0;
364*c83a76b0SSuyog Pawar                 func_indx1 += ai2_yfrac[0] ? 1 : 0;
365*c83a76b0SSuyog Pawar 
366*c83a76b0SSuyog Pawar                 func_indx2 = (ai2_xfrac[0] && ai2_yfrac[0])
367*c83a76b0SSuyog Pawar                                 * (9 + (weighted_pred || bi_pred)) + 11 * clr_indx;
368*c83a76b0SSuyog Pawar 
369*c83a76b0SSuyog Pawar                 func_ptr1 = ps_codec->apf_inter_pred[func_indx1];
370*c83a76b0SSuyog Pawar                 func_ptr2 = ps_codec->apf_inter_pred[func_indx2];
371*c83a76b0SSuyog Pawar             }
372*c83a76b0SSuyog Pawar             else
373*c83a76b0SSuyog Pawar             {
374*c83a76b0SSuyog Pawar                 func_ptr1 = NULL;
375*c83a76b0SSuyog Pawar                 func_ptr2 = NULL;
376*c83a76b0SSuyog Pawar             }
377*c83a76b0SSuyog Pawar             if(ps_pu->b2_pred_mode != PRED_L0)
378*c83a76b0SSuyog Pawar             {
379*c83a76b0SSuyog Pawar                 func_indx3 = 4 * (weighted_pred || bi_pred) + 1 + 11 * clr_indx;
380*c83a76b0SSuyog Pawar                 func_indx3 += ai2_xfrac[1] ? 2 : 0;
381*c83a76b0SSuyog Pawar                 func_indx3 += ai2_yfrac[1] ? 1 : 0;
382*c83a76b0SSuyog Pawar 
383*c83a76b0SSuyog Pawar                 func_indx4 = (ai2_xfrac[1] && ai2_yfrac[1])
384*c83a76b0SSuyog Pawar                                 * (9 + (weighted_pred || bi_pred)) + 11 * clr_indx;
385*c83a76b0SSuyog Pawar 
386*c83a76b0SSuyog Pawar                 func_ptr3 = ps_codec->apf_inter_pred[func_indx3];
387*c83a76b0SSuyog Pawar                 func_ptr4 = ps_codec->apf_inter_pred[func_indx4];
388*c83a76b0SSuyog Pawar             }
389*c83a76b0SSuyog Pawar             else
390*c83a76b0SSuyog Pawar             {
391*c83a76b0SSuyog Pawar                 func_ptr3 = NULL;
392*c83a76b0SSuyog Pawar                 func_ptr4 = NULL;
393*c83a76b0SSuyog Pawar             }
394*c83a76b0SSuyog Pawar 
395*c83a76b0SSuyog Pawar             /*Function 1*/
396*c83a76b0SSuyog Pawar             if(func_ptr1 != NULL)
397*c83a76b0SSuyog Pawar             {
398*c83a76b0SSuyog Pawar                 func_src_strd = ref_strd;
399*c83a76b0SSuyog Pawar                 func_src = (ai2_xfrac[0] && ai2_yfrac[0]) ?
400*c83a76b0SSuyog Pawar                                 ref_pic_l0 - (ntaps / 2 - 1) * func_src_strd :
401*c83a76b0SSuyog Pawar                                 ref_pic_l0;
402*c83a76b0SSuyog Pawar                 func_dst = (weighted_pred || bi_pred) ?
403*c83a76b0SSuyog Pawar                                 (void *)pi2_tmp1 : (void *)pu1_dst;
404*c83a76b0SSuyog Pawar                 if(ai2_xfrac[0] && ai2_yfrac[0])
405*c83a76b0SSuyog Pawar                 {
406*c83a76b0SSuyog Pawar                     func_dst = pi2_tmp1;
407*c83a76b0SSuyog Pawar                 }
408*c83a76b0SSuyog Pawar 
409*c83a76b0SSuyog Pawar                 func_dst_strd = (weighted_pred || bi_pred
410*c83a76b0SSuyog Pawar                                 || (ai2_xfrac[0] && ai2_yfrac[0])) ?
411*c83a76b0SSuyog Pawar                                 pu_wd : ref_strd;
412*c83a76b0SSuyog Pawar                 func_coeff = ai2_xfrac[0] ?
413*c83a76b0SSuyog Pawar                                 coeff[ai2_xfrac[0]] : coeff[ai2_yfrac[0]];
414*c83a76b0SSuyog Pawar                 func_wd = pu_wd >> clr_indx;
415*c83a76b0SSuyog Pawar                 func_ht = pu_ht >> clr_indx;
416*c83a76b0SSuyog Pawar                 func_ht += (ai2_xfrac[0] && ai2_yfrac[0]) ? ntaps - 1 : 0;
417*c83a76b0SSuyog Pawar                 func_ptr1(func_src, func_dst, func_src_strd, func_dst_strd,
418*c83a76b0SSuyog Pawar                           func_coeff, func_ht, func_wd);
419*c83a76b0SSuyog Pawar             }
420*c83a76b0SSuyog Pawar 
421*c83a76b0SSuyog Pawar             /*Function 2*/
422*c83a76b0SSuyog Pawar             if(func_ptr2 != NULL)
423*c83a76b0SSuyog Pawar             {
424*c83a76b0SSuyog Pawar                 func_src_strd = pu_wd;
425*c83a76b0SSuyog Pawar                 func_src = pi2_tmp1 + (ntaps / 2 - 1) * func_src_strd;
426*c83a76b0SSuyog Pawar                 func_dst = (weighted_pred || bi_pred) ?
427*c83a76b0SSuyog Pawar                                 (void *)pi2_tmp1 : (void *)pu1_dst;
428*c83a76b0SSuyog Pawar 
429*c83a76b0SSuyog Pawar                 func_dst_strd = (weighted_pred || bi_pred) ?
430*c83a76b0SSuyog Pawar                                 pu_wd : ref_strd;
431*c83a76b0SSuyog Pawar                 func_coeff = coeff[ai2_yfrac[0]];
432*c83a76b0SSuyog Pawar                 func_wd = pu_wd >> clr_indx;
433*c83a76b0SSuyog Pawar                 func_ht = pu_ht >> clr_indx;
434*c83a76b0SSuyog Pawar                 func_ptr2(func_src, func_dst, func_src_strd, func_dst_strd,
435*c83a76b0SSuyog Pawar                           func_coeff, func_ht, func_wd);
436*c83a76b0SSuyog Pawar             }
437*c83a76b0SSuyog Pawar 
438*c83a76b0SSuyog Pawar             if(func_ptr3 != NULL)
439*c83a76b0SSuyog Pawar             {
440*c83a76b0SSuyog Pawar                 func_src_strd = ref_strd;
441*c83a76b0SSuyog Pawar                 func_src = (ai2_xfrac[1] && ai2_yfrac[1]) ?
442*c83a76b0SSuyog Pawar                                 ref_pic_l1 - (ntaps / 2 - 1) * func_src_strd :
443*c83a76b0SSuyog Pawar                                 ref_pic_l1;
444*c83a76b0SSuyog Pawar 
445*c83a76b0SSuyog Pawar                 func_dst = (weighted_pred || bi_pred) ?
446*c83a76b0SSuyog Pawar                                 (void *)pi2_tmp2 : (void *)pu1_dst;
447*c83a76b0SSuyog Pawar                 if(ai2_xfrac[1] && ai2_yfrac[1])
448*c83a76b0SSuyog Pawar                 {
449*c83a76b0SSuyog Pawar                     func_dst = pi2_tmp2;
450*c83a76b0SSuyog Pawar                 }
451*c83a76b0SSuyog Pawar                 func_dst_strd = (weighted_pred || bi_pred
452*c83a76b0SSuyog Pawar                                 || (ai2_xfrac[1] && ai2_yfrac[1])) ?
453*c83a76b0SSuyog Pawar                                 pu_wd : ref_strd;
454*c83a76b0SSuyog Pawar                 func_coeff = ai2_xfrac[1] ?
455*c83a76b0SSuyog Pawar                                 coeff[ai2_xfrac[1]] : coeff[ai2_yfrac[1]];
456*c83a76b0SSuyog Pawar                 func_wd = pu_wd >> clr_indx;
457*c83a76b0SSuyog Pawar                 func_ht = pu_ht >> clr_indx;
458*c83a76b0SSuyog Pawar                 func_ht += (ai2_xfrac[1] && ai2_yfrac[1]) ? ntaps - 1 : 0;
459*c83a76b0SSuyog Pawar                 func_ptr3(func_src, func_dst, func_src_strd, func_dst_strd,
460*c83a76b0SSuyog Pawar                           func_coeff, func_ht, func_wd);
461*c83a76b0SSuyog Pawar 
462*c83a76b0SSuyog Pawar             }
463*c83a76b0SSuyog Pawar 
464*c83a76b0SSuyog Pawar             if(func_ptr4 != NULL)
465*c83a76b0SSuyog Pawar             {
466*c83a76b0SSuyog Pawar                 func_src_strd = pu_wd;
467*c83a76b0SSuyog Pawar                 func_src = pi2_tmp2 + (ntaps / 2 - 1) * func_src_strd;
468*c83a76b0SSuyog Pawar 
469*c83a76b0SSuyog Pawar                 func_dst = (weighted_pred || bi_pred) ?
470*c83a76b0SSuyog Pawar                                 (void *)pi2_tmp2 : (void *)pu1_dst;
471*c83a76b0SSuyog Pawar                 func_dst_strd = (weighted_pred || bi_pred) ?
472*c83a76b0SSuyog Pawar                                 pu_wd : ref_strd;
473*c83a76b0SSuyog Pawar                 func_coeff = coeff[ai2_yfrac[1]];
474*c83a76b0SSuyog Pawar                 func_wd = pu_wd >> clr_indx;
475*c83a76b0SSuyog Pawar                 func_ht = pu_ht >> clr_indx;
476*c83a76b0SSuyog Pawar                 func_ptr4(func_src, func_dst, func_src_strd, func_dst_strd,
477*c83a76b0SSuyog Pawar                           func_coeff, func_ht, func_wd);
478*c83a76b0SSuyog Pawar 
479*c83a76b0SSuyog Pawar             }
480*c83a76b0SSuyog Pawar 
481*c83a76b0SSuyog Pawar             PROFILE_DISABLE_INTER_PRED_LUMA_AVERAGING(clr_indx);
482*c83a76b0SSuyog Pawar             PROFILE_DISABLE_INTER_PRED_CHROMA_AVERAGING(clr_indx);
483*c83a76b0SSuyog Pawar 
484*c83a76b0SSuyog Pawar 
485*c83a76b0SSuyog Pawar             if((weighted_pred != 0) && (bi_pred != 0))
486*c83a76b0SSuyog Pawar             {
487*c83a76b0SSuyog Pawar                 lvl_shift1 = 0;
488*c83a76b0SSuyog Pawar                 lvl_shift2 = 0;
489*c83a76b0SSuyog Pawar                 if((0 == clr_indx) && (ai2_xfrac[0] && ai2_yfrac[0]))
490*c83a76b0SSuyog Pawar                     lvl_shift1 = (1 << 13);
491*c83a76b0SSuyog Pawar 
492*c83a76b0SSuyog Pawar                 if((0 == clr_indx) && (ai2_xfrac[1] && ai2_yfrac[1]))
493*c83a76b0SSuyog Pawar                     lvl_shift2 = (1 << 13);
494*c83a76b0SSuyog Pawar 
495*c83a76b0SSuyog Pawar 
496*c83a76b0SSuyog Pawar                 if(0 == clr_indx)
497*c83a76b0SSuyog Pawar                 {
498*c83a76b0SSuyog Pawar                     shift = ps_slice_hdr->s_wt_ofst.i1_luma_log2_weight_denom
499*c83a76b0SSuyog Pawar                                     + SHIFT_14_MINUS_BIT_DEPTH + 1;
500*c83a76b0SSuyog Pawar 
501*c83a76b0SSuyog Pawar                     ps_codec->s_func_selector.ihevc_weighted_pred_bi_fptr(pi2_tmp1,
502*c83a76b0SSuyog Pawar                                                                           pi2_tmp2,
503*c83a76b0SSuyog Pawar                                                                           pu1_dst,
504*c83a76b0SSuyog Pawar                                                                           pu_wd,
505*c83a76b0SSuyog Pawar                                                                           pu_wd,
506*c83a76b0SSuyog Pawar                                                                           ref_strd,
507*c83a76b0SSuyog Pawar                                                                           luma_weight_l0,
508*c83a76b0SSuyog Pawar                                                                           luma_offset_l0,
509*c83a76b0SSuyog Pawar                                                                           luma_weight_l1,
510*c83a76b0SSuyog Pawar                                                                           luma_offset_l1,
511*c83a76b0SSuyog Pawar                                                                           shift,
512*c83a76b0SSuyog Pawar                                                                           lvl_shift1,
513*c83a76b0SSuyog Pawar                                                                           lvl_shift2,
514*c83a76b0SSuyog Pawar                                                                           pu_ht,
515*c83a76b0SSuyog Pawar                                                                           pu_wd);
516*c83a76b0SSuyog Pawar                 }
517*c83a76b0SSuyog Pawar                 else
518*c83a76b0SSuyog Pawar                 {
519*c83a76b0SSuyog Pawar                     shift = ps_slice_hdr->s_wt_ofst.i1_chroma_log2_weight_denom
520*c83a76b0SSuyog Pawar                                     + SHIFT_14_MINUS_BIT_DEPTH + 1;
521*c83a76b0SSuyog Pawar 
522*c83a76b0SSuyog Pawar                     if(chroma_yuv420sp_vu)
523*c83a76b0SSuyog Pawar                     {
524*c83a76b0SSuyog Pawar                         ps_codec->s_func_selector.ihevc_weighted_pred_chroma_bi_fptr(pi2_tmp1,
525*c83a76b0SSuyog Pawar                                                                                      pi2_tmp2,
526*c83a76b0SSuyog Pawar                                                                                      pu1_dst,
527*c83a76b0SSuyog Pawar                                                                                      pu_wd,
528*c83a76b0SSuyog Pawar                                                                                      pu_wd,
529*c83a76b0SSuyog Pawar                                                                                      ref_strd,
530*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l0_cr,
531*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l0_cb,
532*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l0_cr,
533*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l0_cb,
534*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l1_cr,
535*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l1_cb,
536*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l1_cr,
537*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l1_cb,
538*c83a76b0SSuyog Pawar                                                                                      shift,
539*c83a76b0SSuyog Pawar                                                                                      lvl_shift1,
540*c83a76b0SSuyog Pawar                                                                                      lvl_shift2,
541*c83a76b0SSuyog Pawar                                                                                      pu_ht >> 1,
542*c83a76b0SSuyog Pawar                                                                                      pu_wd >> 1);
543*c83a76b0SSuyog Pawar                     }
544*c83a76b0SSuyog Pawar                     else
545*c83a76b0SSuyog Pawar                     {
546*c83a76b0SSuyog Pawar                         ps_codec->s_func_selector.ihevc_weighted_pred_chroma_bi_fptr(pi2_tmp1,
547*c83a76b0SSuyog Pawar                                                                                      pi2_tmp2,
548*c83a76b0SSuyog Pawar                                                                                      pu1_dst,
549*c83a76b0SSuyog Pawar                                                                                      pu_wd,
550*c83a76b0SSuyog Pawar                                                                                      pu_wd,
551*c83a76b0SSuyog Pawar                                                                                      ref_strd,
552*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l0_cb,
553*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l0_cr,
554*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l0_cb,
555*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l0_cr,
556*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l1_cb,
557*c83a76b0SSuyog Pawar                                                                                      chroma_weight_l1_cr,
558*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l1_cb,
559*c83a76b0SSuyog Pawar                                                                                      chroma_offset_l1_cr,
560*c83a76b0SSuyog Pawar                                                                                      shift,
561*c83a76b0SSuyog Pawar                                                                                      lvl_shift1,
562*c83a76b0SSuyog Pawar                                                                                      lvl_shift2,
563*c83a76b0SSuyog Pawar                                                                                      pu_ht >> 1,
564*c83a76b0SSuyog Pawar                                                                                      pu_wd >> 1);
565*c83a76b0SSuyog Pawar                     }
566*c83a76b0SSuyog Pawar                 }
567*c83a76b0SSuyog Pawar             }
568*c83a76b0SSuyog Pawar 
569*c83a76b0SSuyog Pawar             else if((weighted_pred != 0) && (bi_pred == 0))
570*c83a76b0SSuyog Pawar             {
571*c83a76b0SSuyog Pawar                 lvl_shift1 = 0;
572*c83a76b0SSuyog Pawar                 if(ps_pu->b2_pred_mode == PRED_L0)
573*c83a76b0SSuyog Pawar                 {
574*c83a76b0SSuyog Pawar                     if((0 == clr_indx) && (ai2_xfrac[0] && ai2_yfrac[0]))
575*c83a76b0SSuyog Pawar                         lvl_shift1 = (1 << 13);
576*c83a76b0SSuyog Pawar                 }
577*c83a76b0SSuyog Pawar                 else
578*c83a76b0SSuyog Pawar                 {
579*c83a76b0SSuyog Pawar                     if((0 == clr_indx) && (ai2_xfrac[1] && ai2_yfrac[1]))
580*c83a76b0SSuyog Pawar                         lvl_shift1 = (1 << 13);
581*c83a76b0SSuyog Pawar                 }
582*c83a76b0SSuyog Pawar 
583*c83a76b0SSuyog Pawar                 if(0 == clr_indx)
584*c83a76b0SSuyog Pawar                 {
585*c83a76b0SSuyog Pawar                     shift = ps_slice_hdr->s_wt_ofst.i1_luma_log2_weight_denom
586*c83a76b0SSuyog Pawar                                     + SHIFT_14_MINUS_BIT_DEPTH;
587*c83a76b0SSuyog Pawar 
588*c83a76b0SSuyog Pawar                     ps_codec->s_func_selector.ihevc_weighted_pred_uni_fptr(ps_pu->b2_pred_mode == PRED_L0 ? pi2_tmp1 : pi2_tmp2,
589*c83a76b0SSuyog Pawar                                                                            pu1_dst,
590*c83a76b0SSuyog Pawar                                                                            pu_wd,
591*c83a76b0SSuyog Pawar                                                                            ref_strd,
592*c83a76b0SSuyog Pawar                                                                            ps_pu->b2_pred_mode == PRED_L0 ? luma_weight_l0 : luma_weight_l1,
593*c83a76b0SSuyog Pawar                                                                            ps_pu->b2_pred_mode == PRED_L0 ? luma_offset_l0 : luma_offset_l1,
594*c83a76b0SSuyog Pawar                                                                            shift,
595*c83a76b0SSuyog Pawar                                                                            lvl_shift1,
596*c83a76b0SSuyog Pawar                                                                            pu_ht,
597*c83a76b0SSuyog Pawar                                                                            pu_wd);
598*c83a76b0SSuyog Pawar                 }
599*c83a76b0SSuyog Pawar                 else
600*c83a76b0SSuyog Pawar                 {
601*c83a76b0SSuyog Pawar                     shift = ps_slice_hdr->s_wt_ofst.i1_chroma_log2_weight_denom
602*c83a76b0SSuyog Pawar                                     + SHIFT_14_MINUS_BIT_DEPTH;
603*c83a76b0SSuyog Pawar 
604*c83a76b0SSuyog Pawar                     if(chroma_yuv420sp_vu)
605*c83a76b0SSuyog Pawar                     {
606*c83a76b0SSuyog Pawar                         ps_codec->s_func_selector.ihevc_weighted_pred_chroma_uni_fptr(ps_pu->b2_pred_mode == PRED_L0 ? pi2_tmp1 : pi2_tmp2,
607*c83a76b0SSuyog Pawar                                                                                       pu1_dst,
608*c83a76b0SSuyog Pawar                                                                                       pu_wd,
609*c83a76b0SSuyog Pawar                                                                                       ref_strd,
610*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cr : chroma_weight_l1_cr,
611*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cb : chroma_weight_l1_cb,
612*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cr : chroma_offset_l1_cr,
613*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cb : chroma_offset_l1_cb,
614*c83a76b0SSuyog Pawar                                                                                       shift,
615*c83a76b0SSuyog Pawar                                                                                       lvl_shift1,
616*c83a76b0SSuyog Pawar                                                                                       pu_ht >> 1,
617*c83a76b0SSuyog Pawar                                                                                       pu_wd >> 1);
618*c83a76b0SSuyog Pawar                     }
619*c83a76b0SSuyog Pawar                     else
620*c83a76b0SSuyog Pawar                     {
621*c83a76b0SSuyog Pawar                         ps_codec->s_func_selector.ihevc_weighted_pred_chroma_uni_fptr(ps_pu->b2_pred_mode == PRED_L0 ? pi2_tmp1 : pi2_tmp2,
622*c83a76b0SSuyog Pawar                                                                                       pu1_dst,
623*c83a76b0SSuyog Pawar                                                                                       pu_wd,
624*c83a76b0SSuyog Pawar                                                                                       ref_strd,
625*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cb : chroma_weight_l1_cb,
626*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cr : chroma_weight_l1_cr,
627*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cb : chroma_offset_l1_cb,
628*c83a76b0SSuyog Pawar                                                                                       ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cr : chroma_offset_l1_cr,
629*c83a76b0SSuyog Pawar                                                                                       shift,
630*c83a76b0SSuyog Pawar                                                                                       lvl_shift1,
631*c83a76b0SSuyog Pawar                                                                                       pu_ht >> 1,
632*c83a76b0SSuyog Pawar                                                                                       pu_wd >> 1);
633*c83a76b0SSuyog Pawar                     }
634*c83a76b0SSuyog Pawar                 }
635*c83a76b0SSuyog Pawar             }
636*c83a76b0SSuyog Pawar 
637*c83a76b0SSuyog Pawar             else if((weighted_pred == 0) && (bi_pred != 0))
638*c83a76b0SSuyog Pawar             {
639*c83a76b0SSuyog Pawar                 lvl_shift1 = 0;
640*c83a76b0SSuyog Pawar                 lvl_shift2 = 0;
641*c83a76b0SSuyog Pawar                 if((0 == clr_indx) && (ai2_xfrac[0] && ai2_yfrac[0]))
642*c83a76b0SSuyog Pawar                     lvl_shift1 = (1 << 13);
643*c83a76b0SSuyog Pawar 
644*c83a76b0SSuyog Pawar                 if((0 == clr_indx) && (ai2_xfrac[1] && ai2_yfrac[1]))
645*c83a76b0SSuyog Pawar                     lvl_shift2 = (1 << 13);
646*c83a76b0SSuyog Pawar 
647*c83a76b0SSuyog Pawar                 if(clr_indx != 0)
648*c83a76b0SSuyog Pawar                 {
649*c83a76b0SSuyog Pawar                     pu_ht = (pu_ht >> 1);
650*c83a76b0SSuyog Pawar                 }
651*c83a76b0SSuyog Pawar                 ps_codec->s_func_selector.ihevc_weighted_pred_bi_default_fptr(pi2_tmp1,
652*c83a76b0SSuyog Pawar                                                                               pi2_tmp2,
653*c83a76b0SSuyog Pawar                                                                               pu1_dst,
654*c83a76b0SSuyog Pawar                                                                               pu_wd,
655*c83a76b0SSuyog Pawar                                                                               pu_wd,
656*c83a76b0SSuyog Pawar                                                                               ref_strd,
657*c83a76b0SSuyog Pawar                                                                               lvl_shift1,
658*c83a76b0SSuyog Pawar                                                                               lvl_shift2,
659*c83a76b0SSuyog Pawar                                                                               pu_ht,
660*c83a76b0SSuyog Pawar                                                                               pu_wd);
661*c83a76b0SSuyog Pawar 
662*c83a76b0SSuyog Pawar             }
663*c83a76b0SSuyog Pawar         }
664*c83a76b0SSuyog Pawar     }
665*c83a76b0SSuyog Pawar }
666