diff --git a/decoder/ih264d_deblocking.c b/decoder/ih264d_deblocking.c
index ad4ce08..c5f3657 100644
--- a/decoder/ih264d_deblocking.c
+++ b/decoder/ih264d_deblocking.c
@@ -39,7 +39,6 @@
 #include "ih264d_format_conv.h"
 #include "ih264d_deblocking.h"
 #include "ih264d_tables.h"
-//extern UWORD8 *g_dest_y, *g_dest_uv;
 
 /*!
  *************************************************************************
@@ -80,8 +79,8 @@
                                           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,
+                                          WORD32 i4_strd_y,
+                                          WORD32 i4_strd_uv,
                                           deblk_mb_t * ps_left_mb,
                                           UWORD32 pu4_bs_tab[],
                                           UWORD8 u1_cur_fld)
@@ -121,11 +120,11 @@
 
     /* 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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cb_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
     idx_a_u = qp_avg + ofst_a;
     alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
@@ -133,11 +132,11 @@
     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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cr_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
     idx_a_v = qp_avg + ofst_a;
     alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
@@ -159,12 +158,9 @@
             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];
+                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);
@@ -198,12 +194,9 @@
             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];
+                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,
@@ -236,11 +229,11 @@
         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);
+            WORD32 mb_qp1, mb_qp2;
+            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
+            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
         }
         idx_a_u = qp_avg + ofst_a;
         alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
@@ -248,11 +241,11 @@
         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);
+            WORD32 mb_qp1, mb_qp2;
+            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
+            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
         }
         idx_a_v = qp_avg + ofst_a;
         alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
@@ -272,12 +265,9 @@
             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];
+                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,
@@ -313,8 +303,8 @@
                                          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,
+                                         WORD32 i4_strd_y,
+                                         WORD32 i4_strd_uv,
                                          deblk_mb_t * ps_top_mb,
                                          UWORD32 u4_bs)
 {
@@ -322,7 +312,6 @@
     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;
@@ -335,20 +324,20 @@
     /* 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;
+    qp_avg = (UWORD8)uc_tmp;
+    idx_a_y = qp_avg + ofst_a;
     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
-    idx_b_y = uc_QPav_Y + ofst_b;
+    idx_b_y = qp_avg + ofst_b;
     beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
     pu1_y = ps_tfr_cxt->pu1_mb_y;
 
     /* CHROMA cb values */
     {
-        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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cb_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
 
     idx_a_u = qp_avg + ofst_a;
@@ -357,11 +346,11 @@
     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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cr_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
 
     idx_a_v = qp_avg + ofst_a;
@@ -405,11 +394,8 @@
                                 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)
+                                WORD32 i4_strd_uv )
 {
     UWORD8 *pu1_y, *pu1_u;
     UWORD32 u4_bs;
@@ -420,157 +406,211 @@
     UWORD8 *pu1_cliptab_v;
     UWORD8 *pu1_cliptab_y;
 
-    UWORD32 * pu4_bs_tab = ps_cur_mb->u4_bs_table;
+    UWORD32 * pu4_bs_tab;
     WORD32 idx_a_y, idx_a_u, idx_a_v;
+    UWORD32 u4_deb_mode, u4_mbs_next;
+    UWORD32 u4_image_wd_mb;
+    deblk_mb_t *ps_top_mb,*ps_left_mb,*ps_cur_mb;
 
     PROFILE_DISABLE_DEBLK()
     /* Return from here to switch off deblocking */
 
-    /*---------------------------------------------------------------------*/
-    /* 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);
+    u4_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
 
-    /*--------------------------------------------------------------------*/
-    /* 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;
+    ps_cur_mb = ps_dec->ps_cur_deblk_mb;
+    pu4_bs_tab = ps_cur_mb->u4_bs_table;
+    u4_deb_mode = ps_cur_mb->u1_deblocking_mode;
+     if(!(u4_deb_mode & MB_DISABLE_FILTERING))
+     {
 
-        qp_avg = ps_cur_mb->u1_mb_qp;
+         if(ps_dec->u4_deblk_mb_x)
+         {
+             ps_left_mb = ps_cur_mb - 1;
 
-        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];
+         }
+         else
+         {
+             ps_left_mb = NULL;
 
-        /* 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];
-    }
+         }
+         if(ps_dec->u4_deblk_mb_y != 0)
+         {
+             ps_top_mb = ps_cur_mb - (u4_image_wd_mb);
+         }
+         else
+         {
+             ps_top_mb = NULL;
+         }
 
-    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
+         if(u4_deb_mode & MB_DISABLE_LEFT_EDGE)
+             ps_left_mb = NULL;
+         if(u4_deb_mode & MB_DISABLE_TOP_EDGE)
+             ps_top_mb = NULL;
 
-    //edge=1
+        /*---------------------------------------------------------------------*/
+        /* 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;
+        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)
-    {
+        if(u4_bs)
+        {
 
-        ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
-                                         u4_bs, pu1_cliptab_y);
+            ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
+                                             u4_bs, pu1_cliptab_y);
 
-    }
-    //edge=2
+        }
+        //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);
+        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
+        }
+        //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);
+        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                        */
+        /*--------------------------------------------------------------------*/
+        /* 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]);
+            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                                  */
-    /*--------------------------------------------------------------------*/
+        /*--------------------------------------------------------------------*/
+        /* Filter wrt Other Horizontal Edges                                  */
+        /*--------------------------------------------------------------------*/
 
-    //edge1
-    u4_bs = pu4_bs_tab[1];
+        //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);
+        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];
+        }
+        //edge2
+        u4_bs = pu4_bs_tab[2];
 
