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