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