mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-11-22 09:09:18 +01:00
1842 lines
71 KiB
C
1842 lines
71 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "ih264_typedefs.h"
|
|
#include "iv.h"
|
|
#include "ivd.h"
|
|
#include "ih264_macros.h"
|
|
#include "ih264_platform_macros.h"
|
|
#include "ih264d_debug.h"
|
|
#include "ih264d_defs.h"
|
|
#include "ih264d_defs.h"
|
|
#include "ih264d_structs.h"
|
|
#include "ih264d_deblocking.h"
|
|
#include "ih264d_mb_utils.h"
|
|
#include "ih264d_error_handler.h"
|
|
#include "ih264d_utils.h"
|
|
|
|
|
|
#include "ih264d_defs.h"
|
|
#include "ih264d_format_conv.h"
|
|
#include "ih264d_deblocking.h"
|
|
#include "ih264d_tables.h"
|
|
|
|
/*!
|
|
*************************************************************************
|
|
* \file ih264d_deblocking.c
|
|
*
|
|
* \brief
|
|
* Decoder specific deblocking routines
|
|
*
|
|
* \author AI
|
|
*************************************************************************
|
|
*/
|
|
|
|
/*!
|
|
**************************************************************************
|
|
* \if Function name : HorizonPad \endif
|
|
*
|
|
* \brief
|
|
* Does the Horizontal padding on a whole pic.
|
|
*
|
|
* \return
|
|
* None
|
|
**************************************************************************
|
|
*/
|
|
|
|
/*!
|
|
**************************************************************************
|
|
* \if Function name : FilterBoundaryLeft \endif
|
|
*
|
|
* \brief
|
|
* Filters MacroBlock Left Boundary egdes.
|
|
*
|
|
* \return
|
|
* None
|
|
**************************************************************************
|
|
*/
|
|
void ih264d_filter_boundary_left_nonmbaff(dec_struct_t *ps_dec,
|
|
tfr_ctxt_t * ps_tfr_cxt,
|
|
WORD8 i1_cb_qp_idx_ofst,
|
|
WORD8 i1_cr_qp_idx_ofst,
|
|
deblk_mb_t * ps_cur_mb,
|
|
WORD32 i4_strd_y,
|
|
WORD32 i4_strd_uv,
|
|
deblk_mb_t * ps_left_mb,
|
|
UWORD32 pu4_bs_tab[],
|
|
UWORD8 u1_cur_fld)
|
|
{
|
|
UWORD8 *pu1_y, *pu1_u, *pu1_v;
|
|
WORD32 uc_tmp, qp_avg;
|
|
WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
|
|
WORD32 alpha_y = 0, beta_y = 0;
|
|
|
|
WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
|
|
WORD32 idx_b_y, idx_a_y;
|
|
|
|
UWORD32 u4_bs_val;
|
|
|
|
UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
|
|
|
|
UWORD8 u1_double_cl = !ps_cur_mb->u1_single_call;
|
|
WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
|
|
WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
|
|
|
|
PROFILE_DISABLE_DEBLK()
|
|
|
|
pu1_y = ps_tfr_cxt->pu1_mb_y;
|
|
pu1_u = ps_tfr_cxt->pu1_mb_u;
|
|
pu1_v = ps_tfr_cxt->pu1_mb_v;
|
|
|
|
/* LUMA values */
|
|
/* Deblock rounding change */
|
|
qp_avg =
|
|
(UWORD8)((ps_cur_mb->u1_left_mb_qp + ps_cur_mb->u1_mb_qp + 1)
|
|
>> 1);
|
|
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
|
|
/* Chroma cb values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cb_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_u = qp_avg + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
/* Chroma cr values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cr_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_v = qp_avg + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
|
|
if(u1_double_cl == 0)
|
|
{
|
|
u4_bs_val = pu4_bs_tab[4];
|
|
|
|
if(0x04040404 == u4_bs_val)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
|
|
ps_dec->pf_deblk_chroma_vert_bs4(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v);
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs_val)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y, i4_strd_y, alpha_y,
|
|
beta_y, u4_bs_val,
|
|
pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v,
|
|
u4_bs_val, pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
i4_strd_y <<= (!u1_cur_fld);
|
|
u4_bs_val = pu4_bs_tab[4];
|
|
i4_strd_uv <<= (!u1_cur_fld);
|
|
|
|
if(0x04040404 == u4_bs_val)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
|
|
beta_y);
|
|
ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v);
|
|
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs_val)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
|
|
alpha_y, beta_y,
|
|
u4_bs_val,
|
|
pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
|
|
alpha_u, beta_u,
|
|
alpha_v, beta_v,
|
|
u4_bs_val,
|
|
pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
}
|
|
}
|
|
|
|
{
|
|
|
|
UWORD16 u2_shift = (i4_strd_y >> 1) << (u1_cur_fld ? 4 : 0);
|
|
pu1_y += u2_shift;
|
|
u2_shift = (i4_strd_uv >> 1) << (u1_cur_fld ? 3 : 0);
|
|
pu1_u += u2_shift;
|
|
pu1_v += u2_shift;
|
|
}
|
|
|
|
qp_avg = (((ps_left_mb + 1)->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
|
|
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
u4_bs_val = pu4_bs_tab[9];
|
|
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_u = qp_avg + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
u4_bs_val = pu4_bs_tab[9];
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_v = qp_avg + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
|
|
if(0x04040404 == u4_bs_val)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
|
|
beta_y);
|
|
ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v);
|
|
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs_val)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
|
|
alpha_y, beta_y,
|
|
u4_bs_val,
|
|
pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
|
|
alpha_u, beta_u,
|
|
alpha_v, beta_v,
|
|
u4_bs_val,
|
|
pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*!
|
|
**************************************************************************
|
|
* \if Function name : FilterBoundaryTop \endif
|
|
*
|
|
* \brief
|
|
* Filters MacroBlock Top Boundary egdes.
|
|
*
|
|
* \return
|
|
* None
|
|
**************************************************************************
|
|
*/
|
|
|
|
void ih264d_filter_boundary_top_nonmbaff(dec_struct_t *ps_dec,
|
|
tfr_ctxt_t * ps_tfr_cxt,
|
|
WORD8 i1_cb_qp_idx_ofst,
|
|
WORD8 i1_cr_qp_idx_ofst,
|
|
deblk_mb_t * ps_cur_mb,
|
|
WORD32 i4_strd_y,
|
|
WORD32 i4_strd_uv,
|
|
deblk_mb_t * ps_top_mb,
|
|
UWORD32 u4_bs)
|
|
{
|
|
UWORD8 *pu1_y, *pu1_u;
|
|
WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
|
|
WORD32 alpha_y = 0, beta_y = 0;
|
|
WORD32 qp_avg;
|
|
WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
|
|
WORD32 idx_b_y, idx_a_y;
|
|
UWORD16 uc_tmp;
|
|
|
|
UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
|
|
WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
|
|
WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
|
|
|
|
UNUSED(ps_top_mb);
|
|
/* LUMA values */
|
|
/* Deblock rounding change */
|
|
uc_tmp = ((ps_cur_mb->u1_topmb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
|
|
qp_avg = (UWORD8)uc_tmp;
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
pu1_y = ps_tfr_cxt->pu1_mb_y;
|
|
|
|
/* CHROMA cb values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cb_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
|
|
idx_a_u = qp_avg + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
/* CHROMA cr values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cr_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
|
|
idx_a_v = qp_avg + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
pu1_u = ps_tfr_cxt->pu1_mb_u;
|
|
|
|
if(u4_bs == 0x04040404)
|
|
{
|
|
/* Code specific to the assembly module */
|
|
|
|
ps_dec->pf_deblk_luma_horz_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
|
|
ps_dec->pf_deblk_chroma_horz_bs4(pu1_u, i4_strd_uv, alpha_u, beta_u,
|
|
alpha_v, beta_v);
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u =
|
|
(UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v =
|
|
(UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
|
|
ps_dec->pf_deblk_luma_horz_bslt4(pu1_y, i4_strd_y, alpha_y, beta_y,
|
|
u4_bs, pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v,
|
|
u4_bs, pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void ih264d_deblock_mb_nonmbaff(dec_struct_t *ps_dec,
|
|
tfr_ctxt_t * ps_tfr_cxt,
|
|
WORD8 i1_cb_qp_idx_ofst,
|
|
WORD8 i1_cr_qp_idx_ofst,
|
|
WORD32 i4_strd_y,
|
|
WORD32 i4_strd_uv )
|
|
{
|
|
UWORD8 *pu1_y, *pu1_u;
|
|
UWORD32 u4_bs;
|
|
|
|
WORD32 alpha, beta, alpha_u, beta_u, alpha_v, beta_v;
|
|
|
|
UWORD8 *pu1_cliptab_u;
|
|
UWORD8 *pu1_cliptab_v;
|
|
UWORD8 *pu1_cliptab_y;
|
|
|
|
UWORD32 * pu4_bs_tab;
|
|
WORD32 idx_a_y, idx_a_u, idx_a_v;
|
|
UWORD32 u4_deb_mode, u4_mbs_next;
|
|
UWORD32 u4_image_wd_mb;
|
|
deblk_mb_t *ps_top_mb,*ps_left_mb,*ps_cur_mb;
|
|
|
|
PROFILE_DISABLE_DEBLK()
|
|
/* Return from here to switch off deblocking */
|
|
|
|
u4_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
|
|
|
|
ps_cur_mb = ps_dec->ps_cur_deblk_mb;
|
|
pu4_bs_tab = ps_cur_mb->u4_bs_table;
|
|
u4_deb_mode = ps_cur_mb->u1_deblocking_mode;
|
|
if(!(u4_deb_mode & MB_DISABLE_FILTERING))
|
|
{
|
|
|
|
if(ps_dec->u4_deblk_mb_x)
|
|
{
|
|
ps_left_mb = ps_cur_mb - 1;
|
|
|
|
}
|
|
else
|
|
{
|
|
ps_left_mb = NULL;
|
|
|
|
}
|
|
if(ps_dec->u4_deblk_mb_y != 0)
|
|
{
|
|
ps_top_mb = ps_cur_mb - (u4_image_wd_mb);
|
|
}
|
|
else
|
|
{
|
|
ps_top_mb = NULL;
|
|
}
|
|
|
|
if(u4_deb_mode & MB_DISABLE_LEFT_EDGE)
|
|
ps_left_mb = NULL;
|
|
if(u4_deb_mode & MB_DISABLE_TOP_EDGE)
|
|
ps_top_mb = NULL;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
/* Filter wrt Left edge */
|
|
/* except */
|
|
/* - Left Egde is Picture Boundary */
|
|
/* - Left Egde is part of Slice Boundary and Deblocking */
|
|
/* parameters of slice disable Filtering of Slice Boundary Edges*/
|
|
/*---------------------------------------------------------------------*/
|
|
if(ps_left_mb)
|
|
ih264d_filter_boundary_left_nonmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
i4_strd_y, i4_strd_uv, ps_left_mb,
|
|
pu4_bs_tab, 0);
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Other Vertical Edges */
|
|
/*--------------------------------------------------------------------*/
|
|
{
|
|
WORD32 ofst_a, ofst_b, idx_b_y, idx_b_u,
|
|
idx_b_v;
|
|
WORD32 qp_avg, qp_avg_u, qp_avg_v;
|
|
ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
|
|
ofst_b = ps_cur_mb->i1_slice_beta_offset;
|
|
|
|
qp_avg = ps_cur_mb->u1_mb_qp;
|
|
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
|
|
/* CHROMA values */
|
|
/* CHROMA Cb values */
|
|
qp_avg_u = (qp_avg + i1_cb_qp_idx_ofst);
|
|
qp_avg_u = gau1_ih264d_qp_scale_cr[12 + qp_avg_u];
|
|
idx_a_u = qp_avg_u + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg_u + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
/* CHROMA Cr values */
|
|
qp_avg_v = (qp_avg + i1_cr_qp_idx_ofst);
|
|
qp_avg_v = gau1_ih264d_qp_scale_cr[12 + qp_avg_v];
|
|
idx_a_v = qp_avg_v + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg_v + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
}
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y]; //this for Luma
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u]; //this for chroma
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v]; //this for chroma
|
|
|
|
//edge=1
|
|
|
|
|
|
u4_bs = pu4_bs_tab[5];
|
|
pu1_y = ps_tfr_cxt->pu1_mb_y;
|
|
pu1_u = ps_tfr_cxt->pu1_mb_u;
|
|
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
|
|
u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
//edge=2
|
|
|
|
u4_bs = pu4_bs_tab[6];
|
|
if(u4_bs)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 8, i4_strd_y, alpha, beta,
|
|
u4_bs, pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u + 4 * YUV420SP_FACTOR,
|
|
i4_strd_uv, alpha_u, beta_u,
|
|
alpha_v, beta_v, u4_bs,
|
|
pu1_cliptab_u, pu1_cliptab_v);
|
|
|
|
}
|
|
//edge=3
|
|
|
|
u4_bs = pu4_bs_tab[7];
|
|
if(u4_bs)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 12, i4_strd_y, alpha, beta,
|
|
u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Top edge */
|
|
/* except */
|
|
/* - Top Egde is Picture Boundary */
|
|
/* - Top Egde is part of Slice Boundary and Deblocking */
|
|
/* parameters of slice disable Filtering of Slice Boundary Edges*/
|
|
/*--------------------------------------------------------------------*/
|
|
if(ps_top_mb)
|
|
{
|
|
/** if top MB and MB AFF and cur MB is frame and top is field then */
|
|
/* one extra top edge needs to be deblocked */
|
|
|
|
ih264d_filter_boundary_top_nonmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
i4_strd_y, i4_strd_uv, ps_top_mb,
|
|
pu4_bs_tab[0]);
|
|
|
|
}
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Other Horizontal Edges */
|
|
/*--------------------------------------------------------------------*/
|
|
|
|
//edge1
|
|
u4_bs = pu4_bs_tab[1];
|
|
|
|
if(u4_bs)
|
|
{
|
|
ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 2), i4_strd_y,
|
|
alpha, beta, u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
//edge2
|
|
u4_bs = pu4_bs_tab[2];
|
|
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 3), i4_strd_y,
|
|
alpha, beta, u4_bs, pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u + (i4_strd_uv << 2),
|
|
i4_strd_uv, alpha_u, beta_u,
|
|
alpha_v, beta_v, u4_bs,
|
|
pu1_cliptab_u, pu1_cliptab_v);
|
|
|
|
}
|
|
//edge3
|
|
u4_bs = pu4_bs_tab[3];
|
|
if(u4_bs)
|
|
{
|
|
ps_dec->pf_deblk_luma_horz_bslt4(
|
|
(pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
|
|
i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
}
|
|
|
|
ps_dec->u4_deblk_mb_x++;
|
|
ps_dec->ps_cur_deblk_mb++;
|
|
ps_dec->u4_cur_deblk_mb_num++;
|
|
u4_mbs_next = u4_image_wd_mb - ps_dec->u4_deblk_mb_x;
|
|
|
|
ps_tfr_cxt->pu1_mb_y += 16;
|
|
ps_tfr_cxt->pu1_mb_u += 8 * YUV420SP_FACTOR;
|
|
ps_tfr_cxt->pu1_mb_v += 8;
|
|
|
|
if(!u4_mbs_next)
|
|
{
|
|
ps_tfr_cxt->pu1_mb_y += ps_tfr_cxt->u4_y_inc;
|
|
ps_tfr_cxt->pu1_mb_u += ps_tfr_cxt->u4_uv_inc;
|
|
ps_tfr_cxt->pu1_mb_v += ps_tfr_cxt->u4_uv_inc;
|
|
ps_dec->u4_deblk_mb_y++;
|
|
ps_dec->u4_deblk_mb_x = 0;
|
|
}
|
|
|
|
}
|
|
|
|
/**************************************************************************
|
|
*
|
|
* Function Name : ih264d_init_deblk_tfr_ctxt
|
|
*
|
|
* Description : This function is called once per deblockpicture call
|
|
* This sets up the transfer address contexts
|
|
*
|
|
* Revision History:
|
|
*
|
|
* DD MM YYYY Author(s) Changes (Describe the changes made)
|
|
* 14 06 2005 SWRN Draft
|
|
**************************************************************************/
|
|
void ih264d_init_deblk_tfr_ctxt(dec_struct_t * ps_dec,
|
|
pad_mgr_t *ps_pad_mgr,
|
|
tfr_ctxt_t *ps_tfr_cxt,
|
|
UWORD16 u2_image_wd_mb,
|
|
UWORD8 u1_mbaff)
|
|
{
|
|
|
|
UWORD32 i4_wd_y;
|
|
UWORD32 i4_wd_uv;
|
|
UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag */
|
|
UNUSED(u2_image_wd_mb);
|
|
ps_tfr_cxt->pu1_src_y = ps_dec->s_cur_pic.pu1_buf1 - 4;
|
|
ps_tfr_cxt->pu1_src_u = ps_dec->s_cur_pic.pu1_buf2 - 4;
|
|
ps_tfr_cxt->pu1_src_v = ps_dec->s_cur_pic.pu1_buf3 - 4;
|
|
ps_tfr_cxt->pu1_dest_y = ps_tfr_cxt->pu1_src_y;
|
|
ps_tfr_cxt->pu1_dest_u = ps_tfr_cxt->pu1_src_u;
|
|
ps_tfr_cxt->pu1_dest_v = ps_tfr_cxt->pu1_src_v;
|
|
|
|
ps_tfr_cxt->pu1_mb_y = ps_tfr_cxt->pu1_src_y + 4;
|
|
ps_tfr_cxt->pu1_mb_u = ps_tfr_cxt->pu1_src_u + 4;
|
|
ps_tfr_cxt->pu1_mb_v = ps_tfr_cxt->pu1_src_v + 4;
|
|
|
|
i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
|
|
i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
|
|
ps_tfr_cxt->u4_y_inc = ((i4_wd_y << u1_mbaff) * 16
|
|
- (ps_dec->u2_frm_wd_in_mbs << 4));
|
|
|
|
ps_tfr_cxt->u4_uv_inc = (i4_wd_uv << u1_mbaff) * 8
|
|
- (ps_dec->u2_frm_wd_in_mbs << 4);
|
|
|
|
/* padding related initialisations */
|
|
if(ps_dec->ps_cur_slice->u1_nal_ref_idc)
|
|
{
|
|
ps_pad_mgr->u1_vert_pad_top = !(ps_dec->ps_cur_slice->u1_field_pic_flag
|
|
&& ps_dec->ps_cur_slice->u1_bottom_field_flag);
|
|
ps_pad_mgr->u1_vert_pad_bot =
|
|
((!ps_dec->ps_cur_slice->u1_field_pic_flag)
|
|
|| ps_dec->ps_cur_slice->u1_bottom_field_flag);
|
|
ps_pad_mgr->u1_horz_pad = 1;
|
|
}
|
|
else
|
|
{
|
|
ps_pad_mgr->u1_horz_pad = 0;
|
|
ps_pad_mgr->u1_vert_pad_top = 0;
|
|
ps_pad_mgr->u1_vert_pad_bot = 0;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function Name : ih264d_deblock_picture_mbaff */
|
|
/* */
|
|
/* Description : This function carries out deblocking on a whole picture */
|
|
/* with MBAFF */
|
|
/* */
|
|
/* Inputs : <What inputs does the function take?> */
|
|
/* Processing : This functions calls deblock MB in the MB increment order*/
|
|
/* */
|
|
/* Outputs : Produces the deblocked picture */
|
|
/* Returns : None */
|
|
/* */
|
|
/* Revision History: */
|
|
/* */
|
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */
|
|
/* 17 02 2005 NS Creation */
|
|
/* 14 06 2005 SWRN clean-up */
|
|
/*****************************************************************************/
|
|
|
|
void ih264d_deblock_picture_mbaff(dec_struct_t * ps_dec)
|
|
{
|
|
WORD16 i2_mb_x, i2_mb_y;
|
|
deblk_mb_t *ps_cur_mb;
|
|
deblk_mb_t *ps_top_mb;
|
|
deblk_mb_t *ps_left_mb;
|
|
|
|
UWORD8 u1_vert_pad_top = 1;
|
|
UWORD8 u1_cur_fld, u1_top_fld, u1_left_fld;
|
|
UWORD8 u1_first_row;
|
|
|
|
UWORD8 * pu1_deb_y, *pu1_deb_u, *pu1_deb_v;
|
|
UWORD8 u1_deb_mode, u1_extra_top_edge;
|
|
WORD32 i4_wd_y, i4_wd_uv;
|
|
|
|
UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag */
|
|
UWORD8 u1_bottom_field_flag = ps_dec->ps_cur_slice->u1_bottom_field_flag; /*< Bottom field u4_flag*/
|
|
|
|
/**************************************************/
|
|
/* one time loads from ps_dec which will be used */
|
|
/* frequently throughout the deblocking procedure */
|
|
/**************************************************/
|
|
pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
|
|
tfr_ctxt_t s_tfr_ctxt;
|
|
tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt;
|
|
|
|
UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
|
|
UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
|
|
UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
|
|
WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
|
|
WORD8 i1_cr_qp_idx_ofst =
|
|
ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
|
|
|
|
/* Set up Parameter for DMA transfer */
|
|
ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
|
|
u1_mbaff);
|
|
|
|
/* Pic level Initialisations */
|
|
i2_mb_y = u2_image_ht_mb;
|
|
i2_mb_x = 0;
|
|
u1_extra_top_edge = 0;
|
|
|
|
u1_first_row = 1;
|
|
|
|
i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
|
|
i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
|
|
/* Initial filling of the buffers with deblocking data */
|
|
|
|
pu1_deb_y = ps_tfr_cxt->pu1_mb_y;
|
|
pu1_deb_u = ps_tfr_cxt->pu1_mb_u;
|
|
pu1_deb_v = ps_tfr_cxt->pu1_mb_v;
|
|
ps_cur_mb = ps_dec->ps_deblk_pic;
|
|
|
|
if(ps_dec->u4_app_disable_deblk_frm == 0)
|
|
{
|
|
{
|
|
|
|
while(i2_mb_y > 0)
|
|
{
|
|
do
|
|
{
|
|
|
|
u1_deb_mode = ps_cur_mb->u1_deblocking_mode;
|
|
if(!(u1_deb_mode & MB_DISABLE_FILTERING))
|
|
{
|
|
ps_tfr_cxt->pu1_mb_y = pu1_deb_y;
|
|
ps_tfr_cxt->pu1_mb_u = pu1_deb_u;
|
|
ps_tfr_cxt->pu1_mb_v = pu1_deb_v;
|
|
|
|
u1_cur_fld = (ps_cur_mb->u1_mb_type & D_FLD_MB) >> 7;
|
|
u1_cur_fld &= 1;
|
|
if(i2_mb_x)
|
|
{
|
|
ps_left_mb = ps_cur_mb - 2;
|
|
}
|
|
else
|
|
{
|
|
ps_left_mb = NULL;
|
|
}
|
|
if(!u1_first_row)
|
|
{
|
|
ps_top_mb = ps_cur_mb - (u2_image_wd_mb << 1) + 1;
|
|
u1_top_fld = (ps_top_mb->u1_mb_type & D_FLD_MB)
|
|
>> 7;
|
|
}
|
|
else
|
|
{
|
|
ps_top_mb = NULL;
|
|
u1_top_fld = 0;
|
|
}
|
|
|
|
if((!u1_first_row) & u1_top_fld & u1_cur_fld)
|
|
ps_top_mb--;
|
|
|
|
/********************************************************/
|
|
/* if top MB and MB AFF and cur MB is frame and top is */
|
|
/* field, then one extra top edge needs to be deblocked */
|
|
/********************************************************/
|
|
u1_extra_top_edge = (!u1_cur_fld) & u1_top_fld;
|
|
|
|
if(u1_deb_mode & MB_DISABLE_LEFT_EDGE)
|
|
ps_left_mb = NULL;
|
|
if(u1_deb_mode & MB_DISABLE_TOP_EDGE)
|
|
ps_top_mb = NULL;
|
|
|
|
ih264d_deblock_mb_mbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
i4_wd_y, i4_wd_uv, ps_top_mb,
|
|
ps_left_mb, u1_cur_fld,
|
|
u1_extra_top_edge);
|
|
}
|
|
|
|
ps_cur_mb++;
|
|
|
|
u1_deb_mode = ps_cur_mb->u1_deblocking_mode;
|
|
if(!(u1_deb_mode & MB_DISABLE_FILTERING))
|
|
{
|
|
ps_tfr_cxt->pu1_mb_y = pu1_deb_y;
|
|
ps_tfr_cxt->pu1_mb_u = pu1_deb_u;
|
|
ps_tfr_cxt->pu1_mb_v = pu1_deb_v;
|
|
|
|
u1_cur_fld = (ps_cur_mb->u1_mb_type & D_FLD_MB) >> 7;
|
|
u1_cur_fld &= 1;
|
|
if(i2_mb_x)
|
|
{
|
|
ps_left_mb = ps_cur_mb - 2;
|
|
u1_left_fld = (ps_left_mb->u1_mb_type & D_FLD_MB)
|
|
>> 7;
|
|
}
|
|
else
|
|
{
|
|
ps_left_mb = NULL;
|
|
u1_left_fld = u1_cur_fld;
|
|
}
|
|
if(!u1_first_row)
|
|
{
|
|
ps_top_mb = ps_cur_mb - (u2_image_wd_mb << 1);
|
|
}
|
|
else
|
|
{
|
|
ps_top_mb = NULL;
|
|
}
|
|
|
|
{
|
|
UWORD8 u1_row_shift_y = 0, u1_row_shift_uv = 0;
|
|
if(!u1_cur_fld)
|
|
{
|
|
ps_top_mb = ps_cur_mb - 1;
|
|
u1_top_fld = (ps_top_mb->u1_mb_type & D_FLD_MB)
|
|
>> 7;
|
|
u1_row_shift_y = 4;
|
|
u1_row_shift_uv = 3;
|
|
}
|
|
ps_tfr_cxt->pu1_mb_y += i4_wd_y << u1_row_shift_y;
|
|
ps_tfr_cxt->pu1_mb_u +=
|
|
(i4_wd_uv << u1_row_shift_uv);
|
|
ps_tfr_cxt->pu1_mb_v += i4_wd_uv << u1_row_shift_uv;
|
|
}
|
|
|
|
/* point to A if top else A+1 */
|
|
if(u1_left_fld ^ u1_cur_fld)
|
|
ps_left_mb--;
|
|
|
|
/********************************************************/
|
|
/* if top MB and MB AFF and cur MB is frame and top is */
|
|
/* field, then one extra top edge needs to be deblocked */
|
|
/********************************************************/
|
|
u1_extra_top_edge = 0;
|
|
|
|
if(u1_deb_mode & MB_DISABLE_LEFT_EDGE)
|
|
ps_left_mb = NULL;
|
|
if(u1_deb_mode & MB_DISABLE_TOP_EDGE)
|
|
ps_top_mb = NULL;
|
|
|
|
ih264d_deblock_mb_mbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
i4_wd_y, i4_wd_uv, ps_top_mb,
|
|
ps_left_mb, u1_cur_fld,
|
|
u1_extra_top_edge);
|
|
}
|
|
|
|
ps_cur_mb++;
|
|
i2_mb_x++;
|
|
|
|
pu1_deb_y += 16;
|
|
pu1_deb_u += 8 * YUV420SP_FACTOR;
|
|
pu1_deb_v += 8;
|
|
|
|
}
|
|
while(u2_image_wd_mb > i2_mb_x);
|
|
|
|
pu1_deb_y += ps_tfr_cxt->u4_y_inc;
|
|
pu1_deb_u += ps_tfr_cxt->u4_uv_inc;
|
|
pu1_deb_v += ps_tfr_cxt->u4_uv_inc;
|
|
|
|
i2_mb_x = 0;
|
|
i2_mb_y -= 2;
|
|
|
|
u1_first_row = 0;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
//Padd the Picture
|
|
//Horizontal Padd
|
|
|
|
if(ps_pad_mgr->u1_horz_pad)
|
|
{
|
|
UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
|
|
ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
|
|
ps_dec->u2_frm_wd_y << u1_field_pic_flag,
|
|
ps_dec->u2_pic_ht >> u1_field_pic_flag,
|
|
PAD_LEN_Y_H);
|
|
ps_dec->pf_pad_right_luma(
|
|
ps_tfr_cxt->pu1_src_y + 4
|
|
+ (ps_dec->u2_frm_wd_in_mbs << 4),
|
|
ps_dec->u2_frm_wd_y << u1_field_pic_flag,
|
|
ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
|
|
|
|
ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
|
|
ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
|
|
(ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
|
|
PAD_LEN_UV_H * YUV420SP_FACTOR);
|
|
ps_dec->pf_pad_right_chroma(
|
|
ps_tfr_cxt->pu1_src_u + 4
|
|
+ (ps_dec->u2_frm_wd_in_mbs << 4),
|
|
ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
|
|
(ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
|
|
PAD_LEN_UV_H * YUV420SP_FACTOR);
|
|
|
|
}
|
|
|
|
//Vertical Padd Top
|
|
if(ps_pad_mgr->u1_vert_pad_top)
|
|
{
|
|
ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
|
|
ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
|
|
ps_pad_mgr->u1_pad_len_y_v);
|
|
ps_dec->pf_pad_top(
|
|
ps_dec->ps_cur_pic->pu1_buf2
|
|
- PAD_LEN_UV_H * YUV420SP_FACTOR,
|
|
ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
|
|
ps_pad_mgr->u1_pad_len_cr_v);
|
|
ps_pad_mgr->u1_vert_pad_top = 0;
|
|
}
|
|
|
|
//Vertical Padd Bottom
|
|
if(ps_pad_mgr->u1_vert_pad_bot)
|
|
{
|
|
|
|
UWORD8 *pu1_buf;
|
|
pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
|
|
pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
|
|
ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
|
|
ps_pad_mgr->u1_pad_len_y_v);
|
|
pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
|
|
pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
|
|
|
|
ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
|
|
ps_dec->u2_frm_wd_uv,
|
|
ps_pad_mgr->u1_pad_len_cr_v);
|
|
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function Name : ih264d_deblock_picture_non_mbaff */
|
|
/* */
|
|
/* Description : This function carries out deblocking on a whole picture */
|
|
/* without MBAFF */
|
|
/* */
|
|
/* Inputs : <What inputs does the function take?> */
|
|
/* Processing : This functions calls deblock MB in the MB increment order*/
|
|
/* */
|
|
/* Outputs : Produces the deblocked picture */
|
|
/* Returns : None */
|
|
/* */
|
|
/* Revision History: */
|
|
/* */
|
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */
|
|
/* 17 02 2005 NS Creation */
|
|
/* 14 06 2005 SWRN clean-up */
|
|
/*****************************************************************************/
|
|
|
|
void ih264d_deblock_picture_non_mbaff(dec_struct_t * ps_dec)
|
|
{
|
|
deblk_mb_t *ps_cur_mb;
|
|
|
|
UWORD8 u1_vert_pad_top = 1;
|
|
|
|
UWORD8 u1_deb_mode;
|
|
WORD32 i4_wd_y, i4_wd_uv;
|
|
|
|
UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag */
|
|
UWORD8 u1_bottom_field_flag = ps_dec->ps_cur_slice->u1_bottom_field_flag; /*< Bottom field u4_flag */
|
|
|
|
/**************************************************/
|
|
/* one time loads from ps_dec which will be used */
|
|
/* frequently throughout the deblocking procedure */
|
|
/**************************************************/
|
|
pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
|
|
tfr_ctxt_t s_tfr_ctxt;
|
|
tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
|
|
|
|
UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
|
|
UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
|
|
WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
|
|
WORD8 i1_cr_qp_idx_ofst =
|
|
ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
|
|
|
|
/* Set up Parameter for DMA transfer */
|
|
ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
|
|
0);
|
|
|
|
/* Pic level Initialisations */
|
|
|
|
|
|
|
|
i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
|
|
i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
|
|
/* Initial filling of the buffers with deblocking data */
|
|
|
|
ps_cur_mb = ps_dec->ps_deblk_pic;
|
|
|
|
if(ps_dec->u4_app_disable_deblk_frm == 0)
|
|
{
|
|
if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
|
|
{
|
|
while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
|
|
{
|
|
ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst,
|
|
i4_wd_y, i4_wd_uv);
|
|
ps_cur_mb++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//Padd the Picture
|
|
//Horizontal Padd
|
|
if(ps_pad_mgr->u1_horz_pad)
|
|
{
|
|
UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
|
|
ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
|
|
ps_dec->u2_frm_wd_y << u1_field_pic_flag,
|
|
ps_dec->u2_pic_ht >> u1_field_pic_flag,
|
|
PAD_LEN_Y_H);
|
|
ps_dec->pf_pad_right_luma(
|
|
ps_tfr_cxt->pu1_src_y + 4
|
|
+ (ps_dec->u2_frm_wd_in_mbs << 4),
|
|
ps_dec->u2_frm_wd_y << u1_field_pic_flag,
|
|
ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
|
|
|
|
ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
|
|
ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
|
|
(ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
|
|
PAD_LEN_UV_H * YUV420SP_FACTOR);
|
|
ps_dec->pf_pad_right_chroma(
|
|
ps_tfr_cxt->pu1_src_u + 4
|
|
+ (ps_dec->u2_frm_wd_in_mbs << 4),
|
|
ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
|
|
(ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
|
|
PAD_LEN_UV_H * YUV420SP_FACTOR);
|
|
|
|
}
|
|
|
|
//Vertical Padd Top
|
|
if(ps_pad_mgr->u1_vert_pad_top)
|
|
{
|
|
ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
|
|
ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
|
|
ps_pad_mgr->u1_pad_len_y_v);
|
|
ps_dec->pf_pad_top(
|
|
ps_dec->ps_cur_pic->pu1_buf2
|
|
- PAD_LEN_UV_H * YUV420SP_FACTOR,
|
|
ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
|
|
ps_pad_mgr->u1_pad_len_cr_v);
|
|
ps_pad_mgr->u1_vert_pad_top = 0;
|
|
}
|
|
|
|
//Vertical Padd Bottom
|
|
if(ps_pad_mgr->u1_vert_pad_bot)
|
|
{
|
|
|
|
UWORD8 *pu1_buf;
|
|
pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
|
|
pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
|
|
ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
|
|
ps_pad_mgr->u1_pad_len_y_v);
|
|
pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
|
|
pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
|
|
|
|
ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
|
|
ps_dec->u2_frm_wd_uv,
|
|
ps_pad_mgr->u1_pad_len_cr_v);
|
|
|
|
}
|
|
}
|
|
|
|
void ih264d_deblock_picture_progressive(dec_struct_t * ps_dec)
|
|
{
|
|
deblk_mb_t *ps_cur_mb;
|
|
|
|
UWORD8 u1_vert_pad_top = 1;
|
|
UWORD8 u1_mbs_next;
|
|
UWORD8 u1_deb_mode;
|
|
WORD32 i4_wd_y, i4_wd_uv;
|
|
|
|
|
|
/**************************************************/
|
|
/* one time loads from ps_dec which will be used */
|
|
/* frequently throughout the deblocking procedure */
|
|
/**************************************************/
|
|
pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
|
|
|
|
tfr_ctxt_t s_tfr_ctxt;
|
|
tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
|
|
UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
|
|
UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
|
|
UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
|
|
|
|
WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
|
|
WORD8 i1_cr_qp_idx_ofst =
|
|
ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
|
|
|
|
/* Set up Parameter for deblocking */
|
|
ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
|
|
0);
|
|
|
|
/* Pic level Initialisations */
|
|
|
|
i4_wd_y = ps_dec->u2_frm_wd_y;
|
|
i4_wd_uv = ps_dec->u2_frm_wd_uv;
|
|
/* Initial filling of the buffers with deblocking data */
|
|
ps_cur_mb = ps_dec->ps_deblk_pic;
|
|
|
|
if(ps_dec->u4_app_disable_deblk_frm == 0)
|
|
{
|
|
if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
|
|
{
|
|
while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
|
|
{
|
|
ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst,
|
|
i4_wd_y, i4_wd_uv);
|
|
ps_cur_mb++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//Padd the Picture
|
|
//Horizontal Padd
|
|
if(ps_pad_mgr->u1_horz_pad)
|
|
{
|
|
UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
|
|
ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
|
|
ps_dec->u2_frm_wd_y << u1_field_pic_flag,
|
|
ps_dec->u2_pic_ht >> u1_field_pic_flag,
|
|
PAD_LEN_Y_H);
|
|
ps_dec->pf_pad_right_luma(
|
|
ps_tfr_cxt->pu1_src_y + 4
|
|
+ (ps_dec->u2_frm_wd_in_mbs << 4),
|
|
ps_dec->u2_frm_wd_y << u1_field_pic_flag,
|
|
ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
|
|
|
|
ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
|
|
ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
|
|
(ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
|
|
PAD_LEN_UV_H * YUV420SP_FACTOR);
|
|
ps_dec->pf_pad_right_chroma(
|
|
ps_tfr_cxt->pu1_src_u + 4
|
|
+ (ps_dec->u2_frm_wd_in_mbs << 4),
|
|
ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
|
|
(ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
|
|
PAD_LEN_UV_H * YUV420SP_FACTOR);
|
|
|
|
}
|
|
|
|
//Vertical Padd Top
|
|
if(ps_pad_mgr->u1_vert_pad_top)
|
|
{
|
|
ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
|
|
ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
|
|
ps_pad_mgr->u1_pad_len_y_v);
|
|
ps_dec->pf_pad_top(
|
|
ps_dec->ps_cur_pic->pu1_buf2
|
|
- PAD_LEN_UV_H * YUV420SP_FACTOR,
|
|
ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
|
|
ps_pad_mgr->u1_pad_len_cr_v);
|
|
|
|
}
|
|
|
|
//Vertical Padd Bottom
|
|
if(ps_pad_mgr->u1_vert_pad_bot)
|
|
{
|
|
|
|
UWORD8 *pu1_buf;
|
|
pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
|
|
pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
|
|
ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
|
|
ps_pad_mgr->u1_pad_len_y_v);
|
|
pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
|
|
pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
|
|
|
|
ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
|
|
ps_dec->u2_frm_wd_uv,
|
|
ps_pad_mgr->u1_pad_len_cr_v);
|
|
|
|
}
|
|
}
|
|
|
|
/*!
|
|
**************************************************************************
|
|
* \if Function name : ih264d_set_deblocking_parameters \endif
|
|
*
|
|
* \brief
|
|
* Sets the deblocking parameters of the macroblock
|
|
*
|
|
* \return
|
|
* 0 on Success and Error code otherwise
|
|
*
|
|
* \note
|
|
* Given the neighbour availablity information, and the deblocking
|
|
* parameters of the slice,this function will set the deblocking
|
|
* mode of the macroblock.
|
|
**************************************************************************
|
|
*/
|
|
|
|
WORD8 ih264d_set_deblocking_parameters(deblk_mb_t * ps_cur_mb,
|
|
dec_slice_params_t * ps_slice,
|
|
UWORD8 u1_mb_ngbr_availablity,
|
|
UWORD8 u1_mb_field_decoding_flag)
|
|
{
|
|
/*------------------------------------------------------------------*/
|
|
/* Set the deblocking parameters */
|
|
/*------------------------------------------------------------------*/
|
|
ps_cur_mb->i1_slice_alpha_c0_offset = ps_slice->i1_slice_alpha_c0_offset;
|
|
ps_cur_mb->i1_slice_beta_offset = ps_slice->i1_slice_beta_offset;
|
|
ps_cur_mb->u1_mb_type = (u1_mb_field_decoding_flag << 7);
|
|
|
|
switch(ps_slice->u1_disable_dblk_filter_idc)
|
|
{
|
|
case DBLK_ENABLED:
|
|
ps_cur_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
|
|
break;
|
|
case DBLK_DISABLED:
|
|
ps_cur_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
|
|
break;
|
|
case SLICE_BOUNDARY_DBLK_DISABLED:
|
|
{
|
|
ps_cur_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
|
|
if(!(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK))
|
|
ps_cur_mb->u1_deblocking_mode |= MB_DISABLE_LEFT_EDGE;
|
|
if(!(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK))
|
|
ps_cur_mb->u1_deblocking_mode |= MB_DISABLE_TOP_EDGE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
void ih264d_copy_intra_pred_line(dec_struct_t *ps_dec,
|
|
dec_mb_info_t *ps_cur_mb_info,
|
|
UWORD32 nmb_index)
|
|
{
|
|
UWORD8 *pu1_mb_last_row, u1_mb_field_decoding_flag;
|
|
UWORD32 u4_recWidth, u4_recwidth_cr;
|
|
|
|
u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
|
|
|
|
u4_recWidth = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
|
|
u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
|
|
|
|
pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_y
|
|
+ (u4_recWidth * (MB_SIZE - 1));
|
|
pu1_mb_last_row += MB_SIZE * nmb_index;
|
|
MEMCPY_16BYTES(ps_dec->pu1_cur_y_intra_pred_line, pu1_mb_last_row);
|
|
|
|
pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_u
|
|
+ (u4_recwidth_cr * (BLK8x8SIZE - 1));
|
|
pu1_mb_last_row += BLK8x8SIZE * nmb_index * YUV420SP_FACTOR;
|
|
|
|
MEMCPY_16BYTES(ps_dec->pu1_cur_u_intra_pred_line, pu1_mb_last_row);
|
|
|
|
ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_cur_y_intra_pred_line_base
|
|
+ (MB_SIZE * (ps_cur_mb_info->u2_mbx + 1));
|
|
ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_cur_u_intra_pred_line_base
|
|
+ (BLK8x8SIZE * (ps_cur_mb_info->u2_mbx + 1))
|
|
* YUV420SP_FACTOR;
|
|
ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_cur_v_intra_pred_line_base
|
|
+ (BLK8x8SIZE * (ps_cur_mb_info->u2_mbx + 1));
|
|
|
|
if(ps_cur_mb_info->u2_mbx == (ps_dec->u2_frm_wd_in_mbs - 1))
|
|
{
|
|
UWORD8* pu1_temp;
|
|
|
|
ps_dec->pu1_cur_y_intra_pred_line =
|
|
ps_dec->pu1_cur_y_intra_pred_line_base;
|
|
ps_dec->pu1_cur_u_intra_pred_line =
|
|
ps_dec->pu1_cur_u_intra_pred_line_base;
|
|
ps_dec->pu1_cur_v_intra_pred_line =
|
|
ps_dec->pu1_cur_v_intra_pred_line_base;
|
|
|
|
/*swap current and previous rows*/
|
|
pu1_temp = ps_dec->pu1_cur_y_intra_pred_line;
|
|
ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_prev_y_intra_pred_line;
|
|
ps_dec->pu1_prev_y_intra_pred_line = pu1_temp;
|
|
|
|
pu1_temp = ps_dec->pu1_cur_u_intra_pred_line;
|
|
ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_prev_u_intra_pred_line;
|
|
ps_dec->pu1_prev_u_intra_pred_line = pu1_temp;
|
|
|
|
pu1_temp = ps_dec->pu1_cur_v_intra_pred_line;
|
|
ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_prev_v_intra_pred_line;
|
|
ps_dec->pu1_prev_v_intra_pred_line = pu1_temp;
|
|
|
|
ps_dec->pu1_cur_y_intra_pred_line_base =
|
|
ps_dec->pu1_cur_y_intra_pred_line;
|
|
ps_dec->pu1_cur_u_intra_pred_line_base =
|
|
ps_dec->pu1_cur_u_intra_pred_line;
|
|
ps_dec->pu1_cur_v_intra_pred_line_base =
|
|
ps_dec->pu1_cur_v_intra_pred_line;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void ih264d_filter_boundary_left_mbaff(dec_struct_t *ps_dec,
|
|
tfr_ctxt_t * ps_tfr_cxt,
|
|
WORD8 i1_cb_qp_idx_ofst,
|
|
WORD8 i1_cr_qp_idx_ofst,
|
|
deblk_mb_t * ps_cur_mb,
|
|
WORD32 i4_strd_y,
|
|
WORD32 i4_strd_uv,
|
|
deblk_mb_t * ps_left_mb, /* Neighbouring MB parameters */
|
|
UWORD32 pu4_bs_tab[], /* pointer to the BsTable array */
|
|
UWORD8 u1_cur_fld)
|
|
{
|
|
UWORD8 *pu1_y, *pu1_u, *pu1_v;
|
|
UWORD8 uc_tmp, qp_avg;
|
|
WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
|
|
WORD32 alpha_y = 0, beta_y = 0;
|
|
|
|
WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
|
|
WORD32 idx_b_y, idx_a_y;
|
|
|
|
UWORD32 u4_bs_val;
|
|
|
|
UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
|
|
|
|
UWORD8 u1_double_cl = !ps_cur_mb->u1_single_call;
|
|
WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
|
|
WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
|
|
|
|
PROFILE_DISABLE_DEBLK()
|
|
|
|
pu1_y = ps_tfr_cxt->pu1_mb_y;
|
|
pu1_u = ps_tfr_cxt->pu1_mb_u;
|
|
pu1_v = ps_tfr_cxt->pu1_mb_v;
|
|
|
|
/* LUMA values */
|
|
/* Deblock rounding change */
|
|
uc_tmp = (UWORD8)((ps_left_mb->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
|
|
qp_avg = uc_tmp;
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
|
|
/* Chroma cb values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_u = qp_avg + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
|
|
/* Chroma cr values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_v = qp_avg + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
|
|
if(u1_double_cl == 0)
|
|
{
|
|
u4_bs_val = pu4_bs_tab[4];
|
|
|
|
if(0x04040404 == u4_bs_val)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
|
|
ps_dec->pf_deblk_chroma_vert_bs4(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v);
|
|
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs_val)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12
|
|
+ idx_a_y];
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12
|
|
+ idx_a_u];
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12
|
|
+ idx_a_v];
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y, i4_strd_y, alpha_y,
|
|
beta_y, u4_bs_val,
|
|
pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v,
|
|
u4_bs_val, pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
i4_strd_y <<= (!u1_cur_fld);
|
|
u4_bs_val = pu4_bs_tab[4];
|
|
i4_strd_uv <<= (!u1_cur_fld);
|
|
|
|
if(0x04040404 == u4_bs_val)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
|
|
beta_y);
|
|
ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v);
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs_val)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
|
|
alpha_y, beta_y,
|
|
u4_bs_val,
|
|
pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
|
|
alpha_u, beta_u,
|
|
alpha_v, beta_v,
|
|
u4_bs_val,
|
|
pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
|
|
{
|
|
|
|
UWORD16 u2_shift = (i4_strd_y >> 1) << (u1_cur_fld ? 4 : 0);
|
|
pu1_y += u2_shift;
|
|
u2_shift = (i4_strd_uv >> 1) << (u1_cur_fld ? 3 : 0);
|
|
pu1_u += u2_shift;
|
|
pu1_v += u2_shift;
|
|
}
|
|
|
|
uc_tmp = (((ps_left_mb + 1)->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
|
|
qp_avg = uc_tmp;
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
u4_bs_val = pu4_bs_tab[9];
|
|
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_u = qp_avg + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
u4_bs_val = pu4_bs_tab[9];
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
idx_a_v = qp_avg + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
|
|
if(0x04040404 == u4_bs_val)
|
|
{
|
|
ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
|
|
beta_y);
|
|
ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v);
|
|
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs_val)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
|
|
alpha_y, beta_y,
|
|
u4_bs_val,
|
|
pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
|
|
alpha_u, beta_u,
|
|
alpha_v, beta_v,
|
|
u4_bs_val,
|
|
pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void ih264d_filter_boundary_topmbaff(dec_struct_t *ps_dec,
|
|
tfr_ctxt_t * ps_tfr_cxt,
|
|
WORD8 i1_cb_qp_idx_ofst,
|
|
WORD8 i1_cr_qp_idx_ofst,
|
|
deblk_mb_t * ps_cur_mb,
|
|
WORD32 i4_strd_y,
|
|
WORD32 i4_strd_uv,
|
|
deblk_mb_t * ps_top_mb,
|
|
UWORD32 u4_bs)
|
|
{
|
|
UWORD8 *pu1_y, *pu1_u;
|
|
WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
|
|
WORD32 alpha_y = 0, beta_y = 0;
|
|
WORD32 qp_avg;
|
|
WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
|
|
WORD32 idx_b_y, idx_a_y;
|
|
UWORD16 uc_tmp;
|
|
|
|
UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
|
|
WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
|
|
WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
|
|
|
|
/* LUMA values */
|
|
/* Deblock rounding change */
|
|
uc_tmp = ((ps_top_mb->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
|
|
qp_avg = (UWORD8)uc_tmp;
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
pu1_y = ps_tfr_cxt->pu1_mb_y;
|
|
|
|
/* CHROMA cb values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
|
|
idx_a_u = qp_avg + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
/* CHROMA cr values */
|
|
{
|
|
WORD32 mb_qp1, mb_qp2;
|
|
mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
|
|
qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
|
|
+ gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
|
|
}
|
|
|
|
idx_a_v = qp_avg + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
pu1_u = ps_tfr_cxt->pu1_mb_u;
|
|
|
|
if(u4_bs == 0x04040404)
|
|
{
|
|
/* Code specific to the assembly module */
|
|
ps_dec->pf_deblk_luma_horz_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
|
|
ps_dec->pf_deblk_chroma_horz_bs4(pu1_u, i4_strd_uv, alpha_u, beta_u,
|
|
alpha_v, beta_v);
|
|
|
|
}
|
|
else
|
|
{
|
|
if(u4_bs)
|
|
{
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
|
|
pu1_cliptab_u =
|
|
(UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
|
|
pu1_cliptab_v =
|
|
(UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
|
|
|
|
ps_dec->pf_deblk_luma_horz_bslt4(pu1_y, i4_strd_y, alpha_y, beta_y,
|
|
u4_bs, pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u, i4_strd_uv, alpha_u,
|
|
beta_u, alpha_v, beta_v,
|
|
u4_bs, pu1_cliptab_u,
|
|
pu1_cliptab_v);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void ih264d_deblock_mb_mbaff(dec_struct_t *ps_dec,
|
|
tfr_ctxt_t * ps_tfr_cxt,
|
|
WORD8 i1_cb_qp_idx_ofst,
|
|
WORD8 i1_cr_qp_idx_ofst,
|
|
deblk_mb_t * ps_cur_mb,
|
|
WORD32 i4_strd_y,
|
|
WORD32 i4_strd_uv,
|
|
deblk_mb_t * ps_top_mb,
|
|
deblk_mb_t * ps_left_mb,
|
|
UWORD8 u1_cur_fld,
|
|
UWORD8 u1_extra_top_edge)
|
|
{
|
|
UWORD8 *pu1_y, *pu1_u;
|
|
UWORD32 u4_bs;
|
|
// WORD8 edge;
|
|
WORD32 alpha, beta, alpha_u, beta_u, alpha_v, beta_v;
|
|
|
|
UWORD8 *pu1_cliptab_u;
|
|
UWORD8 *pu1_cliptab_v;
|
|
UWORD8 *pu1_cliptab_y;
|
|
|
|
UWORD32 * pu4_bs_tab = ps_cur_mb->u4_bs_table;
|
|
WORD32 idx_a_y, idx_a_u, idx_a_v;
|
|
/* Return from here to switch off deblocking */
|
|
PROFILE_DISABLE_DEBLK()
|
|
|
|
i4_strd_y <<= u1_cur_fld;
|
|
i4_strd_uv <<= u1_cur_fld;
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Left edge */
|
|
/* except */
|
|
/* - Left Egde is Picture Boundary */
|
|
/* - Left Egde is part of Slice Boundary and Deblocking */
|
|
/* parameters of slice disable Filtering of Slice Boundary Edges*/
|
|
/*--------------------------------------------------------------------*/
|
|
if(ps_left_mb)
|
|
ih264d_filter_boundary_left_mbaff(ps_dec, ps_tfr_cxt, i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
i4_strd_y, i4_strd_uv, ps_left_mb,
|
|
pu4_bs_tab, u1_cur_fld);
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Other Vertical Edges */
|
|
/*--------------------------------------------------------------------*/
|
|
{
|
|
WORD32 ofst_a, ofst_b, idx_b_y, idx_b_u,
|
|
idx_b_v;
|
|
WORD32 qp_avg, qp_avg_u, qp_avg_v;
|
|
ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
|
|
ofst_b = ps_cur_mb->i1_slice_beta_offset;
|
|
qp_avg = ps_cur_mb->u1_mb_qp;
|
|
idx_a_y = qp_avg + ofst_a;
|
|
alpha = gau1_ih264d_alpha_table[12 + idx_a_y];
|
|
idx_b_y = qp_avg + ofst_b;
|
|
beta = gau1_ih264d_beta_table[12 + idx_b_y];
|
|
|
|
/* CHROMA Cb values */
|
|
qp_avg_u = (qp_avg + i1_cb_qp_idx_ofst);
|
|
qp_avg_u = gau1_ih264d_qp_scale_cr[12 + qp_avg_u];
|
|
idx_a_u = qp_avg_u + ofst_a;
|
|
alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
|
|
idx_b_u = qp_avg_u + ofst_b;
|
|
beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
|
|
/* CHROMA Cr values */
|
|
qp_avg_v = (qp_avg + i1_cr_qp_idx_ofst);
|
|
qp_avg_v = gau1_ih264d_qp_scale_cr[12 + qp_avg_v];
|
|
idx_a_v = qp_avg_v + ofst_a;
|
|
alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
|
|
idx_b_v = qp_avg_v + ofst_b;
|
|
beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
|
|
}
|
|
|
|
//STARTL4_FILTER_VERT;
|
|
|
|
pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y]; //this for Luma
|
|
pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u]; //this for chroma
|
|
pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v]; //this for chroma
|
|
|
|
//edge=1
|
|
|
|
|
|
u4_bs = pu4_bs_tab[5];
|
|
pu1_y = ps_tfr_cxt->pu1_mb_y;
|
|
pu1_u = ps_tfr_cxt->pu1_mb_u;
|
|
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
|
|
u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
//edge=2
|
|
|
|
u4_bs = pu4_bs_tab[6];
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 8, i4_strd_y, alpha, beta,
|
|
u4_bs, pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u + 4 * YUV420SP_FACTOR,
|
|
i4_strd_uv, alpha_u, beta_u,
|
|
alpha_v, beta_v, u4_bs,
|
|
pu1_cliptab_u, pu1_cliptab_v);
|
|
}
|
|
//edge=3
|
|
|
|
u4_bs = pu4_bs_tab[7];
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 12, i4_strd_y, alpha, beta,
|
|
u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Top edge */
|
|
/* except */
|
|
/* - Top Egde is Picture Boundary */
|
|
/* - Top Egde is part of Slice Boundary and Deblocking */
|
|
/* parameters of slice disable Filtering of Slice Boundary Edges*/
|
|
/*--------------------------------------------------------------------*/
|
|
if(ps_top_mb)
|
|
{
|
|
/** if top MB and MB AFF and cur MB is frame and top is field then */
|
|
/* one extra top edge needs to be deblocked */
|
|
if(u1_extra_top_edge)
|
|
{
|
|
ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
(UWORD16)(i4_strd_y << 1),
|
|
(UWORD16)(i4_strd_uv << 1),
|
|
ps_top_mb - 1, pu4_bs_tab[8]);
|
|
ps_tfr_cxt->pu1_mb_y += i4_strd_y;
|
|
ps_tfr_cxt->pu1_mb_u += i4_strd_uv;
|
|
ps_tfr_cxt->pu1_mb_v += i4_strd_uv;
|
|
|
|
ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
(UWORD16)(i4_strd_y << 1),
|
|
(UWORD16)(i4_strd_uv << 1),
|
|
ps_top_mb, pu4_bs_tab[0]);
|
|
ps_tfr_cxt->pu1_mb_y -= i4_strd_y;
|
|
ps_tfr_cxt->pu1_mb_u -= i4_strd_uv;
|
|
ps_tfr_cxt->pu1_mb_v -= i4_strd_uv;
|
|
}
|
|
else
|
|
{
|
|
ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
|
|
i1_cb_qp_idx_ofst,
|
|
i1_cr_qp_idx_ofst, ps_cur_mb,
|
|
i4_strd_y, i4_strd_uv, ps_top_mb,
|
|
pu4_bs_tab[0]);
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/* Filter wrt Other Horizontal Edges */
|
|
/*--------------------------------------------------------------------*/
|
|
|
|
//edge1
|
|
u4_bs = pu4_bs_tab[1];
|
|
|
|
if(u4_bs)
|
|
{
|
|
ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 2), i4_strd_y,
|
|
alpha, beta, u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
//edge2
|
|
u4_bs = pu4_bs_tab[2];
|
|
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 3), i4_strd_y,
|
|
alpha, beta, u4_bs, pu1_cliptab_y);
|
|
ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u + (i4_strd_uv << 2),
|
|
i4_strd_uv, alpha_u, beta_u,
|
|
alpha_v, beta_v, u4_bs,
|
|
pu1_cliptab_u, pu1_cliptab_v);
|
|
|
|
}
|
|
//edge3
|
|
u4_bs = pu4_bs_tab[3];
|
|
if(u4_bs)
|
|
{
|
|
|
|
ps_dec->pf_deblk_luma_horz_bslt4(
|
|
(pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
|
|
i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
|
|
|
|
}
|
|
|
|
}
|
|
|