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