diff options
Diffstat (limited to 'decoder/ih264d_deblocking.c')
-rwxr-xr-x | decoder/ih264d_deblocking.c | 2134 |
1 files changed, 2134 insertions, 0 deletions
diff --git a/decoder/ih264d_deblocking.c b/decoder/ih264d_deblocking.c new file mode 100755 index 0000000..ad4ce08 --- /dev/null +++ b/decoder/ih264d_deblocking.c @@ -0,0 +1,2134 @@ +/****************************************************************************** + * + * 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" +//extern UWORD8 *g_dest_y, *g_dest_uv; + +/*! + ************************************************************************* + * \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, + UWORD16 i4_strd_y, + UWORD16 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 */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cb_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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 */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cr_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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]; + + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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]; + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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, + UWORD16 i4_strd_y, + UWORD16 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 uc_QPav_Y; + 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); + uc_QPav_Y = (UWORD8)uc_tmp; + idx_a_y = uc_QPav_Y + ofst_a; + alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y]; + idx_b_y = uc_QPav_Y + ofst_b; + beta_y = gau1_ih264d_beta_table[12 + idx_b_y]; + pu1_y = ps_tfr_cxt->pu1_mb_y; + + /* CHROMA cb values */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cb_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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 */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cr_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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, + 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 *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 = ps_cur_mb->u4_bs_table; + WORD32 idx_a_y, idx_a_u, idx_a_v; + + PROFILE_DISABLE_DEBLK() + /* Return from here to switch off deblocking */ + + /*---------------------------------------------------------------------*/ + /* 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); + + } + +} + +/************************************************************************** + * + * 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; + + 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_src_y + 4; + pu1_deb_u = ps_tfr_cxt->pu1_src_u + 4; + pu1_deb_v = ps_tfr_cxt->pu1_src_v + 4; + ps_cur_mb = ps_dec->ps_deblk_pic; + + if(ps_dec->u4_app_disable_deblk_frm == 0) + { + if(ps_dec->u4_mb_level_deblk == 0 || ps_dec->u4_num_cores >= 3) + { + + 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) +{ + 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_first_row; + + 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 */ + i2_mb_y = u2_image_ht_mb; + i2_mb_x = 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 */ + + 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; + ps_cur_mb = ps_dec->ps_deblk_pic; + + if(ps_dec->u4_app_disable_deblk_frm == 0) + { + if((ps_dec->u4_mb_level_deblk == 0) && (ps_dec->u4_num_cores != 3)) + { + + while(i2_mb_y > 0) + { + do + { + + u1_deb_mode = ps_cur_mb->u1_deblocking_mode; + if(!(u1_deb_mode & MB_DISABLE_FILTERING)) + { + if(i2_mb_x) + { + ps_left_mb = ps_cur_mb - 1; + } + else + { + ps_left_mb = NULL; + } + if(!u1_first_row) + { + ps_top_mb = ps_cur_mb - (u2_image_wd_mb); + } + else + { + ps_top_mb = NULL; + } + + 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_nonmbaff(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); + } + + ps_cur_mb++; + i2_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; + + } + while(i2_mb_x < u2_image_wd_mb); + + 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; + + i2_mb_x = 0; + i2_mb_y--; + 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); + + } +} + +void ih264d_deblock_picture_progressive(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_mbs_next, u1_first_row; + 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 */ + i2_mb_y = u2_image_ht_mb; + i2_mb_x = 0; + + u1_first_row = 1; + + 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_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; + ps_cur_mb = ps_dec->ps_deblk_pic; + + if(ps_dec->u4_app_disable_deblk_frm == 0) + { + + if((ps_dec->u4_mb_level_deblk == 0) && (ps_dec->u4_num_cores != 3)) + { + + while(i2_mb_y > 0) + { + + u1_deb_mode = ps_cur_mb->u1_deblocking_mode; + if(!(u1_deb_mode & MB_DISABLE_FILTERING)) + { + + if(i2_mb_x) + { + ps_left_mb = ps_cur_mb - 1; + + } + else + { + ps_left_mb = NULL; + + } + if(!u1_first_row) + { + ps_top_mb = ps_cur_mb - (u2_image_wd_mb); + } + else + { + ps_top_mb = NULL; + } + + 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_nonmbaff(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); + } + + ps_cur_mb++; + i2_mb_x++; + u1_mbs_next = u2_image_wd_mb - i2_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(!u1_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; + + i2_mb_x = 0; + i2_mb_y--; + 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); + + } + +//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->s_tran_addrecon.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->s_tran_addrecon.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_deblock_mb_level(dec_struct_t *ps_dec, + dec_mb_info_t *ps_cur_mb_info, + UWORD32 nmb_index) +{ + UWORD8 u1_deb_mode; + deblk_mb_t *ps_cur_mb, *ps_left_mb, *ps_top_mb; + 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; + WORD32 i4_wd_y, i4_wd_uv; + tfr_ctxt_t * ps_tfr_cxt = &ps_dec->s_tran_addrecon; + WORD16 i2_mb_y, i2_mb_x; + UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag; + deblk_mb_t *ps_deblk_cur_mb; + + /*Copy the last row of every MB ,to be used for intra prediction f next row*/ + { + 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->s_tran_addrecon.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->s_tran_addrecon.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)); + } + + i2_mb_y = ps_cur_mb_info->u2_mby; + i4_wd_y = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag; + i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag; + + if(ps_cur_mb_info->u2_mbx != 0) + { + /*Deblock the previous MB*/ + deblk_mb_t *ps_deblk_cur_mb; + + if(ps_dec->u1_separate_parse == 1) + { + ps_deblk_cur_mb = ps_dec->ps_deblk_mbn_dec_thrd + nmb_index - 1; + + } + else + { + + if(nmb_index == 0) + /*if first mb in Nmb ,pick up the context from previous Nmb data*/ + ps_deblk_cur_mb = ps_dec->ps_deblk_mbn_prev + + ps_dec->u4_num_mbs_prev_nmb - 1; + else + ps_deblk_cur_mb = ps_dec->ps_deblk_mbn + nmb_index - 1; + } + + ps_cur_mb = ps_deblk_cur_mb; + + u1_deb_mode = ps_cur_mb->u1_deblocking_mode; + + i2_mb_x = ps_cur_mb_info->u2_mbx - 1; + + if(ps_dec->u4_app_disable_deblk_frm == 1) + u1_deb_mode = MB_DISABLE_FILTERING; + if(!(u1_deb_mode & MB_DISABLE_FILTERING)) + { + + if(i2_mb_x) + { + ps_left_mb = ps_cur_mb - 1; + + } + else + { + ps_left_mb = NULL; + + } + if(i2_mb_y) + { + ps_top_mb = ps_cur_mb - (u2_image_wd_mb); + } + else + { + ps_top_mb = NULL; + } + + 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_nonmbaff(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); + } + + ps_tfr_cxt->pu1_mb_y += MB_SIZE; + ps_tfr_cxt->pu1_mb_u += (MB_SIZE >> 1) * YUV420SP_FACTOR; + ps_tfr_cxt->pu1_mb_v += (MB_SIZE >> 1); + } + + if(ps_cur_mb_info->u2_mbx == (ps_dec->u2_frm_wd_in_mbs - 1)) + { + /*Deblock the previous MB*/ + deblk_mb_t *ps_deblk_cur_mb; + UWORD8 *pu1_temp; + + if(ps_dec->u1_separate_parse == 1) + ps_deblk_cur_mb = ps_dec->ps_deblk_mbn_dec_thrd + nmb_index; + else + ps_deblk_cur_mb = ps_dec->ps_deblk_mbn + nmb_index; + + i2_mb_x = ps_cur_mb_info->u2_mbx; + + ps_cur_mb = ps_deblk_cur_mb; + u1_deb_mode = ps_cur_mb->u1_deblocking_mode; + + if(ps_dec->u4_app_disable_deblk_frm == 1) + u1_deb_mode = MB_DISABLE_FILTERING; + + if(!(u1_deb_mode & MB_DISABLE_FILTERING)) + { + + if(i2_mb_x) + { + ps_left_mb = ps_cur_mb - 1; + + } + else + { + ps_left_mb = NULL; + + } + if(i2_mb_y) + { + ps_top_mb = ps_cur_mb - (u2_image_wd_mb); + } + else + { + ps_top_mb = NULL; + } + + 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_nonmbaff(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); + } + + 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, + UWORD16 i4_strd_y, + UWORD16 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, uc_QPav_Y; + 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); + uc_QPav_Y = uc_tmp; + idx_a_y = uc_QPav_Y + ofst_a; + alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y]; + idx_b_y = uc_QPav_Y + ofst_b; + beta_y = gau1_ih264d_beta_table[12 + idx_b_y]; + + /* Chroma cb values */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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 */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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); + uc_QPav_Y = uc_tmp; + idx_a_y = uc_QPav_Y + ofst_a; + alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y]; + idx_b_y = uc_QPav_Y + ofst_b; + beta_y = gau1_ih264d_beta_table[12 + idx_b_y]; + u4_bs_val = pu4_bs_tab[9]; + + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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]; + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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, + UWORD16 i4_strd_y, + UWORD16 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 uc_QPav_Y; + 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); + uc_QPav_Y = (UWORD8)uc_tmp; + idx_a_y = uc_QPav_Y + ofst_a; + alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y]; + idx_b_y = uc_QPav_Y + ofst_b; + beta_y = gau1_ih264d_beta_table[12 + idx_b_y]; + pu1_y = ps_tfr_cxt->pu1_mb_y; + + /* CHROMA cb values */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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 */ + { + UWORD8 u1_mb_qp1, u1_mb_qp2; + u1_mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + u1_mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst); + qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + u1_mb_qp1] + + gau1_ih264d_qp_scale_cr[12 + u1_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); + + } + +} + |