-    if(u4_bs)
-    {
+        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);
+            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);
+        }
+        //edge3
+        u4_bs = pu4_bs_tab[3];
+        if(u4_bs)
+        {
+            ps_dec->pf_deblk_luma_horz_bslt4(
+                            (pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
+                            i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
 
-    }
+        }
+     }
+
+     ps_dec->u4_deblk_mb_x++;
+     ps_dec->ps_cur_deblk_mb++;
+     ps_dec->u4_cur_deblk_mb_num++;
+     u4_mbs_next = u4_image_wd_mb - ps_dec->u4_deblk_mb_x;
+
+     ps_tfr_cxt->pu1_mb_y += 16;
+     ps_tfr_cxt->pu1_mb_u += 8 * YUV420SP_FACTOR;
+     ps_tfr_cxt->pu1_mb_v += 8;
+
+     if(!u4_mbs_next)
+     {
+         ps_tfr_cxt->pu1_mb_y += ps_tfr_cxt->u4_y_inc;
+         ps_tfr_cxt->pu1_mb_u += ps_tfr_cxt->u4_uv_inc;
+         ps_tfr_cxt->pu1_mb_v += ps_tfr_cxt->u4_uv_inc;
+         ps_dec->u4_deblk_mb_y++;
+         ps_dec->u4_deblk_mb_x = 0;
+     }
 
 }
 
@@ -604,6 +644,10 @@
     ps_tfr_cxt->pu1_dest_u = ps_tfr_cxt->pu1_src_u;
     ps_tfr_cxt->pu1_dest_v = ps_tfr_cxt->pu1_src_v;
 
+    ps_tfr_cxt->pu1_mb_y = ps_tfr_cxt->pu1_src_y + 4;
+    ps_tfr_cxt->pu1_mb_u = ps_tfr_cxt->pu1_src_u + 4;
+    ps_tfr_cxt->pu1_mb_v = ps_tfr_cxt->pu1_src_v + 4;
+
     i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
     i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
     ps_tfr_cxt->u4_y_inc = ((i4_wd_y << u1_mbaff) * 16
@@ -698,14 +742,13 @@
     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;
+    pu1_deb_y = ps_tfr_cxt->pu1_mb_y;
+    pu1_deb_u = ps_tfr_cxt->pu1_mb_u;
+    pu1_deb_v = ps_tfr_cxt->pu1_mb_v;
     ps_cur_mb = ps_dec->ps_deblk_pic;
 
     if(ps_dec->u4_app_disable_deblk_frm == 0)
     {
-        if(ps_dec->u4_mb_level_deblk == 0 || ps_dec->u4_num_cores >= 3)
         {
 
             while(i2_mb_y > 0)
@@ -941,13 +984,9 @@
 
 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;
@@ -974,80 +1013,26 @@
                                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))
+        if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
         {
-
-            while(i2_mb_y > 0)
+            while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
             {
-                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;
-
+                ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
+                                           i1_cb_qp_idx_ofst,
+                                           i1_cr_qp_idx_ofst,
+                                           i4_wd_y, i4_wd_uv);
+                ps_cur_mb++;
             }
         }
 
