libavc-mirror/decoder/ih264d_deblocking.c
Marco Nelissen 8ef4c3f614 Multithreading changes and better error resilience
Fixed the following bugs
Issue 21145276
Issue 21144884
Issue 21181133
Issue 21181134

Decoder now returns error if the level in stream is higher than level at init

Change-Id: I8892c62bd98f7854d046510330c05a1e9ca826b2
2015-06-03 07:27:36 -07:00

1841 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);
}
}