Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 
     21 #include <string.h>
     22 
     23 #include "ih264_typedefs.h"
     24 #include "iv.h"
     25 #include "ivd.h"
     26 #include "ih264_macros.h"
     27 #include "ih264_platform_macros.h"
     28 #include "ih264d_debug.h"
     29 #include "ih264d_defs.h"
     30 #include "ih264d_defs.h"
     31 #include "ih264d_structs.h"
     32 #include "ih264d_deblocking.h"
     33 #include "ih264d_mb_utils.h"
     34 #include "ih264d_error_handler.h"
     35 #include "ih264d_utils.h"
     36 
     37 
     38 #include "ih264d_defs.h"
     39 #include "ih264d_format_conv.h"
     40 #include "ih264d_deblocking.h"
     41 #include "ih264d_tables.h"
     42 
     43 /*!
     44  *************************************************************************
     45  * \file ih264d_deblocking.c
     46  *
     47  * \brief
     48  *    Decoder specific deblocking routines
     49  *
     50  * \author AI
     51  *************************************************************************
     52  */
     53 
     54 /*!
     55  **************************************************************************
     56  * \if Function name : HorizonPad \endif
     57  *
     58  * \brief
     59  *    Does the Horizontal padding on a whole pic.
     60  *
     61  * \return
     62  *    None
     63  **************************************************************************
     64  */
     65 
     66 /*!
     67  **************************************************************************
     68  * \if Function name : FilterBoundaryLeft \endif
     69  *
     70  * \brief
     71  *    Filters MacroBlock Left Boundary egdes.
     72  *
     73  * \return
     74  *    None
     75  **************************************************************************
     76  */
     77 void ih264d_filter_boundary_left_nonmbaff(dec_struct_t *ps_dec,
     78                                           tfr_ctxt_t * ps_tfr_cxt,
     79                                           WORD8 i1_cb_qp_idx_ofst,
     80                                           WORD8 i1_cr_qp_idx_ofst,
     81                                           deblk_mb_t * ps_cur_mb,
     82                                           WORD32 i4_strd_y,
     83                                           WORD32 i4_strd_uv,
     84                                           deblk_mb_t * ps_left_mb,
     85                                           UWORD32 pu4_bs_tab[],
     86                                           UWORD8 u1_cur_fld)
     87 {
     88     UWORD8 *pu1_y, *pu1_u, *pu1_v;
     89     WORD32 uc_tmp, qp_avg;
     90     WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
     91     WORD32 alpha_y = 0, beta_y = 0;
     92 
     93     WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
     94     WORD32 idx_b_y, idx_a_y;
     95 
     96     UWORD32 u4_bs_val;
     97 
     98     UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
     99 
    100     UWORD8 u1_double_cl = !ps_cur_mb->u1_single_call;
    101     WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
    102     WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
    103 
    104     PROFILE_DISABLE_DEBLK()
    105 
    106     pu1_y = ps_tfr_cxt->pu1_mb_y;
    107     pu1_u = ps_tfr_cxt->pu1_mb_u;
    108     pu1_v = ps_tfr_cxt->pu1_mb_v;
    109 
    110     /* LUMA values */
    111     /* Deblock rounding change */
    112     qp_avg =
    113                     (UWORD8)((ps_cur_mb->u1_left_mb_qp + ps_cur_mb->u1_mb_qp + 1)
    114                                     >> 1);
    115 
    116     idx_a_y = qp_avg + ofst_a;
    117     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
    118     idx_b_y = qp_avg + ofst_b;
    119     beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
    120 
    121     /* Chroma cb values */
    122     {
    123         WORD32 mb_qp1, mb_qp2;
    124         mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cb_qp_idx_ofst);
    125         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
    126         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
    127                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
    128     }
    129     idx_a_u = qp_avg + ofst_a;
    130     alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
    131     idx_b_u = qp_avg + ofst_b;
    132     beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
    133     /* Chroma cr values */
    134     {
    135         WORD32 mb_qp1, mb_qp2;
    136         mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cr_qp_idx_ofst);
    137         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
    138         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
    139                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
    140     }
    141     idx_a_v = qp_avg + ofst_a;
    142     alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
    143     idx_b_v = qp_avg + ofst_b;
    144     beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
    145 
    146     if(u1_double_cl == 0)
    147     {
    148         u4_bs_val = pu4_bs_tab[4];
    149 
    150         if(0x04040404 == u4_bs_val)
    151         {
    152             ps_dec->pf_deblk_luma_vert_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
    153             ps_dec->pf_deblk_chroma_vert_bs4(pu1_u, i4_strd_uv, alpha_u,
    154                                              beta_u, alpha_v, beta_v);
    155         }
    156         else
    157         {
    158             if(u4_bs_val)
    159             {
    160 
    161                 pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
    162                 pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
    163                 pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
    164                 ps_dec->pf_deblk_luma_vert_bslt4(pu1_y, i4_strd_y, alpha_y,
    165                                                  beta_y, u4_bs_val,
    166                                                  pu1_cliptab_y);
    167                 ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u, i4_strd_uv, alpha_u,
    168                                                    beta_u, alpha_v, beta_v,
    169                                                    u4_bs_val, pu1_cliptab_u,
    170                                                    pu1_cliptab_v);
    171 
    172             }
    173         }
    174 
    175     }
    176     else
    177     {
    178 
    179         i4_strd_y <<= (!u1_cur_fld);
    180         u4_bs_val = pu4_bs_tab[4];
    181         i4_strd_uv <<= (!u1_cur_fld);
    182 
    183         if(0x04040404 == u4_bs_val)
    184         {
    185 
    186             ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
    187                                                  beta_y);
    188             ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
    189                                                    beta_u, alpha_v, beta_v);
    190 
    191         }
    192         else
    193         {
    194             if(u4_bs_val)
    195             {
    196 
    197                 pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
    198                 pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
    199                 pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
    200 
    201                 ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
    202                                                        alpha_y, beta_y,
    203                                                        u4_bs_val,
    204                                                        pu1_cliptab_y);
    205                 ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
    206                                                          alpha_u, beta_u,
    207                                                          alpha_v, beta_v,
    208                                                          u4_bs_val,
    209                                                          pu1_cliptab_u,
    210                                                          pu1_cliptab_v);
    211             }
    212         }
    213 
    214         {
    215 
    216             UWORD16 u2_shift = (i4_strd_y >> 1) << (u1_cur_fld ? 4 : 0);
    217             pu1_y += u2_shift;
    218             u2_shift = (i4_strd_uv >> 1) << (u1_cur_fld ? 3 : 0);
    219             pu1_u += u2_shift;
    220             pu1_v += u2_shift;
    221         }
    222 
    223         qp_avg = (((ps_left_mb + 1)->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
    224 
    225         idx_a_y = qp_avg + ofst_a;
    226         alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
    227         idx_b_y = qp_avg + ofst_b;
    228         beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
    229         u4_bs_val = pu4_bs_tab[9];
    230 
    231         {
    232             WORD32 mb_qp1, mb_qp2;
    233             mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
    234             mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
    235             qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
    236                             + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
    237         }
    238         idx_a_u = qp_avg + ofst_a;
    239         alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
    240         idx_b_u = qp_avg + ofst_b;
    241         beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
    242         u4_bs_val = pu4_bs_tab[9];
    243         {
    244             WORD32 mb_qp1, mb_qp2;
    245             mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
    246             mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
    247             qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
    248                             + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
    249         }
    250         idx_a_v = qp_avg + ofst_a;
    251         alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
    252         idx_b_v = qp_avg + ofst_b;
    253         beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
    254 
    255         if(0x04040404 == u4_bs_val)
    256         {
    257             ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
    258                                                  beta_y);
    259             ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
    260                                                    beta_u, alpha_v, beta_v);
    261 
    262         }
    263         else
    264         {
    265             if(u4_bs_val)
    266             {
    267 
    268                 pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
    269                 pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
    270                 pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
    271 
    272                 ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
    273                                                        alpha_y, beta_y,
    274                                                        u4_bs_val,
    275                                                        pu1_cliptab_y);
    276                 ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
    277                                                          alpha_u, beta_u,
    278                                                          alpha_v, beta_v,
    279                                                          u4_bs_val,
    280                                                          pu1_cliptab_u,
    281                                                          pu1_cliptab_v);
    282 
    283             }
    284         }
    285     }
    286 
    287 }
    288 
    289 /*!
    290  **************************************************************************
    291  * \if Function name : FilterBoundaryTop \endif
    292  *
    293  * \brief
    294  *    Filters MacroBlock Top Boundary egdes.
    295  *
    296  * \return
    297  *    None
    298  **************************************************************************
    299  */
    300 
    301 void ih264d_filter_boundary_top_nonmbaff(dec_struct_t *ps_dec,
    302                                          tfr_ctxt_t * ps_tfr_cxt,
    303                                          WORD8 i1_cb_qp_idx_ofst,
    304                                          WORD8 i1_cr_qp_idx_ofst,
    305                                          deblk_mb_t * ps_cur_mb,
    306                                          WORD32 i4_strd_y,
    307                                          WORD32 i4_strd_uv,
    308                                          deblk_mb_t * ps_top_mb,
    309                                          UWORD32 u4_bs)
    310 {
    311     UWORD8 *pu1_y, *pu1_u;
    312     WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
    313     WORD32 alpha_y = 0, beta_y = 0;
    314     WORD32 qp_avg;
    315     WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
    316     WORD32 idx_b_y, idx_a_y;
    317     UWORD16 uc_tmp;
    318 
    319     UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
    320     WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
    321     WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
    322 
    323     UNUSED(ps_top_mb);
    324     /* LUMA values */
    325     /* Deblock rounding change */
    326     uc_tmp = ((ps_cur_mb->u1_topmb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
    327     qp_avg = (UWORD8)uc_tmp;
    328     idx_a_y = qp_avg + ofst_a;
    329     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
    330     idx_b_y = qp_avg + ofst_b;
    331     beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
    332     pu1_y = ps_tfr_cxt->pu1_mb_y;
    333 
    334     /* CHROMA cb values */
    335     {
    336         WORD32 mb_qp1, mb_qp2;
    337         mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cb_qp_idx_ofst);
    338         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
    339         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
    340                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
    341     }
    342 
    343     idx_a_u = qp_avg + ofst_a;
    344     alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
    345     idx_b_u = qp_avg + ofst_b;
    346     beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
    347     /* CHROMA cr values */
    348     {
    349         WORD32 mb_qp1, mb_qp2;
    350         mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cr_qp_idx_ofst);
    351         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
    352         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
    353                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
    354     }
    355 
    356     idx_a_v = qp_avg + ofst_a;
    357     alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
    358     idx_b_v = qp_avg + ofst_b;
    359     beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
    360     pu1_u = ps_tfr_cxt->pu1_mb_u;
    361 
    362     if(u4_bs == 0x04040404)
    363     {
    364         /* Code specific to the assembly module */
    365 
    366         ps_dec->pf_deblk_luma_horz_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
    367         ps_dec->pf_deblk_chroma_horz_bs4(pu1_u, i4_strd_uv, alpha_u, beta_u,
    368                                          alpha_v, beta_v);
    369     }
    370     else
    371     {
    372         if(u4_bs)
    373         {
    374 
    375             pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
    376             pu1_cliptab_u =
    377                             (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
    378             pu1_cliptab_v =
    379                             (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
    380 
    381             ps_dec->pf_deblk_luma_horz_bslt4(pu1_y, i4_strd_y, alpha_y, beta_y,
    382                                              u4_bs, pu1_cliptab_y);
    383             ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u, i4_strd_uv, alpha_u,
    384                                                beta_u, alpha_v, beta_v,
    385                                                u4_bs, pu1_cliptab_u,
    386                                                pu1_cliptab_v);
    387 
    388         }
    389     }
    390 
    391 }
    392 
    393 void ih264d_deblock_mb_nonmbaff(dec_struct_t *ps_dec,
    394                                 tfr_ctxt_t * ps_tfr_cxt,
    395                                 WORD8 i1_cb_qp_idx_ofst,
    396                                 WORD8 i1_cr_qp_idx_ofst,
    397                                 WORD32 i4_strd_y,
    398                                 WORD32 i4_strd_uv )
    399 {
    400     UWORD8 *pu1_y, *pu1_u;
    401     UWORD32 u4_bs;
    402 
    403     WORD32 alpha, beta, alpha_u, beta_u, alpha_v, beta_v;
    404 
    405     UWORD8 *pu1_cliptab_u;
    406     UWORD8 *pu1_cliptab_v;
    407     UWORD8 *pu1_cliptab_y;
    408 
    409     UWORD32 * pu4_bs_tab;
    410     WORD32 idx_a_y, idx_a_u, idx_a_v;
    411     UWORD32 u4_deb_mode, u4_mbs_next;
    412     UWORD32 u4_image_wd_mb;
    413     deblk_mb_t *ps_top_mb,*ps_left_mb,*ps_cur_mb;
    414 
    415     PROFILE_DISABLE_DEBLK()
    416     /* Return from here to switch off deblocking */
    417 
    418     u4_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
    419 
    420     ps_cur_mb = ps_dec->ps_cur_deblk_mb;
    421     pu4_bs_tab = ps_cur_mb->u4_bs_table;
    422     u4_deb_mode = ps_cur_mb->u1_deblocking_mode;
    423      if(!(u4_deb_mode & MB_DISABLE_FILTERING))
    424      {
    425 
    426          if(ps_dec->u4_deblk_mb_x)
    427          {
    428              ps_left_mb = ps_cur_mb - 1;
    429 
    430          }
    431          else
    432          {
    433              ps_left_mb = NULL;
    434 
    435          }
    436          if(ps_dec->u4_deblk_mb_y != 0)
    437          {
    438              ps_top_mb = ps_cur_mb - (u4_image_wd_mb);
    439          }
    440          else
    441          {
    442              ps_top_mb = NULL;
    443          }
    444 
    445          if(u4_deb_mode & MB_DISABLE_LEFT_EDGE)
    446              ps_left_mb = NULL;
    447          if(u4_deb_mode & MB_DISABLE_TOP_EDGE)
    448              ps_top_mb = NULL;
    449 
    450         /*---------------------------------------------------------------------*/
    451         /* Filter wrt Left edge                                                */
    452         /* except                                                              */
    453         /*      - Left Egde is Picture Boundary                                */
    454         /*      - Left Egde is part of Slice Boundary and Deblocking           */
    455         /*        parameters of slice disable Filtering of Slice Boundary Edges*/
    456         /*---------------------------------------------------------------------*/
    457         if(ps_left_mb)
    458             ih264d_filter_boundary_left_nonmbaff(ps_dec, ps_tfr_cxt,
    459                                                  i1_cb_qp_idx_ofst,
    460                                                  i1_cr_qp_idx_ofst, ps_cur_mb,
    461                                                  i4_strd_y, i4_strd_uv, ps_left_mb,
    462                                                  pu4_bs_tab, 0);
    463 
    464         /*--------------------------------------------------------------------*/
    465         /* Filter wrt Other Vertical Edges                                    */
    466         /*--------------------------------------------------------------------*/
    467         {
    468             WORD32 ofst_a, ofst_b, idx_b_y, idx_b_u,
    469                             idx_b_v;
    470             WORD32 qp_avg, qp_avg_u, qp_avg_v;
    471             ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
    472             ofst_b = ps_cur_mb->i1_slice_beta_offset;
    473 
    474             qp_avg = ps_cur_mb->u1_mb_qp;
    475 
    476             idx_a_y = qp_avg + ofst_a;
    477             alpha = gau1_ih264d_alpha_table[12 + idx_a_y];
    478             idx_b_y = qp_avg + ofst_b;
    479             beta = gau1_ih264d_beta_table[12 + idx_b_y];
    480 
    481             /* CHROMA values */
    482             /* CHROMA Cb values */
    483             qp_avg_u = (qp_avg + i1_cb_qp_idx_ofst);
    484             qp_avg_u = gau1_ih264d_qp_scale_cr[12 + qp_avg_u];
    485             idx_a_u = qp_avg_u + ofst_a;
    486             alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
    487             idx_b_u = qp_avg_u + ofst_b;
    488             beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
    489             /* CHROMA Cr values */
    490             qp_avg_v = (qp_avg + i1_cr_qp_idx_ofst);
    491             qp_avg_v = gau1_ih264d_qp_scale_cr[12 + qp_avg_v];
    492             idx_a_v = qp_avg_v + ofst_a;
    493             alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
    494             idx_b_v = qp_avg_v + ofst_b;
    495             beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
    496         }
    497 
    498         pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y]; //this for Luma
    499         pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u]; //this for chroma
    500         pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v]; //this for chroma
    501 
    502         //edge=1
    503 
    504 
    505         u4_bs = pu4_bs_tab[5];
    506         pu1_y = ps_tfr_cxt->pu1_mb_y;
    507         pu1_u = ps_tfr_cxt->pu1_mb_u;
    508 
    509         if(u4_bs)
    510         {
    511 
    512             ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
    513                                              u4_bs, pu1_cliptab_y);
    514 
    515         }
    516         //edge=2
    517 
    518         u4_bs = pu4_bs_tab[6];
    519         if(u4_bs)
    520         {
    521             ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 8, i4_strd_y, alpha, beta,
    522                                              u4_bs, pu1_cliptab_y);
    523             ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u + 4 * YUV420SP_FACTOR,
    524                                                i4_strd_uv, alpha_u, beta_u,
    525                                                alpha_v, beta_v, u4_bs,
    526                                                pu1_cliptab_u, pu1_cliptab_v);
    527 
    528         }
    529         //edge=3
    530 
    531         u4_bs = pu4_bs_tab[7];
    532         if(u4_bs)
    533         {
    534             ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 12, i4_strd_y, alpha, beta,
    535                                              u4_bs, pu1_cliptab_y);
    536 
    537         }
    538 
    539         /*--------------------------------------------------------------------*/
    540         /* Filter wrt Top edge                                                */
    541         /* except                                                             */
    542         /*      - Top Egde is Picture Boundary                                */
    543         /*      - Top Egde is part of Slice Boundary and Deblocking           */
    544         /*        parameters of slice disable Filtering of Slice Boundary Edges*/
    545         /*--------------------------------------------------------------------*/
    546         if(ps_top_mb)
    547         {
    548             /** if top MB and MB AFF and cur MB is frame and top is field then  */
    549             /*  one extra top edge needs to be deblocked                        */
    550 
    551             ih264d_filter_boundary_top_nonmbaff(ps_dec, ps_tfr_cxt,
    552                                                 i1_cb_qp_idx_ofst,
    553                                                 i1_cr_qp_idx_ofst, ps_cur_mb,
    554                                                 i4_strd_y, i4_strd_uv, ps_top_mb,
    555                                                 pu4_bs_tab[0]);
    556 
    557         }
    558 
    559         /*--------------------------------------------------------------------*/
    560         /* Filter wrt Other Horizontal Edges                                  */
    561         /*--------------------------------------------------------------------*/
    562 
    563         //edge1
    564         u4_bs = pu4_bs_tab[1];
    565 
    566         if(u4_bs)
    567         {
    568             ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 2), i4_strd_y,
    569                                              alpha, beta, u4_bs, pu1_cliptab_y);
    570 
    571         }
    572         //edge2
    573         u4_bs = pu4_bs_tab[2];
    574 
    575         if(u4_bs)
    576         {
    577 
    578             ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 3), i4_strd_y,
    579                                              alpha, beta, u4_bs, pu1_cliptab_y);
    580             ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u + (i4_strd_uv << 2),
    581                                                i4_strd_uv, alpha_u, beta_u,
    582                                                alpha_v, beta_v, u4_bs,
    583                                                pu1_cliptab_u, pu1_cliptab_v);
    584 
    585         }
    586         //edge3
    587         u4_bs = pu4_bs_tab[3];
    588         if(u4_bs)
    589         {
    590             ps_dec->pf_deblk_luma_horz_bslt4(
    591                             (pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
    592                             i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
    593 
    594         }
    595      }
    596 
    597      ps_dec->u4_deblk_mb_x++;
    598      ps_dec->ps_cur_deblk_mb++;
    599      ps_dec->u4_cur_deblk_mb_num++;
    600      u4_mbs_next = u4_image_wd_mb - ps_dec->u4_deblk_mb_x;
    601 
    602      ps_tfr_cxt->pu1_mb_y += 16;
    603      ps_tfr_cxt->pu1_mb_u += 8 * YUV420SP_FACTOR;
    604      ps_tfr_cxt->pu1_mb_v += 8;
    605 
    606      if(!u4_mbs_next)
    607      {
    608          ps_tfr_cxt->pu1_mb_y += ps_tfr_cxt->u4_y_inc;
    609          ps_tfr_cxt->pu1_mb_u += ps_tfr_cxt->u4_uv_inc;
    610          ps_tfr_cxt->pu1_mb_v += ps_tfr_cxt->u4_uv_inc;
    611          ps_dec->u4_deblk_mb_y++;
    612          ps_dec->u4_deblk_mb_x = 0;
    613      }
    614 
    615 }
    616 
    617 /**************************************************************************
    618  *
    619  *  Function Name : ih264d_init_deblk_tfr_ctxt
    620  *
    621  *  Description   : This function is called once per deblockpicture call
    622  *                  This sets up the transfer address contexts
    623  *
    624  *  Revision History:
    625  *
    626  *         DD MM YYYY   Author(s)       Changes (Describe the changes made)
    627  *         14 06 2005   SWRN            Draft
    628  **************************************************************************/
    629 void ih264d_init_deblk_tfr_ctxt(dec_struct_t * ps_dec,
    630                                 pad_mgr_t *ps_pad_mgr,
    631                                 tfr_ctxt_t *ps_tfr_cxt,
    632                                 UWORD16 u2_image_wd_mb,
    633                                 UWORD8 u1_mbaff)
    634 {
    635 
    636     UWORD32 i4_wd_y;
    637     UWORD32 i4_wd_uv;
    638     UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag  */
    639     UNUSED(u2_image_wd_mb);
    640     ps_tfr_cxt->pu1_src_y = ps_dec->s_cur_pic.pu1_buf1 - 4;
    641     ps_tfr_cxt->pu1_src_u = ps_dec->s_cur_pic.pu1_buf2 - 4;
    642     ps_tfr_cxt->pu1_src_v = ps_dec->s_cur_pic.pu1_buf3 - 4;
    643     ps_tfr_cxt->pu1_dest_y = ps_tfr_cxt->pu1_src_y;
    644     ps_tfr_cxt->pu1_dest_u = ps_tfr_cxt->pu1_src_u;
    645     ps_tfr_cxt->pu1_dest_v = ps_tfr_cxt->pu1_src_v;
    646 
    647     ps_tfr_cxt->pu1_mb_y = ps_tfr_cxt->pu1_src_y + 4;
    648     ps_tfr_cxt->pu1_mb_u = ps_tfr_cxt->pu1_src_u + 4;
    649     ps_tfr_cxt->pu1_mb_v = ps_tfr_cxt->pu1_src_v + 4;
    650 
    651     i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
    652     i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
    653     ps_tfr_cxt->u4_y_inc = ((i4_wd_y << u1_mbaff) * 16
    654                     - (ps_dec->u2_frm_wd_in_mbs << 4));
    655 
    656     ps_tfr_cxt->u4_uv_inc = (i4_wd_uv << u1_mbaff) * 8
    657                     - (ps_dec->u2_frm_wd_in_mbs << 4);
    658 
    659     /* padding related initialisations */
    660     if(ps_dec->ps_cur_slice->u1_nal_ref_idc)
    661     {
    662         ps_pad_mgr->u1_vert_pad_top = !(ps_dec->ps_cur_slice->u1_field_pic_flag
    663                         && ps_dec->ps_cur_slice->u1_bottom_field_flag);
    664         ps_pad_mgr->u1_vert_pad_bot =
    665                         ((!ps_dec->ps_cur_slice->u1_field_pic_flag)
    666                                         || ps_dec->ps_cur_slice->u1_bottom_field_flag);
    667         ps_pad_mgr->u1_horz_pad = 1;
    668     }
    669     else
    670     {
    671         ps_pad_mgr->u1_horz_pad = 0;
    672         ps_pad_mgr->u1_vert_pad_top = 0;
    673         ps_pad_mgr->u1_vert_pad_bot = 0;
    674     }
    675 }
    676 
    677 /*****************************************************************************/
    678 /*                                                                           */
    679 /*  Function Name : ih264d_deblock_picture_mbaff                                     */
    680 /*                                                                           */
    681 /*  Description   : This function carries out deblocking on a whole picture  */
    682 /*                  with MBAFF                                               */
    683 /*                                                                           */
    684 /*  Inputs        : <What inputs does the function take?>                    */
    685 /*  Processing    : This functions calls deblock MB in the MB increment order*/
    686 /*                                                                           */
    687 /*  Outputs       : Produces the deblocked picture                           */
    688 /*  Returns       : None                                                     */
    689 /*                                                                           */
    690 /*  Revision History:                                                        */
    691 /*                                                                           */
    692 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    693 /*         17 02 2005   NS              Creation                             */
    694 /*         14 06 2005   SWRN            clean-up                             */
    695 /*****************************************************************************/
    696 
    697 void ih264d_deblock_picture_mbaff(dec_struct_t * ps_dec)
    698 {
    699     WORD16 i2_mb_x, i2_mb_y;
    700     deblk_mb_t *ps_cur_mb;
    701     deblk_mb_t *ps_top_mb;
    702     deblk_mb_t *ps_left_mb;
    703 
    704     UWORD8 u1_vert_pad_top = 1;
    705     UWORD8 u1_cur_fld, u1_top_fld, u1_left_fld;
    706     UWORD8 u1_first_row;
    707 
    708     UWORD8 * pu1_deb_y, *pu1_deb_u, *pu1_deb_v;
    709     UWORD8 u1_deb_mode, u1_extra_top_edge;
    710     WORD32 i4_wd_y, i4_wd_uv;
    711 
    712     UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag                       */
    713     UWORD8 u1_bottom_field_flag = ps_dec->ps_cur_slice->u1_bottom_field_flag; /*< Bottom field u4_flag*/
    714 
    715     /**************************************************/
    716     /* one time loads from ps_dec which will be used  */
    717     /* frequently throughout the deblocking procedure */
    718     /**************************************************/
    719     pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
    720     tfr_ctxt_t s_tfr_ctxt;
    721     tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt;
    722 
    723     UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
    724     UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
    725     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    726     WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
    727     WORD8 i1_cr_qp_idx_ofst =
    728                     ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
    729 
    730     /* Set up Parameter for  DMA transfer */
    731     ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
    732                                u1_mbaff);
    733 
    734     /* Pic level Initialisations */
    735     i2_mb_y = u2_image_ht_mb;
    736     i2_mb_x = 0;
    737     u1_extra_top_edge = 0;
    738 
    739     u1_first_row = 1;
    740 
    741     i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
    742     i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
    743     /* Initial filling of the buffers with deblocking data */
    744 
    745     pu1_deb_y = ps_tfr_cxt->pu1_mb_y;
    746     pu1_deb_u = ps_tfr_cxt->pu1_mb_u;
    747     pu1_deb_v = ps_tfr_cxt->pu1_mb_v;
    748     ps_cur_mb = ps_dec->ps_deblk_pic;
    749 
    750     if(ps_dec->u4_app_disable_deblk_frm == 0)
    751     {
    752         {
    753 
    754             while(i2_mb_y > 0)
    755             {
    756                 do
    757                 {
    758 
    759                     u1_deb_mode = ps_cur_mb->u1_deblocking_mode;
    760                     if(!(u1_deb_mode & MB_DISABLE_FILTERING))
    761                     {
    762                         ps_tfr_cxt->pu1_mb_y = pu1_deb_y;
    763                         ps_tfr_cxt->pu1_mb_u = pu1_deb_u;
    764                         ps_tfr_cxt->pu1_mb_v = pu1_deb_v;
    765 
    766                         u1_cur_fld = (ps_cur_mb->u1_mb_type & D_FLD_MB) >> 7;
    767                         u1_cur_fld &= 1;
    768                         if(i2_mb_x)
    769                         {
    770                             ps_left_mb = ps_cur_mb - 2;
    771                         }
    772                         else
    773                         {
    774                             ps_left_mb = NULL;
    775                         }
    776                         if(!u1_first_row)
    777                         {
    778                             ps_top_mb = ps_cur_mb - (u2_image_wd_mb << 1) + 1;
    779                             u1_top_fld = (ps_top_mb->u1_mb_type & D_FLD_MB)
    780                                             >> 7;
    781                         }
    782                         else
    783                         {
    784                             ps_top_mb = NULL;
    785                             u1_top_fld = 0;
    786                         }
    787 
    788                         if((!u1_first_row) & u1_top_fld & u1_cur_fld)
    789                             ps_top_mb--;
    790 
    791                         /********************************************************/
    792                         /* if top MB and MB AFF and cur MB is frame and top is  */
    793                         /* field, then one extra top edge needs to be deblocked */
    794                         /********************************************************/
    795                         u1_extra_top_edge = (!u1_cur_fld) & u1_top_fld;
    796 
    797                         if(u1_deb_mode & MB_DISABLE_LEFT_EDGE)
    798                             ps_left_mb = NULL;
    799                         if(u1_deb_mode & MB_DISABLE_TOP_EDGE)
    800                             ps_top_mb = NULL;
    801 
    802                         ih264d_deblock_mb_mbaff(ps_dec, ps_tfr_cxt,
    803                                                 i1_cb_qp_idx_ofst,
    804                                                 i1_cr_qp_idx_ofst, ps_cur_mb,
    805                                                 i4_wd_y, i4_wd_uv, ps_top_mb,
    806                                                 ps_left_mb, u1_cur_fld,
    807                                                 u1_extra_top_edge);
    808                     }
    809 
    810                     ps_cur_mb++;
    811 
    812                     u1_deb_mode = ps_cur_mb->u1_deblocking_mode;
    813                     if(!(u1_deb_mode & MB_DISABLE_FILTERING))
    814                     {
    815                         ps_tfr_cxt->pu1_mb_y = pu1_deb_y;
    816                         ps_tfr_cxt->pu1_mb_u = pu1_deb_u;
    817                         ps_tfr_cxt->pu1_mb_v = pu1_deb_v;
    818 
    819                         u1_cur_fld = (ps_cur_mb->u1_mb_type & D_FLD_MB) >> 7;
    820                         u1_cur_fld &= 1;
    821                         if(i2_mb_x)
    822                         {
    823                             ps_left_mb = ps_cur_mb - 2;
    824                             u1_left_fld = (ps_left_mb->u1_mb_type & D_FLD_MB)
    825                                             >> 7;
    826                         }
    827                         else
    828                         {
    829                             ps_left_mb = NULL;
    830                             u1_left_fld = u1_cur_fld;
    831                         }
    832                         if(!u1_first_row)
    833                         {
    834                             ps_top_mb = ps_cur_mb - (u2_image_wd_mb << 1);
    835                         }
    836                         else
    837                         {
    838                             ps_top_mb = NULL;
    839                         }
    840 
    841                         {
    842                             UWORD8 u1_row_shift_y = 0, u1_row_shift_uv = 0;
    843                             if(!u1_cur_fld)
    844                             {
    845                                 ps_top_mb = ps_cur_mb - 1;
    846                                 u1_top_fld = (ps_top_mb->u1_mb_type & D_FLD_MB)
    847                                                 >> 7;
    848                                 u1_row_shift_y = 4;
    849                                 u1_row_shift_uv = 3;
    850                             }
    851                             ps_tfr_cxt->pu1_mb_y += i4_wd_y << u1_row_shift_y;
    852                             ps_tfr_cxt->pu1_mb_u +=
    853                                             (i4_wd_uv << u1_row_shift_uv);
    854                             ps_tfr_cxt->pu1_mb_v += i4_wd_uv << u1_row_shift_uv;
    855                         }
    856 
    857                         /* point to A if top else A+1 */
    858                         if(u1_left_fld ^ u1_cur_fld)
    859                             ps_left_mb--;
    860 
    861                         /********************************************************/
    862                         /* if top MB and MB AFF and cur MB is frame and top is  */
    863                         /* field, then one extra top edge needs to be deblocked */
    864                         /********************************************************/
    865                         u1_extra_top_edge = 0;
    866 
    867                         if(u1_deb_mode & MB_DISABLE_LEFT_EDGE)
    868                             ps_left_mb = NULL;
    869                         if(u1_deb_mode & MB_DISABLE_TOP_EDGE)
    870                             ps_top_mb = NULL;
    871 
    872                         ih264d_deblock_mb_mbaff(ps_dec, ps_tfr_cxt,
    873                                                 i1_cb_qp_idx_ofst,
    874                                                 i1_cr_qp_idx_ofst, ps_cur_mb,
    875                                                 i4_wd_y, i4_wd_uv, ps_top_mb,
    876                                                 ps_left_mb, u1_cur_fld,
    877                                                 u1_extra_top_edge);
    878                     }
    879 
    880                     ps_cur_mb++;
    881                     i2_mb_x++;
    882 
    883                     pu1_deb_y += 16;
    884                     pu1_deb_u += 8 * YUV420SP_FACTOR;
    885                     pu1_deb_v += 8;
    886 
    887                 }
    888                 while(u2_image_wd_mb > i2_mb_x);
    889 
    890                 pu1_deb_y += ps_tfr_cxt->u4_y_inc;
    891                 pu1_deb_u += ps_tfr_cxt->u4_uv_inc;
    892                 pu1_deb_v += ps_tfr_cxt->u4_uv_inc;
    893 
    894                 i2_mb_x = 0;
    895                 i2_mb_y -= 2;
    896 
    897                 u1_first_row = 0;
    898 
    899             }
    900         }
    901 
    902     }
    903     //Padd the Picture
    904     //Horizontal Padd
    905 
    906     if(ps_pad_mgr->u1_horz_pad)
    907     {
    908         UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
    909         ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
    910                                  ps_dec->u2_frm_wd_y << u1_field_pic_flag,
    911                                  ps_dec->u2_pic_ht >> u1_field_pic_flag,
    912                                  PAD_LEN_Y_H);
    913         ps_dec->pf_pad_right_luma(
    914                         ps_tfr_cxt->pu1_src_y + 4
    915                                         + (ps_dec->u2_frm_wd_in_mbs << 4),
    916                         ps_dec->u2_frm_wd_y << u1_field_pic_flag,
    917                         ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
    918 
    919         ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
    920                                    ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
    921                                    (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
    922                                    PAD_LEN_UV_H * YUV420SP_FACTOR);
    923         ps_dec->pf_pad_right_chroma(
    924                         ps_tfr_cxt->pu1_src_u + 4
    925                                         + (ps_dec->u2_frm_wd_in_mbs << 4),
    926                         ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
    927                         (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
    928                         PAD_LEN_UV_H * YUV420SP_FACTOR);
    929 
    930     }
    931 
    932 //Vertical Padd Top
    933     if(ps_pad_mgr->u1_vert_pad_top)
    934     {
    935         ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
    936                            ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
    937                            ps_pad_mgr->u1_pad_len_y_v);
    938         ps_dec->pf_pad_top(
    939                         ps_dec->ps_cur_pic->pu1_buf2
    940                                         - PAD_LEN_UV_H * YUV420SP_FACTOR,
    941                         ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
    942                         ps_pad_mgr->u1_pad_len_cr_v);
    943         ps_pad_mgr->u1_vert_pad_top = 0;
    944     }
    945 
    946 //Vertical Padd Bottom
    947     if(ps_pad_mgr->u1_vert_pad_bot)
    948     {
    949 
    950         UWORD8 *pu1_buf;
    951         pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
    952         pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
    953         ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
    954                               ps_pad_mgr->u1_pad_len_y_v);
    955         pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
    956         pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
    957 
    958         ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
    959                               ps_dec->u2_frm_wd_uv,
    960                               ps_pad_mgr->u1_pad_len_cr_v);
    961 
    962     }
    963 }
    964 
    965 /*****************************************************************************/
    966 /*                                                                           */
    967 /*  Function Name : ih264d_deblock_picture_non_mbaff                                  */
    968 /*                                                                           */
    969 /*  Description   : This function carries out deblocking on a whole picture  */
    970 /*                  without MBAFF                                            */
    971 /*                                                                           */
    972 /*  Inputs        : <What inputs does the function take?>                    */
    973 /*  Processing    : This functions calls deblock MB in the MB increment order*/
    974 /*                                                                           */
    975 /*  Outputs       : Produces the deblocked picture                           */
    976 /*  Returns       : None                                                     */
    977 /*                                                                           */
    978 /*  Revision History:                                                        */
    979 /*                                                                           */
    980 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    981 /*         17 02 2005   NS              Creation                             */
    982 /*         14 06 2005   SWRN            clean-up                             */
    983 /*****************************************************************************/
    984 
    985 void ih264d_deblock_picture_non_mbaff(dec_struct_t * ps_dec)
    986 {
    987     deblk_mb_t *ps_cur_mb;
    988 
    989     UWORD8 u1_vert_pad_top = 1;
    990 
    991     UWORD8 u1_deb_mode;
    992     WORD32 i4_wd_y, i4_wd_uv;
    993 
    994     UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag                       */
    995     UWORD8 u1_bottom_field_flag = ps_dec->ps_cur_slice->u1_bottom_field_flag; /*< Bottom field u4_flag */
    996 
    997     /**************************************************/
    998     /* one time loads from ps_dec which will be used  */
    999     /* frequently throughout the deblocking procedure */
   1000     /**************************************************/
   1001     pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
   1002     tfr_ctxt_t s_tfr_ctxt;
   1003     tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
   1004 
   1005     UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
   1006     UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
   1007     WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
   1008     WORD8 i1_cr_qp_idx_ofst =
   1009                     ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
   1010 
   1011     /* Set up Parameter for  DMA transfer */
   1012     ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
   1013                                0);
   1014 
   1015     /* Pic level Initialisations */
   1016 
   1017 
   1018 
   1019     i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
   1020     i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
   1021     /* Initial filling of the buffers with deblocking data */
   1022 
   1023     ps_cur_mb = ps_dec->ps_deblk_pic;
   1024 
   1025     if(ps_dec->u4_app_disable_deblk_frm == 0)
   1026     {
   1027         if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
   1028         {
   1029             while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
   1030             {
   1031                 ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
   1032                                            i1_cb_qp_idx_ofst,
   1033                                            i1_cr_qp_idx_ofst,
   1034                                            i4_wd_y, i4_wd_uv);
   1035                 ps_cur_mb++;
   1036             }
   1037         }
   1038 
   1039     }
   1040 
   1041     //Padd the Picture
   1042     //Horizontal Padd
   1043     if(ps_pad_mgr->u1_horz_pad)
   1044     {
   1045         UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
   1046         ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
   1047                                  ps_dec->u2_frm_wd_y << u1_field_pic_flag,
   1048                                  ps_dec->u2_pic_ht >> u1_field_pic_flag,
   1049                                  PAD_LEN_Y_H);
   1050         ps_dec->pf_pad_right_luma(
   1051                         ps_tfr_cxt->pu1_src_y + 4
   1052                                         + (ps_dec->u2_frm_wd_in_mbs << 4),
   1053                         ps_dec->u2_frm_wd_y << u1_field_pic_flag,
   1054                         ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
   1055 
   1056         ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
   1057                                    ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
   1058                                    (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
   1059                                    PAD_LEN_UV_H * YUV420SP_FACTOR);
   1060         ps_dec->pf_pad_right_chroma(
   1061                         ps_tfr_cxt->pu1_src_u + 4
   1062                                         + (ps_dec->u2_frm_wd_in_mbs << 4),
   1063                         ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
   1064                         (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
   1065                         PAD_LEN_UV_H * YUV420SP_FACTOR);
   1066 
   1067     }
   1068 
   1069 //Vertical Padd Top
   1070     if(ps_pad_mgr->u1_vert_pad_top)
   1071     {
   1072         ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
   1073                            ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
   1074                            ps_pad_mgr->u1_pad_len_y_v);
   1075         ps_dec->pf_pad_top(
   1076                         ps_dec->ps_cur_pic->pu1_buf2
   1077                                         - PAD_LEN_UV_H * YUV420SP_FACTOR,
   1078                         ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
   1079                         ps_pad_mgr->u1_pad_len_cr_v);
   1080         ps_pad_mgr->u1_vert_pad_top = 0;
   1081     }
   1082 
   1083 //Vertical Padd Bottom
   1084     if(ps_pad_mgr->u1_vert_pad_bot)
   1085     {
   1086 
   1087         UWORD8 *pu1_buf;
   1088         pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
   1089         pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
   1090         ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
   1091                               ps_pad_mgr->u1_pad_len_y_v);
   1092         pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
   1093         pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
   1094 
   1095         ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
   1096                               ps_dec->u2_frm_wd_uv,
   1097                               ps_pad_mgr->u1_pad_len_cr_v);
   1098 
   1099     }
   1100 }
   1101 
   1102 void ih264d_deblock_picture_progressive(dec_struct_t * ps_dec)
   1103 {
   1104     deblk_mb_t *ps_cur_mb;
   1105 
   1106     UWORD8 u1_vert_pad_top = 1;
   1107     UWORD8 u1_mbs_next;
   1108     UWORD8 u1_deb_mode;
   1109     WORD32 i4_wd_y, i4_wd_uv;
   1110 
   1111 
   1112     /**************************************************/
   1113     /* one time loads from ps_dec which will be used  */
   1114     /* frequently throughout the deblocking procedure */
   1115     /**************************************************/
   1116     pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
   1117 
   1118     tfr_ctxt_t s_tfr_ctxt;
   1119     tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
   1120     UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
   1121     UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
   1122     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
   1123 
   1124     WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
   1125     WORD8 i1_cr_qp_idx_ofst =
   1126                     ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
   1127 
   1128     /* Set up Parameter for  deblocking */
   1129     ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
   1130                                0);
   1131 
   1132     /* Pic level Initialisations */
   1133 
   1134     i4_wd_y = ps_dec->u2_frm_wd_y;
   1135     i4_wd_uv = ps_dec->u2_frm_wd_uv;
   1136     /* Initial filling of the buffers with deblocking data */
   1137     ps_cur_mb = ps_dec->ps_deblk_pic;
   1138 
   1139     if(ps_dec->u4_app_disable_deblk_frm == 0)
   1140     {
   1141         if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
   1142         {
   1143             while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
   1144             {
   1145                 ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
   1146                                            i1_cb_qp_idx_ofst,
   1147                                            i1_cr_qp_idx_ofst,
   1148                                            i4_wd_y, i4_wd_uv);
   1149                 ps_cur_mb++;
   1150             }
   1151         }
   1152 
   1153     }
   1154 
   1155     //Padd the Picture
   1156     //Horizontal Padd
   1157     if(ps_pad_mgr->u1_horz_pad)
   1158     {
   1159         UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
   1160         ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
   1161                                  ps_dec->u2_frm_wd_y << u1_field_pic_flag,
   1162                                  ps_dec->u2_pic_ht >> u1_field_pic_flag,
   1163                                  PAD_LEN_Y_H);
   1164         ps_dec->pf_pad_right_luma(
   1165                         ps_tfr_cxt->pu1_src_y + 4
   1166                                         + (ps_dec->u2_frm_wd_in_mbs << 4),
   1167                         ps_dec->u2_frm_wd_y << u1_field_pic_flag,
   1168                         ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
   1169 
   1170         ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
   1171                                    ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
   1172                                    (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
   1173                                    PAD_LEN_UV_H * YUV420SP_FACTOR);
   1174         ps_dec->pf_pad_right_chroma(
   1175                         ps_tfr_cxt->pu1_src_u + 4
   1176                                         + (ps_dec->u2_frm_wd_in_mbs << 4),
   1177                         ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
   1178                         (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
   1179                         PAD_LEN_UV_H * YUV420SP_FACTOR);
   1180 
   1181     }
   1182 
   1183 //Vertical Padd Top
   1184     if(ps_pad_mgr->u1_vert_pad_top)
   1185     {
   1186         ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
   1187                            ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
   1188                            ps_pad_mgr->u1_pad_len_y_v);
   1189         ps_dec->pf_pad_top(
   1190                         ps_dec->ps_cur_pic->pu1_buf2
   1191                                         - PAD_LEN_UV_H * YUV420SP_FACTOR,
   1192                         ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
   1193                         ps_pad_mgr->u1_pad_len_cr_v);
   1194 
   1195     }
   1196 
   1197 //Vertical Padd Bottom
   1198     if(ps_pad_mgr->u1_vert_pad_bot)
   1199     {
   1200 
   1201         UWORD8 *pu1_buf;
   1202         pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
   1203         pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
   1204         ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
   1205                               ps_pad_mgr->u1_pad_len_y_v);
   1206         pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
   1207         pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
   1208 
   1209         ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
   1210                               ps_dec->u2_frm_wd_uv,
   1211                               ps_pad_mgr->u1_pad_len_cr_v);
   1212 
   1213     }
   1214 }
   1215 
   1216 /*!
   1217  **************************************************************************
   1218  * \if Function name : ih264d_set_deblocking_parameters \endif
   1219  *
   1220  * \brief
   1221  *    Sets the deblocking parameters of the macroblock
   1222  *
   1223  * \return
   1224  *    0 on Success and Error code otherwise
   1225  *
   1226  * \note
   1227  *   Given the neighbour availablity information, and the deblocking
   1228  *   parameters of the slice,this function will set the deblocking
   1229  *   mode of the macroblock.
   1230  **************************************************************************
   1231  */
   1232 
   1233 WORD8 ih264d_set_deblocking_parameters(deblk_mb_t * ps_cur_mb,
   1234                                        dec_slice_params_t * ps_slice,
   1235                                        UWORD8 u1_mb_ngbr_availablity,
   1236                                        UWORD8 u1_mb_field_decoding_flag)
   1237 {
   1238     /*------------------------------------------------------------------*/
   1239     /* Set the deblocking parameters                                  */
   1240     /*------------------------------------------------------------------*/
   1241     ps_cur_mb->i1_slice_alpha_c0_offset = ps_slice->i1_slice_alpha_c0_offset;
   1242     ps_cur_mb->i1_slice_beta_offset = ps_slice->i1_slice_beta_offset;
   1243     ps_cur_mb->u1_mb_type = (u1_mb_field_decoding_flag << 7);
   1244 
   1245     switch(ps_slice->u1_disable_dblk_filter_idc)
   1246     {
   1247         case DBLK_ENABLED:
   1248             ps_cur_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
   1249             break;
   1250         case DBLK_DISABLED:
   1251             ps_cur_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
   1252             break;
   1253         case SLICE_BOUNDARY_DBLK_DISABLED:
   1254         {
   1255             ps_cur_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
   1256             if(!(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK))
   1257                 ps_cur_mb->u1_deblocking_mode |= MB_DISABLE_LEFT_EDGE;
   1258             if(!(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK))
   1259                 ps_cur_mb->u1_deblocking_mode |= MB_DISABLE_TOP_EDGE;
   1260             break;
   1261         }
   1262     }
   1263 
   1264     return (0);
   1265 }
   1266 
   1267 void ih264d_copy_intra_pred_line(dec_struct_t *ps_dec,
   1268                                  dec_mb_info_t *ps_cur_mb_info,
   1269                                  UWORD32 nmb_index)
   1270 {
   1271     UWORD8 *pu1_mb_last_row, u1_mb_field_decoding_flag;
   1272     UWORD32 u4_recWidth, u4_recwidth_cr;
   1273 
   1274     u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
   1275 
   1276     u4_recWidth = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
   1277     u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
   1278 
   1279     pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_y
   1280                     + (u4_recWidth * (MB_SIZE - 1));
   1281     pu1_mb_last_row += MB_SIZE * nmb_index;
   1282     MEMCPY_16BYTES(ps_dec->pu1_cur_y_intra_pred_line, pu1_mb_last_row);
   1283 
   1284     pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_u
   1285                     + (u4_recwidth_cr * (BLK8x8SIZE - 1));
   1286     pu1_mb_last_row += BLK8x8SIZE * nmb_index * YUV420SP_FACTOR;
   1287 
   1288     MEMCPY_16BYTES(ps_dec->pu1_cur_u_intra_pred_line, pu1_mb_last_row);
   1289 
   1290     ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_cur_y_intra_pred_line_base
   1291                     + (MB_SIZE * (ps_cur_mb_info->u2_mbx + 1));
   1292     ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_cur_u_intra_pred_line_base
   1293                     + (BLK8x8SIZE * (ps_cur_mb_info->u2_mbx + 1))
   1294                                     * YUV420SP_FACTOR;
   1295     ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_cur_v_intra_pred_line_base
   1296                     + (BLK8x8SIZE * (ps_cur_mb_info->u2_mbx + 1));
   1297 
   1298     if(ps_cur_mb_info->u2_mbx == (ps_dec->u2_frm_wd_in_mbs - 1))
   1299     {
   1300         UWORD8* pu1_temp;
   1301 
   1302         ps_dec->pu1_cur_y_intra_pred_line =
   1303                         ps_dec->pu1_cur_y_intra_pred_line_base;
   1304         ps_dec->pu1_cur_u_intra_pred_line =
   1305                         ps_dec->pu1_cur_u_intra_pred_line_base;
   1306         ps_dec->pu1_cur_v_intra_pred_line =
   1307                         ps_dec->pu1_cur_v_intra_pred_line_base;
   1308 
   1309         /*swap current and previous rows*/
   1310         pu1_temp = ps_dec->pu1_cur_y_intra_pred_line;
   1311         ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_prev_y_intra_pred_line;
   1312         ps_dec->pu1_prev_y_intra_pred_line = pu1_temp;
   1313 
   1314         pu1_temp = ps_dec->pu1_cur_u_intra_pred_line;
   1315         ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_prev_u_intra_pred_line;
   1316         ps_dec->pu1_prev_u_intra_pred_line = pu1_temp;
   1317 
   1318         pu1_temp = ps_dec->pu1_cur_v_intra_pred_line;
   1319         ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_prev_v_intra_pred_line;
   1320         ps_dec->pu1_prev_v_intra_pred_line = pu1_temp;
   1321 
   1322         ps_dec->pu1_cur_y_intra_pred_line_base =
   1323                         ps_dec->pu1_cur_y_intra_pred_line;
   1324         ps_dec->pu1_cur_u_intra_pred_line_base =
   1325                         ps_dec->pu1_cur_u_intra_pred_line;
   1326         ps_dec->pu1_cur_v_intra_pred_line_base =
   1327                         ps_dec->pu1_cur_v_intra_pred_line;
   1328 
   1329 
   1330 
   1331 
   1332 
   1333     }
   1334 
   1335 }
   1336 
   1337 
   1338 void ih264d_filter_boundary_left_mbaff(dec_struct_t *ps_dec,
   1339                                        tfr_ctxt_t * ps_tfr_cxt,
   1340                                        WORD8 i1_cb_qp_idx_ofst,
   1341                                        WORD8 i1_cr_qp_idx_ofst,
   1342                                        deblk_mb_t * ps_cur_mb,
   1343                                        WORD32 i4_strd_y,
   1344                                        WORD32 i4_strd_uv,
   1345                                        deblk_mb_t * ps_left_mb, /* Neighbouring MB parameters   */
   1346                                        UWORD32 pu4_bs_tab[], /* pointer to the BsTable array */
   1347                                        UWORD8 u1_cur_fld)
   1348 {
   1349     UWORD8 *pu1_y, *pu1_u, *pu1_v;
   1350     UWORD8 uc_tmp, qp_avg;
   1351     WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
   1352     WORD32 alpha_y = 0, beta_y = 0;
   1353 
   1354     WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
   1355     WORD32 idx_b_y, idx_a_y;
   1356 
   1357     UWORD32 u4_bs_val;
   1358 
   1359     UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
   1360 
   1361     UWORD8 u1_double_cl = !ps_cur_mb->u1_single_call;
   1362     WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
   1363     WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
   1364 
   1365     PROFILE_DISABLE_DEBLK()
   1366 
   1367     pu1_y = ps_tfr_cxt->pu1_mb_y;
   1368     pu1_u = ps_tfr_cxt->pu1_mb_u;
   1369     pu1_v = ps_tfr_cxt->pu1_mb_v;
   1370 
   1371     /* LUMA values */
   1372     /* Deblock rounding change */
   1373     uc_tmp = (UWORD8)((ps_left_mb->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
   1374     qp_avg = uc_tmp;
   1375     idx_a_y = qp_avg + ofst_a;
   1376     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
   1377     idx_b_y = qp_avg + ofst_b;
   1378     beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
   1379 
   1380     /* Chroma cb values */
   1381     {
   1382         WORD32 mb_qp1, mb_qp2;
   1383         mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
   1384         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
   1385         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
   1386                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
   1387     }
   1388     idx_a_u = qp_avg + ofst_a;
   1389     alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
   1390     idx_b_u = qp_avg + ofst_b;
   1391     beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
   1392 
   1393     /* Chroma cr values */
   1394     {
   1395         WORD32 mb_qp1, mb_qp2;
   1396         mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
   1397         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
   1398         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
   1399                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
   1400     }
   1401     idx_a_v = qp_avg + ofst_a;
   1402     alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
   1403     idx_b_v = qp_avg + ofst_b;
   1404     beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
   1405 
   1406     if(u1_double_cl == 0)
   1407     {
   1408         u4_bs_val = pu4_bs_tab[4];
   1409 
   1410         if(0x04040404 == u4_bs_val)
   1411         {
   1412             ps_dec->pf_deblk_luma_vert_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
   1413             ps_dec->pf_deblk_chroma_vert_bs4(pu1_u, i4_strd_uv, alpha_u,
   1414                                              beta_u, alpha_v, beta_v);
   1415 
   1416         }
   1417         else
   1418         {
   1419             if(u4_bs_val)
   1420             {
   1421 
   1422                 pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12
   1423                                 + idx_a_y];
   1424                 pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12
   1425                                 + idx_a_u];
   1426                 pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12
   1427                                 + idx_a_v];
   1428 
   1429                 ps_dec->pf_deblk_luma_vert_bslt4(pu1_y, i4_strd_y, alpha_y,
   1430                                                  beta_y, u4_bs_val,
   1431                                                  pu1_cliptab_y);
   1432                 ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u, i4_strd_uv, alpha_u,
   1433                                                    beta_u, alpha_v, beta_v,
   1434                                                    u4_bs_val, pu1_cliptab_u,
   1435                                                    pu1_cliptab_v);
   1436 
   1437             }
   1438         }
   1439 
   1440     }
   1441     else
   1442     {
   1443 
   1444         i4_strd_y <<= (!u1_cur_fld);
   1445         u4_bs_val = pu4_bs_tab[4];
   1446         i4_strd_uv <<= (!u1_cur_fld);
   1447 
   1448         if(0x04040404 == u4_bs_val)
   1449         {
   1450             ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
   1451                                                  beta_y);
   1452             ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
   1453                                                    beta_u, alpha_v, beta_v);
   1454         }
   1455         else
   1456         {
   1457             if(u4_bs_val)
   1458             {
   1459 
   1460                 pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
   1461                 pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
   1462                 pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
   1463                 ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
   1464                                                        alpha_y, beta_y,
   1465                                                        u4_bs_val,
   1466                                                        pu1_cliptab_y);
   1467                 ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
   1468                                                          alpha_u, beta_u,
   1469                                                          alpha_v, beta_v,
   1470                                                          u4_bs_val,
   1471                                                          pu1_cliptab_u,
   1472                                                          pu1_cliptab_v);
   1473 
   1474             }
   1475         }
   1476 
   1477         {
   1478 
   1479             UWORD16 u2_shift = (i4_strd_y >> 1) << (u1_cur_fld ? 4 : 0);
   1480             pu1_y += u2_shift;
   1481             u2_shift = (i4_strd_uv >> 1) << (u1_cur_fld ? 3 : 0);
   1482             pu1_u += u2_shift;
   1483             pu1_v += u2_shift;
   1484         }
   1485 
   1486         uc_tmp = (((ps_left_mb + 1)->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
   1487         qp_avg = uc_tmp;
   1488         idx_a_y = qp_avg + ofst_a;
   1489         alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
   1490         idx_b_y = qp_avg + ofst_b;
   1491         beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
   1492         u4_bs_val = pu4_bs_tab[9];
   1493 
   1494         {
   1495             WORD32 mb_qp1, mb_qp2;
   1496             mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
   1497             mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
   1498             qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
   1499                             + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
   1500         }
   1501         idx_a_u = qp_avg + ofst_a;
   1502         alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
   1503         idx_b_u = qp_avg + ofst_b;
   1504         beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
   1505         u4_bs_val = pu4_bs_tab[9];
   1506         {
   1507             WORD32 mb_qp1, mb_qp2;
   1508             mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
   1509             mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
   1510             qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
   1511                             + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
   1512         }
   1513         idx_a_v = qp_avg + ofst_a;
   1514         alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
   1515         idx_b_v = qp_avg + ofst_b;
   1516         beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
   1517 
   1518         if(0x04040404 == u4_bs_val)
   1519         {
   1520             ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
   1521                                                  beta_y);
   1522             ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
   1523                                                    beta_u, alpha_v, beta_v);
   1524 
   1525         }
   1526         else
   1527         {
   1528             if(u4_bs_val)
   1529             {
   1530 
   1531                 pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
   1532                 pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
   1533                 pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
   1534 
   1535                 ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
   1536                                                        alpha_y, beta_y,
   1537                                                        u4_bs_val,
   1538                                                        pu1_cliptab_y);
   1539                 ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
   1540                                                          alpha_u, beta_u,
   1541                                                          alpha_v, beta_v,
   1542                                                          u4_bs_val,
   1543                                                          pu1_cliptab_u,
   1544                                                          pu1_cliptab_v);
   1545 
   1546             }
   1547         }
   1548     }
   1549 
   1550 }
   1551 
   1552 void ih264d_filter_boundary_topmbaff(dec_struct_t *ps_dec,
   1553                                      tfr_ctxt_t * ps_tfr_cxt,
   1554                                      WORD8 i1_cb_qp_idx_ofst,
   1555                                      WORD8 i1_cr_qp_idx_ofst,
   1556                                      deblk_mb_t * ps_cur_mb,
   1557                                      WORD32 i4_strd_y,
   1558                                      WORD32 i4_strd_uv,
   1559                                      deblk_mb_t * ps_top_mb,
   1560                                      UWORD32 u4_bs)
   1561 {
   1562     UWORD8 *pu1_y, *pu1_u;
   1563     WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
   1564     WORD32 alpha_y = 0, beta_y = 0;
   1565     WORD32 qp_avg;
   1566     WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
   1567     WORD32 idx_b_y, idx_a_y;
   1568     UWORD16 uc_tmp;
   1569 
   1570     UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
   1571     WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
   1572     WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
   1573 
   1574     /* LUMA values */
   1575     /* Deblock rounding change */
   1576     uc_tmp = ((ps_top_mb->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
   1577     qp_avg = (UWORD8)uc_tmp;
   1578     idx_a_y = qp_avg + ofst_a;
   1579     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
   1580     idx_b_y = qp_avg + ofst_b;
   1581     beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
   1582     pu1_y = ps_tfr_cxt->pu1_mb_y;
   1583 
   1584     /* CHROMA cb values */
   1585     {
   1586         WORD32 mb_qp1, mb_qp2;
   1587         mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
   1588         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
   1589         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
   1590                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
   1591     }
   1592 
   1593     idx_a_u = qp_avg + ofst_a;
   1594     alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
   1595     idx_b_u = qp_avg + ofst_b;
   1596     beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
   1597     /* CHROMA cr values */
   1598     {
   1599         WORD32 mb_qp1, mb_qp2;
   1600         mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
   1601         mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
   1602         qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
   1603                         + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
   1604     }
   1605 
   1606     idx_a_v = qp_avg + ofst_a;
   1607     alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
   1608     idx_b_v = qp_avg + ofst_b;
   1609     beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
   1610     pu1_u = ps_tfr_cxt->pu1_mb_u;
   1611 
   1612     if(u4_bs == 0x04040404)
   1613     {
   1614         /* Code specific to the assembly module */
   1615         ps_dec->pf_deblk_luma_horz_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
   1616         ps_dec->pf_deblk_chroma_horz_bs4(pu1_u, i4_strd_uv, alpha_u, beta_u,
   1617                                          alpha_v, beta_v);
   1618 
   1619     }
   1620     else
   1621     {
   1622         if(u4_bs)
   1623         {
   1624 
   1625             pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
   1626             pu1_cliptab_u =
   1627                             (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
   1628             pu1_cliptab_v =
   1629                             (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
   1630 
   1631             ps_dec->pf_deblk_luma_horz_bslt4(pu1_y, i4_strd_y, alpha_y, beta_y,
   1632                                              u4_bs, pu1_cliptab_y);
   1633             ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u, i4_strd_uv, alpha_u,
   1634                                                beta_u, alpha_v, beta_v,
   1635                                                u4_bs, pu1_cliptab_u,
   1636                                                pu1_cliptab_v);
   1637 
   1638         }
   1639     }
   1640 
   1641 }
   1642 
   1643 void ih264d_deblock_mb_mbaff(dec_struct_t *ps_dec,
   1644                              tfr_ctxt_t * ps_tfr_cxt,
   1645                              WORD8 i1_cb_qp_idx_ofst,
   1646                              WORD8 i1_cr_qp_idx_ofst,
   1647                              deblk_mb_t * ps_cur_mb,
   1648                              WORD32 i4_strd_y,
   1649                              WORD32 i4_strd_uv,
   1650                              deblk_mb_t * ps_top_mb,
   1651                              deblk_mb_t * ps_left_mb,
   1652                              UWORD8 u1_cur_fld,
   1653                              UWORD8 u1_extra_top_edge)
   1654 {
   1655     UWORD8 *pu1_y, *pu1_u;
   1656     UWORD32 u4_bs;
   1657 //  WORD8  edge;
   1658     WORD32 alpha, beta, alpha_u, beta_u, alpha_v, beta_v;
   1659 
   1660     UWORD8 *pu1_cliptab_u;
   1661     UWORD8 *pu1_cliptab_v;
   1662     UWORD8 *pu1_cliptab_y;
   1663 
   1664     UWORD32 * pu4_bs_tab = ps_cur_mb->u4_bs_table;
   1665     WORD32 idx_a_y, idx_a_u, idx_a_v;
   1666     /* Return from here to switch off deblocking */
   1667     PROFILE_DISABLE_DEBLK()
   1668 
   1669     i4_strd_y <<= u1_cur_fld;
   1670     i4_strd_uv <<= u1_cur_fld;
   1671     /*--------------------------------------------------------------------*/
   1672     /* Filter wrt Left edge                                               */
   1673     /* except                                                             */
   1674     /*      - Left Egde is Picture Boundary                               */
   1675     /*      - Left Egde is part of Slice Boundary and Deblocking          */
   1676     /*        parameters of slice disable Filtering of Slice Boundary Edges*/
   1677     /*--------------------------------------------------------------------*/
   1678     if(ps_left_mb)
   1679         ih264d_filter_boundary_left_mbaff(ps_dec, ps_tfr_cxt, i1_cb_qp_idx_ofst,
   1680                                           i1_cr_qp_idx_ofst, ps_cur_mb,
   1681                                           i4_strd_y, i4_strd_uv, ps_left_mb,
   1682                                           pu4_bs_tab, u1_cur_fld);
   1683 
   1684     /*--------------------------------------------------------------------*/
   1685     /* Filter wrt Other Vertical Edges                                    */
   1686     /*--------------------------------------------------------------------*/
   1687     {
   1688         WORD32 ofst_a, ofst_b, idx_b_y, idx_b_u,
   1689                         idx_b_v;
   1690         WORD32 qp_avg, qp_avg_u, qp_avg_v;
   1691         ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
   1692         ofst_b = ps_cur_mb->i1_slice_beta_offset;
   1693         qp_avg = ps_cur_mb->u1_mb_qp;
   1694         idx_a_y = qp_avg + ofst_a;
   1695         alpha = gau1_ih264d_alpha_table[12 + idx_a_y];
   1696         idx_b_y = qp_avg + ofst_b;
   1697         beta = gau1_ih264d_beta_table[12 + idx_b_y];
   1698 
   1699         /* CHROMA Cb values */
   1700         qp_avg_u = (qp_avg + i1_cb_qp_idx_ofst);
   1701         qp_avg_u = gau1_ih264d_qp_scale_cr[12 + qp_avg_u];
   1702         idx_a_u = qp_avg_u + ofst_a;
   1703         alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
   1704         idx_b_u = qp_avg_u + ofst_b;
   1705         beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
   1706         /* CHROMA Cr values */
   1707         qp_avg_v = (qp_avg + i1_cr_qp_idx_ofst);
   1708         qp_avg_v = gau1_ih264d_qp_scale_cr[12 + qp_avg_v];
   1709         idx_a_v = qp_avg_v + ofst_a;
   1710         alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
   1711         idx_b_v = qp_avg_v + ofst_b;
   1712         beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
   1713     }
   1714 
   1715     //STARTL4_FILTER_VERT;
   1716 
   1717     pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y]; //this for Luma
   1718     pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u]; //this for chroma
   1719     pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v]; //this for chroma
   1720 
   1721     //edge=1
   1722 
   1723 
   1724     u4_bs = pu4_bs_tab[5];
   1725     pu1_y = ps_tfr_cxt->pu1_mb_y;
   1726     pu1_u = ps_tfr_cxt->pu1_mb_u;
   1727 
   1728     if(u4_bs)
   1729     {
   1730 
   1731         ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
   1732                                          u4_bs, pu1_cliptab_y);
   1733 
   1734     }
   1735     //edge=2
   1736 
   1737     u4_bs = pu4_bs_tab[6];
   1738     if(u4_bs)
   1739     {
   1740 
   1741         ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 8, i4_strd_y, alpha, beta,
   1742                                          u4_bs, pu1_cliptab_y);
   1743         ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u + 4 * YUV420SP_FACTOR,
   1744                                            i4_strd_uv, alpha_u, beta_u,
   1745                                            alpha_v, beta_v, u4_bs,
   1746                                            pu1_cliptab_u, pu1_cliptab_v);
   1747     }
   1748     //edge=3
   1749 
   1750     u4_bs = pu4_bs_tab[7];
   1751     if(u4_bs)
   1752     {
   1753 
   1754         ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 12, i4_strd_y, alpha, beta,
   1755                                          u4_bs, pu1_cliptab_y);
   1756 
   1757     }
   1758 
   1759     /*--------------------------------------------------------------------*/
   1760     /* Filter wrt Top edge                                                */
   1761     /* except                                                             */
   1762     /*      - Top Egde is Picture Boundary                                */
   1763     /*      - Top Egde is part of Slice Boundary and Deblocking           */
   1764     /*        parameters of slice disable Filtering of Slice Boundary Edges*/
   1765     /*--------------------------------------------------------------------*/
   1766     if(ps_top_mb)
   1767     {
   1768         /** if top MB and MB AFF and cur MB is frame and top is field then  */
   1769         /*  one extra top edge needs to be deblocked                        */
   1770         if(u1_extra_top_edge)
   1771         {
   1772             ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
   1773                                             i1_cb_qp_idx_ofst,
   1774                                             i1_cr_qp_idx_ofst, ps_cur_mb,
   1775                                             (UWORD16)(i4_strd_y << 1),
   1776                                             (UWORD16)(i4_strd_uv << 1),
   1777                                             ps_top_mb - 1, pu4_bs_tab[8]);
   1778             ps_tfr_cxt->pu1_mb_y += i4_strd_y;
   1779             ps_tfr_cxt->pu1_mb_u += i4_strd_uv;
   1780             ps_tfr_cxt->pu1_mb_v += i4_strd_uv;
   1781 
   1782             ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
   1783                                             i1_cb_qp_idx_ofst,
   1784                                             i1_cr_qp_idx_ofst, ps_cur_mb,
   1785                                             (UWORD16)(i4_strd_y << 1),
   1786                                             (UWORD16)(i4_strd_uv << 1),
   1787                                             ps_top_mb, pu4_bs_tab[0]);
   1788             ps_tfr_cxt->pu1_mb_y -= i4_strd_y;
   1789             ps_tfr_cxt->pu1_mb_u -= i4_strd_uv;
   1790             ps_tfr_cxt->pu1_mb_v -= i4_strd_uv;
   1791         }
   1792         else
   1793         {
   1794             ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
   1795                                             i1_cb_qp_idx_ofst,
   1796                                             i1_cr_qp_idx_ofst, ps_cur_mb,
   1797                                             i4_strd_y, i4_strd_uv, ps_top_mb,
   1798                                             pu4_bs_tab[0]);
   1799         }
   1800     }
   1801 
   1802     /*--------------------------------------------------------------------*/
   1803     /* Filter wrt Other Horizontal Edges                                  */
   1804     /*--------------------------------------------------------------------*/
   1805 
   1806     //edge1
   1807     u4_bs = pu4_bs_tab[1];
   1808 
   1809     if(u4_bs)
   1810     {
   1811         ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 2), i4_strd_y,
   1812                                          alpha, beta, u4_bs, pu1_cliptab_y);
   1813 
   1814     }
   1815     //edge2
   1816     u4_bs = pu4_bs_tab[2];
   1817 
   1818     if(u4_bs)
   1819     {
   1820 
   1821         ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 3), i4_strd_y,
   1822                                          alpha, beta, u4_bs, pu1_cliptab_y);
   1823         ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u + (i4_strd_uv << 2),
   1824                                            i4_strd_uv, alpha_u, beta_u,
   1825                                            alpha_v, beta_v, u4_bs,
   1826                                            pu1_cliptab_u, pu1_cliptab_v);
   1827 
   1828     }
   1829     //edge3
   1830     u4_bs = pu4_bs_tab[3];
   1831     if(u4_bs)
   1832     {
   1833 
   1834         ps_dec->pf_deblk_luma_horz_bslt4(
   1835                         (pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
   1836                         i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
   1837 
   1838     }
   1839 
   1840 }
   1841 
   1842