@@ -1116,14 +1101,10 @@
 
 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_mbs_next;
     UWORD8 u1_deb_mode;
     WORD32 i4_wd_y, i4_wd_uv;
 
@@ -1149,83 +1130,23 @@
                                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))
+        if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
         {
-
-            while(i2_mb_y > 0)
+            while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
             {
-
-                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);
-                }
-
+                ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
+                                           i1_cb_qp_idx_ofst,
+                                           i1_cr_qp_idx_ofst,
+                                           i4_wd_y, i4_wd_uv);
                 ps_cur_mb++;
-                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;
-                }
-
             }
         }
 
@@ -1355,12 +1276,12 @@
     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
+    pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_y
                     + (u4_recWidth * (MB_SIZE - 1));
     pu1_mb_last_row += MB_SIZE * nmb_index;
     MEMCPY_16BYTES(ps_dec->pu1_cur_y_intra_pred_line, pu1_mb_last_row);
 
-    pu1_mb_last_row = ps_dec->s_tran_addrecon.pu1_dest_u
+    pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_u
                     + (u4_recwidth_cr * (BLK8x8SIZE - 1));
     pu1_mb_last_row += BLK8x8SIZE * nmb_index * YUV420SP_FACTOR;
 
@@ -1413,227 +1334,20 @@
 
 }
 
-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,
+                                       WORD32 i4_strd_y,
+                                       WORD32 i4_strd_uv,
                                        deblk_mb_t * ps_left_mb, /* Neighbouring MB parameters   */
                                        UWORD32 pu4_bs_tab[], /* pointer to the BsTable array */
                                        UWORD8 u1_cur_fld)
 {
     UWORD8 *pu1_y, *pu1_u, *pu1_v;
-    UWORD8 uc_tmp, qp_avg, uc_QPav_Y;
+    UWORD8 uc_tmp, qp_avg;
     WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
     WORD32 alpha_y = 0, beta_y = 0;
 
@@ -1657,19 +1371,19 @@
     /* 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;
+    qp_avg = uc_tmp;
+    idx_a_y = qp_avg + ofst_a;
     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
-    idx_b_y = uc_QPav_Y + ofst_b;
+    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_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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
     idx_a_u = qp_avg + ofst_a;
     alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
@@ -1678,11 +1392,11 @@
 
     /* 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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
     idx_a_v = qp_avg + ofst_a;
     alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
@@ -1743,12 +1457,9 @@
             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];
+                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,
@@ -1773,19 +1484,19 @@
         }
 
         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;
+        qp_avg = uc_tmp;
+        idx_a_y = qp_avg + ofst_a;
         alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
-        idx_b_y = uc_QPav_Y + ofst_b;
+        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);
+            WORD32 mb_qp1, mb_qp2;
+            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
+            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
         }
         idx_a_u = qp_avg + ofst_a;
         alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
@@ -1793,11 +1504,11 @@
         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);
+            WORD32 mb_qp1, mb_qp2;
+            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
+            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
         }
         idx_a_v = qp_avg + ofst_a;
         alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
@@ -1817,12 +1528,9 @@
             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];
+                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,
@@ -1846,8 +1554,8 @@
                                      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,
+                                     WORD32 i4_strd_y,
+                                     WORD32 i4_strd_uv,
                                      deblk_mb_t * ps_top_mb,
                                      UWORD32 u4_bs)
 {
@@ -1855,7 +1563,6 @@
     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;
@@ -1867,20 +1574,20 @@
     /* 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;
+    qp_avg = (UWORD8)uc_tmp;
+    idx_a_y = qp_avg + ofst_a;
     alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
-    idx_b_y = uc_QPav_Y + ofst_b;
+    idx_b_y = qp_avg + ofst_b;
     beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
     pu1_y = ps_tfr_cxt->pu1_mb_y;
 
     /* CHROMA cb values */
     {
-        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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
 
     idx_a_u = qp_avg + ofst_a;
@@ -1889,11 +1596,11 @@
     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);
+        WORD32 mb_qp1, mb_qp2;
+        mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
+        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
+                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
     }
 
     idx_a_v = qp_avg + ofst_a;
