libhevc-mirror/decoder/ihevcd_inter_pred.c
Naveen Kumar Ponnusamy 9663ae2116 Few bug fixes in loop filter
Removed few unused functions
Fixed an issue in 420P output in shared mdoe
Few bug fixes in handling loop filter corner cases in multi-tile multi-slice clips
Renamed few elements in mv_buf_t for consistency

Change-Id: I8d179b9ad3c7ee3ad27972ee02ea2658fd2c3c25
2015-07-30 18:14:32 +05:30

665 lines
29 KiB
C

/******************************************************************************
*
* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/**
*******************************************************************************
* @file
* ihevc_inter_pred.c
*
* @brief
* Calculates the prediction samples for a given cbt
*
* @author
* Srinivas T
*
* @par List of Functions:
* - ihevc_inter_pred()
*
* @remarks
* None
*
*******************************************************************************
*/
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "ihevc_typedefs.h"
#include "iv.h"
#include "ivd.h"
#include "ihevcd_cxa.h"
#include "ithread.h"
#include "ihevc_defs.h"
#include "ihevc_debug.h"
#include "ihevc_structs.h"
#include "ihevc_macros.h"
#include "ihevc_platform_macros.h"
#include "ihevc_cabac_tables.h"
#include "ihevc_weighted_pred.h"
#include "ihevc_error.h"
#include "ihevc_common_tables.h"
#include "ihevcd_trace.h"
#include "ihevcd_defs.h"
#include "ihevcd_function_selector.h"
#include "ihevcd_structs.h"
#include "ihevcd_error.h"
#include "ihevcd_nal.h"
#include "ihevcd_bitstream.h"
#include "ihevcd_job_queue.h"
#include "ihevcd_utils.h"
#include "ihevc_inter_pred.h"
#include "ihevcd_profile.h"
static WORD8 gai1_luma_filter[4][NTAPS_LUMA] =
{
{ 0, 0, 0, 64, 0, 0, 0, 0 },
{ -1, 4, -10, 58, 17, -5, 1, 0 },
{ -1, 4, -11, 40, 40, -11, 4, -1 },
{ 0, 1, -5, 17, 58, -10, 4, -1 } };
/* The filter uses only the first four elements in each array */
static WORD8 gai1_chroma_filter[8][NTAPS_LUMA] =
{
{ 0, 64, 0, 0, 0, 0, 0, 0 },
{ -2, 58, 10, -2, 0, 0, 0, 0 },
{ -4, 54, 16, -2, 0, 0, 0, 0 },
{ -6, 46, 28, -4, 0, 0, 0, 0 },
{ -4, 36, 36, -4, 0, 0, 0, 0 },
{ -4, 28, 46, -6, 0, 0, 0, 0 },
{ -2, 16, 54, -4, 0, 0, 0, 0 },
{ -2, 10, 58, -2, 0, 0, 0, 0 } };
/**
*******************************************************************************
*
* @brief
* Inter prediction CTB level function
*
* @par Description:
* For a given CTB, Inter prediction followed by weighted prediction is
* done for all the PUs present in the CTB
*
* @param[in] ps_ctb
* Pointer to the CTB context
*
* @returns
*
* @remarks
*
*
*******************************************************************************
*/
void ihevcd_inter_pred_ctb(process_ctxt_t *ps_proc)
{
UWORD8 *ref_pic_luma_l0, *ref_pic_chroma_l0;
UWORD8 *ref_pic_luma_l1, *ref_pic_chroma_l1;
UWORD8 *ref_pic_l0 = NULL, *ref_pic_l1 = NULL;
slice_header_t *ps_slice_hdr;
sps_t *ps_sps;
pps_t *ps_pps;
pu_t *ps_pu;
codec_t *ps_codec;
WORD32 pu_indx;
WORD32 pu_x, pu_y;
WORD32 pu_wd, pu_ht;
WORD32 i4_pu_cnt;
WORD32 cur_ctb_idx;
WORD32 clr_indx;
WORD32 ntaps;
WORD32 ai2_xint[2] = { 0, 0 }, ai2_yint[2] = { 0, 0 };
WORD32 ai2_xfrac[2] = { 0, 0 }, ai2_yfrac[2] = { 0, 0 };
WORD32 weighted_pred, bi_pred;
WORD32 ref_strd;
UWORD8 *pu1_dst_luma, *pu1_dst_chroma;
UWORD8 *pu1_dst;
WORD16 *pi2_tmp1, *pi2_tmp2;
WORD32 luma_weight_l0, luma_weight_l1;
WORD32 chroma_weight_l0_cb, chroma_weight_l1_cb, chroma_weight_l0_cr, chroma_weight_l1_cr;
WORD32 luma_offset_l0, luma_offset_l1;
WORD32 chroma_offset_l0_cb, chroma_offset_l1_cb, chroma_offset_l0_cr, chroma_offset_l1_cr;
WORD32 shift, lvl_shift1, lvl_shift2;
pf_inter_pred func_ptr1, func_ptr2, func_ptr3, func_ptr4;
WORD32 func_indx1, func_indx2, func_indx3, func_indx4;
void *func_src;
void *func_dst;
WORD32 func_src_strd;
WORD32 func_dst_strd;
WORD8 *func_coeff;
WORD32 func_wd;
WORD32 func_ht;
WORD32 next_ctb_idx;
WORD8(*coeff)[8];
WORD32 chroma_yuv420sp_vu;
PROFILE_DISABLE_INTER_PRED();
ps_codec = ps_proc->ps_codec;
ps_slice_hdr = ps_proc->ps_slice_hdr;
ps_pps = ps_proc->ps_pps;
ps_sps = ps_proc->ps_sps;
cur_ctb_idx = ps_proc->i4_ctb_x
+ ps_proc->i4_ctb_y * (ps_sps->i2_pic_wd_in_ctb);
/*
* In case of tiles, the next ctb belonging to the same tile must be used to get the PU index
*/
next_ctb_idx = ps_proc->i4_next_pu_ctb_cnt;
i4_pu_cnt = ps_proc->pu4_pic_pu_idx[next_ctb_idx] - ps_proc->pu4_pic_pu_idx[cur_ctb_idx];
ps_pu = ps_proc->ps_pu;
ref_strd = ps_codec->i4_strd;
pi2_tmp1 = ps_proc->pi2_inter_pred_tmp_buf1;
pi2_tmp2 = ps_proc->pi2_inter_pred_tmp_buf2;
pu1_dst_luma = ps_proc->pu1_cur_pic_luma;
pu1_dst_chroma = ps_proc->pu1_cur_pic_chroma;
chroma_yuv420sp_vu = (ps_codec->e_ref_chroma_fmt == IV_YUV_420SP_VU);
ASSERT(PSLICE == ps_slice_hdr->i1_slice_type || BSLICE == ps_slice_hdr->i1_slice_type);
ref_pic_luma_l0 = NULL;
ref_pic_chroma_l0 = NULL;
luma_weight_l0 = 0;
chroma_weight_l0_cb = 0;
chroma_weight_l0_cr = 0;
luma_offset_l0 = 0;
chroma_offset_l0_cb = 0;
chroma_offset_l0_cr = 0;
ref_pic_luma_l1 = NULL;
ref_pic_chroma_l1 = NULL;
luma_weight_l1 = 0;
chroma_weight_l1_cb = 0;
chroma_weight_l1_cr = 0;
luma_offset_l1 = 0;
chroma_offset_l1_cb = 0;
chroma_offset_l1_cr = 0;
for(pu_indx = 0; pu_indx < i4_pu_cnt; pu_indx++, ps_pu++)
{
/* If the PU is intra then proceed to the next */
if(1 == ps_pu->b1_intra_flag)
continue;
pu_x = (ps_proc->i4_ctb_x << ps_sps->i1_log2_ctb_size) + (ps_pu->b4_pos_x << 2);
pu_y = (ps_proc->i4_ctb_y << ps_sps->i1_log2_ctb_size) + (ps_pu->b4_pos_y << 2);
pu_wd = (ps_pu->b4_wd + 1) << 2;
pu_ht = (ps_pu->b4_ht + 1) << 2;
weighted_pred = (ps_slice_hdr->i1_slice_type == PSLICE) ? ps_pps->i1_weighted_pred_flag :
ps_pps->i1_weighted_bipred_flag;
bi_pred = (ps_pu->b2_pred_mode == PRED_BI);
if(ps_pu->b2_pred_mode != PRED_L1)
{
pic_buf_t *ps_pic_buf_l0;
ps_pic_buf_l0 = (pic_buf_t *)((ps_slice_hdr->as_ref_pic_list0[ps_pu->mv.i1_l0_ref_idx].pv_pic_buf));
ref_pic_luma_l0 = ps_pic_buf_l0->pu1_luma;
ref_pic_chroma_l0 = ps_pic_buf_l0->pu1_chroma;
luma_weight_l0 = ps_slice_hdr->s_wt_ofst.i2_luma_weight_l0[ps_pu->mv.i1_l0_ref_idx];
chroma_weight_l0_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l0_cb[ps_pu->mv.i1_l0_ref_idx];
chroma_weight_l0_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l0_cr[ps_pu->mv.i1_l0_ref_idx];
luma_offset_l0 = ps_slice_hdr->s_wt_ofst.i2_luma_offset_l0[ps_pu->mv.i1_l0_ref_idx];
chroma_offset_l0_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l0_cb[ps_pu->mv.i1_l0_ref_idx];
chroma_offset_l0_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l0_cr[ps_pu->mv.i1_l0_ref_idx];
}
if(ps_pu->b2_pred_mode != PRED_L0)
{
pic_buf_t *ps_pic_buf_l1;
ps_pic_buf_l1 = (pic_buf_t *)((ps_slice_hdr->as_ref_pic_list1[ps_pu->mv.i1_l1_ref_idx].pv_pic_buf));
ref_pic_luma_l1 = ps_pic_buf_l1->pu1_luma;
ref_pic_chroma_l1 = ps_pic_buf_l1->pu1_chroma;
luma_weight_l1 = ps_slice_hdr->s_wt_ofst.i2_luma_weight_l1[ps_pu->mv.i1_l1_ref_idx];
chroma_weight_l1_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l1_cb[ps_pu->mv.i1_l1_ref_idx];
chroma_weight_l1_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_weight_l1_cr[ps_pu->mv.i1_l1_ref_idx];
luma_offset_l1 = ps_slice_hdr->s_wt_ofst.i2_luma_offset_l1[ps_pu->mv.i1_l1_ref_idx];
chroma_offset_l1_cb = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l1_cb[ps_pu->mv.i1_l1_ref_idx];
chroma_offset_l1_cr = ps_slice_hdr->s_wt_ofst.i2_chroma_offset_l1_cr[ps_pu->mv.i1_l1_ref_idx];
}
/*luma and chroma components*/
for(clr_indx = 0; clr_indx < 2; clr_indx++)
{
PROFILE_DISABLE_INTER_PRED_LUMA(clr_indx);
PROFILE_DISABLE_INTER_PRED_CHROMA(clr_indx);
if(clr_indx == 0)
{
WORD32 mv;
if(ps_pu->b2_pred_mode != PRED_L1)
{
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));
ai2_xint[0] = pu_x + (mv >> 2);
ai2_xfrac[0] = mv & 3;
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));
ai2_yint[0] = pu_y + (mv >> 2);
ai2_yfrac[0] = mv & 3;
ai2_xfrac[0] &= ps_codec->i4_mv_frac_mask;
ai2_yfrac[0] &= ps_codec->i4_mv_frac_mask;
ref_pic_l0 = ref_pic_luma_l0 + ai2_yint[0] * ref_strd
+ ai2_xint[0];
}
if(ps_pu->b2_pred_mode != PRED_L0)
{
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));
ai2_xint[1] = pu_x + (mv >> 2);
ai2_xfrac[1] = mv & 3;
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));
ai2_yint[1] = pu_y + (mv >> 2);
ai2_yfrac[1] = mv & 3;
ref_pic_l1 = ref_pic_luma_l1 + ai2_yint[1] * ref_strd
+ ai2_xint[1];
ai2_xfrac[1] &= ps_codec->i4_mv_frac_mask;
ai2_yfrac[1] &= ps_codec->i4_mv_frac_mask;
}
pu1_dst = pu1_dst_luma + pu_y * ref_strd + pu_x;
ntaps = NTAPS_LUMA;
coeff = gai1_luma_filter;
}
else
{
WORD32 mv;
/* xint is upshifted by 1 because the chroma components are */
/* interleaved which is not the assumption made by standard */
if(ps_pu->b2_pred_mode != PRED_L1)
{
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));
ai2_xint[0] = (pu_x / 2 + (mv >> 3)) << 1;
ai2_xfrac[0] = mv & 7;
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));
ai2_yint[0] = pu_y / 2 + (mv >> 3);
ai2_yfrac[0] = mv & 7;
ref_pic_l0 = ref_pic_chroma_l0 + ai2_yint[0] * ref_strd
+ ai2_xint[0];
ai2_xfrac[0] &= ps_codec->i4_mv_frac_mask;
ai2_yfrac[0] &= ps_codec->i4_mv_frac_mask;
}
if(ps_pu->b2_pred_mode != PRED_L0)
{
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));
ai2_xint[1] = (pu_x / 2 + (mv >> 3)) << 1;
ai2_xfrac[1] = mv & 7;
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));
ai2_yint[1] = pu_y / 2 + (mv >> 3);
ai2_yfrac[1] = mv & 7;
ref_pic_l1 = ref_pic_chroma_l1 + ai2_yint[1] * ref_strd
+ ai2_xint[1];
ai2_xfrac[1] &= ps_codec->i4_mv_frac_mask;
ai2_yfrac[1] &= ps_codec->i4_mv_frac_mask;
}
pu1_dst = pu1_dst_chroma + pu_y * ref_strd / 2 + pu_x;
ntaps = NTAPS_CHROMA;
coeff = gai1_chroma_filter;
}
if(ps_pu->b2_pred_mode != PRED_L1)
{
func_indx1 = 4 * (weighted_pred || bi_pred) + 1 + 11 * clr_indx;
func_indx1 += ai2_xfrac[0] ? 2 : 0;
func_indx1 += ai2_yfrac[0] ? 1 : 0;
func_indx2 = (ai2_xfrac[0] && ai2_yfrac[0])
* (9 + (weighted_pred || bi_pred)) + 11 * clr_indx;
func_ptr1 = ps_codec->apf_inter_pred[func_indx1];
func_ptr2 = ps_codec->apf_inter_pred[func_indx2];
}
else
{
func_ptr1 = NULL;
func_ptr2 = NULL;
}
if(ps_pu->b2_pred_mode != PRED_L0)
{
func_indx3 = 4 * (weighted_pred || bi_pred) + 1 + 11 * clr_indx;
func_indx3 += ai2_xfrac[1] ? 2 : 0;
func_indx3 += ai2_yfrac[1] ? 1 : 0;
func_indx4 = (ai2_xfrac[1] && ai2_yfrac[1])
* (9 + (weighted_pred || bi_pred)) + 11 * clr_indx;
func_ptr3 = ps_codec->apf_inter_pred[func_indx3];
func_ptr4 = ps_codec->apf_inter_pred[func_indx4];
}
else
{
func_ptr3 = NULL;
func_ptr4 = NULL;
}
/*Function 1*/
if(func_ptr1 != NULL)
{
func_src_strd = ref_strd;
func_src = (ai2_xfrac[0] && ai2_yfrac[0]) ?
ref_pic_l0 - (ntaps / 2 - 1) * func_src_strd :
ref_pic_l0;
func_dst = (weighted_pred || bi_pred) ?
(void *)pi2_tmp1 : (void *)pu1_dst;
if(ai2_xfrac[0] && ai2_yfrac[0])
{
func_dst = pi2_tmp1;
}
func_dst_strd = (weighted_pred || bi_pred
|| (ai2_xfrac[0] && ai2_yfrac[0])) ?
pu_wd : ref_strd;
func_coeff = ai2_xfrac[0] ?
coeff[ai2_xfrac[0]] : coeff[ai2_yfrac[0]];
func_wd = pu_wd >> clr_indx;
func_ht = pu_ht >> clr_indx;
func_ht += (ai2_xfrac[0] && ai2_yfrac[0]) ? ntaps - 1 : 0;
func_ptr1(func_src, func_dst, func_src_strd, func_dst_strd,
func_coeff, func_ht, func_wd);
}
/*Function 2*/
if(func_ptr2 != NULL)
{
func_src_strd = pu_wd;
func_src = pi2_tmp1 + (ntaps / 2 - 1) * func_src_strd;
func_dst = (weighted_pred || bi_pred) ?
(void *)pi2_tmp1 : (void *)pu1_dst;
func_dst_strd = (weighted_pred || bi_pred) ?
pu_wd : ref_strd;
func_coeff = coeff[ai2_yfrac[0]];
func_wd = pu_wd >> clr_indx;
func_ht = pu_ht >> clr_indx;
func_ptr2(func_src, func_dst, func_src_strd, func_dst_strd,
func_coeff, func_ht, func_wd);
}
if(func_ptr3 != NULL)
{
func_src_strd = ref_strd;
func_src = (ai2_xfrac[1] && ai2_yfrac[1]) ?
ref_pic_l1 - (ntaps / 2 - 1) * func_src_strd :
ref_pic_l1;
func_dst = (weighted_pred || bi_pred) ?
(void *)pi2_tmp2 : (void *)pu1_dst;
if(ai2_xfrac[1] && ai2_yfrac[1])
{
func_dst = pi2_tmp2;
}
func_dst_strd = (weighted_pred || bi_pred
|| (ai2_xfrac[1] && ai2_yfrac[1])) ?
pu_wd : ref_strd;
func_coeff = ai2_xfrac[1] ?
coeff[ai2_xfrac[1]] : coeff[ai2_yfrac[1]];
func_wd = pu_wd >> clr_indx;
func_ht = pu_ht >> clr_indx;
func_ht += (ai2_xfrac[1] && ai2_yfrac[1]) ? ntaps - 1 : 0;
func_ptr3(func_src, func_dst, func_src_strd, func_dst_strd,
func_coeff, func_ht, func_wd);
}
if(func_ptr4 != NULL)
{
func_src_strd = pu_wd;
func_src = pi2_tmp2 + (ntaps / 2 - 1) * func_src_strd;
func_dst = (weighted_pred || bi_pred) ?
(void *)pi2_tmp2 : (void *)pu1_dst;
func_dst_strd = (weighted_pred || bi_pred) ?
pu_wd : ref_strd;
func_coeff = coeff[ai2_yfrac[1]];
func_wd = pu_wd >> clr_indx;
func_ht = pu_ht >> clr_indx;
func_ptr4(func_src, func_dst, func_src_strd, func_dst_strd,
func_coeff, func_ht, func_wd);
}
PROFILE_DISABLE_INTER_PRED_LUMA_AVERAGING(clr_indx);
PROFILE_DISABLE_INTER_PRED_CHROMA_AVERAGING(clr_indx);
if((weighted_pred != 0) && (bi_pred != 0))
{
lvl_shift1 = 0;
lvl_shift2 = 0;
if((0 == clr_indx) && (ai2_xfrac[0] && ai2_yfrac[0]))
lvl_shift1 = (1 << 13);
if((0 == clr_indx) && (ai2_xfrac[1] && ai2_yfrac[1]))
lvl_shift2 = (1 << 13);
if(0 == clr_indx)
{
shift = ps_slice_hdr->s_wt_ofst.i1_luma_log2_weight_denom
+ SHIFT_14_MINUS_BIT_DEPTH + 1;
ps_codec->s_func_selector.ihevc_weighted_pred_bi_fptr(pi2_tmp1,
pi2_tmp2,
pu1_dst,
pu_wd,
pu_wd,
ref_strd,
luma_weight_l0,
luma_offset_l0,
luma_weight_l1,
luma_offset_l1,
shift,
lvl_shift1,
lvl_shift2,
pu_ht,
pu_wd);
}
else
{
shift = ps_slice_hdr->s_wt_ofst.i1_chroma_log2_weight_denom
+ SHIFT_14_MINUS_BIT_DEPTH + 1;
if(chroma_yuv420sp_vu)
{
ps_codec->s_func_selector.ihevc_weighted_pred_chroma_bi_fptr(pi2_tmp1,
pi2_tmp2,
pu1_dst,
pu_wd,
pu_wd,
ref_strd,
chroma_weight_l0_cr,
chroma_weight_l0_cb,
chroma_offset_l0_cr,
chroma_offset_l0_cb,
chroma_weight_l1_cr,
chroma_weight_l1_cb,
chroma_offset_l1_cr,
chroma_offset_l1_cb,
shift,
lvl_shift1,
lvl_shift2,
pu_ht >> 1,
pu_wd >> 1);
}
else
{
ps_codec->s_func_selector.ihevc_weighted_pred_chroma_bi_fptr(pi2_tmp1,
pi2_tmp2,
pu1_dst,
pu_wd,
pu_wd,
ref_strd,
chroma_weight_l0_cb,
chroma_weight_l0_cr,
chroma_offset_l0_cb,
chroma_offset_l0_cr,
chroma_weight_l1_cb,
chroma_weight_l1_cr,
chroma_offset_l1_cb,
chroma_offset_l1_cr,
shift,
lvl_shift1,
lvl_shift2,
pu_ht >> 1,
pu_wd >> 1);
}
}
}
else if((weighted_pred != 0) && (bi_pred == 0))
{
lvl_shift1 = 0;
if(ps_pu->b2_pred_mode == PRED_L0)
{
if((0 == clr_indx) && (ai2_xfrac[0] && ai2_yfrac[0]))
lvl_shift1 = (1 << 13);
}
else
{
if((0 == clr_indx) && (ai2_xfrac[1] && ai2_yfrac[1]))
lvl_shift1 = (1 << 13);
}
if(0 == clr_indx)
{
shift = ps_slice_hdr->s_wt_ofst.i1_luma_log2_weight_denom
+ SHIFT_14_MINUS_BIT_DEPTH;
ps_codec->s_func_selector.ihevc_weighted_pred_uni_fptr(ps_pu->b2_pred_mode == PRED_L0 ? pi2_tmp1 : pi2_tmp2,
pu1_dst,
pu_wd,
ref_strd,
ps_pu->b2_pred_mode == PRED_L0 ? luma_weight_l0 : luma_weight_l1,
ps_pu->b2_pred_mode == PRED_L0 ? luma_offset_l0 : luma_offset_l1,
shift,
lvl_shift1,
pu_ht,
pu_wd);
}
else
{
shift = ps_slice_hdr->s_wt_ofst.i1_chroma_log2_weight_denom
+ SHIFT_14_MINUS_BIT_DEPTH;
if(chroma_yuv420sp_vu)
{
ps_codec->s_func_selector.ihevc_weighted_pred_chroma_uni_fptr(ps_pu->b2_pred_mode == PRED_L0 ? pi2_tmp1 : pi2_tmp2,
pu1_dst,
pu_wd,
ref_strd,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cr : chroma_weight_l1_cr,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cb : chroma_weight_l1_cb,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cr : chroma_offset_l1_cr,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cb : chroma_offset_l1_cb,
shift,
lvl_shift1,
pu_ht >> 1,
pu_wd >> 1);
}
else
{
ps_codec->s_func_selector.ihevc_weighted_pred_chroma_uni_fptr(ps_pu->b2_pred_mode == PRED_L0 ? pi2_tmp1 : pi2_tmp2,
pu1_dst,
pu_wd,
ref_strd,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cb : chroma_weight_l1_cb,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_weight_l0_cr : chroma_weight_l1_cr,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cb : chroma_offset_l1_cb,
ps_pu->b2_pred_mode == PRED_L0 ? chroma_offset_l0_cr : chroma_offset_l1_cr,
shift,
lvl_shift1,
pu_ht >> 1,
pu_wd >> 1);
}
}
}
else if((weighted_pred == 0) && (bi_pred != 0))
{
lvl_shift1 = 0;
lvl_shift2 = 0;
if((0 == clr_indx) && (ai2_xfrac[0] && ai2_yfrac[0]))
lvl_shift1 = (1 << 13);
if((0 == clr_indx) && (ai2_xfrac[1] && ai2_yfrac[1]))
lvl_shift2 = (1 << 13);
if(clr_indx != 0)
{
pu_ht = (pu_ht >> 1);
}
ps_codec->s_func_selector.ihevc_weighted_pred_bi_default_fptr(pi2_tmp1,
pi2_tmp2,
pu1_dst,
pu_wd,
pu_wd,
ref_strd,
lvl_shift1,
lvl_shift2,
pu_ht,
pu_wd);
}
}
}
}