RESTRICT AUTOMERGE Fix heap buffer overflow
am: 5aee254181  -s ours

Change-Id: If12a5f1e937892322763485fc3a6bdfadb0707f9
diff --git a/common/arm/ihevc_intra_pred_filters_neon_intr.c b/common/arm/ihevc_intra_pred_filters_neon_intr.c
index 0e89de3..2564ffa 100644
--- a/common/arm/ihevc_intra_pred_filters_neon_intr.c
+++ b/common/arm/ihevc_intra_pred_filters_neon_intr.c
@@ -466,7 +466,7 @@
     WORD32 four_nt = 4 * nt;
 
     WORD32 src_4nt;
-
+    WORD32 src_0nt;
     /* Naming has been made as per the functionlity it has, For eg. pu1_src_tmp_1 is denoting pu1_src + 1   */
     /* src_val_1 to load value from pointer pu1_src_tmp_1, add_res has the result of adding 2 values        */
     UWORD8 *pu1_src_tmp_0 = pu1_src;
@@ -522,6 +522,7 @@
         }
 
         src_4nt = pu1_src[4 * nt];
+        src_0nt = pu1_src[0];
         /* Strong filtering of reference samples */
         if(1 == bi_linear_int_flag)
         {
@@ -616,7 +617,7 @@
             pu1_dst_tmp_0 += 8;
         }
         pu1_dst[4 * nt] = src_4nt;
-
+        pu1_dst[0] = src_0nt;
     }
 
 }
diff --git a/common/arm/ihevc_intra_ref_substitution_a9q.c b/common/arm/ihevc_intra_ref_substitution_a9q.c
index 3270786..d090d84 100644
--- a/common/arm/ihevc_intra_ref_substitution_a9q.c
+++ b/common/arm/ihevc_intra_ref_substitution_a9q.c
@@ -571,14 +571,27 @@
                 ihevc_memset_mul_8_a9q(&pu1_dst[two_nt - 1 - (nt - 1)], 0, nt);
             }
 
-            if(nbr_flags & 0xC)
+            /* Bottom - left availability is checked for every 8x8 TU position and set accordingly */
             {
-                for(i = nt; i < two_nt; i++)
+                if(nbr_flags & 0x8)
+                {
+                    for(i = nt; i < (nt + 8); i++)
                     pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
-            }
-            else
-            {
-                ihevc_memset_mul_8_a9q(&pu1_dst[two_nt - 1 - (two_nt - 1)], 0, nt);
+                }
+                else
+                {
+                    ihevc_memset_mul_8_a9q(&pu1_dst[nt - 8], 0, 8);
+                }
+
+                if(nbr_flags & 0x4)
+                {
+                    for(i = (nt + 8); i < two_nt; i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8_a9q(&pu1_dst[0], 0, 8);
+                }
             }
 
 
@@ -682,16 +695,48 @@
                 ihevc_memset_mul_8_a9q(&pu1_dst[two_nt - 1 - (nt - 1)], 0, nt);
             }
 
-            if(nbr_flags & 0xF)
+            /* Bottom - left availability is checked for every 8x8 TU position and set accordingly */
             {
-                for(i = nt; i < two_nt; i++)
+                if(nbr_flags & 0x8)
+                {
+                    for(i = nt; i < (nt + 8); i++)
                     pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
-            }
-            else
-            {
-                ihevc_memset_mul_8_a9q(&pu1_dst[two_nt - 1 - (two_nt - 1)], 0, nt);
-            }
+                }
+                else
+                {
+                    ihevc_memset_mul_8_a9q(&pu1_dst[24], 0, 8);
+                }
 
+                if(nbr_flags & 0x4)
+                {
+                    for(i = (nt + 8); i < (nt + 16); i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8_a9q(&pu1_dst[16], 0, 8);
+                }
+
+                if(nbr_flags & 0x2)
+                {
+                    for(i = (nt + 16); i < (nt + 24); i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8_a9q(&pu1_dst[8], 0, 8);
+                }
+
+                if(nbr_flags & 0x1)
+                {
+                    for(i = (nt + 24); i < (two_nt); i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8_a9q(&pu1_dst[0], 0, 8);
+                }
+            }
 
             if(nbr_flags & 0xF00)
             {
diff --git a/common/arm/ihevc_platform_macros.h b/common/arm/ihevc_platform_macros.h
index fc08ba0..6d48cd9 100644
--- a/common/arm/ihevc_platform_macros.h
+++ b/common/arm/ihevc_platform_macros.h
@@ -116,6 +116,8 @@
 
 #define INLINE inline
 
+#define POPCNT_U32(x)       __builtin_popcount(x)
+
 static INLINE UWORD32 CLZ(UWORD32 u4_word)
 {
     if(u4_word)
@@ -124,6 +126,11 @@
         return 32;
 }
 
+static INLINE UWORD32 CLZNZ(UWORD32 u4_word)
+{
+   return (__builtin_clz(u4_word));
+}
+
 static INLINE UWORD32 CTZ(UWORD32 u4_word)
 {
     if(0 == u4_word)
diff --git a/common/ihevc_buf_mgr.c b/common/ihevc_buf_mgr.c
index b6e4f2a..93340ff 100644
--- a/common/ihevc_buf_mgr.c
+++ b/common/ihevc_buf_mgr.c
@@ -43,10 +43,12 @@
 *******************************************************************************
 */
 #include <stdlib.h>
+#include <assert.h>
 #include "ihevc_typedefs.h"
 #include "ihevc_macros.h"
 #include "ihevc_func_selector.h"
 #include "ihevc_buf_mgr.h"
+#include "ihevc_debug.h"
 
 
 /**
@@ -165,6 +167,8 @@
     pv_ret_ptr = NULL;
     for(id = 0; id < (WORD32)ps_buf_mgr->u4_max_buf_cnt; id++)
     {
+        ASSERT(ps_buf_mgr->au4_status[id] != 2);
+
         /* Check if the buffer is non-null and status is zero */
         if((ps_buf_mgr->au4_status[id] == 0) && (ps_buf_mgr->apv_ptr[id]))
         {
@@ -206,6 +210,8 @@
 
     for(id = 0; id < ps_buf_mgr->u4_max_buf_cnt; id++)
     {
+        ASSERT(ps_buf_mgr->au4_status[id] != 2);
+
         if((ps_buf_mgr->au4_status[id] == 0) &&
            (ps_buf_mgr->apv_ptr[id]))
         {
@@ -256,6 +262,7 @@
     }
 
     ps_buf_mgr->au4_status[buf_id] &= ~mask;
+    ASSERT(ps_buf_mgr->au4_status[buf_id] != 2);
 
     /* If both the REF and DISP are zero, DEC is set to zero */
     if(ps_buf_mgr->au4_status[buf_id] == 1)
@@ -312,6 +319,7 @@
     }
 
     ps_buf_mgr->au4_status[buf_id] |= mask;
+    ASSERT(ps_buf_mgr->au4_status[buf_id] != 2);
     return 0;
 }
 
diff --git a/common/ihevc_chroma_itrans_recon.h b/common/ihevc_chroma_itrans_recon.h
index c20cebf..7d4958b 100644
--- a/common/ihevc_chroma_itrans_recon.h
+++ b/common/ihevc_chroma_itrans_recon.h
@@ -102,6 +102,11 @@
 ihevc_chroma_itrans_recon_16x16_ft ihevc_chroma_itrans_recon_16x16;
 ihevc_hbd_chroma_itrans_recon_16x16_ft ihevc_hbd_chroma_itrans_recon_16x16;
 
+/* A9 Q Function Declarations */
+ihevc_chroma_itrans_recon_4x4_ft ihevc_chroma_itrans_recon_4x4_a9q;
+ihevc_chroma_itrans_recon_8x8_ft ihevc_chroma_itrans_recon_8x8_a9q;
+ihevc_chroma_itrans_recon_16x16_ft ihevc_chroma_itrans_recon_16x16_a9q;
+
 ihevc_hbd_chroma_itrans_recon_4x4_ft ihevc_hbd_chroma_itrans_recon_4x4_sse42;
 ihevc_hbd_chroma_itrans_recon_8x8_ft ihevc_hbd_chroma_itrans_recon_8x8_sse42;
 ihevc_hbd_chroma_itrans_recon_16x16_ft ihevc_hbd_chroma_itrans_recon_16x16_sse42;
diff --git a/common/ihevc_defs.h b/common/ihevc_defs.h
index c18ff03..946687f 100644
--- a/common/ihevc_defs.h
+++ b/common/ihevc_defs.h
@@ -210,6 +210,16 @@
     VID_FMT_UNSPECIFIED
 };
 
+typedef enum {
+    USER_DATA_BAR_DATA       = 0,
+    USER_DATA_CC_DATA        = 1,
+    USER_DATA_AFD_DATA       = 2,
+
+    // do not add anything below
+    USER_DATA_MAX
+} USER_DATA_SEI_TYPE_T;
+
+
 #define BIT_DEPTH           8
 #define BIT_DEPTH_LUMA      BIT_DEPTH
 #define BIT_DEPTH_CHROMA    BIT_DEPTH
@@ -246,10 +256,10 @@
 /* Tile restrictions                                                         */
 /*****************************************************************************/
 /* Minimum tile width in Main Profile */
-#define MIN_TILE_WD  MIN_CTB_SIZE
+#define MIN_TILE_WD  MAX_CTB_SIZE
 
 /* Minimum tile height in Main Profile */
-#define MIN_TILE_HT  MIN_CTB_SIZE
+#define MIN_TILE_HT  MAX_CTB_SIZE
 
 /*****************************************************************************/
 /* SPS restrictions                                                          */
@@ -454,6 +464,9 @@
  */
 #define INTRA_PRED_CHROMA_IDX_NONE  7
 
+#define MAX_NUM_CLOCK_TS    3
+#define MAX_USERDATA_PAYLOAD 256
+
 #define MAX_CPB_CNT 32
 
 #endif /*__IHEVC_DEFS_H_*/
diff --git a/common/ihevc_func_types.h b/common/ihevc_func_types.h
index f5a2c44..74de30e 100644
--- a/common/ihevc_func_types.h
+++ b/common/ihevc_func_types.h
@@ -45,7 +45,7 @@
 #define    CXAINTR      10
 
 /* Neon intrinsics */
-#define    NEONINTR     0
+#define    NEONINTR     11
 
 /* X86 intrinsics */
 #define    X86INTR      12
diff --git a/common/ihevc_intra_pred_filters.c b/common/ihevc_intra_pred_filters.c
index ea81d00..abb219a 100644
--- a/common/ihevc_intra_pred_filters.c
+++ b/common/ihevc_intra_pred_filters.c
@@ -374,16 +374,28 @@
                 ihevc_memset_mul_8(&pu1_dst[two_nt - 1 - (nt - 1)], 0, nt);
             }
 
-            if(nbr_flags & 0xC)
+            /* Bottom - left availability is checked for every 8x8 TU position and set accordingly */
             {
-                for(i = nt; i < two_nt; i++)
+                if(nbr_flags & 0x8)
+                {
+                    for(i = nt; i < (nt + 8); i++)
                     pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
-            }
-            else
-            {
-                ihevc_memset_mul_8(&pu1_dst[two_nt - 1 - (two_nt - 1)], 0, nt);
-            }
+                }
+                else
+                {
+                    ihevc_memset_mul_8(&pu1_dst[nt - 8], 0, 8);
+                }
 
+                if(nbr_flags & 0x4)
+                {
+                    for(i = (nt + 8); i < two_nt; i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8(&pu1_dst[0], 0, 8);
+                }
+            }
 
             if(nbr_flags & 0x300)
             {
@@ -485,14 +497,47 @@
                 ihevc_memset_mul_8(&pu1_dst[two_nt - 1 - (nt - 1)], 0, nt);
             }
 
-            if(nbr_flags & 0xF)
+            /* Bottom - left availability is checked for every 8x8 TU position and set accordingly */
             {
-                for(i = nt; i < two_nt; i++)
+                if(nbr_flags & 0x8)
+                {
+                    for(i = nt; i < (nt + 8); i++)
                     pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
-            }
-            else
-            {
-                ihevc_memset_mul_8(&pu1_dst[two_nt - 1 - (two_nt - 1)], 0, nt);
+                }
+                else
+                {
+                    ihevc_memset_mul_8(&pu1_dst[24], 0, 8);
+                }
+
+                if(nbr_flags & 0x4)
+                {
+                    for(i = (nt + 8); i < (nt + 16); i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8(&pu1_dst[16], 0, 8);
+                }
+
+                if(nbr_flags & 0x2)
+                {
+                    for(i = (nt + 16); i < (nt + 24); i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8(&pu1_dst[8], 0, 8);
+                }
+
+                if(nbr_flags & 0x1)
+                {
+                    for(i = (nt + 24); i < (two_nt); i++)
+                        pu1_dst[two_nt - 1 - i] = pu1_left[i * src_strd];
+                }
+                else
+                {
+                    ihevc_memset_mul_8(&pu1_dst[0], 0, 8);
+                }
             }
 
 
diff --git a/common/ihevc_structs.h b/common/ihevc_structs.h
index 37b9bab..baa6375 100644
--- a/common/ihevc_structs.h
+++ b/common/ihevc_structs.h
@@ -38,6 +38,870 @@
 #ifndef _IHEVC_STRUCTS_H_
 #define _IHEVC_STRUCTS_H_
 
+
+/**
+ * Buffering Period SEI parameters Info
+ */
+typedef struct
+{
+    /**
+     * specifies SPS Id active for the coded picture assosiated
+     * with the bp message.
+     */
+    UWORD8  u1_bp_seq_parameter_set_id;
+
+    /**
+     * Derived from Hrd parameters
+     */
+    UWORD8  u1_sub_pic_cpb_params_present_flag;
+
+    /**
+     * specifies the presence of the initial_alt_cpb_removal_delay[ i ]
+     * and initial_alt_cpb_removal_offset[ i ] syntax elements
+     */
+    UWORD8  u1_rap_cpb_params_present_flag;
+
+    /**
+     * cbp removal delay used in buffering period SEI
+     */
+    UWORD32 u4_cpb_delay_offset;
+
+    /**
+     * dbp removal delay used in buffering period SEI
+     */
+    UWORD32 u4_dpb_delay_offset;
+
+    /**
+     * concatanation flag
+     */
+    UWORD8 u1_concatenation_flag;
+
+    /**
+     * delata cbp removal delay
+     */
+    UWORD32 u4_au_cpb_removal_delay_delta_minus1;
+
+    /**
+     * specify the default initial CPB removal delays, respectively,
+     * for the CPB when the NAL HRD parameters are in use
+     */
+    UWORD32 au4_nal_initial_cpb_removal_delay[MAX_CPB_CNT];
+
+    /**
+     * specify the alternate initial CPB removal delays, respectively,
+     * for the CPB when the NAL HRD parameters are in use
+     */
+    UWORD32 au4_nal_initial_alt_cpb_removal_delay[MAX_CPB_CNT];
+
+    /**
+     * specify the initial CPB removal delay offset, respectively,
+     * for the CPB when the NAL HRD parameters are in use
+     */
+    UWORD32 au4_nal_initial_cpb_removal_delay_offset[MAX_CPB_CNT];
+
+    /**
+     * specify the alternate initial CPB removal delays offsets, respectively,
+     * for the CPB when the NAL HRD parameters are in use
+     */
+    UWORD32 au4_nal_initial_alt_cpb_removal_delay_offset[MAX_CPB_CNT];
+
+    /**
+     * specify the default initial CPB removal delays, respectively,
+     * for the CPB when the VCL HRD parameters are in use
+     */
+    UWORD32 au4_vcl_initial_cpb_removal_delay[MAX_CPB_CNT];
+
+    /**
+     * specify the initial alt CPB removal delays , respectively,
+     * for the CPB when the VCL HRD parameters are in use
+     */
+    UWORD32 au4_vcl_initial_alt_cpb_removal_delay[MAX_CPB_CNT];
+
+    /**
+     * specify the initial CPB removal delay offset, respectively,
+     * for the CPB when the VCL HRD parameters are in use
+     */
+    UWORD32 au4_vcl_initial_cpb_removal_delay_offset[MAX_CPB_CNT];
+
+    /**
+     * specify the alternate initial CPB removal delays offsets, respectively,
+     * for the CPB when the VCL HRD parameters are in use
+     */
+    UWORD32 au4_vcl_initial_alt_cpb_removal_delay_offset[MAX_CPB_CNT];
+
+    /**
+     * Inital CPB removal delay
+     */
+    UWORD32 u4_initial_cpb_removal_delay_length;
+
+    /**
+     * CPB cnt for corr. sublayer
+     */
+    UWORD32 u4_cpb_cnt;
+
+
+    /**
+     * VBV buffer size used in buffering period SEI
+     */
+    UWORD32 u4_buffer_size_sei;
+
+    /**
+     * Encoder buffer fullness  used in buffering period SEI
+     */
+    UWORD32 u4_dbf_sei;
+
+    /**
+     * target bitrate used in buffering period SEI
+     */
+    UWORD32 u4_target_bit_rate_sei;
+
+}buf_period_sei_params_t;
+
+
+/**
+ * Picture Timing SEI parameters Info
+ */
+typedef struct
+{
+    /**
+     * derived from vui parameters
+     */
+    UWORD8 u1_frame_field_info_present_flag;
+
+    /**
+     * indicates whether a picture should be displayed as a
+     * frame or as one or more fields
+     */
+    UWORD32 u4_pic_struct;
+
+    UWORD32 u4_source_scan_type;
+
+    /**
+     * if 1, indicates if the current pic is a duplicte pic in output order
+     */
+    UWORD8 u1_duplicate_flag;
+
+    /**
+     * specifies the number clock ticks between the nominal CPB removal time
+     * au associated with the pt SEI message and
+     * the preceding au in decoding order that contained a bp SEI message
+     */
+    UWORD32 u4_au_cpb_removal_delay_minus1;
+
+    /**
+     * compute the DPB output time of the picture
+     */
+    UWORD32 u4_pic_dpb_output_delay;
+
+    UWORD32 u4_pic_dpb_output_du_delay;
+
+    /**
+     * specifies the number of decoding units in the access unit
+     * the picture timing SEI message is associated with
+     */
+    UWORD32 u4_num_decoding_units_minus1;
+
+    /**
+     * if 1 specifies that the du_common_cpb_removal_delay_increment_minus1 is present
+     */
+    UWORD8 u1_du_common_cpb_removal_delay_flag;
+
+    /**
+     * specifies the duration, in units of clock sub-ticks,
+     * between the nominal CPB removal times of any two consecutive decoding units
+     * in decoding order in the access unit associated with the pt_SEI message
+     */
+    UWORD32 u4_du_common_cpb_removal_delay_increment_minus1; //same as u4_du_cpb_removal_delay_increment_minus1
+
+    /**
+     * specifies the number of NAL units in the decoding unit of the access unit
+     * the picture timing SEI message is associated with.
+     * range from 0 to (pic size in ctby - 1)
+     */
+    UWORD32 au4_num_nalus_in_du_minus1[4320 / MIN_CTB_SIZE];
+
+    /**
+     * specifies the duration, in units of clock sub-ticks,
+     * between the nominal CPB removal times of the ( i + 1 )-th decoding unit and the i-th decoding unit,
+     * in decoding order, in the access unit associated with the pt_SEI message
+     */
+    UWORD32 au4_du_cpb_removal_delay_increment_minus1[4320 / MIN_CTB_SIZE];
+
+}pic_timing_sei_params_t;
+
+/**
+ * Structure to hold Recovery point SEI parameters Info
+ */
+typedef struct
+{
+    /**
+     * specifies the recovery point of output pictures in output order
+     */
+    WORD32 i4_recovery_poc_cnt;
+
+    UWORD8 u1_exact_match_flag;
+
+    /**
+     * indicates the presence or absence of a broken link in the NAL unit
+     * stream at the location of the recovery point SEI message
+     */
+
+    UWORD8 u1_broken_link_flag;
+
+}recovery_point_sei_params_t;
+
+/**
+ * Structure to hold Mastering Display Colour Volume SEI
+ */
+typedef struct
+{
+    /**
+     * Array to store the display_primaries_x values
+     */
+    UWORD16 au2_display_primaries_x[3];
+
+    /**
+     * Array to store the display_primaries_y values
+     */
+    UWORD16 au2_display_primaries_y[3];
+
+    /**
+     * Variable to store the white point x value
+     */
+    UWORD16 u2_white_point_x;
+
+    /**
+     * Variable to store the white point y value
+     */
+    UWORD16 u2_white_point_y;
+
+    /**
+     * Variable to store the max display mastering luminance value
+     */
+    UWORD32 u4_max_display_mastering_luminance;
+
+    /**
+     * Variable to store the min display mastering luminance value
+     */
+    UWORD32 u4_min_display_mastering_luminance;
+
+}mastering_dis_col_vol_sei_params_t;
+
+/**
+ * Structure to hold active parameter parameter set SEI parameters Info
+ */
+typedef struct
+{
+    /*
+    * active vps id
+    */
+
+    UWORD8 u1_active_video_parameter_set_id;
+
+    /*
+     * default set to zero.
+     */
+    UWORD8 u1_self_contained_cvs_flag;
+
+    UWORD8 u1_no_parameter_set_update_flag;
+
+    UWORD8 u1_num_sps_ids_minus1;
+
+    /*
+     * active sps id
+     */
+    UWORD8 au1_active_seq_parameter_set_id[15];
+
+    UWORD32 au4_layer_sps_idx[64];
+
+}active_parameter_set_sei_param_t;
+
+/**
+ * Structure to hold SEI Hash values
+ */
+typedef struct
+{
+    /*
+     * SEI Hash values for each color component
+     */
+    UWORD8 au1_sei_hash[3][16];
+
+}hash_sei_param_t;
+
+/**
+ * Structure to hold user data registered SEI param Info
+ */
+typedef struct
+{
+    /**
+     * Contains country code by Annex A of Recommendation ITU-T T.35
+     */
+    UWORD8 u1_itu_t_t35_country_code;
+
+    /**
+     * Contains country code by Annex B of Recommendation ITU-T T.35
+     */
+    UWORD8 u1_itu_t_t35_country_code_extension_byte;
+
+    /**
+     * Contains data registered as specified in Recommendation ITU-T T.35
+     */
+    UWORD8 u1_itu_t_t35_payload_byte[MAX_USERDATA_PAYLOAD];
+
+    /**
+     * Valid payload size present in this buffer
+     */
+    WORD32 i4_valid_payload_size;
+
+    /**
+     * Total payload size incase payloadSize > IHEVCD_MAX_USERDATA_PAYLOAD
+     */
+    WORD32 i4_payload_size;
+}user_data_registered_itu_t_t35_t;
+
+/**
+ * Structure to hold time code SEI param info
+ */
+typedef struct
+{
+    /**
+     * Number of sets of clock timestamp syntax elements present for the current picture
+     */
+    UWORD8 u1_num_clock_ts;
+
+    /**
+     * Indicates presenc of associated set of clock timestamps
+     */
+    UWORD8 au1_clock_timestamp_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Used in calculating clockTimestamp[i]
+     */
+    UWORD8 au1_units_field_based_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the method of dropping values of the n_frames[i] syntax element
+     */
+    UWORD8 au1_counting_type[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies that the n_frames[i] syntax element is followed by seconds_value[i],
+     * minutes_value[i] and hours_value[i]
+     */
+    UWORD8 au1_full_timestamp_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Indicates the discontinuity in clockTimestamp
+     */
+    UWORD8 au1_discontinuity_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the skipping of one or more values of n_frames[i]
+     */
+    UWORD8 au1_cnt_dropped_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the value of nFrames used to compute clockTimestamp[i]
+     */
+    UWORD16 au2_n_frames[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the presence of seconds_value[i] and minutes_flag[i]
+     */
+    UWORD8 au1_seconds_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the presence of minutes_value[i] and hours_flag[i]
+     */
+    UWORD8 au1_minutes_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the presence of hours_value[i]
+     */
+    UWORD8 au1_hours_flag[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the value of sS used to compute clockTimestamp[i]
+     */
+    UWORD8 au1_seconds_value[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the value of mM used to compute clockTimestamp[i]
+     */
+    UWORD8 au1_minutes_value[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the value of hH used to compute clockTimestamp[i]
+     */
+    UWORD8 au1_hours_value[MAX_NUM_CLOCK_TS];
+
+    /**
+     * Specifies the length in bits of the time_offset_value[i]
+     */
+    UWORD8 au1_time_offset_length[MAX_NUM_CLOCK_TS];
+
+    /**
+     * pecifies the value of tOffset used to compute clockTimestamp[i]
+     */
+    UWORD8 au1_time_offset_value[MAX_NUM_CLOCK_TS];
+
+}time_code_t;
+
+
+/**
+ * Structure to hold SEI parameters Info
+ */
+typedef struct
+{
+
+    WORD8 i1_sei_parameters_present_flag;
+
+    WORD8 i1_aud_present_flag;
+
+    WORD8 i1_buf_period_params_present_flag;
+
+    WORD8 i1_pic_timing_params_present_flag;
+
+    WORD8 i1_recovery_point_params_present_flag;
+
+    WORD8 i1_active_parameter_set;
+
+    WORD8 i4_sei_mastering_disp_colour_vol_params_present_flags;
+
+    /* Enable/Disable SEI Hash on the Decoded picture & Hash type */
+    /* < 3 : Checksum, 2 : CRC, 1 : MD5, 0 : disable >            */
+    /* Other values are not supported                             */
+    WORD8 i1_decoded_pic_hash_sei_flag;
+
+    /* number of user data e.g. CC data, BAR data, AFD data etc */
+    WORD32 i4_sei_user_data_cnt;
+
+    WORD8 i1_user_data_registered_present_flag;
+
+    WORD8 i1_time_code_present_flag;
+
+    buf_period_sei_params_t  s_buf_period_sei_params;
+
+    pic_timing_sei_params_t  s_pic_timing_sei_params;
+
+    recovery_point_sei_params_t s_recovery_point_params;
+
+    active_parameter_set_sei_param_t s_active_parameter_set_sei_params;
+
+    hash_sei_param_t    s_hash_sei_params;
+
+    mastering_dis_col_vol_sei_params_t s_mastering_dis_col_vol_sei_params;
+
+    user_data_registered_itu_t_t35_t as_user_data_registered_itu_t_t35[USER_DATA_MAX];
+
+    time_code_t s_time_code;
+} sei_params_t;
+
+
+/**
+ * Sub-layer HRD parameters Info
+ */
+typedef struct
+{
+    /**
+     * (together with bit_rate_scale) specifies the
+     * maximum input bit rate for the i-th CPB
+     */
+    UWORD32 au4_bit_rate_value_minus1[MAX_CPB_CNT];
+    /**
+     * together with cpb_size_scale to specify the
+     * CPB size when the CPB operates at the access unit level.
+     */
+    UWORD32 au4_cpb_size_value_minus1[MAX_CPB_CNT];
+
+    /**
+     * together with cpb_size_du_scale to specify the CPB size
+     * when the CPB operates at sub-picture level
+     */
+    UWORD32 au4_cpb_size_du_value_minus1[MAX_CPB_CNT];
+
+    /**
+     * specifies the maximum input bit rate for the i-th CPB when the CPB
+     * operates at the sub-picture level. bit_rate_du_value_minus1[ i ]
+     * shall be in the range of 0 to 2^32 - 2
+     */
+    UWORD32 au4_bit_rate_du_value_minus1[MAX_CPB_CNT];
+
+    /**
+     * if 1, specifies that the HSS operates in a constant bit rate (CBR) mode
+     * if 0, specifies that the HSS operates in a intermittent bit rate (CBR) mode
+     */
+    UWORD8  au1_cbr_flag[32];
+
+}sub_lyr_hrd_params_t;
+
+/**
+ * HRD parameters Info
+ */
+typedef struct
+{
+    /**
+     * Indicates the presence of the
+     * num_units_in_ticks, time_scale flag
+     */
+    UWORD8 u1_timing_info_present_flag;
+
+    /**
+     * Number of units that
+     * correspond to one increment of the
+     * clock. Indicates the  resolution
+     */
+    UWORD32 u4_num_units_in_tick;
+
+    /**
+     * The number of time units that pass in one second
+     */
+    UWORD32 u4_time_scale;
+
+    /**
+     * Nal- hrd parameters flag
+     */
+    UWORD8 u1_nal_hrd_parameters_present_flag;
+
+    /**
+     * VCL- hrd parameters flag
+     */
+    UWORD8 u1_vcl_hrd_parameters_present_flag;
+
+    /**
+     * Indicates the presence of NAL-HRD params or VCL_HRD params
+     * in the bitstream
+     */
+    UWORD8 u1_cpbdpb_delays_present_flag;
+
+    /**
+     * specifies that sub-picture level CPB removal delay parameters are
+     * present in picture timing SEI messages
+     */
+    UWORD8 u1_sub_pic_cpb_params_present_flag;
+
+    /**
+     * specify the clock sub-tick
+     * (the minimum interval of time that can be represented in the coded data when sub_pic_cpb_params_present_flag is equal to 1)
+     */
+    UWORD8 u1_tick_divisor_minus2;
+
+    /**
+     * specifies the length, in bits for the du cpb delay syntax in pt_sei
+     */
+    UWORD8 u1_du_cpb_removal_delay_increment_length_minus1;
+
+    /**
+     * Indicates presence of sub_pic_cpb_params in pic timing sei
+     */
+    UWORD8 u1_sub_pic_cpb_params_in_pic_timing_sei_flag;
+
+    /**
+     * specifies the length, in bits, of the pic_dpb_output_du_delay syntax
+     * element in the picture timing SEI message and the
+     * pic_spt_dpb_output_du_delay syntax element in the decoding unit
+     * information SEI message
+     */
+    UWORD8 u1_dpb_output_delay_du_length_minus1;
+
+    /**
+     * (together with bit_rate_value_minus1) specifies the
+     * maximum input bit rate of the i-th CPB
+     */
+    UWORD32 u4_bit_rate_scale;
+
+    /**
+     * (together with cpb_size_du_value_minus1) specfies
+     * CPB size of the i-th CPB when the CPB operates
+     * at the access unit level
+     */
+    UWORD32 u4_cpb_size_scale;
+
+    /**
+     * (together with cpb_size_du_value_minus1) specfies
+     * CPB size of the i-th CPB when the CPB operates
+     * at the sub-picture level
+     */
+    UWORD32 u4_cpb_size_du_scale;
+
+
+    /**
+     * specifies the length, in bits for initial cpb delay (nal/vcl)sysntax in bp sei
+     */
+    UWORD8  u1_initial_cpb_removal_delay_length_minus1;
+
+    /**
+     * specifies the length, in bits for the au cpb delay syntax in pt_sei
+     */
+    UWORD8  u1_au_cpb_removal_delay_length_minus1;
+
+    /**
+     * specifies the length, in bits, of the pic_dpb_output_delay syntax element in the pt SEI message
+     */
+    UWORD8  u1_dpb_output_delay_length_minus1;
+
+    /**
+     * if 1, , for the highest temporal sub-layers, the temporal distance between the HRD output times
+     * of consecutive pictures in output order is constrained refer to Table E-6
+     */
+    UWORD8 au1_fixed_pic_rate_general_flag[VPS_MAX_SUB_LAYERS];
+
+    UWORD8 au1_fixed_pic_rate_within_cvs_flag[VPS_MAX_SUB_LAYERS];
+
+    /**
+     * if 1, , for the highest temporal sub-layers, the temporal distance (in clock ticks) between the
+     * element units that specify HRD output times of consecutive pictures in output order is constrained
+     * refer to Table E-6
+     */
+    UWORD8 au1_elemental_duration_in_tc_minus1[VPS_MAX_SUB_LAYERS];
+
+    /**
+     * specifies the HRD operational mode
+     */
+    UWORD8 au1_low_delay_hrd_flag[VPS_MAX_SUB_LAYERS];
+
+    /**
+     * 1 specifies the number of alternative CPB specifications in the
+     * bitstream of the cvs when HighestTid is equal to i
+     */
+    UWORD8 au1_cpb_cnt_minus1[VPS_MAX_SUB_LAYERS];
+
+
+    /**
+     * VUI level Sub-layer HRD parameters
+     */
+    sub_lyr_hrd_params_t as_sub_layer_hrd_params[VPS_MAX_SUB_LAYERS];
+
+}hrd_params_t;
+
+/**
+ * Structure to hold VUI parameters Info
+ */
+typedef struct
+{
+    /**
+     * indicates the presence of aspect_ratio
+     */
+    UWORD8 u1_aspect_ratio_info_present_flag;
+
+    /**
+     * specifies the aspect ratio of the luma samples
+     */
+    UWORD8 u1_aspect_ratio_idc;
+
+    /**
+     *  width of the luma samples. user dependent
+     */
+    UWORD16 u2_sar_width;
+
+    /**
+     *  hieght of the luma samples. user dependent
+     */
+    UWORD16 u2_sar_height;
+
+    /**
+     * if 1, specifies that the overscan_appropriate_flag is present
+     * if 0, the preferred display method for the video signal is unspecified
+     */
+    UWORD8 u1_overscan_info_present_flag;
+
+    /**
+     * if 1,indicates that the cropped decoded pictures output
+     * are suitable for display using overscan
+     */
+    UWORD8 u1_overscan_appropriate_flag;
+
+    /**
+     * if 1 specifies that video_format, video_full_range_flag and
+     * colour_description_present_flag are present
+     */
+    UWORD8 u1_video_signal_type_present_flag;
+
+    /**
+     *
+     */
+    UWORD8 u1_video_format;
+
+    /**
+     * indicates the black level and range of the luma and chroma signals
+     */
+    UWORD8 u1_video_full_range_flag;
+
+    /**
+     * if 1,to 1 specifies that colour_primaries, transfer_characteristics
+     * and matrix_coefficients are present
+     */
+    UWORD8 u1_colour_description_present_flag;
+
+    /**
+     * indicates the chromaticity coordinates of the source primaries
+     */
+    UWORD8 u1_colour_primaries;
+
+    /**
+     * indicates the opto-electronic transfer characteristic of the source picture
+     */
+    UWORD8 u1_transfer_characteristics;
+
+    /**
+     * the matrix coefficients used in deriving luma and chroma signals
+     * from the green, blue, and red primaries
+     */
+    UWORD8 u1_matrix_coefficients;
+
+    /**
+     * if 1, specifies that chroma_sample_loc_type_top_field and
+     * chroma_sample_loc_type_bottom_field are present
+     */
+    UWORD8 u1_chroma_loc_info_present_flag;
+
+    /**
+     * location of chroma samples
+     */
+    UWORD8 u1_chroma_sample_loc_type_top_field;
+
+    UWORD8 u1_chroma_sample_loc_type_bottom_field;
+
+    /**
+     * if 1, indicates that the value of all decoded chroma samples is
+     * equal to 1 << ( BitDepthC - 1 )
+     */
+    UWORD8 u1_neutral_chroma_indication_flag;
+
+    /**
+     * 1 indicates that the coded video sequence conveys pictures that represent fields
+     * 0 indicates the pictures that represents field
+     */
+    UWORD8 u1_field_seq_flag;
+
+    /**
+     * specifies that picture timing SEI messages are present for every picture
+     */
+    UWORD8 u1_frame_field_info_present_flag;
+
+    /**
+     * 1 indicates that the default display window parameters follow next in the VUI
+     */
+    UWORD8 u1_default_display_window_flag;
+
+    /**
+     * specify the samples of the pictures in the coded video sequence
+     * that are within the default display window,
+     * in terms of a rectangular region specified in picture coordinates for display
+     */
+    UWORD32 u4_def_disp_win_left_offset;
+
+    UWORD32 u4_def_disp_win_right_offset;
+
+    UWORD32 u4_def_disp_win_top_offset;
+
+    UWORD32 u4_def_disp_win_bottom_offset;
+
+    /**
+     * to 1 specifies that the syntax structure hrd_parameters is present in the vui_parameters syntax structue
+     */
+    UWORD8 u1_vui_hrd_parameters_present_flag;
+
+    /**
+     * VUI level HRD parameters
+     */
+    hrd_params_t s_vui_hrd_parameters;
+
+    /**
+     * Indicates the presence of the
+     * num_units_in_ticks, time_scale flag
+     */
+    UWORD8 u1_vui_timing_info_present_flag;
+
+    /**
+     * Number of units that
+     * correspond to one increment of the
+     * clock. Indicates the  resolution
+     */
+    UWORD32 u4_vui_num_units_in_tick;
+
+    /**
+     * The number of time units that pass in one second
+     */
+    UWORD32 u4_vui_time_scale;
+    /**
+     * if 1, indicates that the POC for each picture in the coded video sequence (cvs) (not the first picture), in decoding order,
+     * is proportional to the output time of the picture relative to that of the first picture in the cvs
+     */
+    UWORD8 u1_poc_proportional_to_timing_flag;
+
+    /**
+     * num_ticks_poc_diff_one_minus1 plus 1 specifies the number of clock ticks
+     * corresponding to a difference of poc values equal to 1
+     */
+    UWORD8 u1_num_ticks_poc_diff_one_minus1;
+
+    /**
+     * 1, specifies that the following cvs bitstream restriction parameters are present
+     */
+    UWORD8 u1_bitstream_restriction_flag;
+
+    /**
+     *  if 1, indicates that each pps that is active in the cvs has
+     *  the same value of the tile syntax elements
+     */
+    UWORD8 u1_tiles_fixed_structure_flag;
+
+    /**
+     * if 0, indicates that no pel outside the pic boundaries and
+     * no sub-pels derived using pels outside the pic boundaries is used for inter prediction
+     */
+    UWORD8 u1_motion_vectors_over_pic_boundaries_flag;
+
+    /**
+     * if 1, indicates
+     * all P/B slices belonging to the same pic have an identical refpic list0,
+     * all B slices that belong to the same picture have an identical refpic list1.
+     */
+    UWORD8 u1_restricted_ref_pic_lists_flag;
+
+    /**
+     * min_spatial_segmentation_idc, when not equal to 0, establishes a bound on the maximum possible size of distinct
+     * coded spatial segmentation regions in the pictures of the CVS. When min_spatial_segmentation_idc is not present, it is
+     * inferred to be equal to 0. The value of min_spatial_segmentation_idc shall be in the range of 0 to 4095, inclusive.
+     *
+     * can be used by a decoder to calculate the maximum number of luma samples to be processed by one processing thread
+     *
+     * If tiles=0 and entropy_sync=0 then
+     *     no slice shall exceed ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4 luma samples
+     *
+     * If tiles=1 and entropy_sync=0 then
+     *     no tile shall exceed ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4 luma samples
+     *
+     * If tiles=0 and entropy_sync=1 then
+     *     ( 2 * pic_height_in_luma_samples + pic_width_in_luma_samples ) * CtbSizeY
+     *             <= ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4
+     */
+    UWORD32 u4_min_spatial_segmentation_idc;
+    /**
+     * Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units
+     * associated with any coded picture
+     */
+    UWORD8 u1_max_bytes_per_pic_denom;
+
+    /**
+     * Indicates an upper bound for the number of bits of coding_unit() data
+     */
+    UWORD8 u1_max_bits_per_mincu_denom;
+
+    /**
+     * Indicate the maximum absolute value of a decoded horizontal MV component
+     * in quarter-pel luma units
+     */
+    UWORD8 u1_log2_max_mv_length_horizontal;
+
+    /**
+     * Indicate the maximum absolute value of a decoded vertical MV component
+     * in quarter-pel luma units
+     */
+    UWORD8 u1_log2_max_mv_length_vertical;
+}vui_t;
+
 /**
  * Picture buffer
  */
@@ -59,6 +923,16 @@
      */
     UWORD8 u1_buf_id;
 
+
+    // See IV_FLD_TYPE_T for all field types
+    UWORD32 e4_fld_type;
+
+    sei_params_t s_sei_params;
+
+    WORD32 i4_vui_present;
+
+    vui_t s_vui;
+
 }pic_buf_t;
 
 
@@ -386,7 +1260,7 @@
     UWORD32     b2_pred_mode    : 2;
 
 
-/**
+    /**
      *  Merge flag for each partition - 0 or 1
      */
     UWORD32     b1_merge_flag   : 1;
@@ -424,7 +1298,6 @@
      */
     UWORD32      b2_part_idx     : 2;
 
-
 }pu_t;
 
 /**
@@ -442,7 +1315,6 @@
      */
     UWORD32     b4_pos_y            : 4;
 
-
     /*************************************************************************/
     /* Luma TU size (width or height) = 1 << (b3_size + 2)                   */
     /*   i.e. 0 : 4, 1 : 8, 2: 16, 3: 32, 4: 64                              */
@@ -460,7 +1332,6 @@
     /* Cr info. For the first three TUs in 8x8 (for 4x4 luma) this will      */
     /* be zero. For all the other cases this will be 1                       */
     /*************************************************************************/
-
     /**
      * 4x4 Luma TUs only the fourth one contains cb,cr
      * TODO: Check if this is really needed, cb_cbf and cr_cbf should be enough
@@ -909,7 +1780,6 @@
 }tu_sblk_coeff_data_t;
 
 
-
 /*************************************************************************/
 /* The following describes how each of the CU cases are handled          */
 /*************************************************************************/
@@ -1310,7 +2180,6 @@
      */
     WORD8 ai1_bit_rate_info_present_flag[VPS_MAX_SUB_LAYERS];
 
-
     /**
      * pic_rate_info_present_flag[i]
      */
@@ -1320,428 +2189,23 @@
      * avg_bit_rate[i]
      */
     UWORD16 au2_avg_bit_rate[VPS_MAX_SUB_LAYERS];
+
     /**
      * max_bit_rate[i]
      */
     UWORD16 au2_max_bit_rate[VPS_MAX_SUB_LAYERS];
+
     /**
      * constant_pic_rate_idc[i]
      */
     WORD8 ai1_constant_pic_rate_idc[VPS_MAX_SUB_LAYERS];
+
     /**
      * avg_pic_rate[i]
      */
     UWORD16 au2_avg_pic_rate[VPS_MAX_SUB_LAYERS];
 }vps_t;
 
-/**
- * Sub-layer HRD parameters Info
- */
-typedef struct
-{
-    /**
-    *  (together with bit_rate_scale) specifies the
-    *  maximum input bit rate for the i-th CPB
-    */
-    UWORD32 au4_bit_rate_value_minus1[32];
-    /**
-    *  together with cpb_size_scale to specify the
-    *  CPB size when the CPB operates at the access unit level.
-    */
-    UWORD32 au4_cpb_size_value_minus1[32];
-
-    /**
-    * together with cpb_size_du_scale to specify the CPB size
-    * when the CPB operates at sub-picture level
-    */
-    UWORD32 au4_cpb_size_du_value_minus1[32];
-
-    /**
-    * specifies the maximum input bit rate for the i-th CPB when the CPB
-    * operates at the sub-picture level. bit_rate_du_value_minus1[ i ]
-    * shall be in the range of 0 to 2^32 - 2
-    */
-    UWORD32 au4_bit_rate_du_value_minus1[32];
-
-    /**
-    * if 1, specifies that the HSS operates in a constant bit rate (CBR) mode
-    * if 0, specifies that the HSS operates in a intermittent bit rate (CBR) mode
-    */
-    UWORD8  au1_cbr_flag[32];
-
-}sub_lyr_hrd_params_t;
-
-/**
- * HRD parameters Info
- */
-typedef struct
-{
-
-    /**
-    *   Indicates the presence of the
-    *   num_units_in_ticks, time_scale flag
-    */
-    UWORD8 u1_timing_info_present_flag;
-
-    /**
-    *   Number of units that
-    *   correspond to one increment of the
-    *   clock. Indicates the  resolution
-    */
-    UWORD32 u4_num_units_in_tick;
-
-    /**
-    *   The number of time units that pass in one second
-    */
-    UWORD32 u4_time_scale;
-
-    /**
-    * Nal- hrd parameters flag
-    */
-    UWORD8 u1_nal_hrd_parameters_present_flag;
-
-    /**
-    * VCL- hrd parameters flag
-    */
-    UWORD8 u1_vcl_hrd_parameters_present_flag;
-
-    /**
-    * Indicates the presence of NAL-HRD params or VCL_HRD params
-    * in the bitstream
-    */
-    UWORD8 u1_cpbdpb_delays_present_flag;
-
-    /**
-    * specifies that sub-picture level CPB removal delay parameters are
-    * present in picture timing SEI messages
-    */
-    UWORD8 u1_sub_pic_cpb_params_present_flag;
-
-    /**
-    * specify the clock sub-tick
-    * (the minimum interval of time that can be represented in the coded data when sub_pic_cpb_params_present_flag is equal to 1)
-    */
-    UWORD8 u1_tick_divisor_minus2;
-
-    /**
-    * specifies the length, in bits for the du cpb delay syntax in pt_sei
-    */
-    UWORD8 u1_du_cpb_removal_delay_increment_length_minus1;
-
-    /**
-    * Indicates presence of sub_pic_cpb_params in pic timing sei
-    */
-    UWORD8 u1_sub_pic_cpb_params_in_pic_timing_sei_flag;
-
-    /**
-    * specifies the length, in bits, of the pic_dpb_output_du_delay syntax
-    * element in the picture timing SEI message and the
-    * pic_spt_dpb_output_du_delay syntax element in the decoding unit
-    * information SEI message
-     */
-    UWORD8 u1_dpb_output_delay_du_length_minus1;
-
-    /**
-    * (together with bit_rate_value_minus1) specifies the
-    * maximum input bit rate of the i-th CPB
-    */
-    UWORD32 u4_bit_rate_scale;
-
-    /**
-    * (together with cpb_size_du_value_minus1) specfies
-    * CPB size of the i-th CPB when the CPB operates
-    * at the access unit level
-    */
-    UWORD32 u4_cpb_size_scale;
-
-    /**
-    * (together with cpb_size_du_value_minus1) specfies
-    * CPB size of the i-th CPB when the CPB operates
-    * at the sub-picture level
-    */
-    UWORD32 u4_cpb_size_du_scale;
-
-
-    /**
-    * specifies the length, in bits for initial cpb delay (nal/vcl)sysntax in bp sei
-    */
-    UWORD8  u1_initial_cpb_removal_delay_length_minus1;
-
-    /**
-    * specifies the length, in bits for the au cpb delay syntax in pt_sei
-    */
-    UWORD8  u1_au_cpb_removal_delay_length_minus1;
-
-    /**
-    * specifies the length, in bits, of the pic_dpb_output_delay syntax element in the pt SEI message
-    */
-    UWORD8  u1_dpb_output_delay_length_minus1;
-
-    /**
-    * if 1, , for the highest temporal sub-layers, the temporal distance between the HRD output times
-    *  of consecutive pictures in output order is constrained refer to Table E-6
-    */
-    UWORD8 au1_fixed_pic_rate_general_flag[VPS_MAX_SUB_LAYERS];
-
-    UWORD8 au1_fixed_pic_rate_within_cvs_flag[VPS_MAX_SUB_LAYERS];
-
-    /**
-    * if 1, , for the highest temporal sub-layers, the temporal distance (in clock ticks) between the
-    * element units that specify HRD output times of consecutive pictures in output order is constrained
-    * refer to Table E-6
-    */
-    UWORD8 au1_elemental_duration_in_tc_minus1[VPS_MAX_SUB_LAYERS];
-
-    /**
-    * specifies the HRD operational mode
-    */
-    UWORD8 au1_low_delay_hrd_flag[VPS_MAX_SUB_LAYERS];
-
-    /**
-    * 1 specifies the number of alternative CPB specifications in the
-    * bitstream of the cvs when HighestTid is equal to i
-    */
-    UWORD8 au1_cpb_cnt_minus1[VPS_MAX_SUB_LAYERS];
-
-
-    /**
-    *  VUI level Sub-layer HRD parameters
-    */
-    sub_lyr_hrd_params_t as_sub_layer_hrd_params[VPS_MAX_SUB_LAYERS];
-
-}hrd_params_t;
-
-
-/**
- * Structure to hold VUI parameters Info
- */
-typedef struct
-{
-    /**
-    *  indicates the presence of aspect_ratio
-    */
-    UWORD8 u1_aspect_ratio_info_present_flag;
-
-    /**
-    *  specifies the aspect ratio of the luma samples
-    */
-    UWORD8 u1_aspect_ratio_idc;
-
-    /**
-    *  width of the luma samples. user dependent
-    */
-    UWORD16 u2_sar_width;
-
-    /**
-    *  hieght of the luma samples. user dependent
-    */
-    UWORD16 u2_sar_height;
-
-    /**
-    * if 1, specifies that the overscan_appropriate_flag is present
-    * if 0, the preferred display method for the video signal is unspecified
-    */
-    UWORD8 u1_overscan_info_present_flag;
-
-    /**
-    * if 1,indicates that the cropped decoded pictures output
-    * are suitable for display using overscan
-    */
-    UWORD8 u1_overscan_appropriate_flag;
-
-    /**
-    * if 1 specifies that video_format, video_full_range_flag and
-    * colour_description_present_flag are present
-    */
-    UWORD8 u1_video_signal_type_present_flag;
-
-    /**
-    *
-    */
-    UWORD8 u1_video_format;
-
-    /**
-    * indicates the black level and range of the luma and chroma signals
-    */
-    UWORD8 u1_video_full_range_flag;
-
-    /**
-    * if 1,to 1 specifies that colour_primaries, transfer_characteristics
-    * and matrix_coefficients are present
-    */
-    UWORD8 u1_colour_description_present_flag;
-
-    /**
-    * indicates the chromaticity coordinates of the source primaries
-    */
-    UWORD8 u1_colour_primaries;
-
-    /**
-    * indicates the opto-electronic transfer characteristic of the source picture
-    */
-    UWORD8 u1_transfer_characteristics;
-
-    /**
-    * the matrix coefficients used in deriving luma and chroma signals
-    * from the green, blue, and red primaries
-    */
-    UWORD8 u1_matrix_coefficients;
-
-    /**
-    * if 1, specifies that chroma_sample_loc_type_top_field and
-    * chroma_sample_loc_type_bottom_field are present
-    */
-    UWORD8 u1_chroma_loc_info_present_flag;
-
-    /**
-    * location of chroma samples
-    */
-    UWORD8 u1_chroma_sample_loc_type_top_field;
-
-    UWORD8 u1_chroma_sample_loc_type_bottom_field;
-
-    /**
-    * if 1, indicates that the value of all decoded chroma samples is
-    * equal to 1 << ( BitDepthC - 1 )
-    */
-    UWORD8 u1_neutral_chroma_indication_flag;
-
-    /**
-    *  1 indicates that the coded video sequence conveys pictures that represent fields
-    *  0 indicates the pictures that represents field
-    */
-    UWORD8 u1_field_seq_flag;
-
-    /**
-    * specifies that picture timing SEI messages are present for every picture
-    */
-    UWORD8 u1_frame_field_info_present_flag;
-
-    /**
-    * 1 indicates that the default display window parameters follow next in the VUI
-    */
-    UWORD8 u1_default_display_window_flag;
-
-    /**
-    * specify the samples of the pictures in the coded video sequence
-    * that are within the default display window,
-    * in terms of a rectangular region specified in picture coordinates for display
-    */
-    UWORD32 u4_def_disp_win_left_offset;
-
-    UWORD32 u4_def_disp_win_right_offset;
-
-    UWORD32 u4_def_disp_win_top_offset;
-
-    UWORD32 u4_def_disp_win_bottom_offset;
-
-    /**
-    *  to 1 specifies that the syntax structure hrd_parameters is present in the vui_parameters syntax structue
-    */
-    UWORD8 u1_vui_hrd_parameters_present_flag;
-
-    /**
-    *  VUI level HRD parameters
-    */
-    hrd_params_t s_vui_hrd_parameters;
-
-    /**
-    *   Indicates the presence of the
-    *   num_units_in_ticks, time_scale flag
-    */
-    UWORD8 u1_vui_timing_info_present_flag;
-
-    /**
-    *   Number of units that
-    *   correspond to one increment of the
-    *   clock. Indicates the  resolution
-    */
-    UWORD32 u4_vui_num_units_in_tick;
-
-    /**
-    *   The number of time units that pass in one second
-    */
-    UWORD32 u4_vui_time_scale;
-    /**
-    * if 1, indicates that the POC for each picture in the coded video sequence (cvs) (not the first picture), in decoding order,
-    * is proportional to the output time of the picture relative to that of the first picture in the cvs
-    */
-    UWORD8 u1_poc_proportional_to_timing_flag;
-
-    /**
-    * num_ticks_poc_diff_one_minus1 plus 1 specifies the number of clock ticks
-    * corresponding to a difference of poc values equal to 1
-    */
-    UWORD8 u1_num_ticks_poc_diff_one_minus1;
-
-    /**
-    * 1, specifies that the following cvs bitstream restriction parameters are present
-    */
-    UWORD8 u1_bitstream_restriction_flag;
-
-    /**
-    *  if 1, indicates that each pps that is active in the cvs has
-    *  the same value of the tile syntax elements
-    */
-    UWORD8 u1_tiles_fixed_structure_flag;
-
-    /**
-    * if 0, indicates that no pel outside the pic boundaries and
-    * no sub-pels derived using pels outside the pic boundaries is used for inter prediction
-    */
-    UWORD8 u1_motion_vectors_over_pic_boundaries_flag;
-
-    /**
-    * if 1, indicates
-    * all P/B slices belonging to the same pic have an identical refpic list0,
-    * all B slices that belong to the same picture have an identical refpic list1.
-    */
-    UWORD8 u1_restricted_ref_pic_lists_flag;
-
-    /**
-    *   min_spatial_segmentation_idc, when not equal to 0, establishes a bound on the maximum possible size of distinct
-    *   coded spatial segmentation regions in the pictures of the CVS. When min_spatial_segmentation_idc is not present, it is
-    *   inferred to be equal to 0. The value of min_spatial_segmentation_idc shall be in the range of 0 to 4095, inclusive.
-    *
-    *   can be used by a decoder to calculate the maximum number of luma samples to be processed by one processing thread
-    *
-    *   If tiles=0 and entropy_sync=0 then
-    *       no slice shall exceed ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4 luma samples
-    *
-    *   If tiles=1 and entropy_sync=0 then
-    *       no tile shall exceed ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4 luma samples
-    *
-    *   If tiles=0 and entropy_sync=1 then
-    *       ( 2 * pic_height_in_luma_samples + pic_width_in_luma_samples ) * CtbSizeY
-    *               <= ( 4 * PicSizeInSamplesY ) / minSpatialSegmentationTimes4
-    */
-    UWORD32 u4_min_spatial_segmentation_idc;
-    /**
-    * Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units
-    * associated with any coded picture
-    */
-    UWORD8 u1_max_bytes_per_pic_denom;
-
-    /**
-    *  Indicates an upper bound for the number of bits of coding_unit() data
-    */
-    UWORD8 u1_max_bits_per_mincu_denom;
-
-    /**
-    * Indicate the maximum absolute value of a decoded horizontal MV component
-    * in quarter-pel luma units
-    */
-    UWORD8 u1_log2_max_mv_length_horizontal;
-
-    /**
-    * Indicate the maximum absolute value of a decoded vertical MV component
-    * in quarter-pel luma units
-    */
-    UWORD8 u1_log2_max_mv_length_vertical;
-
-
-}vui_t;
-
 
 /**
  * Structure to hold SPS info
@@ -2288,283 +2752,6 @@
 }pps_t;
 
 
-
-/**
- * Buffering Period SEI parameters Info
- */
-typedef struct
-{
-    /**
-    * specifies SPS Id active for the coded picture assosiated
-    * with the bp message.
-    */
-    UWORD8  u1_sps_id;
-
-    /**
-    * Derived from Hrd parameters
-    */
-    UWORD8  u1_sub_pic_cpb_params_present_flag;
-
-    /**
-    * specifies the presence of the initial_alt_cpb_removal_delay[ i ]
-    * and initial_alt_cpb_removal_offset[ i ] syntax elements
-    */
-    UWORD8  u1_rap_cpb_params_present_flag;
-
-    /**
-    * cbp removal delay used in buffering period SEI
-    */
-    UWORD32 cpb_delay_offset;
-
-    /**
-    * dbp removal delay used in buffering period SEI
-    */
-    UWORD32 dpb_delay_offset;
-
-    /**
-    * concatanation flag
-    */
-    UWORD8 concatenation_flag;
-
-    /**
-    * delata cbp removal delay
-    */
-    UWORD32 au_cpb_removal_delay_delta_minus1;
-
-    /**
-    * specify the default initial CPB removal delays, respectively,
-    * for the CPB when the NAL HRD parameters are in use
-    */
-    UWORD32 au4_nal_initial_cpb_removal_delay[32];
-
-    /**
-    * specify the alternate initial CPB removal delays, respectively,
-    * for the CPB when the NAL HRD parameters are in use
-    */
-    UWORD32 au4_nal_initial_alt_cpb_removal_delay[32];
-
-    /**
-    * specify the initial CPB removal delay offset, respectively,
-    * for the CPB when the NAL HRD parameters are in use
-    */
-    UWORD32 au4_nal_initial_cpb_removal_delay_offset[32];
-
-    /**
-    * specify the alternate initial CPB removal delays offsets, respectively,
-    * for the CPB when the NAL HRD parameters are in use
-    */
-    UWORD32 au4_nal_initial_alt_cpb_removal_delay_offset[32];
-
-    /**
-    * specify the default initial CPB removal delays, respectively,
-    * for the CPB when the VCL HRD parameters are in use
-    */
-    UWORD32 au4_vcl_initial_cpb_removal_delay[32];
-
-    /**
-    * specify the initial alt CPB removal delays , respectively,
-    * for the CPB when the VCL HRD parameters are in use
-    */
-    UWORD32 au4_vcl_initial_alt_cpb_removal_delay[32];
-
-    /**
-    * specify the initial CPB removal delay offset, respectively,
-    * for the CPB when the VCL HRD parameters are in use
-    */
-    UWORD32 au4_vcl_initial_cpb_removal_delay_offset[32];
-
-    /**
-    * specify the alternate initial CPB removal delays offsets, respectively,
-    * for the CPB when the VCL HRD parameters are in use
-    */
-    UWORD32 au4_vcl_initial_alt_cpb_removal_delay_offset[32];
-
-    /**
-    *  Inital CPB removal delay
-    */
-    UWORD32 u4_initial_cpb_removal_delay_length;
-
-    /**
-    *  CPB cnt for corr. sublayer
-    */
-    UWORD32 u4_cpb_cnt;
-
-
-    /**
-    * VBV buffer size used in buffering period SEI
-    */
-    UWORD32 u4_buffer_size_sei;
-
-    /**
-    * Encoder buffer fullness  used in buffering period SEI
-    */
-    UWORD32 u4_dbf_sei;
-
-    /**
-    * target bitrate used in buffering period SEI
-    */
-    UWORD32 u4_target_bit_rate_sei;
-
-
-
-
-}buf_period_sei_params_t;
-
-
-/**
- * Picture Timing SEI parameters Info
- */
-typedef struct
-{
-    /**
-    * derived from vui parameters
-    */
-    UWORD8 u1_frame_field_info_present_flag;
-
-    /**
-    * indicates whether a picture should be displayed as a
-    * frame or as one or more fields
-    */
-    UWORD32 u4_pic_struct;
-
-    UWORD8  u1_num_clk_ticks;
-
-    /**
-    * indicates whether a scan-type of the pic should be interpreted
-    * as progressive or interlaced
-    */
-    UWORD8 u1_progressive_source_idc;
-
-    /**
-    * if 1, indicates if the current pic is a duplicte pic in output order
-    */
-    UWORD8 u1_duplicate_flag;
-
-    /**
-    * specifies the number clock ticks between the nominal CPB removal time
-    * au associated with the pt SEI message and
-    * the preceding au in decoding order that contained a bp SEI message
-    */
-    UWORD32 u4_au_cpb_removal_delay_minus1;
-
-    /**
-    * compute the DPB output time of the picture
-    */
-    UWORD32 u4_pic_dpb_output_delay;
-
-    UWORD32 u4_pic_dpb_output_du_delay;
-
-    /**
-    * specifies the number of decoding units in the access unit
-    * the picture timing SEI message is associated with
-    */
-    UWORD32 u4_num_decoding_units_minus1;
-
-    /**
-    * if 1 specifies that the du_common_cpb_removal_delay_increment_minus1 is present
-    */
-    UWORD32 u4_du_common_cpb_removal_delay_flag;
-
-    /**
-    * specifies the duration, in units of clock sub-ticks,
-    * between the nominal CPB removal times of any two consecutive decoding units
-    * in decoding order in the access unit associated with the pt_SEI message
-    */
-    UWORD32 u4_du_common_cpb_removal_delay_increment_minus1; //same as u4_du_cpb_removal_delay_increment_minus1
-
-    /**
-    * specifies the number of NAL units in the decoding unit of the access unit
-    * the picture timing SEI message is associated with.
-    * range from 0 to (pic size in ctby - 1)
-    */
-    UWORD32 u4_num_nalus_in_du_minus1;
-
-    /**
-    * specifies the duration, in units of clock sub-ticks,
-    * between the nominal CPB removal times of the ( i + 1 )-th decoding unit and the i-th decoding unit,
-    * in decoding order, in the access unit associated with the pt_SEI message
-    */
-    UWORD32 u4_du_cpb_removal_delay_increment_minus1;
-
-
-}pic_timing_sei_params_t;
-
-/**
- * Structure to hold Recovery point SEI parameters Info
- */
-typedef struct
-{
-    /**
-    * specifies the recovery point of output pictures in output order
-    */
-    WORD32 i4_recovery_poc_cnt;
-
-    UWORD8 u1_exact_match_flag;
-
-    /**
-    * indicates the presence or absence of a broken link in the NAL unit
-    * stream at the location of the recovery point SEI message
-    */
-
-    UWORD8 u1_broken_link_flag;
-
-}recovery_point_sei_params_t;
-/**
- * Structure to hold active parameter parameter set SEI parameters Info
- */
-typedef struct
-{
-    /*
-    * active vps id
-    */
-
-    UWORD8 u1_active_video_parameter_set_id;
-
-    /*
-    * default set to zero.
-    */
-    UWORD8 u1_self_contained_cvs_flag;
-
-    UWORD8 u1_no_parameter_set_update_flag;
-
-    UWORD8 u1_num_sps_ids_minus1;
-
-    /*
-    * active sps id
-    */
-    UWORD8 au1_active_seq_parameter_set_id[15];
-
-}active_parameter_set_sei_param_t;
-
-/**
- * Structure to hold SEI parameters Info
- */
-typedef struct
-{
-
-    WORD8 i1_sei_parameters_present_flag;
-
-    WORD8 i1_aud_present_flag;
-
-    WORD8 i1_buf_period_params_present_flag;
-
-    WORD8 i1_pic_timing_params_present_flag;
-
-    WORD8 i1_recovery_point_params_present_flag;
-
-    buf_period_sei_params_t  s_buf_period_sei_params;
-
-    pic_timing_sei_params_t  s_pic_timing_sei_params;
-
-    recovery_point_sei_params_t s_recovery_point_params;
-
-    active_parameter_set_sei_param_t s_active_parameter_set_sei_params;
-
-
-} sei_params_t;
-
-
-
 /**
  * Structure to hold slice header info
  */
diff --git a/common/ihevc_trans_tables.c b/common/ihevc_trans_tables.c
index 139699a..7c93662 100644
--- a/common/ihevc_trans_tables.c
+++ b/common/ihevc_trans_tables.c
@@ -93,6 +93,12 @@
     40, 45, 51, 57, 64, 72
 };
 
+/*Multiplied by 16 for flat scale coeff */
+const WORD32 g_ihevc_iquant_scales_flat_scale[6] =
+{
+    640, 720, 816, 912, 1024, 1152
+};
+
 const WORD16 g_ihevc_iquant_intr_scales[6][8] =
 {
     { 40, 40, 40, 40, 40, 40, 40, 40 },
@@ -250,6 +256,25 @@
     {  9, -25,  43, -57,  70, -80,  87, -90,  90, -87,  80, -70,  57, -43,  25,  -9 }
 };
 
+const WORD32 g_ai4_ihevc_trans_16[16][8] =
+{
+    { 64,  64,  64,  64,  64,  64,  64,  64 },
+    { 90,  87,  80,  70,  57,  43,  25,   9 },
+    { 89,  75,  50,  18, -18, -50, -75, -89 },
+    { 87,  57,   9, -43, -80, -90, -70, -25 },
+    { 83,  36, -36, -83, -83, -36,  36,  83 },
+    { 80,   9, -70, -87, -25,  57,  90,  43 },
+    { 75, -18, -89, -50,  50,  89,  18, -75 },
+    { 70, -43, -87,   9,  90,  25, -80, -57 },
+    { 64, -64, -64,  64,  64, -64, -64,  64 },
+    { 57, -80, -25,  90,  -9, -87,  43,  70 },
+    { 50, -89,  18,  75, -75, -18,  89, -50 },
+    { 43, -90,  57,  25, -87,  70,   9, -80 },
+    { 36, -83,  83, -36, -36,  83, -83,  36 },
+    { 25, -70,  90, -80,  43,   9, -57,  87 },
+    { 18, -50,  75, -89,  89, -75,  50, -18 },
+    {  9, -25,  43, -57,  70, -80,  87, -90}};
+
 const WORD16 g_ai2_ihevc_trans_16_transpose[1][16] =
 {
     { 64, 90, 89, 87, 83, 80, 75, 70, 64, 57, 50, 43, 36, 25, 18, 9 }
@@ -330,7 +355,41 @@
     {  4, -13,  22, -31,  38, -46,  54, -61,  67, -73,  78, -82,  85, -88,  90, -90,  90, -90,  88, -85,  82, -78,  73, -67,  61, -54,  46, -38,  31, -22,  13,  -4 }
 };
 
-
+const WORD32 g_ai4_ihevc_trans_32[32][16] =
+{
+    { 64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64},
+    { 90,  90,  88,  85,  82,  78,  73,  67,  61,  54,  46,  38,  31,  22,  13,   4},
+    { 90,  87,  80,  70,  57,  43,  25,   9,  -9, -25, -43, -57, -70, -80, -87, -90},
+    { 90,  82,  67,  46,  22,  -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13},
+    { 89,  75,  50,  18, -18, -50, -75, -89, -89, -75, -50, -18,  18,  50,  75,  89},
+    { 88,  67,  31, -13, -54, -82, -90, -78, -46,  -4,  38,  73,  90,  85,  61,  22},
+    { 87,  57,   9, -43, -80, -90, -70, -25,  25,  70,  90,  80,  43,  -9, -57, -87},
+    { 85,  46, -13, -67, -90, -73, -22,  38,  82,  88,  54,  -4, -61, -90, -78, -31},
+    { 83,  36, -36, -83, -83, -36,  36,  83,  83,  36, -36, -83, -83, -36,  36,  83},
+    { 82,  22, -54, -90, -61,  13,  78,  85,  31, -46, -90, -67,   4,  73,  88,  38},
+    { 80,   9, -70, -87, -25,  57,  90,  43, -43, -90, -57,  25,  87,  70,  -9, -80},
+    { 78,  -4, -82, -73,  13,  85,  67, -22, -88, -61,  31,  90,  54, -38, -90, -46},
+    { 75, -18, -89, -50,  50,  89,  18, -75, -75,  18,  89,  50, -50, -89, -18,  75},
+    { 73, -31, -90, -22,  78,  67, -38, -90, -13,  82,  61, -46, -88,  -4,  85,  54},
+    { 70, -43, -87,   9,  90,  25, -80, -57,  57,  80, -25, -90,  -9,  87,  43, -70},
+    { 67, -54, -78,  38,  85, -22, -90,   4,  90,  13, -88, -31,  82,  46, -73, -61},
+    { 64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64},
+    { 61, -73, -46,  82,  31, -88, -13,  90,  -4, -90,  22,  85, -38, -78,  54,  67},
+    { 57, -80, -25,  90,  -9, -87,  43,  70, -70, -43,  87,   9, -90,  25,  80, -57},
+    { 54, -85,  -4,  88, -46, -61,  82,  13, -90,  38,  67, -78, -22,  90, -31, -73},
+    { 50, -89,  18,  75, -75, -18,  89, -50, -50,  89, -18, -75,  75,  18, -89,  50},
+    { 46, -90,  38,  54, -90,  31,  61, -88,  22,  67, -85,  13,  73, -82,   4,  78},
+    { 43, -90,  57,  25, -87,  70,   9, -80,  80,  -9, -70,  87, -25, -57,  90, -43},
+    { 38, -88,  73,  -4, -67,  90, -46, -31,  85, -78,  13,  61, -90,  54,  22, -82},
+    { 36, -83,  83, -36, -36,  83, -83,  36,  36, -83,  83, -36, -36,  83, -83,  36},
+    { 31, -78,  90, -61,   4,  54, -88,  82, -38, -22,  73, -90,  67, -13, -46,  85},
+    { 25, -70,  90, -80,  43,   9, -57,  87, -87,  57,  -9, -43,  80, -90,  70, -25},
+    { 22, -61,  85, -90,  73, -38,  -4,  46, -78,  90, -82,  54, -13, -31,  67, -88},
+    { 18, -50,  75, -89,  89, -75,  50, -18, -18,  50, -75,  89, -89,  75, -50,  18},
+    { 13, -38,  61, -78,  88, -90,  85, -73,  54, -31,   4,  22, -46,  67, -82,  90},
+    {  9, -25,  43, -57,  70, -80,  87, -90,  90, -87,  80, -70,  57, -43,  25,  -9},
+    {  4, -13,  22, -31,  38, -46,  54, -61,  67, -73,  78, -82,  85, -88,  90, -90}
+};
 
 const WORD32 g_ai2_ihevc_trans_32_intr_16[15][4] =
 { /* 4*32 = 128 bit */
diff --git a/common/ihevc_trans_tables.h b/common/ihevc_trans_tables.h
index 7295967..581cd92 100644
--- a/common/ihevc_trans_tables.h
+++ b/common/ihevc_trans_tables.h
@@ -41,6 +41,8 @@
 
 extern const WORD16 g_ihevc_iquant_intr_scales[6][8];
 
+extern const WORD32 g_ihevc_iquant_scales_flat_scale[6];
+
 extern const WORD32 g_ihevc_quant_scales[6];
 
 extern const WORD16 g_ai2_ihevc_trans_dst_4[4][4];
@@ -52,10 +54,11 @@
 extern const WORD16 g_ai2_ihevc_trans_8[8][8];
 
 extern const WORD16 g_ai2_ihevc_trans_16[16][16];
+extern const WORD32 g_ai4_ihevc_trans_16[16][8];
 extern const WORD16 g_ai2_ihevc_trans_16_transpose[1][16];
 extern const WORD16 g_ai2_ihevc_trans_32_transpose[1][32];
 extern const WORD16 g_ai2_ihevc_trans_32[32][32];
-
+extern const WORD32 g_ai4_ihevc_trans_32[32][16];
 
 extern const WORD32 g_ai4_ihevc_trans_dst_intr_4[3][4];
 
diff --git a/common/ihevc_typedefs.h b/common/ihevc_typedefs.h
index 47a7a2f..7a82b7f 100644
--- a/common/ihevc_typedefs.h
+++ b/common/ihevc_typedefs.h
@@ -48,6 +48,7 @@
 
 typedef double          DOUBLE;
 
+typedef char           STRWORD8;
 
 
 
diff --git a/common/ithread.c b/common/ithread.c
index e3d5e00..0b55206 100644
--- a/common/ithread.c
+++ b/common/ithread.c
@@ -38,7 +38,6 @@
 #include "ithread.h"
 #include <sys/types.h>
 
-#ifndef X86_MSVC
 //#define PTHREAD_AFFINITY
 //#define SYSCALL_AFFINITY
 
@@ -52,266 +51,6 @@
 #include <semaphore.h>
 #include <unistd.h>
 
-
-#endif
-
-
-
-
-#ifdef X86_MSVC
-
-#include <windows.h>
-#define SEM_MAX_COUNT       100
-#define SEM_INCREMENT_COUNT 1
-
-UWORD32 ithread_get_handle_size(void)
-{
-    return (sizeof(HANDLE));
-}
-
-UWORD32 ithread_get_mutex_lock_size(void)
-{
-    return (sizeof(HANDLE));
-}
-
-WORD32 ithread_create(void *thread_handle, void *attribute, void *strt, void *argument)
-{
-    HANDLE *ppv_thread_handle;
-    HANDLE thread_handle_value;
-
-    if(0 == thread_handle)
-        return -1;
-
-    ppv_thread_handle = (HANDLE *)thread_handle;
-    thread_handle_value = (void *)CreateThread
-                    (NULL,                              /* Attributes      */
-                     1024 * 128,                        /* Stack size      */
-                     (LPTHREAD_START_ROUTINE)strt,      /* Thread function */
-                     argument,                          /* Parameters      */
-                     0,                                 /* Creation flags  */
-                     NULL);                             /* Thread ID       */
-    *ppv_thread_handle = (HANDLE)thread_handle_value;
-
-    return 0;
-}
-
-WORD32 ithread_join(void *thread_handle, void **val_ptr)
-{
-    HANDLE *ppv_thread_handle;
-    HANDLE thread_handle_value;
-
-    if(0 == thread_handle)
-        return -1;
-
-    ppv_thread_handle = (HANDLE *)thread_handle;
-    thread_handle_value = *ppv_thread_handle;
-
-    if(WAIT_OBJECT_0 == WaitForSingleObject(thread_handle_value, INFINITE))
-    {
-        CloseHandle(thread_handle_value);
-    }
-
-    return 0;
-}
-
-void ithread_exit(void *thread_handle)
-{
-    HANDLE *ppv_thread_handle;
-    HANDLE thread_handle_value;
-    DWORD thread_exit_code;
-
-    if(0 == thread_handle)
-        return;
-
-    ppv_thread_handle = (HANDLE *)thread_handle;
-    thread_handle_value = *ppv_thread_handle;
-    /* Get exit code for thread. If the return value is 0, means thread is busy */
-    if(0 != GetExitCodeThread(thread_handle_value, &thread_exit_code))
-    {
-        TerminateThread(thread_handle_value, thread_exit_code);
-    }
-
-    return;
-}
-
-WORD32 ithread_get_mutex_struct_size(void)
-{
-    return (sizeof(HANDLE));
-}
-
-WORD32 ithread_mutex_init(void *mutex)
-{
-    HANDLE *ppv_mutex_handle;
-    HANDLE mutex_handle_value;
-
-    if(0 == mutex)
-        return -1;
-
-    ppv_mutex_handle = (HANDLE *)mutex;
-    mutex_handle_value = CreateSemaphore(NULL, 1, 1, NULL);
-    *ppv_mutex_handle = mutex_handle_value;
-    return 0;
-}
-
-WORD32 ithread_mutex_destroy(void *mutex)
-{
-    HANDLE *ppv_mutex_handle;
-    HANDLE mutex_handle_value;
-
-    if(0 == mutex)
-        return -1;
-
-    ppv_mutex_handle = (HANDLE *)mutex;
-    mutex_handle_value = *ppv_mutex_handle;
-    CloseHandle(mutex_handle_value);
-    return 0;
-}
-
-WORD32 ithread_mutex_lock(void *mutex)
-{
-    HANDLE *ppv_mutex_handle;
-    HANDLE mutex_handle_value;
-    DWORD  result = 0;
-
-    if(0 == mutex)
-        return -1;
-
-    ppv_mutex_handle = (HANDLE *)mutex;
-    mutex_handle_value = *ppv_mutex_handle;
-    result = WaitForSingleObject(mutex_handle_value, INFINITE);
-
-    if(WAIT_OBJECT_0 == result)
-        return 0;
-
-    return 1;
-
-}
-
-WORD32 ithread_mutex_unlock(void *mutex)
-{
-    HANDLE *ppv_mutex_handle;
-    HANDLE mutex_handle_value;
-    DWORD  result = 0;
-
-    if(0 == mutex)
-        return -1;
-
-    ppv_mutex_handle = (HANDLE *)mutex;
-    mutex_handle_value = *ppv_mutex_handle;
-    result = ReleaseSemaphore(mutex_handle_value, 1, NULL);
-
-    if(0 == result)
-        return -1;
-
-    return 0;
-}
-
-void ithread_yield(void) { }
-
-void ithread_usleep(UWORD32 u4_time_us)
-{
-    UWORD32 u4_time_ms = u4_time_us / 1000;
-    Sleep(u4_time_ms);
-}
-
-void ithread_msleep(UWORD32 u4_time_ms)
-{
-    Sleep(u4_time_ms);
-}
-
-
-void ithread_sleep(UWORD32 u4_time)
-{
-    UWORD32 u4_time_ms = u4_time * 1000;
-    Sleep(u4_time_ms);
-}
-
-UWORD32 ithread_get_sem_struct_size(void)
-{
-    return (sizeof(HANDLE));
-}
-
-WORD32 ithread_sem_init(void *sem, WORD32 pshared, UWORD32 value)
-{
-    HANDLE *sem_handle = (HANDLE *)sem;
-    HANDLE sem_handle_value;
-
-    if(0 == sem)
-        return -1;
-
-    sem_handle_value = CreateSemaphore(NULL,  /* Security Attribute*/
-                                       value,  /* Initial count     */
-                                       SEM_MAX_COUNT, /* Max value         */
-                                       NULL);        /* Name, not used    */
-    *sem_handle = sem_handle_value;
-    return 0;
-}
-
-WORD32 ithread_sem_post(void *sem)
-{
-    HANDLE *sem_handle = (HANDLE *)sem;
-    HANDLE sem_handle_value;
-
-    if(0 == sem)
-        return -1;
-
-    sem_handle_value = *sem_handle;
-
-    /* Post on Semaphore by releasing the lock on mutex */
-    if(ReleaseSemaphore(sem_handle_value, SEM_INCREMENT_COUNT, NULL))
-        return 0;
-
-    return -1;
-}
-
-WORD32 ithread_sem_wait(void *sem)
-{
-    DWORD          result = 0;
-    HANDLE *sem_handle = (HANDLE *)sem;
-    HANDLE sem_handle_value;
-
-    if(0 == sem)
-        return -1;
-
-    sem_handle_value = *sem_handle;
-
-    /* Wait on Semaphore object infinitly */
-    result = WaitForSingleObject(sem_handle_value, INFINITE);
-
-    /* If lock on semaphore is acquired, return SUCCESS */
-    if(WAIT_OBJECT_0 == result)
-        return 0;
-
-    /* If call timeouts, return FAILURE */
-    if(WAIT_TIMEOUT == result)
-        return -1;
-
-    return 0;
-}
-
-WORD32 ithread_sem_destroy(void *sem)
-{
-    HANDLE *sem_handle = (HANDLE *)sem;
-    HANDLE sem_handle_value;
-
-    if(0 == sem)
-        return -1;
-
-    sem_handle_value = *sem_handle;
-
-    if(FALSE == CloseHandle(sem_handle_value))
-    {
-        return -1;
-    }
-    return 0;
-}
-
-WORD32 ithread_set_affinity(WORD32 core_id)
-{
-    return 1;
-}
-
-#else
 UWORD32 ithread_get_handle_size(void)
 {
     return sizeof(pthread_t);
@@ -322,7 +61,6 @@
     return sizeof(pthread_mutex_t);
 }
 
-
 WORD32 ithread_create(void *thread_handle, void *attribute, void *strt, void *argument)
 {
     return pthread_create((pthread_t *)thread_handle, attribute, (void * (*)(void *))strt, argument);
@@ -388,7 +126,6 @@
     return (sizeof(sem_t));
 }
 
-
 WORD32 ithread_sem_init(void *sem, WORD32 pshared, UWORD32 value)
 {
     return sem_init((sem_t *)sem, pshared, value);
@@ -399,19 +136,16 @@
     return sem_post((sem_t *)sem);
 }
 
-
 WORD32 ithread_sem_wait(void *sem)
 {
     return sem_wait((sem_t *)sem);
 }
 
-
 WORD32 ithread_sem_destroy(void *sem)
 {
     return sem_destroy((sem_t *)sem);
 }
 
-
 WORD32 ithread_set_affinity(WORD32 core_id)
 {
 
@@ -446,6 +180,4 @@
 #endif
 
     return core_id;
-
 }
-#endif
diff --git a/common/iv.h b/common/iv.h
index a60cf47..842bb6c 100644
--- a/common/iv.h
+++ b/common/iv.h
@@ -63,20 +63,6 @@
     IV_FAIL                                     = 0x1,
 }IV_API_CALL_STATUS_T;
 
-/* IV_MEM_TYPE_T: This Enumeration defines the type of memory (Internal/Ext */
-/* -ernal) along with the cacheable/non-cacheable attributes                */
-
-typedef enum {
-    IV_NA_MEM_TYPE                              = 0x7FFFFFFF,
-    IV_INTERNAL_CACHEABLE_PERSISTENT_MEM        = 0x1,
-    IV_INTERNAL_CACHEABLE_SCRATCH_MEM           = 0x2,
-    IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM        = 0x3,
-    IV_EXTERNAL_CACHEABLE_SCRATCH_MEM           = 0x4,
-    IV_INTERNAL_NONCACHEABLE_PERSISTENT_MEM     = 0x5,
-    IV_INTERNAL_NONCACHEABLE_SCRATCH_MEM        = 0x6,
-    IV_EXTERNAL_NONCACHEABLE_PERSISTENT_MEM     = 0x7,
-    IV_EXTERNAL_NONCACHEABLE_SCRATCH_MEM        = 0x8
-}IV_MEM_TYPE_T;
 
 /* IV_COLOR_FORMAT_T: This enumeration lists all the color formats which    */
 /* finds usage in video/image codecs                                        */
@@ -148,10 +134,6 @@
 /* IV_API_COMMAND_TYPE_T:API command type                                   */
 typedef enum {
     IV_CMD_NA                           = 0x7FFFFFFF,
-    IV_CMD_GET_NUM_MEM_REC              = 0x0,
-    IV_CMD_FILL_NUM_MEM_REC             = 0x1,
-    IV_CMD_RETRIEVE_MEMREC              = 0x2,
-    IV_CMD_INIT                         = 0x3,
     IV_CMD_DUMMY_ELEMENT                = 0x4,
 }IV_API_COMMAND_TYPE_T;
 
@@ -178,35 +160,6 @@
     void                                        *pv_codec_handle;
 }iv_obj_t;
 
-/* iv_mem_rec_t: This structure defines the memory record holder which will  */
-/* be used by the codec to communicate its memory requirements to the        */
-/* application through appropriate API functions                             */
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * Pointer to the memory allocated by the application
-     */
-    void                                        *pv_base;
-
-    /**
-     * u4_size of the memory to be allocated
-     */
-    UWORD32                                     u4_mem_size;
-
-    /**
-     * Alignment of the memory pointer
-     */
-    UWORD32                                     u4_mem_alignment;
-    /**
-     * Nature of the memory to be allocated
-     */
-    IV_MEM_TYPE_T                               e_mem_type;
-}iv_mem_rec_t;
 
 /* IV_YUV_BUF_T: This structure defines attributes for the yuv buffer        */
 
@@ -277,141 +230,6 @@
     UWORD32                                     u4_v_strd;
 }iv_yuv_buf_t;
 
-/*****************************************************************************/
-/*  Get Number of Memory Records                                             */
-/*****************************************************************************/
-
-/* IV_API_COMMAND_TYPE_T::e_cmd = IV_CMD_GET_NUM_MEM_REC                     */
-
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * cmd
-     */
-    IV_API_COMMAND_TYPE_T                       e_cmd;
-}iv_num_mem_rec_ip_t;
-
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * error code
-     */
-    UWORD32                                     u4_error_code;
-
-    /**
-     * num_mem_rec
-     */
-    UWORD32                                     u4_num_mem_rec;
-}iv_num_mem_rec_op_t;
-
-
-/*****************************************************************************/
-/*  Fill Memory Records                                                      */
-/*****************************************************************************/
-
-/* IV_API_COMMAND_TYPE_T::e_cmd = IV_CMD_FILL_NUM_MEM_REC                    */
-
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * cmd
-     */
-    IV_API_COMMAND_TYPE_T                       e_cmd;
-
-    /**
-     * pointer to array of memrecords structures should be filled by codec
-    with details of memory resource requirements
-     */
-    iv_mem_rec_t                                *pv_mem_rec_location;
-
-    /**
-     * maximum width for which codec should request memory requirements
-     */
-    UWORD32                                     u4_max_frm_wd;
-
-    /**
-     * maximum height for which codec should request memory requirements
-     */
-    UWORD32                                     u4_max_frm_ht;
-}iv_fill_mem_rec_ip_t;
-
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * error_code
-     */
-    UWORD32                                     u4_error_code;
-
-    /**
-     * no of memory record structures which are filled by codec
-     */
-    UWORD32                                     u4_num_mem_rec_filled;
-}iv_fill_mem_rec_op_t;
-
-
-/*****************************************************************************/
-/*  Retrieve Memory Records                                                  */
-/*****************************************************************************/
-
-/* IV_API_COMMAND_TYPE_T::e_cmd = IV_CMD_RETRIEVE_MEMREC                     */
-
-
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * cmd
-     */
-    IV_API_COMMAND_TYPE_T                       e_cmd;
-
-    /**
-     * array of structures where codec should fill with all resources(memory) with it
-     */
-    iv_mem_rec_t                                *pv_mem_rec_location;
-}iv_retrieve_mem_rec_ip_t;
-
-
-typedef struct {
-    /**
-     * u4_size of the structure
-     */
-    UWORD32                                     u4_size;
-
-    /**
-     * error_code
-     */
-    UWORD32                                     u4_error_code;
-
-    /**
-     * no of memory records filled by codec
-     */
-    UWORD32                                     u4_num_mem_rec_filled;
-}iv_retrieve_mem_rec_op_t;
-
 
 
 #endif /* _IV_H */
diff --git a/common/ivd.h b/common/ivd.h
index 812da18..fe39a78 100644
--- a/common/ivd.h
+++ b/common/ivd.h
@@ -126,7 +126,9 @@
 /* IVD_API_COMMAND_TYPE_T:API command type                                   */
 typedef enum {
     IVD_CMD_VIDEO_NA                          = 0x7FFFFFFF,
-    IVD_CMD_VIDEO_CTL                         = IV_CMD_DUMMY_ELEMENT + 1,
+    IVD_CMD_CREATE                            = IV_CMD_DUMMY_ELEMENT + 1,
+    IVD_CMD_DELETE,
+    IVD_CMD_VIDEO_CTL,
     IVD_CMD_VIDEO_DECODE,
     IVD_CMD_GET_DISPLAY_FRAME,
     IVD_CMD_REL_DISPLAY_FRAME,
@@ -226,7 +228,8 @@
     IVD_DEC_REF_BUF_NULL                        = 0x28,
     IVD_DEC_FRM_SKIPPED                         = 0x29,
     IVD_RES_CHANGED                             = 0x2a,
-    IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS      = 0x300,
+    IVD_MEM_ALLOC_FAILED                        = 0x2b,
+    IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS      = 0xD0,
 }IVD_ERROR_CODES_T;
 
 
@@ -255,10 +258,10 @@
 }ivd_out_bufdesc_t;
 
 /*****************************************************************************/
-/*   Initialize decoder                                                      */
+/*   Create decoder                                                          */
 /*****************************************************************************/
 
-/* IVD_API_COMMAND_TYPE_T::e_cmd = IVD_CMD_INIT                              */
+/* IVD_API_COMMAND_TYPE_T::e_cmd = IVD_CMD_CREATE                            */
 
 
 typedef struct {
@@ -273,26 +276,36 @@
     IVD_API_COMMAND_TYPE_T                  e_cmd;
 
     /**
-     *no memrecords which are allocated on request of codec through fill mem records
-     */
-    UWORD32                                 u4_num_mem_rec;
-    /**
-     * maximum height for which codec should be initialized
-     */
-    UWORD32                                 u4_frm_max_wd;
-    /**
-     * maximum width for which codec should be initialized
-     */
-    UWORD32                                 u4_frm_max_ht;
-    /**
      * format in which codec has to give out frame data for display
      */
     IV_COLOR_FORMAT_T                       e_output_format;
+
     /**
-     * pointer to memrecord array, which contains allocated resources
+     * Flag to indicate shared display buffer mode
      */
-    iv_mem_rec_t                            *pv_mem_rec_location;
-}ivd_init_ip_t;
+    UWORD32                                 u4_share_disp_buf;
+
+    /**
+     * Pointer to a function for aligned allocation.
+     */
+    void    *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
+
+    /**
+     * Pointer to a function for aligned free.
+     */
+    void   (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+
+    /**
+     * Pointer to memory context that is needed during alloc/free for custom
+     * memory managers. This will be passed as first argument to pf_aligned_alloc and
+     * pf_aligned_free.
+     * If application is using standard memory functions like
+     * malloc/aligned_malloc/memalign/free/aligned_free,
+     * then this is not needed and can be set to NULL
+     */
+    void    *pv_mem_ctxt;
+
+}ivd_create_ip_t;
 
 
 typedef struct {
@@ -305,8 +318,49 @@
      * u4_error_code
      */
     UWORD32                                 u4_error_code;
-}ivd_init_op_t;
 
+    /**
+     * Codec Handle
+     */
+    void                                    *pv_handle;
+
+}ivd_create_op_t;
+
+
+/*****************************************************************************/
+/*  Delete decoder                                                           */
+/*****************************************************************************/
+
+/* IVD_API_COMMAND_TYPE_T::e_cmd = IVD_CMD_DELETE                              */
+
+
+
+typedef struct {
+    /**
+     * u4_size of the structure
+     */
+    UWORD32                                     u4_size;
+
+    /**
+     * cmd
+     */
+    IVD_API_COMMAND_TYPE_T                       e_cmd;
+
+}ivd_delete_ip_t;
+
+
+typedef struct {
+    /**
+     * u4_size of the structure
+     */
+    UWORD32                                     u4_size;
+
+    /**
+     * error_code
+     */
+    UWORD32                                     u4_error_code;
+
+}ivd_delete_op_t;
 
 /*****************************************************************************/
 /*   Video Decode                                                            */
diff --git a/common/mips/ihevc_platform_macros.h b/common/mips/ihevc_platform_macros.h
index e614aea..b028624 100644
--- a/common/mips/ihevc_platform_macros.h
+++ b/common/mips/ihevc_platform_macros.h
@@ -58,10 +58,17 @@
 #define SHR_NEG(val,shift)  ((shift>0)?(val>>shift):(val<<(-shift)))
 #define SHL_NEG(val,shift)  ((shift<0)?(val>>(-shift)):(val<<shift))
 
-static inline UWORD32 CLZ(UWORD32 x)
+static inline UWORD32 CLZ(UWORD32 u4_word)
 {
-    asm("clz %0, %1" : "=r"(x) : "r"(x));
-    return x;
+    if(u4_word)
+        return (__builtin_clz(u4_word));
+    else
+        return 32;
+}
+
+static inline UWORD32 CLZNZ(UWORD32 u4_word)
+{
+   return (__builtin_clz(u4_word));
 }
 
 static inline UWORD32 CTZ(UWORD32 u4_word)
@@ -76,6 +83,8 @@
     }
 }
 
+#define POPCNT_U32(x)       __builtin_popcount(x)
+
 #define NOP(nop_cnt)    {UWORD32 nop_i; for (nop_i = 0; nop_i < nop_cnt; nop_i++);}
 
 #define INLINE
diff --git a/common/x86/ihevc_platform_macros.h b/common/x86/ihevc_platform_macros.h
index 22c58d2..1d5dc74 100644
--- a/common/x86/ihevc_platform_macros.h
+++ b/common/x86/ihevc_platform_macros.h
@@ -68,6 +68,8 @@
 
 #define NOP(nop_cnt)    {UWORD32 nop_i; for (nop_i = 0; nop_i < nop_cnt; nop_i++);}
 
+#define POPCNT_U32(x)       __builtin_popcount(x)
+
 #define PLD(a)
 #define INLINE inline
 
@@ -78,7 +80,10 @@
     else
         return 32;
 }
-
+static INLINE UWORD32 CLZNZ(UWORD32 u4_word)
+{
+   return (__builtin_clz(u4_word));
+}
 static INLINE UWORD32 CTZ(UWORD32 u4_word)
 {
     if(0 == u4_word)
diff --git a/decoder/ihevcd_api.c b/decoder/ihevcd_api.c
index ec71490..e331337 100644
--- a/decoder/ihevcd_api.c
+++ b/decoder/ihevcd_api.c
@@ -32,8 +32,8 @@
 * - ihevcd_set_default_params()
 * - ihevcd_init()
 * - ihevcd_get_num_rec()
-* - ihevcd_fill_num_mem_rec()
-* - ihevcd_init_mem_rec()
+* - ihevcd_allocate_static_bufs()
+* - ihevcd_create()
 * - ihevcd_retrieve_memrec()
 * - ihevcd_set_display_frame()
 * - ihevcd_set_flush_mode()
@@ -92,12 +92,16 @@
 #include "ihevcd_job_queue.h"
 #include "ihevcd_statistics.h"
 
+
+#define ALIGNED_FREE(ps_codec, y) \
+if(y) {ps_codec->pf_aligned_free(ps_codec->pv_mem_ctxt, ((void *)y)); (y) = NULL;}
+
 /*****************************************************************************/
 /* Function Prototypes                                                       */
 /*****************************************************************************/
 IV_API_CALL_STATUS_T ihevcd_get_version(CHAR *pc_version_string,
                                         UWORD32 u4_version_buffer_size);
-
+WORD32 ihevcd_free_dynamic_bufs(codec_t *ps_codec);
 
 
 /**
@@ -133,7 +137,7 @@
     IVD_API_COMMAND_TYPE_T e_cmd;
     UWORD32 *pu4_api_ip;
     UWORD32 *pu4_api_op;
-    WORD32 i, j;
+    WORD32 i;
 
     if(NULL == pv_api_op)
         return (IV_FAIL);
@@ -149,31 +153,14 @@
     /* error checks on handle */
     switch((WORD32)e_cmd)
     {
-        case IV_CMD_GET_NUM_MEM_REC:
-        case IV_CMD_FILL_NUM_MEM_REC:
+        case IVD_CMD_CREATE:
             break;
-        case IV_CMD_INIT:
-            if(ps_handle == NULL)
-            {
-                *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
-                *(pu4_api_op + 1) |= IVD_HANDLE_NULL;
-                return IV_FAIL;
-            }
 
-            if(ps_handle->u4_size != sizeof(iv_obj_t))
-            {
-                *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
-                *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT;
-                DEBUG("Sizes do not match. Expected: %d, Got: %d",
-                                sizeof(iv_obj_t), ps_handle->u4_size);
-                return IV_FAIL;
-            }
-            break;
         case IVD_CMD_REL_DISPLAY_FRAME:
         case IVD_CMD_SET_DISPLAY_FRAME:
         case IVD_CMD_GET_DISPLAY_FRAME:
         case IVD_CMD_VIDEO_DECODE:
-        case IV_CMD_RETRIEVE_MEMREC:
+        case IVD_CMD_DELETE:
         case IVD_CMD_VIDEO_CTL:
             if(ps_handle == NULL)
             {
@@ -205,540 +192,57 @@
 
     switch((WORD32)e_cmd)
     {
-        case IV_CMD_GET_NUM_MEM_REC:
+        case IVD_CMD_CREATE:
         {
-            ihevcd_cxa_num_mem_rec_ip_t *ps_ip =
-                            (ihevcd_cxa_num_mem_rec_ip_t *)pv_api_ip;
-            ihevcd_cxa_num_mem_rec_op_t *ps_op =
-                            (ihevcd_cxa_num_mem_rec_op_t *)pv_api_op;
-            ps_op->s_ivd_num_mem_rec_op_t.u4_error_code = 0;
+            ihevcd_cxa_create_ip_t *ps_ip = (ihevcd_cxa_create_ip_t *)pv_api_ip;
+            ihevcd_cxa_create_op_t *ps_op = (ihevcd_cxa_create_op_t *)pv_api_op;
 
-            if(ps_ip->s_ivd_num_mem_rec_ip_t.u4_size
-                            != sizeof(ihevcd_cxa_num_mem_rec_ip_t))
+
+            ps_op->s_ivd_create_op_t.u4_error_code = 0;
+
+            if((ps_ip->s_ivd_create_ip_t.u4_size > sizeof(ihevcd_cxa_create_ip_t))
+                            || (ps_ip->s_ivd_create_ip_t.u4_size
+                                            < sizeof(ivd_create_ip_t)))
             {
-                ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= 1
+                ps_op->s_ivd_create_op_t.u4_error_code |= 1
                                 << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |=
+                ps_op->s_ivd_create_op_t.u4_error_code |=
                                 IVD_IP_API_STRUCT_SIZE_INCORRECT;
+
                 return (IV_FAIL);
             }
 
-            if(ps_op->s_ivd_num_mem_rec_op_t.u4_size
-                            != sizeof(ihevcd_cxa_num_mem_rec_op_t))
+            if((ps_op->s_ivd_create_op_t.u4_size != sizeof(ihevcd_cxa_create_op_t))
+                            && (ps_op->s_ivd_create_op_t.u4_size
+                                            != sizeof(ivd_create_op_t)))
             {
-                ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= 1
+                ps_op->s_ivd_create_op_t.u4_error_code |= 1
                                 << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |=
+                ps_op->s_ivd_create_op_t.u4_error_code |=
                                 IVD_OP_API_STRUCT_SIZE_INCORRECT;
-                return (IV_FAIL);
-            }
-        }
-            break;
-        case IV_CMD_FILL_NUM_MEM_REC:
-        {
-            ihevcd_cxa_fill_mem_rec_ip_t *ps_ip =
-                            (ihevcd_cxa_fill_mem_rec_ip_t *)pv_api_ip;
-            ihevcd_cxa_fill_mem_rec_op_t *ps_op =
-                            (ihevcd_cxa_fill_mem_rec_op_t *)pv_api_op;
-            iv_mem_rec_t *ps_mem_rec;
-            WORD32 max_wd = ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd;
-            WORD32 max_ht = ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht;
 
-            max_wd = ALIGN64(max_wd);
-            max_ht = ALIGN64(max_ht);
-
-            ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0;
-
-            if((ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                            > sizeof(ihevcd_cxa_fill_mem_rec_ip_t))
-                            || (ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                                            < sizeof(iv_fill_mem_rec_ip_t)))
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_IP_API_STRUCT_SIZE_INCORRECT;
                 return (IV_FAIL);
             }
 
-            if((ps_op->s_ivd_fill_mem_rec_op_t.u4_size
-                            != sizeof(ihevcd_cxa_fill_mem_rec_op_t))
-                            && (ps_op->s_ivd_fill_mem_rec_op_t.u4_size
-                                            != sizeof(iv_fill_mem_rec_op_t)))
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_OP_API_STRUCT_SIZE_INCORRECT;
-                return (IV_FAIL);
-            }
 
-            if(max_wd < MIN_WD)
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_REQUESTED_WIDTH_NOT_SUPPPORTED;
-                return (IV_FAIL);
-            }
-
-            if(max_wd > MAX_WD)
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_REQUESTED_WIDTH_NOT_SUPPPORTED;
-                return (IV_FAIL);
-            }
-
-            if(max_ht < MIN_HT)
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED;
-                return (IV_FAIL);
-            }
-
-            if((max_ht * max_wd) > (MAX_HT * MAX_WD))
-
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED;
-                return (IV_FAIL);
-            }
-
-            if(NULL == ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location)
-            {
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                IVD_NUM_REC_NOT_SUFFICIENT;
-                return (IV_FAIL);
-            }
-
-            /* check memrecords sizes are correct */
-            ps_mem_rec = ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location;
-            for(i = 0; i < MEM_REC_CNT; i++)
-            {
-                if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
-                {
-                    ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
-                                    << IVD_UNSUPPORTEDPARAM;
-                    ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                                    IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
-                    return IV_FAIL;
-                }
-            }
-        }
-            break;
-
-        case IV_CMD_INIT:
-        {
-            ihevcd_cxa_init_ip_t *ps_ip = (ihevcd_cxa_init_ip_t *)pv_api_ip;
-            ihevcd_cxa_init_op_t *ps_op = (ihevcd_cxa_init_op_t *)pv_api_op;
-            iv_mem_rec_t *ps_mem_rec;
-            WORD32 max_wd = ps_ip->s_ivd_init_ip_t.u4_frm_max_wd;
-            WORD32 max_ht = ps_ip->s_ivd_init_ip_t.u4_frm_max_ht;
-
-            max_wd = ALIGN64(max_wd);
-            max_ht = ALIGN64(max_ht);
-
-            ps_op->s_ivd_init_op_t.u4_error_code = 0;
-
-            if((ps_ip->s_ivd_init_ip_t.u4_size > sizeof(ihevcd_cxa_init_ip_t))
-                            || (ps_ip->s_ivd_init_ip_t.u4_size
-                                            < sizeof(ivd_init_ip_t)))
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_IP_API_STRUCT_SIZE_INCORRECT;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if((ps_op->s_ivd_init_op_t.u4_size != sizeof(ihevcd_cxa_init_op_t))
-                            && (ps_op->s_ivd_init_op_t.u4_size
-                                            != sizeof(ivd_init_op_t)))
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_OP_API_STRUCT_SIZE_INCORRECT;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec != MEM_REC_CNT)
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_INIT_DEC_NOT_SUFFICIENT;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if(max_wd < MIN_WD)
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if(max_wd > MAX_WD)
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if(max_ht < MIN_HT)
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if((max_ht * max_wd) > (MAX_HT * MAX_WD))
-
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if(NULL == ps_ip->s_ivd_init_ip_t.pv_mem_rec_location)
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_NUM_REC_NOT_SUFFICIENT;
-                DEBUG("\n");
-                return (IV_FAIL);
-            }
-
-            if((ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420P)
-                            && (ps_ip->s_ivd_init_ip_t.e_output_format
+            if((ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420P)
+                            && (ps_ip->s_ivd_create_ip_t.e_output_format
                                             != IV_YUV_422ILE)
-                            && (ps_ip->s_ivd_init_ip_t.e_output_format
+                            && (ps_ip->s_ivd_create_ip_t.e_output_format
                                             != IV_RGB_565)
-                            && (ps_ip->s_ivd_init_ip_t.e_output_format
-                                            != IV_RGBA_8888)
-                            && (ps_ip->s_ivd_init_ip_t.e_output_format
+                            && (ps_ip->s_ivd_create_ip_t.e_output_format
                                             != IV_YUV_420SP_UV)
-                            && (ps_ip->s_ivd_init_ip_t.e_output_format
+                            && (ps_ip->s_ivd_create_ip_t.e_output_format
                                             != IV_YUV_420SP_VU))
             {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
+                ps_op->s_ivd_create_op_t.u4_error_code |= 1
                                 << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
+                ps_op->s_ivd_create_op_t.u4_error_code |=
                                 IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
-                DEBUG("\n");
+
                 return (IV_FAIL);
             }
 
-            /* verify number of mem records */
-            if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec < MEM_REC_CNT)
-            {
-                ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_init_op_t.u4_error_code |=
-                                IVD_INIT_DEC_MEM_REC_NOT_SUFFICIENT;
-                DEBUG("\n");
-                return IV_FAIL;
-            }
-
-            ps_mem_rec = ps_ip->s_ivd_init_ip_t.pv_mem_rec_location;
-            /* check memrecords sizes are correct */
-            for(i = 0; i < (WORD32)ps_ip->s_ivd_init_ip_t.u4_num_mem_rec; i++)
-            {
-                if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
-                {
-                    ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                    << IVD_UNSUPPORTEDPARAM;
-                    ps_op->s_ivd_init_op_t.u4_error_code |=
-                                    IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
-                    DEBUG("i: %d\n", i);
-                    return IV_FAIL;
-                }
-                /* check memrecords pointers are not NULL */
-
-                if(ps_mem_rec[i].pv_base == NULL)
-                {
-
-                    ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                    << IVD_UNSUPPORTEDPARAM;
-                    ps_op->s_ivd_init_op_t.u4_error_code |=
-                                    IVD_INIT_DEC_MEM_REC_BASE_NULL;
-                    DEBUG("i: %d\n", i);
-                    return IV_FAIL;
-
-                }
-
-            }
-
-            /* verify memtabs for overlapping regions */
-            {
-                void *start[MEM_REC_CNT];
-                void *end[MEM_REC_CNT];
-
-                start[0] = (ps_mem_rec[0].pv_base);
-                end[0] = (UWORD8 *)(ps_mem_rec[0].pv_base)
-                                + ps_mem_rec[0].u4_mem_size - 1;
-                for(i = 1; i < MEM_REC_CNT; i++)
-                {
-                    /* This array is populated to check memtab overlapp */
-                    start[i] = (ps_mem_rec[i].pv_base);
-                    end[i] = (UWORD8 *)(ps_mem_rec[i].pv_base)
-                                    + ps_mem_rec[i].u4_mem_size - 1;
-
-                    for(j = 0; j < i; j++)
-                    {
-                        if((start[i] >= start[j]) && (start[i] <= end[j]))
-                        {
-                            ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                            << IVD_UNSUPPORTEDPARAM;
-                            ps_op->s_ivd_init_op_t.u4_error_code |=
-                                            IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
-                            DEBUG("i: %d, j: %d\n", i, j);
-                            return IV_FAIL;
-                        }
-
-                        if((end[i] >= start[j]) && (end[i] <= end[j]))
-                        {
-                            ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                            << IVD_UNSUPPORTEDPARAM;
-                            ps_op->s_ivd_init_op_t.u4_error_code |=
-                                            IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
-                            DEBUG("i: %d, j: %d\n", i, j);
-                            return IV_FAIL;
-                        }
-
-                        if((start[i] < start[j]) && (end[i] > end[j]))
-                        {
-                            ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                            << IVD_UNSUPPORTEDPARAM;
-                            ps_op->s_ivd_init_op_t.u4_error_code |=
-                                            IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
-                            DEBUG("i: %d, j: %d\n", i, j);
-                            return IV_FAIL;
-                        }
-                    }
-
-                }
-            }
-
-            {
-                iv_mem_rec_t mem_rec_ittiam_api[MEM_REC_CNT];
-                ihevcd_cxa_fill_mem_rec_ip_t s_fill_mem_rec_ip;
-                ihevcd_cxa_fill_mem_rec_op_t s_fill_mem_rec_op;
-                IV_API_CALL_STATUS_T e_status;
-
-                WORD32 i;
-                s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.e_cmd =
-                                IV_CMD_FILL_NUM_MEM_REC;
-                s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location =
-                                mem_rec_ittiam_api;
-                s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd =
-                                max_wd;
-                s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht =
-                                max_ht;
-
-                if(ps_ip->s_ivd_init_ip_t.u4_size
-                                > offsetof(ihevcd_cxa_init_ip_t, i4_level))
-                {
-                    s_fill_mem_rec_ip.i4_level = ps_ip->i4_level;
-                }
-                else
-                {
-                    s_fill_mem_rec_ip.i4_level = IHEVC_LEVEL_31;
-                }
-
-                if(ps_ip->s_ivd_init_ip_t.u4_size
-                                > offsetof(ihevcd_cxa_init_ip_t,
-                                           u4_num_ref_frames))
-                {
-                    s_fill_mem_rec_ip.u4_num_ref_frames =
-                                    ps_ip->u4_num_ref_frames;
-                }
-                else
-                {
-                    s_fill_mem_rec_ip.u4_num_ref_frames = (MAX_REF_CNT + 1);
-                }
-
-                if(ps_ip->s_ivd_init_ip_t.u4_size
-                                > offsetof(ihevcd_cxa_init_ip_t,
-                                           u4_num_reorder_frames))
-                {
-                    s_fill_mem_rec_ip.u4_num_reorder_frames =
-                                    ps_ip->u4_num_reorder_frames;
-                }
-                else
-                {
-                    s_fill_mem_rec_ip.u4_num_reorder_frames = (MAX_REF_CNT + 1);
-                }
-
-                if(ps_ip->s_ivd_init_ip_t.u4_size
-                                > offsetof(ihevcd_cxa_init_ip_t,
-                                           u4_num_extra_disp_buf))
-                {
-                    s_fill_mem_rec_ip.u4_num_extra_disp_buf =
-                                    ps_ip->u4_num_extra_disp_buf;
-                }
-                else
-                {
-                    s_fill_mem_rec_ip.u4_num_extra_disp_buf = 0;
-                }
-
-                if(ps_ip->s_ivd_init_ip_t.u4_size
-                                > offsetof(ihevcd_cxa_init_ip_t,
-                                           u4_share_disp_buf))
-                {
-#ifndef LOGO_EN
-                    s_fill_mem_rec_ip.u4_share_disp_buf =
-                                    ps_ip->u4_share_disp_buf;
-#else
-                    s_fill_mem_rec_ip.u4_share_disp_buf = 0;
-#endif
-                }
-                else
-                {
-                    s_fill_mem_rec_ip.u4_share_disp_buf = 0;
-                }
-
-                s_fill_mem_rec_ip.e_output_format =
-                                ps_ip->s_ivd_init_ip_t.e_output_format;
-
-                if((s_fill_mem_rec_ip.e_output_format != IV_YUV_420P)
-                                && (s_fill_mem_rec_ip.e_output_format
-                                                != IV_YUV_420SP_UV)
-                                && (s_fill_mem_rec_ip.e_output_format
-                                                != IV_YUV_420SP_VU))
-                {
-                    s_fill_mem_rec_ip.u4_share_disp_buf = 0;
-                }
-
-                s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_size =
-                                sizeof(ihevcd_cxa_fill_mem_rec_ip_t);
-                s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_size =
-                                sizeof(ihevcd_cxa_fill_mem_rec_op_t);
-
-                for(i = 0; i < MEM_REC_CNT; i++)
-                    mem_rec_ittiam_api[i].u4_size = sizeof(iv_mem_rec_t);
-
-                e_status = ihevcd_cxa_api_function(NULL,
-                                                   (void *)&s_fill_mem_rec_ip,
-                                                   (void *)&s_fill_mem_rec_op);
-                if(IV_FAIL == e_status)
-                {
-                    ps_op->s_ivd_init_op_t.u4_error_code =
-                                    s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_error_code;
-                    DEBUG("Fail\n");
-                    return (IV_FAIL);
-                }
-
-                for(i = 0; i < MEM_REC_CNT; i++)
-                {
-#ifdef ARMRVDS
-                    if((UWORD32)(ps_mem_rec[i].pv_base) & (mem_rec_ittiam_api[i].u4_mem_alignment - 1))
-                    {
-                        ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
-                        ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR;
-                        DEBUG("Fail\n");
-                        return IV_FAIL;
-                    }
-#endif
-
-                    if(ps_mem_rec[i].u4_mem_size
-                                    < mem_rec_ittiam_api[i].u4_mem_size)
-                    {
-                        ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                        << IVD_UNSUPPORTEDPARAM;
-                        ps_op->s_ivd_init_op_t.u4_error_code |=
-                                        IVD_INIT_DEC_MEM_REC_INSUFFICIENT_SIZE;
-                        DEBUG("i: %d \n", i);
-                        return IV_FAIL;
-                    }
-                    if(ps_mem_rec[i].u4_mem_alignment
-                                    != mem_rec_ittiam_api[i].u4_mem_alignment)
-                    {
-                        ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                        << IVD_UNSUPPORTEDPARAM;
-                        ps_op->s_ivd_init_op_t.u4_error_code |=
-                                        IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR;
-                        DEBUG("i: %d \n", i);
-                        return IV_FAIL;
-                    }
-                    if(ps_mem_rec[i].e_mem_type
-                                    != mem_rec_ittiam_api[i].e_mem_type)
-                    {
-                        UWORD32 check = IV_SUCCESS;
-                        UWORD32 diff = mem_rec_ittiam_api[i].e_mem_type
-                                        - ps_mem_rec[i].e_mem_type;
-
-                        if((ps_mem_rec[i].e_mem_type
-                                        <= IV_EXTERNAL_CACHEABLE_SCRATCH_MEM)
-                                        && (mem_rec_ittiam_api[i].e_mem_type
-                                                        >= IV_INTERNAL_NONCACHEABLE_PERSISTENT_MEM))
-                        {
-                            check = IV_FAIL;
-                        }
-                        if(3 != (mem_rec_ittiam_api[i].e_mem_type % 4))
-                        {
-                            /*
-                             * It is not IV_EXTERNAL_NONCACHEABLE_PERSISTENT_MEM or IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM
-                             */
-                            if((diff < 1) || (diff > 3))
-                            {
-                                // Difference between 1 and 3 is okay for all cases other than the two filtered
-                                // with the MOD condition above
-                                check = IV_FAIL;
-                            }
-                        }
-                        else
-                        {
-                            if(diff == 1)
-                            {
-                                /*
-                                 * This particular case is when codec asked for External Persistent, but got
-                                 * Internal Scratch.
-                                 */
-                                check = IV_FAIL;
-                            }
-                            if((diff != 2) && (diff != 3))
-                            {
-                                check = IV_FAIL;
-                            }
-                        }
-                        if(check == IV_FAIL)
-                        {
-                            ps_op->s_ivd_init_op_t.u4_error_code |= 1
-                                            << IVD_UNSUPPORTEDPARAM;
-                            ps_op->s_ivd_init_op_t.u4_error_code |=
-                                            IVD_INIT_DEC_MEM_REC_INCORRECT_TYPE;
-                            DEBUG("i: %d \n", i);
-                            return IV_FAIL;
-                        }
-                    }
-                }
-            }
-
         }
             break;
 
@@ -939,49 +443,35 @@
         }
             break;
 
-        case IV_CMD_RETRIEVE_MEMREC:
+        case IVD_CMD_DELETE:
         {
-            ihevcd_cxa_retrieve_mem_rec_ip_t *ps_ip =
-                            (ihevcd_cxa_retrieve_mem_rec_ip_t *)pv_api_ip;
-            ihevcd_cxa_retrieve_mem_rec_op_t *ps_op =
-                            (ihevcd_cxa_retrieve_mem_rec_op_t *)pv_api_op;
-            iv_mem_rec_t *ps_mem_rec;
+            ihevcd_cxa_delete_ip_t *ps_ip =
+                            (ihevcd_cxa_delete_ip_t *)pv_api_ip;
+            ihevcd_cxa_delete_op_t *ps_op =
+                            (ihevcd_cxa_delete_op_t *)pv_api_op;
 
-            ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code = 0;
+            ps_op->s_ivd_delete_op_t.u4_error_code = 0;
 
-            if(ps_ip->s_ivd_retrieve_mem_rec_ip_t.u4_size
-                            != sizeof(ihevcd_cxa_retrieve_mem_rec_ip_t))
+            if(ps_ip->s_ivd_delete_ip_t.u4_size
+                            != sizeof(ihevcd_cxa_delete_ip_t))
             {
-                ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1
+                ps_op->s_ivd_delete_op_t.u4_error_code |= 1
                                 << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |=
+                ps_op->s_ivd_delete_op_t.u4_error_code |=
                                 IVD_IP_API_STRUCT_SIZE_INCORRECT;
                 return (IV_FAIL);
             }
 
-            if(ps_op->s_ivd_retrieve_mem_rec_op_t.u4_size
-                            != sizeof(ihevcd_cxa_retrieve_mem_rec_op_t))
+            if(ps_op->s_ivd_delete_op_t.u4_size
+                            != sizeof(ihevcd_cxa_delete_op_t))
             {
-                ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1
+                ps_op->s_ivd_delete_op_t.u4_error_code |= 1
                                 << IVD_UNSUPPORTEDPARAM;
-                ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |=
+                ps_op->s_ivd_delete_op_t.u4_error_code |=
                                 IVD_OP_API_STRUCT_SIZE_INCORRECT;
                 return (IV_FAIL);
             }
 
-            ps_mem_rec = ps_ip->s_ivd_retrieve_mem_rec_ip_t.pv_mem_rec_location;
-            /* check memrecords sizes are correct */
-            for(i = 0; i < MEM_REC_CNT; i++)
-            {
-                if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
-                {
-                    ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1
-                                    << IVD_UNSUPPORTEDPARAM;
-                    ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |=
-                                    IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
-                    return IV_FAIL;
-                }
-            }
         }
             break;
 
@@ -1480,7 +970,7 @@
 *******************************************************************************
 *
 * @brief
-*  Initialize the context. This will be called by  init_mem_rec and during
+*  Initialize the context. This will be called by  create and during
 * reset
 *
 * @par Description:
@@ -1501,12 +991,15 @@
     WORD32 status = IV_SUCCESS;
     WORD32 i;
 
+    /* Free any dynamic buffers that are allocated */
+    ihevcd_free_dynamic_bufs(ps_codec);
 
+    ps_codec->u4_allocate_dynamic_done = 0;
     ps_codec->i4_num_disp_bufs = 1;
     ps_codec->i4_flush_mode = 0;
 
-    ps_codec->i4_ht = ps_codec->i4_disp_ht = ps_codec->i4_max_ht;
-    ps_codec->i4_wd = ps_codec->i4_disp_wd = ps_codec->i4_max_wd;
+    ps_codec->i4_ht = ps_codec->i4_disp_ht = 0;
+    ps_codec->i4_wd = ps_codec->i4_disp_wd = 0;
     ps_codec->i4_strd = 0;
     ps_codec->i4_disp_strd = 0;
     ps_codec->i4_num_cores = 1;
@@ -1572,23 +1065,6 @@
     }
 
     ihevcd_set_default_params(ps_codec);
-    ps_codec->pv_proc_jobq = ihevcd_jobq_init(ps_codec->pv_proc_jobq_buf, ps_codec->i4_proc_jobq_buf_size);
-    RETURN_IF((ps_codec->pv_proc_jobq == NULL), IV_FAIL);
-
-    /* Update the jobq context to all the threads */
-    ps_codec->s_parse.pv_proc_jobq = ps_codec->pv_proc_jobq;
-    for(i = 0; i < MAX_PROCESS_THREADS; i++)
-    {
-        ps_codec->as_process[i].pv_proc_jobq = ps_codec->pv_proc_jobq;
-        ps_codec->as_process[i].i4_id = i;
-        ps_codec->as_process[i].ps_codec = ps_codec;
-
-        /* Set the following to zero assuming it is a single core solution
-         * When threads are launched these will be set appropriately
-         */
-        ps_codec->as_process[i].i4_check_parse_status = 0;
-        ps_codec->as_process[i].i4_check_proc_status = 0;
-    }
     /* Initialize MV Bank buffer manager */
     ihevc_buf_mgr_init((buf_mgr_t *)ps_codec->pv_mv_buf_mgr);
 
@@ -1623,11 +1099,10 @@
 *******************************************************************************
 *
 * @brief
-*  Gets number of memory records required by the codec
+*  Allocate static memory for the codec
 *
 * @par Description:
-*  Gets codec mem record requirements and adds concealment  modules
-* requirements
+*  Allocates static memory for the codec
 *
 * @param[in] pv_api_ip
 *  Pointer to input argument structure
@@ -1642,1106 +1117,178 @@
 *
 *******************************************************************************
 */
-WORD32 ihevcd_get_num_rec(void *pv_api_ip, void *pv_api_op)
+WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj,
+                                   ihevcd_cxa_create_ip_t *ps_create_ip,
+                                   ihevcd_cxa_create_op_t *ps_create_op)
 {
-
-    iv_num_mem_rec_op_t *ps_mem_q_op;
-
-    UNUSED(pv_api_ip);
-    ps_mem_q_op = (iv_num_mem_rec_op_t *)pv_api_op;
-    ps_mem_q_op->u4_num_mem_rec = MEM_REC_CNT;
-    DEBUG("Get num mem records without concealment %d\n",
-                    ps_mem_q_op->u4_num_mem_rec);
-#ifdef APPLY_CONCEALMENT
-    {
-        IV_API_CALL_STATUS_T status;
-        icncl_num_mem_rec_ip_t cncl_mem_ip;
-        icncl_num_mem_rec_op_t cncl_mem_op;
-
-        cncl_mem_ip.s_ivd_num_rec_ip_t.e_cmd = IV_CMD_GET_NUM_MEM_REC;
-        cncl_mem_ip.s_ivd_num_rec_ip_t.u4_size = sizeof(icncl_num_mem_rec_ip_t);
-
-        status = icncl_api_function(NULL, (void *)&cncl_mem_ip, (void *)&cncl_mem_op);
-
-        if(status == IV_SUCCESS)
-        {
-            /* Add the concealment library's memory requirements */
-            ps_mem_q_op->u4_num_mem_rec += cncl_mem_op.s_ivd_num_mem_rec_op_t.u4_num_mem_rec;
-            DEBUG("Get num mem records %d\n", ps_mem_q_op->u4_num_mem_rec);
-            return status; /* Nothing else to do, return */
-        }
-        else
-        {
-            /*
-             * Something went wrong with the concealment library call.
-             */
-            DEBUG("ERROR: Get num mem records %d\n", ps_mem_q_op->u4_num_mem_rec);
-            return status;
-        }
-
-    }
-#endif //APPLY_CONCEALMENT
-
-
-    return IV_SUCCESS;
-
-}
-
-/**
-*******************************************************************************
-*
-* @brief
-*  Fills memory requirements of the codec
-*
-* @par Description:
-*  Gets codec mem record requirements and adds concealment  modules
-* requirements
-*
-* @param[in] pv_api_ip
-*  Pointer to input argument structure
-*
-* @param[out] pv_api_op
-*  Pointer to output argument structure
-*
-* @returns  Status
-*
-* @remarks
-*
-*
-*******************************************************************************
-*/
-WORD32 ihevcd_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
-{
-
-    ihevcd_cxa_fill_mem_rec_ip_t *ps_mem_q_ip;
-    ihevcd_cxa_fill_mem_rec_op_t *ps_mem_q_op;
-    WORD32 level;
-    WORD32 num_reorder_frames;
-    WORD32 num_ref_frames;
-    WORD32 num_extra_disp_bufs;
-    WORD32 max_dpb_size;
-
-    iv_mem_rec_t *ps_mem_rec;
-    iv_mem_rec_t *ps_mem_rec_base;
-    WORD32 no_of_mem_rec_filled;
-    WORD32 chroma_format, share_disp_buf;
-    WORD32 max_ctb_cnt;
-    WORD32 max_wd_luma, max_wd_chroma;
-    WORD32 max_ht_luma, max_ht_chroma;
-    WORD32 max_tile_cols, max_tile_rows;
-    WORD32 max_ctb_rows, max_ctb_cols;
-    WORD32 max_num_cu_cols;
+    WORD32 size;
+    void *pv_buf;
+    UWORD8 *pu1_buf;
     WORD32 i;
-    WORD32 max_num_4x4_cols;
+    codec_t *ps_codec;
     IV_API_CALL_STATUS_T status = IV_SUCCESS;
-    no_of_mem_rec_filled = 0;
-
-    //TODO: Remove as and when the following are used
-    UNUSED(num_extra_disp_bufs);
-    UNUSED(no_of_mem_rec_filled);
-    UNUSED(max_wd_chroma);
-    UNUSED(max_ht_chroma);
-
-    ps_mem_q_ip = (ihevcd_cxa_fill_mem_rec_ip_t *)pv_api_ip;
-    ps_mem_q_op = (ihevcd_cxa_fill_mem_rec_op_t *)pv_api_op;
-
-    if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_fill_mem_rec_ip_t, i4_level))
-    {
-        level = ps_mem_q_ip->i4_level;
-        /* Spec requires level should be multiplied by 30
-         * API has values where level is multiplied by 10. This keeps it consistent with H264
-         * Because of the above differences, level is multiplied by 3 here.
-         */
-        level *= 3;
-    }
-    else
-    {
-        level = MAX_LEVEL;
-    }
-
-    if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_fill_mem_rec_ip_t,
-                               u4_num_reorder_frames))
-    {
-        num_reorder_frames = ps_mem_q_ip->u4_num_reorder_frames;
-    }
-    else
-    {
-        num_reorder_frames = MAX_REF_CNT;
-    }
-
-    if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_fill_mem_rec_ip_t, u4_num_ref_frames))
-    {
-        num_ref_frames = ps_mem_q_ip->u4_num_ref_frames;
-    }
-    else
-    {
-        num_ref_frames = MAX_REF_CNT;
-    }
-
-    if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_fill_mem_rec_ip_t,
-                               u4_num_extra_disp_buf))
-    {
-        num_extra_disp_bufs = ps_mem_q_ip->u4_num_extra_disp_buf;
-    }
-    else
-    {
-        num_extra_disp_bufs = 0;
-    }
-
-    if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_fill_mem_rec_ip_t, u4_share_disp_buf))
-    {
-#ifndef LOGO_EN
-        share_disp_buf = ps_mem_q_ip->u4_share_disp_buf;
-#else
-        share_disp_buf = 0;
-#endif
-    }
-    else
-    {
-        share_disp_buf = 0;
-    }
-
-    if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_fill_mem_rec_ip_t, e_output_format))
-    {
-        chroma_format = ps_mem_q_ip->e_output_format;
-    }
-    else
-    {
-        chroma_format = -1;
-    }
-
-    /* Shared disp buffer mode is supported only for 420SP formats */
-    if((chroma_format != IV_YUV_420P) &&
-       (chroma_format != IV_YUV_420SP_UV) &&
-       (chroma_format != IV_YUV_420SP_VU))
-    {
-        share_disp_buf = 0;
-    }
-
-    {
-
-        max_ht_luma = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht;
-        max_wd_luma = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd;
-
-        max_ht_luma = ALIGN64(max_ht_luma);
-        max_wd_luma = ALIGN64(max_wd_luma);
-
-
-
-        max_tile_cols = (max_wd_luma + MIN_TILE_WD - 1) / MIN_TILE_WD;
-        max_tile_rows = (max_ht_luma + MIN_TILE_HT - 1) / MIN_TILE_HT;
-        max_ctb_rows  = max_ht_luma / MIN_CTB_SIZE;
-        max_ctb_cols  = max_wd_luma / MIN_CTB_SIZE;
-        max_ctb_cnt   = max_ctb_rows * max_ctb_cols;
-        max_num_cu_cols = max_wd_luma / MIN_CU_SIZE;
-        max_num_4x4_cols = max_wd_luma / 4;
-    }
-    /*
-     * If level is lesser than 31 and the resolution required is higher,
-     * then make the level at least 31.
-     */
-    /*    if (num_mbs > MAX_NUM_MBS_3_0 && level < MAX_LEVEL)
-     {
-     level           = MAX_LEVEL;
-     }
-     */
-    if((level < MIN_LEVEL) || (level > MAX_LEVEL))
-    {
-        ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                        IHEVCD_LEVEL_UNSUPPORTED;
-        level = MAX_LEVEL;
-    }
-    if(num_ref_frames > MAX_REF_CNT)
-    {
-        ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                        IHEVCD_NUM_REF_UNSUPPORTED;
-        num_ref_frames = MAX_REF_CNT;
-    }
-
-    if(num_reorder_frames > MAX_REF_CNT)
-    {
-        ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
-                        IHEVCD_NUM_REORDER_UNSUPPORTED;
-        num_reorder_frames = MAX_REF_CNT;
-    }
-
-    max_dpb_size = ihevcd_get_dpb_size(level, max_wd_luma * max_ht_luma);
-    ps_mem_rec_base = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location;
-
-    /* Set all memory reconds as persistent and alignment as 128
-     * by default
-     */
-    ps_mem_rec = ps_mem_rec_base;
-    for(i = 0; i < MEM_REC_CNT; i++)
-    {
-        ps_mem_rec->u4_mem_alignment = 128;
-        ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
-        ps_mem_rec++;
-    }
+    void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
+    void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+    void *pv_mem_ctxt;
 
     /* Request memory for HEVCD object */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_IV_OBJ];
-    ps_mem_rec->u4_mem_size = sizeof(iv_obj_t);
+    ps_create_op->s_ivd_create_op_t.pv_handle = NULL;
 
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_IV_OBJ,
-                    ps_mem_rec->u4_mem_size);
+    pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
+    pf_aligned_free = ps_create_ip->s_ivd_create_ip_t.pf_aligned_free;
+    pv_mem_ctxt  = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
 
-    /* Request memory for HEVC Codec context */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_CODEC];
-    ps_mem_rec->u4_mem_size = sizeof(codec_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CODEC,
-                    ps_mem_rec->u4_mem_size);
 
-    /* Request memory for buffer which holds bitstream after emulation prevention */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_BITSBUF];
-    ps_mem_rec->u4_mem_size = MAX((max_wd_luma * max_ht_luma), MIN_BITSBUF_SIZE);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_BITSBUF,
-                    ps_mem_rec->u4_mem_size);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(iv_obj_t));
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    *pps_codec_obj = (iv_obj_t *)pv_buf;
+    ps_create_op->s_ivd_create_op_t.pv_handle = *pps_codec_obj;
 
-    /* Request memory for buffer which holds TU structures and coeff data for
-     * a set of CTBs in the current picture */
-    /*TODO Currently the buffer is allocated at a frame level. Reduce this to
-     * allocate for s set of CTBs and add appropriate synchronization logic to
-     * ensure that this is data is not overwritten before consumption
-     */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TU_DATA];
-    ps_mem_rec->u4_mem_size = ihevcd_get_tu_data_size(max_wd_luma * max_ht_luma);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_TU_DATA,
-                    ps_mem_rec->u4_mem_size);
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_MVBANK];
-
-    ps_mem_rec->u4_mem_size = sizeof(buf_mgr_t);
-
-    /* Size for holding mv_buf_t for each MV Bank */
-    /* Note this allocation is done for BUF_MGR_MAX_CNT instead of
-     * max_dpb_size or MAX_DPB_SIZE for following reasons
-     * max_dpb_size will be based on max_wd and max_ht
-     * For higher max_wd and max_ht this number will be smaller than MAX_DPB_SIZE
-     * But during actual initialization number of buffers allocated can be more
-     *
-     * One extra MV Bank is needed to hold current pics MV bank.
-     * Since this is only a structure allocation and not actual buffer allocation,
-     * it is allocated for (MAX_DPB_SIZE + 1) entries
-     */
-    ps_mem_rec->u4_mem_size += (MAX_DPB_SIZE + 1) * sizeof(mv_buf_t);
-
-    {
-        /* Allocate for pu_map, pu_t and pic_pu_idx for each MV bank */
-        /* Note: Number of luma samples is not max_wd * max_ht here, instead it is
-         * set to maximum number of luma samples allowed at the given level.
-         * This is done to ensure that any stream with width and height lesser
-         * than max_wd and max_ht is supported. Number of buffers required can be greater
-         * for lower width and heights at a given level and this increased number of buffers
-         * might require more memory than what max_wd and max_ht buffer would have required
-         * Also note one extra buffer is allocted to store current pictures MV bank
-         * In case of asynchronous parsing and processing, number of buffers should increase here
-         * based on when parsing and processing threads are synchronized
-         */
-        WORD32 lvl_idx = ihevcd_get_lvl_idx(level);
-        WORD32 max_luma_samples = gai4_ihevc_max_luma_pic_size[lvl_idx];
-        ps_mem_rec->u4_mem_size += (max_dpb_size + 1) *
-                        ihevcd_get_pic_mv_bank_size(max_luma_samples);
-        DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MVBANK,
-                        ps_mem_rec->u4_mem_size);
-    }
-    // TODO GPU : Have to creat ping-pong view for VPS,SPS,PPS.
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_VPS];
-    ps_mem_rec->u4_mem_size = MAX_VPS_CNT * sizeof(vps_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_VPS,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SPS];
-    ps_mem_rec->u4_mem_size = MAX_SPS_CNT * sizeof(sps_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SPS,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PPS];
-    ps_mem_rec->u4_mem_size = MAX_PPS_CNT * sizeof(pps_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PPS,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SLICE_HDR];
-    ps_mem_rec->u4_mem_size = MAX_SLICE_HDR_CNT * sizeof(slice_header_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SLICE_HDR,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TILE];
-    {
-        WORD32 tile_size;
-
-        tile_size  = max_tile_cols * max_tile_rows;
-        tile_size  *= sizeof(tile_t);
-
-
-        ps_mem_rec->u4_mem_size = MAX_PPS_CNT * tile_size;
-    }
-
-
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_TILE,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTRY_OFST];
-    {
-        WORD32 num_entry_points;
-
-        /* One entry point per tile */
-        num_entry_points  = max_tile_cols * max_tile_rows;
-
-        /* One entry point per row of CTBs */
-        /*********************************************************************/
-        /* Only tiles or entropy sync is enabled at a time in main           */
-        /* profile, but since memory required does not increase too much,    */
-        /* this allocation is done to handle both cases                      */
-        /*********************************************************************/
-        num_entry_points  += max_ctb_rows;
-
-
-        ps_mem_rec->u4_mem_size = sizeof(WORD32) * num_entry_points;
-    }
-
-
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_ENTRY_OFST,
-                    ps_mem_rec->u4_mem_size);
-
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SCALING_MAT];
-    {
-        WORD32 scaling_mat_size;
-
-        SCALING_MAT_SIZE(scaling_mat_size)
-        ps_mem_rec->u4_mem_size = (MAX_SPS_CNT + MAX_PPS_CNT) * scaling_mat_size * sizeof(WORD16);
-    }
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SCALING_MAT,
-                    ps_mem_rec->u4_mem_size);
-
-    /* Holds one row skip_flag at 8x8 level used during parsing */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_SKIP_FLAG];
-
-    /* 1 bit per 8x8 */
-    ps_mem_rec->u4_mem_size = max_num_cu_cols / 8;
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PARSE_SKIP_FLAG,
-                  ps_mem_rec->u4_mem_size);
-
-    /* Holds one row skip_flag at 8x8 level used during parsing */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_CT_DEPTH];
-
-    /* 2 bits per 8x8 */
-    ps_mem_rec->u4_mem_size = max_num_cu_cols / 4;
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PARSE_CT_DEPTH,
-                  ps_mem_rec->u4_mem_size);
-
-    /* Holds one row skip_flag at 8x8 level used during parsing */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_INTRA_PRED_MODE];
-
-    /* 8 bits per 4x4 */
-    /* 16 bytes each for top and left 64 pixels and 16 bytes for default mode */
-    ps_mem_rec->u4_mem_size = 3 * 16 * sizeof(UWORD8);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PARSE_INTRA_PRED_MODE,
-                  ps_mem_rec->u4_mem_size);
-
-    /* Holds one intra mode at 8x8 level for entire picture */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_INTRA_FLAG];
-
-    /* 1 bit per 8x8 */
-    ps_mem_rec->u4_mem_size = (max_wd_luma / MIN_CU_SIZE) * (max_ht_luma / MIN_CU_SIZE) / 8;
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_INTRA_FLAG,
-                  ps_mem_rec->u4_mem_size);
-
-    /* Holds one transquant bypass flag at 8x8 level for entire picture */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TRANSQUANT_BYPASS_FLAG];
-
-    /* 1 bit per 8x8 */
-    /* Extra row and column are allocated for easy processing of top and left blocks while loop filtering */
-    ps_mem_rec->u4_mem_size = ((max_wd_luma + 64) / MIN_CU_SIZE) * ((max_ht_luma + 64) / MIN_CU_SIZE) / 8;
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_TRANSQUANT_BYPASS_FLAG,
-                  ps_mem_rec->u4_mem_size);
-
-    /* Request memory to hold thread handles for each processing thread */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_THREAD_HANDLE];
-    ps_mem_rec->u4_mem_size = MAX_PROCESS_THREADS * ithread_get_handle_size();
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_THREAD_HANDLE,
-                    ps_mem_rec->u4_mem_size);
-
-
-    {
-        WORD32 job_queue_size;
-        WORD32 num_jobs;
-        ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_JOBQ];
-
-
-        /* One job per row of CTBs */
-        num_jobs  = max_ctb_rows;
-
-        /* One each tile a row of CTBs, num_jobs has to incremented */
-        num_jobs  *= max_tile_cols;
-
-        /* One format convert/frame copy job per row of CTBs for non-shared mode*/
-        num_jobs  += max_ctb_rows;
-
-
-        job_queue_size = ihevcd_jobq_ctxt_size();
-        job_queue_size += num_jobs * sizeof(proc_job_t);
-        ps_mem_rec->u4_mem_size = job_queue_size;
-        DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PROC_JOBQ,
-                        ps_mem_rec->u4_mem_size);
-    }
-
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_MAP];
-    ps_mem_rec->u4_mem_size = max_ctb_cnt;
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PARSE_MAP,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_MAP];
-    ps_mem_rec->u4_mem_size = max_ctb_cnt;
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PROC_MAP,
-                    ps_mem_rec->u4_mem_size);
-
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_DISP_MGR];
-
-    /* size for holding display manager context */
-    ps_mem_rec->u4_mem_size = sizeof(buf_mgr_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_DISP_MGR,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_DPB_MGR];
-
-    /* size for holding dpb manager context */
-    ps_mem_rec->u4_mem_size = sizeof(dpb_mgr_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_DPB_MGR,
-                    ps_mem_rec->u4_mem_size);
-
-    /** Holds top and left neighbor's pu idx into picture level pu array */
-    /* Only one top row is enough but left has to be replicated for each process context */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PIC_PU_IDX_NEIGHBOR];
-
-    ps_mem_rec->u4_mem_size = (max_num_4x4_cols  /* left */ + MAX_PROCESS_THREADS * (MAX_CTB_SIZE / 4)/* top */ + 1/* top right */) * sizeof(WORD32);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PIC_PU_IDX_NEIGHBOR,
-                    ps_mem_rec->u4_mem_size);
-
-
-
-    /* TO hold scratch buffers needed for each process context */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_SCRATCH];
-    {
-        WORD32 size = 0;
-        WORD32 inter_pred_tmp_buf_size;
-        WORD32 ntaps_luma;
-        WORD32 pu_map_size;
-        WORD32 sao_size = 0;
-        ntaps_luma = 8;
-
-        /* Max inter pred size (number of bytes) */
-        inter_pred_tmp_buf_size = sizeof(WORD16) * (MAX_CTB_SIZE + ntaps_luma) * MAX_CTB_SIZE;
-        inter_pred_tmp_buf_size = ALIGN64(inter_pred_tmp_buf_size);
-
-
-        /* To hold pu_index w.r.t. frame level pu_t array for a CTB at 4x4 level*/
-        /* 16 x 16 4x4 in a CTB of size 64 x 64 and two extra needed for holding
-         * neighbors
-         */
-        pu_map_size = sizeof(WORD32) * (18 * 18);
-
-        pu_map_size = ALIGN64(pu_map_size);
-        size += pu_map_size;
-
-        /* To hold inter pred temporary buffers */
-        size += 2 * inter_pred_tmp_buf_size;
-
-
-        /* Allocate for each process context */
-        size *= MAX_PROCESS_THREADS;
-
-
-        /* To hold SAO left buffer for luma */
-        sao_size += sizeof(UWORD8) * (MAX(max_ht_luma, max_wd_luma));
-
-        /* To hold SAO left buffer for chroma */
-        sao_size += sizeof(UWORD8) * (MAX(max_ht_luma, max_wd_luma));
-
-        /* To hold SAO top buffer for luma */
-        sao_size += sizeof(UWORD8) * max_wd_luma;
-
-        /* To hold SAO top buffer for chroma */
-        sao_size += sizeof(UWORD8) * max_wd_luma;
-
-        /* To hold SAO top left luma pixel value for last output ctb in a row*/
-        sao_size += sizeof(UWORD8) * max_ctb_rows;
-
-        /* To hold SAO top left chroma pixel value last output ctb in a row*/
-        sao_size += sizeof(UWORD8) * max_ctb_rows * 2;
-
-        /* To hold SAO top left pixel luma for current ctb - column array*/
-        sao_size += sizeof(UWORD8) * max_ctb_rows;
-
-        /* To hold SAO top left pixel chroma for current ctb-column array*/
-        sao_size += sizeof(UWORD8) * max_ctb_rows * 2;
-
-        /* To hold SAO top right pixel luma pixel value last output ctb in a row*/
-        sao_size += sizeof(UWORD8) * max_ctb_cols;
-
-        /* To hold SAO top right pixel chroma pixel value last output ctb in a row*/
-        sao_size += sizeof(UWORD8) * max_ctb_cols * 2;
-
-        /*To hold SAO botton bottom left pixels for luma*/
-        sao_size += sizeof(UWORD8) * max_ctb_rows;
-
-        /*To hold SAO botton bottom left pixels for luma*/
-        sao_size += sizeof(UWORD8) * max_ctb_rows * 2;
-        sao_size = ALIGN64(sao_size);
-        size += sao_size;
-        ps_mem_rec->u4_mem_size = size;
-    }
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PROC_SCRATCH,
-                    ps_mem_rec->u4_mem_size);
-
-    /* TO hold scratch buffers needed for each SAO context */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SAO_SCRATCH];
-    {
-        WORD32 size = 0;
-
-        size = 4 * MAX_CTB_SIZE * MAX_CTB_SIZE;
-
-        /* 2 temporary buffers*/
-        size *= 2;
-
-        size *= MAX_PROCESS_THREADS;
-
-        ps_mem_rec->u4_mem_size = size;
-    }
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SAO_SCRATCH,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_BS_QP];
-    {
-        WORD32 size = 0;
-        WORD32 vert_bs_size, horz_bs_size;
-        WORD32 qp_const_flag_size;
-        WORD32 qp_size, num_8x8;
-
-        /* Max Number of vertical edges */
-        vert_bs_size = max_wd_luma / 8 + 2 * MAX_CTB_SIZE / 8;
-
-        /* Max Number of horizontal edges - extra MAX_CTB_SIZE / 8 to handle the last 4 rows separately(shifted CTB processing) */
-        vert_bs_size *= (max_ht_luma + MAX_CTB_SIZE) / MIN_TU_SIZE;
-
-        /* Number of bytes */
-        vert_bs_size /= 8;
-
-        /* Two bits per edge */
-        vert_bs_size *= 2;
-
-        /* Max Number of horizontal edges */
-        horz_bs_size = max_ht_luma / 8 + MAX_CTB_SIZE / 8;
-
-        /* Max Number of vertical edges - extra MAX_CTB_SIZE / 8 to handle the last 4 columns separately(shifted CTB processing) */
-        horz_bs_size *= (max_wd_luma + MAX_CTB_SIZE) / MIN_TU_SIZE;
-
-        /* Number of bytes */
-        horz_bs_size /= 8;
-
-        /* Two bits per edge */
-        horz_bs_size *= 2;
-
-        /* Max CTBs in a row */
-        qp_const_flag_size = max_wd_luma / MIN_CTB_SIZE + 1 /* The last ctb row deblk is done in last ctb + 1 row.*/;
-
-        /* Max CTBs in a column */
-        qp_const_flag_size *= max_ht_luma / MIN_CTB_SIZE;
-
-        /* Number of bytes */
-        qp_const_flag_size = (qp_const_flag_size + 7) >> 3;
-
-        /* QP changes at CU level - So store at 8x8 level */
-        num_8x8 = (max_ht_luma * max_wd_luma) / (MIN_CU_SIZE * MIN_CU_SIZE);
-        qp_size = num_8x8;
-
-        /* To hold vertical boundary strength */
-        size += vert_bs_size;
-
-        /* To hold horizontal boundary strength */
-        size += horz_bs_size;
-
-        /* To hold QP */
-        size += qp_size;
-
-        /* To hold QP const in CTB flags */
-        size += qp_const_flag_size;
-
-        ps_mem_rec->u4_mem_size = size;
-    }
-
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_BS_QP,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TILE_IDX];
-    {
-        WORD32 size = 0;
-        /* Max CTBs in a row */
-        size  = max_wd_luma / MIN_CTB_SIZE + 2 /* Top row and bottom row extra. This ensures accessing left,top in first row
-                                                  and right in last row will not result in invalid access*/;
-        /* Max CTBs in a column */
-        size *= max_ht_luma / MIN_CTB_SIZE;
-
-        size *= sizeof(UWORD16);
-        ps_mem_rec->u4_mem_size = size;
-    }
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_TILE_IDX,
-                    ps_mem_rec->u4_mem_size);
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SAO];
-    {
-        UWORD32 size;
-
-        /* 4 bytes per color component per CTB */
-        size = 3 * 4;
-
-        /* MAX number of CTBs in a row */
-        size *= max_wd_luma / MIN_CTB_SIZE;
-
-        /* MAX number of CTBs in a column */
-        size *= max_ht_luma / MIN_CTB_SIZE;
-        ps_mem_rec->u4_mem_size = size;
-    }
-
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SAO,
-                    ps_mem_rec->u4_mem_size);
-
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_REF_PIC];
-
-    /* size for holding buffer manager context */
-    ps_mem_rec->u4_mem_size = sizeof(buf_mgr_t);
-
-    /* Size for holding pic_buf_t for each reference picture */
-    /* Note this allocation is done for BUF_MGR_MAX_CNT instead of
-     * max_dpb_size or MAX_DPB_SIZE for following reasons
-     * max_dpb_size will be based on max_wd and max_ht
-     * For higher max_wd and max_ht this number will be smaller than MAX_DPB_SIZE
-     * But during actual initialization number of buffers allocated can be more
-     *
-     * Also to handle display depth application can allocate more than what
-     * codec asks for in case of non-shared mode
-     * Since this is only a structure allocation and not actual buffer allocation,
-     * it is allocated for BUF_MGR_MAX_CNT entries
-     */
-    ps_mem_rec->u4_mem_size += BUF_MGR_MAX_CNT * sizeof(pic_buf_t);
-
-    /* In case of non-shared mode allocate for reference picture buffers */
-    /* In case of shared and 420p output, allocate for chroma samples */
-    if((0 == share_disp_buf) || (chroma_format == IV_YUV_420P))
-    {
-        UWORD32 init_num_bufs;
-        UWORD32 init_extra_bufs;
-        WORD32 chroma_only;
-
-        chroma_only = 0;
-        init_extra_bufs = 0;
-        init_num_bufs = num_reorder_frames + num_ref_frames + 1;
-
-        /* In case of shared display buffers and chroma format 420P
-         * Allocate for chroma in reference buffers, luma buffer will be display buffer
-         */
-
-        if((1 == share_disp_buf) && (chroma_format == IV_YUV_420P))
-        {
-            chroma_only = 1;
-            init_extra_bufs = num_extra_disp_bufs;
-        }
-
-        /* Note: Number of luma samples is not max_wd * max_ht here, instead it is
-         * set to maximum number of luma samples allowed at the given level.
-         * This is done to ensure that any stream with width and height lesser
-         * than max_wd and max_ht is supported. Number of buffers required can be greater
-         * for lower width and heights at a given level and this increased number of buffers
-         * might require more memory than what max_wd and max_ht buffer would have required
-         * Number of buffers is doubled in order to return one frame at a time instead of sending
-         * multiple outputs during dpb full case.
-         * Also note one extra buffer is allocted to store current picture
-         * In case of asynchronous parsing and processing, number of buffers should increase here
-         * based on when parsing and processing threads are synchronized
-         */
-        ps_mem_rec->u4_mem_size +=
-                        ihevcd_get_total_pic_buf_size(max_wd_luma * max_ht_luma, level,  PAD_WD,  PAD_HT,
-                                                      init_num_bufs, init_extra_bufs, chroma_only);
-    }
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_REF_PIC,
-                    ps_mem_rec->u4_mem_size);
-
-    /* Request memory to hold mem records to be returned during retrieve call */
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_BACKUP];
-    ps_mem_rec->u4_mem_size = MEM_REC_CNT * sizeof(iv_mem_rec_t);
-    DEBUG("\nMemory record Id %d = %d \n", MEM_REC_BACKUP,
-                    ps_mem_rec->u4_mem_size);
-
-    /* Each memtab size is aligned to next multiple of 128 bytes */
-    /* This is to ensure all the memtabs start at different cache lines */
-    ps_mem_rec = ps_mem_rec_base;
-    for(i = 0; i < MEM_REC_CNT; i++)
-    {
-        ps_mem_rec->u4_mem_size = ALIGN128(ps_mem_rec->u4_mem_size);
-        ps_mem_rec++;
-    }
-    ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled = MEM_REC_CNT;
-#ifdef APPLY_CONCEALMENT
-    {
-        IV_API_CALL_STATUS_T status;
-        icncl_fill_mem_rec_ip_t cncl_fill_ip;
-        icncl_fill_mem_rec_op_t cncl_fill_op;
-        UWORD8 mem_loc = MEM_REC_CNT;
-
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = &(memTab[mem_loc]);
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.u4_size = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size;
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd = max_wd_luma;
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht = max_ht_luma;
-
-        status = icncl_api_function(NULL, (void *)&cncl_fill_ip, (void *)&cncl_fill_op);
-
-        if(IV_SUCCESS == status)
-        {
-            icncl_num_mem_rec_ip_t cncl_mem_ip;
-            icncl_num_mem_rec_op_t cncl_mem_op;
-
-            cncl_mem_ip.s_ivd_num_rec_ip_t.e_cmd = IV_CMD_GET_NUM_MEM_REC;
-            cncl_mem_ip.s_ivd_num_rec_ip_t.u4_size = sizeof(icncl_num_mem_rec_ip_t);
-
-            status = icncl_api_function(NULL, (void *)&cncl_mem_ip, (void *)&cncl_mem_op);
-            if(IV_SUCCESS == status)
-            {
-                ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled += cncl_mem_op.s_ivd_num_mem_rec_op_t.u4_num_mem_rec;
-            }
-        }
-
-        return status;
-
-    }
-#endif //APPLY_CONCEALMENT
-    DEBUG("Num mem recs in fill call : %d\n",
-                    ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled);
-
-
-    return (status);
-}
-
-
-/**
-*******************************************************************************
-*
-* @brief
-*  Initializes from mem records passed to the codec
-*
-* @par Description:
-*  Initializes pointers based on mem records passed
-*
-* @param[in] ps_codec_obj
-*  Pointer to codec object at API level
-*
-* @param[in] pv_api_ip
-*  Pointer to input argument structure
-*
-* @param[out] pv_api_op
-*  Pointer to output argument structure
-*
-* @returns  Status
-*
-* @remarks
-*
-*
-*******************************************************************************
-*/
-WORD32 ihevcd_init_mem_rec(iv_obj_t *ps_codec_obj,
-                           void *pv_api_ip,
-                           void *pv_api_op)
-{
-
-    ihevcd_cxa_init_ip_t *dec_init_ip;
-    ihevcd_cxa_init_op_t *dec_init_op;
-    WORD32 i;
-    iv_mem_rec_t *ps_mem_rec, *ps_mem_rec_base;
-    WORD32 status = IV_SUCCESS;
-    codec_t *ps_codec;
-    WORD32 max_tile_cols, max_tile_rows;
-
-    dec_init_ip = (ihevcd_cxa_init_ip_t *)pv_api_ip;
-    dec_init_op = (ihevcd_cxa_init_op_t *)pv_api_op;
-
-    ps_mem_rec_base = dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_CODEC];
-    ps_codec_obj->pv_codec_handle = ps_mem_rec->pv_base;
-
-    ps_codec = (codec_t *)(ps_codec_obj->pv_codec_handle);
+    (*pps_codec_obj)->pv_codec_handle = NULL;
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(codec_t));
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    (*pps_codec_obj)->pv_codec_handle = (codec_t *)pv_buf;
+    ps_codec = (codec_t *)pv_buf;
 
-    /* Note this memset can not be done in init() call, since init will called
-    during reset as well. And calling this during reset will mean all pointers
-    need to reinitialized*/
     memset(ps_codec, 0, sizeof(codec_t));
 
-    if(dec_init_ip->s_ivd_init_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_init_ip_t, i4_level))
-    {
-        ps_codec->i4_init_level = dec_init_ip->i4_level;
-
-        ps_codec->i4_init_level *= 3;
-    }
-    else
-    {
-        ps_codec->i4_init_level = MAX_LEVEL;
-    }
-
-    if(dec_init_ip->s_ivd_init_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_init_ip_t, u4_num_ref_frames))
-    {
-        ps_codec->i4_init_num_ref = dec_init_ip->u4_num_ref_frames;
-    }
-    else
-    {
-        ps_codec->i4_init_num_ref = MAX_REF_CNT;
-    }
-
-    if(dec_init_ip->s_ivd_init_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_init_ip_t, u4_num_reorder_frames))
-    {
-        ps_codec->i4_init_num_reorder = dec_init_ip->u4_num_reorder_frames;
-    }
-    else
-    {
-        ps_codec->i4_init_num_reorder = MAX_REF_CNT;
-    }
-
-    if(dec_init_ip->s_ivd_init_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_init_ip_t, u4_num_extra_disp_buf))
-    {
-        ps_codec->i4_init_num_extra_disp_buf =
-                        dec_init_ip->u4_num_extra_disp_buf;
-    }
-    else
-    {
-        ps_codec->i4_init_num_extra_disp_buf = 0;
-    }
-
-    if(dec_init_ip->s_ivd_init_ip_t.u4_size
-                    > offsetof(ihevcd_cxa_init_ip_t, u4_share_disp_buf))
-    {
 #ifndef LOGO_EN
-        ps_codec->i4_share_disp_buf = dec_init_ip->u4_share_disp_buf;
+    ps_codec->i4_share_disp_buf = ps_create_ip->s_ivd_create_ip_t.u4_share_disp_buf;
 #else
-        ps_codec->i4_share_disp_buf = 0;
+    ps_codec->i4_share_disp_buf = 0;
 #endif
-    }
-    else
-    {
-        ps_codec->i4_share_disp_buf = 0;
-    }
+
     /* Shared display mode is supported only for 420SP and 420P formats */
-    if((dec_init_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420P) &&
-       (dec_init_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420SP_UV) &&
-       (dec_init_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420SP_VU))
+    if((ps_create_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420P) &&
+       (ps_create_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420SP_UV) &&
+       (ps_create_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420SP_VU))
     {
         ps_codec->i4_share_disp_buf = 0;
     }
 
-    if((ps_codec->i4_init_level < MIN_LEVEL)
-                    || (ps_codec->i4_init_level > MAX_LEVEL))
-    {
-        dec_init_op->s_ivd_init_op_t.u4_error_code |= IHEVCD_LEVEL_UNSUPPORTED;
-        return (IV_FAIL);
-    }
+    ps_codec->e_chroma_fmt = ps_create_ip->s_ivd_create_ip_t.e_output_format;
 
-    if(ps_codec->i4_init_num_ref > MAX_REF_CNT)
-    {
-        dec_init_op->s_ivd_init_op_t.u4_error_code |=
-                        IHEVCD_NUM_REF_UNSUPPORTED;
-        ps_codec->i4_init_num_ref = MAX_REF_CNT;
-    }
+    ps_codec->pf_aligned_alloc = pf_aligned_alloc;
+    ps_codec->pf_aligned_free = pf_aligned_free;
+    ps_codec->pv_mem_ctxt = pv_mem_ctxt;
 
-    if(ps_codec->i4_init_num_reorder > MAX_REF_CNT)
-    {
-        dec_init_op->s_ivd_init_op_t.u4_error_code |=
-                        IHEVCD_NUM_REORDER_UNSUPPORTED;
-        ps_codec->i4_init_num_reorder = MAX_REF_CNT;
-    }
+    /* Request memory to hold thread handles for each processing thread */
+    size = MAX_PROCESS_THREADS * ithread_get_handle_size();
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
 
-    if(ps_codec->i4_init_num_extra_disp_buf > MAX_REF_CNT)
-    {
-        dec_init_op->s_ivd_init_op_t.u4_error_code |=
-                        IHEVCD_NUM_EXTRA_DISP_UNSUPPORTED;
-        ps_codec->i4_init_num_extra_disp_buf = 0;
-    }
-
-    ps_codec->e_chroma_fmt = dec_init_ip->s_ivd_init_ip_t.e_output_format;
-
-    ps_codec->i4_max_wd = dec_init_ip->s_ivd_init_ip_t.u4_frm_max_wd;
-    ps_codec->i4_max_ht = dec_init_ip->s_ivd_init_ip_t.u4_frm_max_ht;
-
-    ps_codec->i4_max_wd = ALIGN64(ps_codec->i4_max_wd);
-    ps_codec->i4_max_ht = ALIGN64(ps_codec->i4_max_ht);
-
-    ps_codec->i4_new_max_wd = ps_codec->i4_max_wd;
-    ps_codec->i4_new_max_ht = ps_codec->i4_max_ht;
-
-    max_tile_cols = (ps_codec->i4_max_wd + MIN_TILE_WD - 1) / MIN_TILE_WD;
-    max_tile_rows = (ps_codec->i4_max_ht + MIN_TILE_HT - 1) / MIN_TILE_HT;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_BACKUP];
-    ps_codec->ps_mem_rec_backup = (iv_mem_rec_t *)ps_mem_rec->pv_base;
-
-    memcpy(ps_codec->ps_mem_rec_backup, ps_mem_rec_base,
-           MEM_REC_CNT * sizeof(iv_mem_rec_t));
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_BITSBUF];
-    ps_codec->pu1_bitsbuf = (UWORD8 *)ps_mem_rec->pv_base;
-    ps_codec->u4_bitsbuf_size = ps_mem_rec->u4_mem_size;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TU_DATA];
-    ps_codec->pv_tu_data = ps_mem_rec->pv_base;
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_MVBANK];
-    ps_codec->pv_mv_buf_mgr = ps_mem_rec->pv_base;
-    ps_codec->pv_mv_bank_buf_base = (UWORD8 *)ps_codec->pv_mv_buf_mgr + sizeof(buf_mgr_t);
-
-    ps_codec->i4_total_mv_bank_size = ps_mem_rec->u4_mem_size - sizeof(buf_mgr_t);
-
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_VPS];
-    ps_codec->ps_vps_base = (vps_t *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.ps_vps_base = ps_codec->ps_vps_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SPS];
-    ps_codec->ps_sps_base = (sps_t *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.ps_sps_base = ps_codec->ps_sps_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PPS];
-    ps_codec->ps_pps_base = (pps_t *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.ps_pps_base = ps_codec->ps_pps_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SLICE_HDR];
-    memset(ps_mem_rec->pv_base, 0, ps_mem_rec->u4_mem_size);
-    ps_codec->ps_slice_hdr_base = (slice_header_t *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.ps_slice_hdr_base = ps_codec->ps_slice_hdr_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TILE];
-    ps_codec->ps_tile = (tile_t *)ps_mem_rec->pv_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTRY_OFST];
-    ps_codec->pi4_entry_ofst = (WORD32 *)ps_mem_rec->pv_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SCALING_MAT];
-    ps_codec->pi2_scaling_mat = (WORD16 *)ps_mem_rec->pv_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_SKIP_FLAG];
-    ps_codec->s_parse.pu4_skip_cu_top = (UWORD32 *)ps_mem_rec->pv_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_CT_DEPTH];
-    ps_codec->s_parse.pu4_ct_depth_top = (UWORD32 *)ps_mem_rec->pv_base;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_INTRA_PRED_MODE];
-    ps_codec->s_parse.pu1_luma_intra_pred_mode_left =
-                    (UWORD8 *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.pu1_luma_intra_pred_mode_top  =
-                    (UWORD8 *)ps_mem_rec->pv_base + 16;
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_INTRA_FLAG];
-
-    memset(ps_mem_rec->pv_base, 0, (ps_codec->i4_max_wd / MIN_CU_SIZE) * (ps_codec->i4_max_ht / MIN_CU_SIZE) / 8);
-
-    ps_codec->pu1_pic_intra_flag = (UWORD8 *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.pu1_pic_intra_flag = ps_codec->pu1_pic_intra_flag;
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TRANSQUANT_BYPASS_FLAG];
-
-    {
-        WORD32 loop_filter_size = ((ps_codec->i4_max_wd  + 64) / MIN_CU_SIZE) * ((ps_codec->i4_max_ht + 64) / MIN_CU_SIZE) / 8;
-        WORD32 loop_filter_strd = (ps_codec->i4_max_wd + 63) >> 6;
-
-        memset(ps_mem_rec->pv_base, 0, loop_filter_size);
-
-        /* The offset is added for easy processing of top and left blocks while loop filtering */
-        ps_codec->pu1_pic_no_loop_filter_flag = (UWORD8 *)ps_mem_rec->pv_base + loop_filter_strd + 1;
-        ps_codec->s_parse.pu1_pic_no_loop_filter_flag = ps_codec->pu1_pic_no_loop_filter_flag;
-        ps_codec->s_parse.s_deblk_ctxt.pu1_pic_no_loop_filter_flag = ps_codec->pu1_pic_no_loop_filter_flag;
-        ps_codec->s_parse.s_sao_ctxt.pu1_pic_no_loop_filter_flag = ps_codec->pu1_pic_no_loop_filter_flag;
-    }
-
-    /* Initialize pointers in PPS structures */
-    {
-        sps_t *ps_sps = ps_codec->ps_sps_base;
-        pps_t *ps_pps = ps_codec->ps_pps_base;
-        tile_t *ps_tile =  ps_codec->ps_tile;
-        WORD16 *pi2_scaling_mat =  ps_codec->pi2_scaling_mat;
-        WORD32 scaling_mat_size;
-
-        SCALING_MAT_SIZE(scaling_mat_size);
-
-        for(i = 0; i < MAX_SPS_CNT; i++)
-        {
-            ps_sps->pi2_scaling_mat  = pi2_scaling_mat;
-            pi2_scaling_mat += scaling_mat_size;
-            ps_sps++;
-        }
-
-        for(i = 0; i < MAX_PPS_CNT; i++)
-        {
-            ps_pps->ps_tile = ps_tile;
-            ps_tile += (max_tile_cols * max_tile_rows);
-
-            ps_pps->pi2_scaling_mat  = pi2_scaling_mat;
-            pi2_scaling_mat += scaling_mat_size;
-            ps_pps++;
-        }
-
-    }
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_THREAD_HANDLE];
     for(i = 0; i < MAX_PROCESS_THREADS; i++)
     {
         WORD32 handle_size = ithread_get_handle_size();
         ps_codec->apv_process_thread_handle[i] =
-                        (UWORD8 *)ps_mem_rec->pv_base + (i * handle_size);
+                        (UWORD8 *)pv_buf + (i * handle_size);
     }
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_JOBQ];
-    ps_codec->pv_proc_jobq_buf = ps_mem_rec->pv_base;
-    ps_codec->i4_proc_jobq_buf_size = ps_mem_rec->u4_mem_size;
+    /* Request memory for static bitstream buffer which holds bitstream after emulation prevention */
+    size = MIN_BITSBUF_SIZE;
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pu1_bitsbuf_static = pv_buf;
+    ps_codec->u4_bitsbuf_size_static = size;
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PARSE_MAP];
-    ps_codec->pu1_parse_map = (UWORD8 *)ps_mem_rec->pv_base;
+    /* size for holding display manager context */
+    size = sizeof(buf_mgr_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_disp_buf_mgr = pv_buf;
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_MAP];
-    ps_codec->pu1_proc_map = (UWORD8 *)ps_mem_rec->pv_base;
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_DISP_MGR];
-    ps_codec->pv_disp_buf_mgr = ps_mem_rec->pv_base;
+    /* size for holding dpb manager context */
+    size = sizeof(dpb_mgr_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_dpb_mgr = pv_buf;
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_DPB_MGR];
-    ps_codec->pv_dpb_mgr = ps_mem_rec->pv_base;
+    /* size for holding buffer manager context */
+    size = sizeof(buf_mgr_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_pic_buf_mgr = pv_buf;
+
+    /* size for holding mv buffer manager context */
+    size = sizeof(buf_mgr_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_mv_buf_mgr = pv_buf;
+
+    size = MAX_VPS_CNT * sizeof(vps_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->ps_vps_base = pv_buf;
+    ps_codec->s_parse.ps_vps_base = ps_codec->ps_vps_base;
+
+    size = MAX_SPS_CNT * sizeof(sps_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->ps_sps_base = pv_buf;
+    ps_codec->s_parse.ps_sps_base = ps_codec->ps_sps_base;
+
+    size = MAX_PPS_CNT * sizeof(pps_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->ps_pps_base = pv_buf;
+    ps_codec->s_parse.ps_pps_base = ps_codec->ps_pps_base;
+
+    size = MAX_SLICE_HDR_CNT * sizeof(slice_header_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->ps_slice_hdr_base = (slice_header_t *)pv_buf;
+    ps_codec->s_parse.ps_slice_hdr_base = ps_codec->ps_slice_hdr_base;
 
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PIC_PU_IDX_NEIGHBOR];
+    SCALING_MAT_SIZE(size)
+    size = (MAX_SPS_CNT + MAX_PPS_CNT) * size * sizeof(WORD16);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pi2_scaling_mat = (WORD16 *)pv_buf;
+
+
+    /* Size for holding pic_buf_t for each reference picture
+     * Since this is only a structure allocation and not actual buffer allocation,
+     * it is allocated for BUF_MGR_MAX_CNT entries
+     */
+    size = BUF_MGR_MAX_CNT * sizeof(pic_buf_t);
+    pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_pic_buf_base = (UWORD8 *)pv_buf;
+
+    /* TO hold scratch buffers needed for each SAO context */
+    size = 4 * MAX_CTB_SIZE * MAX_CTB_SIZE;
+
+    /* 2 temporary buffers*/
+    size *= 2;
+    size *= MAX_PROCESS_THREADS;
+
+    pu1_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pu1_buf), IV_FAIL);
 
     for(i = 0; i < MAX_PROCESS_THREADS; i++)
     {
-        UWORD32 *pu4_buf = (UWORD32 *)ps_mem_rec->pv_base;
-        ps_codec->as_process[i].pu4_pic_pu_idx_left = pu4_buf + i * (MAX_CTB_SIZE / 4);
-        memset(ps_codec->as_process[i].pu4_pic_pu_idx_left, 0, sizeof(UWORD32) * MAX_CTB_SIZE / 4);
-        ps_codec->as_process[i].pu4_pic_pu_idx_top = pu4_buf + MAX_PROCESS_THREADS * (MAX_CTB_SIZE / 4);
+        ps_codec->as_process[i].s_sao_ctxt.pu1_tmp_buf_luma = (UWORD8 *)pu1_buf;
+        pu1_buf += 4 * MAX_CTB_SIZE * MAX_CTB_SIZE * sizeof(UWORD8);
+
+        ps_codec->as_process[i].s_sao_ctxt.pu1_tmp_buf_chroma = (UWORD8 *)pu1_buf;
+        pu1_buf += 4 * MAX_CTB_SIZE * MAX_CTB_SIZE * sizeof(UWORD8);
     }
-    memset(ps_codec->as_process[0].pu4_pic_pu_idx_top, 0, sizeof(UWORD32) * (ps_codec->i4_max_wd / 4 + 1));
 
+    /* Allocate intra pred modes buffer */
+    /* 8 bits per 4x4 */
+    /* 16 bytes each for top and left 64 pixels and 16 bytes for default mode */
+    size =  3 * 16 * sizeof(UWORD8);
+    pu1_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pu1_buf), IV_FAIL);
+    ps_codec->s_parse.pu1_luma_intra_pred_mode_left = pu1_buf;
+    ps_codec->s_parse.pu1_luma_intra_pred_mode_top  = pu1_buf + 16;
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_SCRATCH];
-    memset(ps_mem_rec->pv_base, 0, ps_mem_rec->u4_mem_size);
     {
-        UWORD8 *pu1_buf = (UWORD8 *)ps_mem_rec->pv_base;
-        WORD32 pic_pu_idx_map_size;
-
         WORD32 inter_pred_tmp_buf_size, ntaps_luma;
+        WORD32 pic_pu_idx_map_size;
 
         /* Max inter pred size */
         ntaps_luma = 8;
@@ -2752,6 +1299,15 @@
         /* To hold pu_index w.r.t. frame level pu_t array for a CTB */
         pic_pu_idx_map_size = sizeof(WORD32) * (18 * 18);
         pic_pu_idx_map_size = ALIGN64(pic_pu_idx_map_size);
+
+        size =  inter_pred_tmp_buf_size * 2;
+        size += pic_pu_idx_map_size;
+        size *= MAX_PROCESS_THREADS;
+
+        pu1_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+        RETURN_IF((NULL == pu1_buf), IV_FAIL);
+        memset(pu1_buf, 0, size);
+
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].pi2_inter_pred_tmp_buf1 = (WORD16 *)pu1_buf;
@@ -2777,52 +1333,370 @@
             ps_codec->as_process[i].i4_inter_pred_tmp_buf_strd = MAX_CTB_SIZE;
 
         }
+    }
+    /* Initialize pointers in PPS structures */
+    {
+        sps_t *ps_sps = ps_codec->ps_sps_base;
+        pps_t *ps_pps = ps_codec->ps_pps_base;
+        WORD16 *pi2_scaling_mat =  ps_codec->pi2_scaling_mat;
+        WORD32 scaling_mat_size;
+
+        SCALING_MAT_SIZE(scaling_mat_size);
+
+        for(i = 0; i < MAX_SPS_CNT; i++)
+        {
+            ps_sps->pi2_scaling_mat  = pi2_scaling_mat;
+            pi2_scaling_mat += scaling_mat_size;
+            ps_sps++;
+        }
+
+        for(i = 0; i < MAX_PPS_CNT; i++)
+        {
+            ps_pps->pi2_scaling_mat  = pi2_scaling_mat;
+            pi2_scaling_mat += scaling_mat_size;
+            ps_pps++;
+        }
+    }
+
+    return (status);
+}
+
+/**
+*******************************************************************************
+*
+* @brief
+*  Free static memory for the codec
+*
+* @par Description:
+*  Free static memory for the codec
+*
+* @param[in] ps_codec
+*  Pointer to codec context
+*
+* @returns  Status
+*
+* @remarks
+*
+*
+*******************************************************************************
+*/
+WORD32 ihevcd_free_static_bufs(iv_obj_t *ps_codec_obj)
+{
+    codec_t *ps_codec;
+
+    void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+    void *pv_mem_ctxt;
+
+    ps_codec = (codec_t *)ps_codec_obj->pv_codec_handle;
+    pf_aligned_free = ps_codec->pf_aligned_free;
+    pv_mem_ctxt = ps_codec->pv_mem_ctxt;
+
+
+    ALIGNED_FREE(ps_codec, ps_codec->apv_process_thread_handle[0]);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_bitsbuf_static);
+
+    ALIGNED_FREE(ps_codec, ps_codec->pv_disp_buf_mgr);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_dpb_mgr);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_pic_buf_mgr);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_mv_buf_mgr);
+    ALIGNED_FREE(ps_codec, ps_codec->ps_vps_base);
+    ALIGNED_FREE(ps_codec, ps_codec->ps_sps_base);
+    ALIGNED_FREE(ps_codec, ps_codec->ps_pps_base);
+    ALIGNED_FREE(ps_codec, ps_codec->ps_slice_hdr_base);
+    ALIGNED_FREE(ps_codec, ps_codec->pi2_scaling_mat);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_pic_buf_base);
+    ALIGNED_FREE(ps_codec, ps_codec->s_parse.pu1_luma_intra_pred_mode_left);
+    ALIGNED_FREE(ps_codec, ps_codec->as_process[0].s_sao_ctxt.pu1_tmp_buf_luma);
+    ALIGNED_FREE(ps_codec, ps_codec->as_process[0].pi2_inter_pred_tmp_buf1);
+    ALIGNED_FREE(ps_codec, ps_codec_obj->pv_codec_handle);
+
+    if(ps_codec_obj)
+    {
+        pf_aligned_free(pv_mem_ctxt, ps_codec_obj);
+    }
+
+    return IV_SUCCESS;
+
+}
+
+
+/**
+*******************************************************************************
+*
+* @brief
+*  Allocate dynamic memory for the codec
+*
+* @par Description:
+*  Allocates dynamic memory for the codec
+*
+* @param[in] ps_codec
+*  Pointer to codec context
+*
+* @returns  Status
+*
+* @remarks
+*
+*
+*******************************************************************************
+*/
+WORD32 ihevcd_allocate_dynamic_bufs(codec_t *ps_codec)
+{
+    WORD32 max_tile_cols, max_tile_rows;
+    WORD32 max_ctb_rows, max_ctb_cols;
+    WORD32 max_num_cu_cols;
+    WORD32 max_num_cu_rows;
+    WORD32 max_num_4x4_cols;
+    WORD32 max_ctb_cnt;
+    WORD32 wd;
+    WORD32 ht;
+    WORD32 i;
+    WORD32 max_dpb_size;
+    void *pv_mem_ctxt = ps_codec->pv_mem_ctxt;
+    void *pv_buf;
+    UWORD8 *pu1_buf;
+    WORD32 size;
+
+    wd = ALIGN64(ps_codec->i4_wd);
+    ht = ALIGN64(ps_codec->i4_ht);
+
+    max_tile_cols = (wd + MIN_TILE_WD - 1) / MIN_TILE_WD;
+    max_tile_rows = (ht + MIN_TILE_HT - 1) / MIN_TILE_HT;
+    max_ctb_rows  = ht / MIN_CTB_SIZE;
+    max_ctb_cols  = wd / MIN_CTB_SIZE;
+    max_ctb_cnt   = max_ctb_rows * max_ctb_cols;
+    max_num_cu_cols = wd / MIN_CU_SIZE;
+    max_num_cu_rows = ht / MIN_CU_SIZE;
+    max_num_4x4_cols = wd / 4;
+
+    /* Allocate tile structures */
+    size = max_tile_cols * max_tile_rows;
+    size *= sizeof(tile_t);
+    size *= MAX_PPS_CNT;
+
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->ps_tile = (tile_t *)pv_buf;
+
+
+    /* Allocate memory to hold entry point offsets */
+    /* One entry point per tile */
+    size = max_tile_cols * max_tile_rows;
+
+    /* One entry point per row of CTBs */
+    /*********************************************************************/
+    /* Only tiles or entropy sync is enabled at a time in main           */
+    /* profile, but since memory required does not increase too much,    */
+    /* this allocation is done to handle both cases                      */
+    /*********************************************************************/
+    size  += max_ctb_rows;
+    size *= sizeof(WORD32);
+
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->pi4_entry_ofst = (WORD32 *)pv_buf;
+
+    /* Allocate parse skip flag buffer */
+    /* 1 bit per 8x8 */
+    size = max_num_cu_cols / 8;
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->s_parse.pu4_skip_cu_top = (UWORD32 *)pv_buf;
+
+    /* Allocate parse coding tree depth buffer */
+    /* 2 bits per 8x8 */
+    size =  max_num_cu_cols / 4;
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->s_parse.pu4_ct_depth_top = (UWORD32 *)pv_buf;
+
+    /* Allocate intra flag buffer */
+    /* 1 bit per 8x8 */
+    size =  max_num_cu_cols * max_num_cu_rows / 8;
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->pu1_pic_intra_flag = (UWORD8 *)pv_buf;
+    ps_codec->s_parse.pu1_pic_intra_flag = ps_codec->pu1_pic_intra_flag;
+
+    /* Allocate transquant bypass flag buffer */
+    /* 1 bit per 8x8 */
+    /* Extra row and column are allocated for easy processing of top and left blocks while loop filtering */
+    size =  ((max_num_cu_cols + 8) * (max_num_cu_rows + 8)) / 8;
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 1, size);
+    {
+        WORD32 loop_filter_strd = (wd + 63) >> 6;
+        ps_codec->pu1_pic_no_loop_filter_flag_base = pv_buf;
+        /* The offset is added for easy processing of top and left blocks while loop filtering */
+        ps_codec->pu1_pic_no_loop_filter_flag = (UWORD8 *)pv_buf + loop_filter_strd + 1;
+        ps_codec->s_parse.pu1_pic_no_loop_filter_flag = ps_codec->pu1_pic_no_loop_filter_flag;
+        ps_codec->s_parse.s_deblk_ctxt.pu1_pic_no_loop_filter_flag = ps_codec->pu1_pic_no_loop_filter_flag;
+        ps_codec->s_parse.s_sao_ctxt.pu1_pic_no_loop_filter_flag = ps_codec->pu1_pic_no_loop_filter_flag;
+    }
+
+    /* Initialize pointers in PPS structures */
+    {
+        pps_t *ps_pps = ps_codec->ps_pps_base;
+        tile_t *ps_tile =  ps_codec->ps_tile;
+
+        for(i = 0; i < MAX_PPS_CNT; i++)
+        {
+            ps_pps->ps_tile = ps_tile;
+            ps_tile += (max_tile_cols * max_tile_rows);
+            ps_pps++;
+        }
+
+    }
+
+    /* Allocate memory for job queue */
+
+    /* One job per row of CTBs */
+    size  = max_ctb_rows;
+
+    /* One each tile a row of CTBs, num_jobs has to incremented */
+    size  *= max_tile_cols;
+
+    /* One format convert/frame copy job per row of CTBs for non-shared mode*/
+    size  += max_ctb_rows;
+
+    size *= sizeof(proc_job_t);
+
+    size += ihevcd_jobq_ctxt_size();
+    size = ALIGN4(size);
+
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_proc_jobq_buf = pv_buf;
+    ps_codec->i4_proc_jobq_buf_size = size;
+
+    size =  max_ctb_cnt;
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->pu1_parse_map = (UWORD8 *)pv_buf;
+
+    size =  max_ctb_cnt;
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+    ps_codec->pu1_proc_map = (UWORD8 *)pv_buf;
+
+    /** Holds top and left neighbor's pu idx into picture level pu array */
+    /* Only one top row is enough but left has to be replicated for each process context */
+    size =  (max_num_4x4_cols  /* left */ + MAX_PROCESS_THREADS * (MAX_CTB_SIZE / 4)/* top */ + 1/* top right */) * sizeof(WORD32);
+    size = ALIGN4(size);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+
+    for(i = 0; i < MAX_PROCESS_THREADS; i++)
+    {
+        UWORD32 *pu4_buf = (UWORD32 *)pv_buf;
+        ps_codec->as_process[i].pu4_pic_pu_idx_left = pu4_buf + i * (MAX_CTB_SIZE / 4);
+        memset(ps_codec->as_process[i].pu4_pic_pu_idx_left, 0, sizeof(UWORD32) * MAX_CTB_SIZE / 4);
+        ps_codec->as_process[i].pu4_pic_pu_idx_top = pu4_buf + MAX_PROCESS_THREADS * (MAX_CTB_SIZE / 4);
+    }
+    memset(ps_codec->as_process[0].pu4_pic_pu_idx_top, 0, sizeof(UWORD32) * (wd / 4 + 1));
+
+    {
+        /* To hold SAO left buffer for luma */
+        size  = sizeof(UWORD8) * (MAX(ht, wd));
+
+        /* To hold SAO left buffer for chroma */
+        size += sizeof(UWORD8) * (MAX(ht, wd));
+
+        /* To hold SAO top buffer for luma */
+        size += sizeof(UWORD8) * wd;
+
+        /* To hold SAO top buffer for chroma */
+        size += sizeof(UWORD8) * wd;
+
+        /* To hold SAO top left luma pixel value for last output ctb in a row*/
+        size += sizeof(UWORD8) * max_ctb_rows;
+
+        /* To hold SAO top left chroma pixel value last output ctb in a row*/
+        size += sizeof(UWORD8) * max_ctb_rows * 2;
+
+        /* To hold SAO top left pixel luma for current ctb - column array*/
+        size += sizeof(UWORD8) * max_ctb_rows;
+
+        /* To hold SAO top left pixel chroma for current ctb-column array*/
+        size += sizeof(UWORD8) * max_ctb_rows * 2;
+
+        /* To hold SAO top right pixel luma pixel value last output ctb in a row*/
+        size += sizeof(UWORD8) * max_ctb_cols;
+
+        /* To hold SAO top right pixel chroma pixel value last output ctb in a row*/
+        size += sizeof(UWORD8) * max_ctb_cols * 2;
+
+        /*To hold SAO botton bottom left pixels for luma*/
+        size += sizeof(UWORD8) * max_ctb_rows;
+
+        /*To hold SAO botton bottom left pixels for luma*/
+        size += sizeof(UWORD8) * max_ctb_rows * 2;
+        size = ALIGN64(size);
+
+        pu1_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+        RETURN_IF((NULL == pu1_buf), IV_FAIL);
+        memset(pu1_buf, 0, size);
+
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_left_luma = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_left_luma = (UWORD8 *)pu1_buf;
-        pu1_buf += MAX(ps_codec->i4_max_ht, ps_codec->i4_max_wd);
+        pu1_buf += MAX(ht, wd);
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_left_chroma = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_left_chroma = (UWORD8 *)pu1_buf;
-        pu1_buf += MAX(ps_codec->i4_max_ht, ps_codec->i4_max_wd);
+        pu1_buf += MAX(ht, wd);
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_top_luma = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_luma = (UWORD8 *)pu1_buf;
-        pu1_buf += ps_codec->i4_max_wd;
+        pu1_buf += wd;
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_top_chroma = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_chroma = (UWORD8 *)pu1_buf;
-        pu1_buf += ps_codec->i4_max_wd;
+        pu1_buf += wd;
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_luma_top_left_ctb = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_luma_top_left_ctb = (UWORD8 *)pu1_buf;
-        pu1_buf += ps_codec->i4_max_ht / MIN_CTB_SIZE;
+        pu1_buf += ht / MIN_CTB_SIZE;
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_chroma_top_left_ctb = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_chroma_top_left_ctb = (UWORD8 *)pu1_buf;
-        pu1_buf += (ps_codec->i4_max_ht / MIN_CTB_SIZE) * 2;
+        pu1_buf += (ht / MIN_CTB_SIZE) * 2;
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_top_left_luma_curr_ctb = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_left_luma_curr_ctb = (UWORD8 *)pu1_buf;
-        pu1_buf += ps_codec->i4_max_ht / MIN_CTB_SIZE;
+        pu1_buf += ht / MIN_CTB_SIZE;
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
@@ -2830,21 +1704,21 @@
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_left_chroma_curr_ctb = (UWORD8 *)pu1_buf;
 
-        pu1_buf += (ps_codec->i4_max_ht / MIN_CTB_SIZE) * 2;
+        pu1_buf += (ht / MIN_CTB_SIZE) * 2;
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_top_left_luma_top_right = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_left_luma_top_right = (UWORD8 *)pu1_buf;
 
-        pu1_buf += ps_codec->i4_max_wd / MIN_CTB_SIZE;
+        pu1_buf += wd / MIN_CTB_SIZE;
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
             ps_codec->as_process[i].s_sao_ctxt.pu1_sao_src_top_left_chroma_top_right = (UWORD8 *)pu1_buf;
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_left_chroma_top_right = (UWORD8 *)pu1_buf;
 
-        pu1_buf += (ps_codec->i4_max_wd / MIN_CTB_SIZE) * 2;
+        pu1_buf += (wd / MIN_CTB_SIZE) * 2;
 
         /*Per CTB, Store 1 value for luma , 2 values for chroma*/
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
@@ -2853,7 +1727,7 @@
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_left_luma_bot_left = (UWORD8 *)pu1_buf;
 
-        pu1_buf += (ps_codec->i4_max_ht / MIN_CTB_SIZE);
+        pu1_buf += (ht / MIN_CTB_SIZE);
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
@@ -2861,35 +1735,22 @@
         }
         ps_codec->s_parse.s_sao_ctxt.pu1_sao_src_top_left_chroma_bot_left = (UWORD8 *)pu1_buf;
 
-        pu1_buf += (ps_codec->i4_max_ht / MIN_CTB_SIZE) * 2;
+        pu1_buf += (ht / MIN_CTB_SIZE) * 2;
     }
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SAO_SCRATCH];
-    {
-        UWORD8 *pu1_buf = (UWORD8 *)ps_mem_rec->pv_base;
-        for(i = 0; i < MAX_PROCESS_THREADS; i++)
-        {
-            ps_codec->as_process[i].s_sao_ctxt.pu1_tmp_buf_luma = (UWORD8 *)pu1_buf;
-            pu1_buf += 4 * MAX_CTB_SIZE * MAX_CTB_SIZE * sizeof(UWORD8);
 
-            ps_codec->as_process[i].s_sao_ctxt.pu1_tmp_buf_chroma = (UWORD8 *)pu1_buf;
-            pu1_buf += 4 * MAX_CTB_SIZE * MAX_CTB_SIZE * sizeof(UWORD8);
-        }
-    }
-
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_BS_QP];
     {
-        UWORD8 *pu1_buf = (UWORD8 *)ps_mem_rec->pv_base;
+        UWORD8 *pu1_buf = (UWORD8 *)pv_buf;
         WORD32 vert_bs_size, horz_bs_size;
         WORD32 qp_const_flag_size;
         WORD32 qp_size;
         WORD32 num_8x8;
 
         /* Max Number of vertical edges */
-        vert_bs_size = ps_codec->i4_max_wd / 8 + 2 * MAX_CTB_SIZE / 8;
+        vert_bs_size = wd / 8 + 2 * MAX_CTB_SIZE / 8;
 
         /* Max Number of horizontal edges - extra MAX_CTB_SIZE / 8 to handle the last 4 rows separately(shifted CTB processing) */
-        vert_bs_size *= (ps_codec->i4_max_ht + MAX_CTB_SIZE) / MIN_TU_SIZE;
+        vert_bs_size *= (ht + MAX_CTB_SIZE) / MIN_TU_SIZE;
 
         /* Number of bytes */
         vert_bs_size /= 8;
@@ -2898,10 +1759,10 @@
         vert_bs_size *= 2;
 
         /* Max Number of horizontal edges */
-        horz_bs_size = ps_codec->i4_max_ht / 8 + MAX_CTB_SIZE / 8;
+        horz_bs_size = ht / 8 + MAX_CTB_SIZE / 8;
 
         /* Max Number of vertical edges - extra MAX_CTB_SIZE / 8 to handle the last 4 columns separately(shifted CTB processing) */
-        horz_bs_size *= (ps_codec->i4_max_wd + MAX_CTB_SIZE) / MIN_TU_SIZE;
+        horz_bs_size *= (wd + MAX_CTB_SIZE) / MIN_TU_SIZE;
 
         /* Number of bytes */
         horz_bs_size /= 8;
@@ -2910,18 +1771,34 @@
         horz_bs_size *= 2;
 
         /* Max CTBs in a row */
-        qp_const_flag_size = ps_codec->i4_max_wd / MIN_CTB_SIZE + 1 /* The last ctb row deblk is done in last ctb + 1 row.*/;
+        qp_const_flag_size = wd / MIN_CTB_SIZE + 1 /* The last ctb row deblk is done in last ctb + 1 row.*/;
 
         /* Max CTBs in a column */
-        qp_const_flag_size *= ps_codec->i4_max_ht / MIN_CTB_SIZE;
+        qp_const_flag_size *= ht / MIN_CTB_SIZE;
 
         /* Number of bytes */
         qp_const_flag_size /= 8;
 
         /* QP changes at CU level - So store at 8x8 level */
-        num_8x8 = (ps_codec->i4_max_ht * ps_codec->i4_max_wd) / (MIN_CU_SIZE * MIN_CU_SIZE);
+        num_8x8 = (ht * wd) / (MIN_CU_SIZE * MIN_CU_SIZE);
         qp_size = num_8x8;
-        memset(pu1_buf, 0, vert_bs_size + horz_bs_size + qp_size + qp_const_flag_size);
+
+        /* To hold vertical boundary strength */
+        size += vert_bs_size;
+
+        /* To hold horizontal boundary strength */
+        size += horz_bs_size;
+
+        /* To hold QP */
+        size += qp_size;
+
+        /* To hold QP const in CTB flags */
+        size += qp_const_flag_size;
+
+        pu1_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+        RETURN_IF((NULL == pu1_buf), IV_FAIL);
+
+        memset(pu1_buf, 0, size);
 
         for(i = 0; i < MAX_PROCESS_THREADS; i++)
         {
@@ -2961,73 +1838,194 @@
 
     }
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_TILE_IDX];
-    {
-        UWORD8 *pu1_buf = (UWORD8 *)ps_mem_rec->pv_base;
+    /* Max CTBs in a row */
+    size  = wd / MIN_CTB_SIZE + 2 /* Top row and bottom row extra. This ensures accessing left,top in first row
+                                              and right in last row will not result in invalid access*/;
+    /* Max CTBs in a column */
+    size *= ht / MIN_CTB_SIZE;
 
-        for(i = 0; i < MAX_PROCESS_THREADS; i++)
-        {
-            ps_codec->as_process[i].pu1_tile_idx = (UWORD16 *)pu1_buf + ps_codec->i4_max_wd / MIN_CTB_SIZE /* Offset 1 row */;
-        }
+    size *= sizeof(UWORD16);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+
+    ps_codec->pu1_tile_idx_base = pv_buf;
+    for(i = 0; i < MAX_PROCESS_THREADS; i++)
+    {
+        ps_codec->as_process[i].pu1_tile_idx = (UWORD16 *)pv_buf + wd / MIN_CTB_SIZE /* Offset 1 row */;
     }
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_SAO];
-    ps_codec->s_parse.ps_pic_sao = (sao_t *)ps_mem_rec->pv_base;
-    ps_codec->s_parse.s_sao_ctxt.ps_pic_sao = (sao_t *)ps_mem_rec->pv_base;
+    /* 4 bytes per color component per CTB */
+    size = 3 * 4;
+
+    /* MAX number of CTBs in a row */
+    size *= wd / MIN_CTB_SIZE;
+
+    /* MAX number of CTBs in a column */
+    size *= ht / MIN_CTB_SIZE;
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    memset(pv_buf, 0, size);
+
+    ps_codec->s_parse.ps_pic_sao = (sao_t *)pv_buf;
+    ps_codec->s_parse.s_sao_ctxt.ps_pic_sao = (sao_t *)pv_buf;
     for(i = 0; i < MAX_PROCESS_THREADS; i++)
     {
         ps_codec->as_process[i].s_sao_ctxt.ps_pic_sao = ps_codec->s_parse.ps_pic_sao;
     }
 
-    ps_mem_rec = &ps_mem_rec_base[MEM_REC_REF_PIC];
-    ps_codec->pv_pic_buf_mgr = ps_mem_rec->pv_base;
-    ps_codec->pv_pic_buf_base = (UWORD8 *)ps_codec->pv_pic_buf_mgr + sizeof(buf_mgr_t);
-    ps_codec->i4_total_pic_buf_size = ps_mem_rec->u4_mem_size - sizeof(buf_mgr_t);
-    ps_codec->pu1_cur_chroma_ref_buf = (UWORD8 *)ps_codec->pv_pic_buf_base + BUF_MGR_MAX_CNT * sizeof(pic_buf_t);
-    ps_codec->i4_remaining_pic_buf_size = ps_codec->i4_total_pic_buf_size - BUF_MGR_MAX_CNT * sizeof(pic_buf_t);
-
-
-
-
-#ifdef APPLY_CONCEALMENT
+    /* Only if width * height * 3 / 2 is greater than MIN_BITSBUF_SIZE,
+    then allocate dynamic bistream buffer */
+    ps_codec->pu1_bitsbuf_dynamic = NULL;
+    size = wd * ht;
+    if(size > MIN_BITSBUF_SIZE)
     {
+        pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+        RETURN_IF((NULL == pv_buf), IV_FAIL);
+        ps_codec->pu1_bitsbuf_dynamic = pv_buf;
+        ps_codec->u4_bitsbuf_size_dynamic = size;
+    }
 
-        UWORD32 mem_loc;
+    size = ihevcd_get_tu_data_size(wd * ht);
+    pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+    RETURN_IF((NULL == pv_buf), IV_FAIL);
+    ps_codec->pv_tu_data = pv_buf;
 
-        icncl_init_ip_t cncl_init_ip;
-        icncl_init_op_t cncl_init_op;
-        iv_mem_rec_t *ps_mem_rec;
-        DecStruct *ps_codec;
+    {
+        sps_t *ps_sps = (ps_codec->s_parse.ps_sps_base + ps_codec->i4_sps_id);
 
-        ps_mem_rec = dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location;
-        mem_loc = MEM_REC_CNT;
 
-        ps_codec->ps_conceal = (iv_obj_t *)ps_mem_rec[mem_loc].pv_base;
-        ps_codec->i4_first_frame_done = 0;
+        /* Allocate for pu_map, pu_t and pic_pu_idx for each MV bank */
+        /* Note: Number of luma samples is not max_wd * max_ht here, instead it is
+         * set to maximum number of luma samples allowed at the given level.
+         * This is done to ensure that any stream with width and height lesser
+         * than max_wd and max_ht is supported. Number of buffers required can be greater
+         * for lower width and heights at a given level and this increased number of buffers
+         * might require more memory than what max_wd and max_ht buffer would have required
+         * Also note one extra buffer is allocted to store current pictures MV bank
+         * In case of asynchronous parsing and processing, number of buffers should increase here
+         * based on when parsing and processing threads are synchronized
+         */
+        max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
+        /* Size for holding mv_buf_t for each MV Bank
+         * One extra MV Bank is needed to hold current pics MV bank.
+         */
+        size = (max_dpb_size + 1) * sizeof(mv_buf_t);
 
-        cncl_init_ip.u4_size = sizeof(icncl_init_ip_t);
-        cncl_init_ip.pv_mem_rec_location = &(ps_mem_rec[mem_loc]);
-        cncl_init_ip.e_cmd = IV_CMD_INIT;
+        size += (max_dpb_size + 1) *
+                        ihevcd_get_pic_mv_bank_size(wd * ht);
 
-        status = icncl_api_function(ps_codec->ps_conceal, (void *)&cncl_init_ip, (void *)&cncl_init_op);
+        pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+        RETURN_IF((NULL == pv_buf), IV_FAIL);
+
+        ps_codec->pv_mv_bank_buf_base = pv_buf;
+        ps_codec->i4_total_mv_bank_size = size;
 
     }
-#endif //APPLY_CONCEALMENT
 
-    status = ihevcd_init(ps_codec);
+    /* In case of non-shared mode allocate for reference picture buffers */
+    /* In case of shared and 420p output, allocate for chroma samples */
+    if(0 == ps_codec->i4_share_disp_buf)
+    {
+        /* Number of buffers is doubled in order to return one frame at a time instead of sending
+         * multiple outputs during dpb full case.
+         * Also note one extra buffer is allocted to store current picture
+         * In case of asynchronous parsing and processing, number of buffers should increase here
+         * based on when parsing and processing threads are synchronized
+         */
+        size = ihevcd_get_total_pic_buf_size(ps_codec, wd, ht);
+        pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+        RETURN_IF((NULL == pv_buf), IV_FAIL);
 
-    TRACE_INIT(NULL);
-    STATS_INIT();
-    return status;
+
+        ps_codec->i4_total_pic_buf_size = size;
+        ps_codec->pu1_ref_pic_buf_base = (UWORD8 *)pv_buf;
+    }
+
+    ps_codec->pv_proc_jobq = ihevcd_jobq_init(ps_codec->pv_proc_jobq_buf, ps_codec->i4_proc_jobq_buf_size);
+    RETURN_IF((ps_codec->pv_proc_jobq == NULL), IV_FAIL);
+
+    /* Update the jobq context to all the threads */
+    ps_codec->s_parse.pv_proc_jobq = ps_codec->pv_proc_jobq;
+    for(i = 0; i < MAX_PROCESS_THREADS; i++)
+    {
+        ps_codec->as_process[i].pv_proc_jobq = ps_codec->pv_proc_jobq;
+        ps_codec->as_process[i].i4_id = i;
+        ps_codec->as_process[i].ps_codec = ps_codec;
+
+        /* Set the following to zero assuming it is a single core solution
+         * When threads are launched these will be set appropriately
+         */
+        ps_codec->as_process[i].i4_check_parse_status = 0;
+        ps_codec->as_process[i].i4_check_proc_status = 0;
+    }
+
+    ps_codec->u4_allocate_dynamic_done = 1;
+
+    return IV_SUCCESS;
 }
+
 /**
 *******************************************************************************
 *
 * @brief
-*  Retrieves mem records passed to the codec
+*  Free dynamic memory for the codec
 *
 * @par Description:
-*  Retrieves memrecs passed earlier
+*  Free dynamic memory for the codec
+*
+* @param[in] ps_codec
+*  Pointer to codec context
+*
+* @returns  Status
+*
+* @remarks
+*
+*
+*******************************************************************************
+*/
+WORD32 ihevcd_free_dynamic_bufs(codec_t *ps_codec)
+{
+
+    if(ps_codec->pv_proc_jobq)
+    {
+        ihevcd_jobq_deinit(ps_codec->pv_proc_jobq);
+        ps_codec->pv_proc_jobq = NULL;
+    }
+
+    ALIGNED_FREE(ps_codec, ps_codec->ps_tile);
+    ALIGNED_FREE(ps_codec, ps_codec->pi4_entry_ofst);
+    ALIGNED_FREE(ps_codec, ps_codec->s_parse.pu4_skip_cu_top);
+    ALIGNED_FREE(ps_codec, ps_codec->s_parse.pu4_ct_depth_top);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_pic_intra_flag);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_pic_no_loop_filter_flag_base);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_proc_jobq_buf);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_parse_map);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_proc_map);
+    ALIGNED_FREE(ps_codec, ps_codec->as_process[0].pu4_pic_pu_idx_left);
+    ALIGNED_FREE(ps_codec, ps_codec->as_process[0].s_sao_ctxt.pu1_sao_src_left_luma);
+    ALIGNED_FREE(ps_codec, ps_codec->as_process[0].s_bs_ctxt.pu4_pic_vert_bs);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_tile_idx_base);
+    ALIGNED_FREE(ps_codec, ps_codec->s_parse.ps_pic_sao);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_bitsbuf_dynamic);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_tu_data);
+    ALIGNED_FREE(ps_codec, ps_codec->pv_mv_bank_buf_base);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_ref_pic_buf_base);
+    ALIGNED_FREE(ps_codec, ps_codec->pu1_cur_chroma_ref_buf);
+
+    ps_codec->u4_allocate_dynamic_done = 0;
+    return IV_SUCCESS;
+}
+
+
+/**
+*******************************************************************************
+*
+* @brief
+*  Initializes from mem records passed to the codec
+*
+* @par Description:
+*  Initializes pointers based on mem records passed
 *
 * @param[in] ps_codec_obj
 *  Pointer to codec object at API level
@@ -3045,74 +2043,82 @@
 *
 *******************************************************************************
 */
-WORD32 ihevcd_retrieve_memrec(iv_obj_t *ps_codec_obj,
-                              void *pv_api_ip,
-                              void *pv_api_op)
+WORD32 ihevcd_create(iv_obj_t *ps_codec_obj,
+                           void *pv_api_ip,
+                           void *pv_api_op)
 {
 
-    iv_retrieve_mem_rec_ip_t *dec_clr_ip;
-    iv_retrieve_mem_rec_op_t *dec_clr_op;
-    codec_t *ps_codec;
-    dec_clr_ip = (iv_retrieve_mem_rec_ip_t *)pv_api_ip;
-    dec_clr_op = (iv_retrieve_mem_rec_op_t *)pv_api_op;
-    ps_codec = (codec_t *)(ps_codec_obj->pv_codec_handle);
+    ihevcd_cxa_create_op_t *ps_create_op;
 
-    if(ps_codec->i4_init_done != 1)
+    WORD32 ret;
+    codec_t *ps_codec;
+    ps_create_op = (ihevcd_cxa_create_op_t *)pv_api_op;
+
+    ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
+
+    ret = ihevcd_allocate_static_bufs(&ps_codec_obj, pv_api_ip, pv_api_op);
+
+    /* If allocation of some buffer fails, then free buffers allocated till then */
+    if((IV_FAIL == ret) && (NULL != ps_codec_obj))
     {
-        dec_clr_op->u4_error_code |= 1 << IVD_FATALERROR;
-        dec_clr_op->u4_error_code |= IHEVCD_INIT_NOT_DONE;
+        ihevcd_free_static_bufs(ps_codec_obj);
+        ps_create_op->s_ivd_create_op_t.u4_error_code = IVD_MEM_ALLOC_FAILED;
+        ps_create_op->s_ivd_create_op_t.u4_error_code = 1 << IVD_FATALERROR;
+
         return IV_FAIL;
     }
+    ps_codec = (codec_t *)ps_codec_obj->pv_codec_handle;
+    ret = ihevcd_init(ps_codec);
 
-    memcpy(dec_clr_ip->pv_mem_rec_location, ps_codec->ps_mem_rec_backup,
-           MEM_REC_CNT * (sizeof(iv_mem_rec_t)));
-    dec_clr_op->u4_num_mem_rec_filled = MEM_REC_CNT;
+    TRACE_INIT(NULL);
+    STATS_INIT();
 
-#ifdef APPLY_CONCEALMENT
-    {
-        IV_API_CALL_STATUS_T status;
-        icncl_fill_mem_rec_ip_t cncl_fill_ip;
-        icncl_fill_mem_rec_op_t cncl_fill_op;
-
-        iv_mem_rec_t *ps_mem_rec;
-
-        UWORD8 mem_loc = MEM_REC_CNT;
-        UWORD8 num_cncl_mem = 0;
-
-        ps_mem_rec = dec_clr_ip->pv_mem_rec_location;
-
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = &(ps_mem_rec[mem_loc]);
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.u4_size = sizeof(icncl_fill_mem_rec_ip_t);
-
-        status = icncl_api_function(NULL, (void *)&cncl_fill_ip, (void *)&cncl_fill_op);
-
-        cncl_fill_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_RETRIEVE_MEMREC;
-        cncl_fill_op.s_ivd_fill_mem_rec_op_t.u4_size = sizeof(icncl_fill_mem_rec_op_t);
-
-        status = icncl_api_function(ps_codec->ps_conceal, (void *)&cncl_fill_ip, (void *)&cncl_fill_op);
-
-        if(status == IV_SUCCESS)
-        {
-            /* Add the concealment library's memory requirements */
-            dec_clr_op->u4_num_mem_rec_filled += cncl_fill_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled;
-        }
-    }
-#endif //APPLY_CONCEALMENT
-    DEBUG("Retrieve num mem recs: %d\n",
-                    dec_clr_op->u4_num_mem_rec_filled);
-    STATS_PRINT();
-    ihevcd_jobq_free((jobq_t *)ps_codec->pv_proc_jobq);
-
-
-
-    return IV_SUCCESS;
-
+    return ret;
 }
 /**
 *******************************************************************************
 *
 * @brief
+*  Delete codec
+*
+* @par Description:
+*  Delete codec
+*
+* @param[in] ps_codec_obj
+*  Pointer to codec object at API level
+*
+* @param[in] pv_api_ip
+*  Pointer to input argument structure
+*
+* @param[out] pv_api_op
+*  Pointer to output argument structure
+*
+* @returns  Status
+*
+* @remarks
+*
+*
+*******************************************************************************
+*/
+WORD32 ihevcd_delete(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
+{
+    codec_t *ps_dec;
+    ihevcd_cxa_delete_ip_t *ps_ip = (ihevcd_cxa_delete_ip_t *)pv_api_ip;
+    ihevcd_cxa_delete_op_t *ps_op = (ihevcd_cxa_delete_op_t *)pv_api_op;
+
+    ps_dec = (codec_t *)(ps_codec_obj->pv_codec_handle);
+    UNUSED(ps_ip);
+    ps_op->s_ivd_delete_op_t.u4_error_code = 0;
+    ihevcd_free_dynamic_bufs(ps_dec);
+    ihevcd_free_static_bufs(ps_codec_obj);
+    return IV_SUCCESS;
+}
+
+
+/**
+*******************************************************************************
+*
+* @brief
 *  Passes display buffer from application to codec
 *
 * @par Description:
@@ -3157,31 +2163,38 @@
         pic_buf_t *ps_pic_buf;
         UWORD8 *pu1_buf;
         WORD32 buf_ret;
-        WORD32 strd;
-        strd = ps_codec->i4_strd;
-        if(0 == strd)
-            strd = ps_codec->i4_max_wd + PAD_WD;
+
+        UWORD8 *pu1_chroma_buf = NULL;
         num_bufs = MIN(num_bufs, BUF_MGR_MAX_CNT);
         ps_codec->i4_num_disp_bufs = num_bufs;
 
         ps_pic_buf = (pic_buf_t *)ps_codec->ps_pic_buf;
+
+        /* If color format is 420P, then allocate chroma buffers to hold semiplanar
+         * chroma data */
+        if(ps_codec->e_chroma_fmt == IV_YUV_420P)
+        {
+            WORD32 num_samples = ps_dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[1] << 1;
+            WORD32 size = num_samples * num_bufs;
+            void *pv_mem_ctxt = ps_codec->pv_mem_ctxt;
+
+            pu1_chroma_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+            RETURN_IF((NULL == pu1_chroma_buf), IV_FAIL);
+
+            ps_codec->pu1_cur_chroma_ref_buf = pu1_chroma_buf;
+        }
         for(i = 0; i < (WORD32)num_bufs; i++)
         {
+            /* Stride is not available in some cases here.
+               So store base pointers to buffer manager now,
+               and update these pointers once header is decoded */
             pu1_buf =  ps_dec_disp_ip->s_disp_buffer[i].pu1_bufs[0];
-            ps_pic_buf->pu1_luma = pu1_buf + strd * PAD_TOP + PAD_LEFT;
+            ps_pic_buf->pu1_luma = pu1_buf;
 
             if(ps_codec->e_chroma_fmt == IV_YUV_420P)
             {
-                pu1_buf =  ps_codec->pu1_cur_chroma_ref_buf;
-                ps_codec->pu1_cur_chroma_ref_buf += strd * (ps_codec->i4_ht / 2 + PAD_HT / 2);
-                ps_codec->i4_remaining_pic_buf_size -= strd * (ps_codec->i4_ht / 2 + PAD_HT / 2);
-
-                if(0 > ps_codec->i4_remaining_pic_buf_size)
-                {
-                    ps_codec->i4_error_code = IHEVCD_BUF_MGR_ERROR;
-                    return IHEVCD_BUF_MGR_ERROR;
-                }
-
+                pu1_buf = pu1_chroma_buf;
+                pu1_chroma_buf += ps_dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[1] << 1;
             }
             else
             {
@@ -3189,7 +2202,7 @@
                 pu1_buf =  ps_dec_disp_ip->s_disp_buffer[i].pu1_bufs[1];
             }
 
-            ps_pic_buf->pu1_chroma = pu1_buf + strd * (PAD_TOP / 2) + PAD_LEFT;
+            ps_pic_buf->pu1_chroma = pu1_buf;
 
             buf_ret = ihevc_buf_mgr_add((buf_mgr_t *)ps_codec->pv_pic_buf_mgr, ps_pic_buf, i);
 
@@ -3332,7 +2345,9 @@
 
     for(i = 0; i < (WORD32)ps_ctl_op->u4_min_num_in_bufs; i++)
     {
-        ps_ctl_op->u4_min_in_buf_size[i] = MAX((ps_codec->i4_wd * ps_codec->i4_ht), MIN_BITSBUF_SIZE);
+        wd = ALIGN64(ps_codec->i4_wd);
+        ht = ALIGN64(ps_codec->i4_ht);
+        ps_ctl_op->u4_min_in_buf_size[i] = MAX((wd * ht), MIN_BITSBUF_SIZE);
     }
 
     wd = ps_codec->i4_wd;
@@ -3352,19 +2367,6 @@
             ht = ps_codec->i4_ht + PAD_HT;
         }
     }
-    else
-    {
-        if(0 == ps_codec->i4_share_disp_buf)
-        {
-            wd = ps_codec->i4_new_max_wd;
-            ht = ps_codec->i4_new_max_ht;
-        }
-        else
-        {
-            wd = ALIGN32(wd + PAD_WD);
-            ht += PAD_HT;
-        }
-    }
 
     if(ps_codec->i4_disp_strd > wd)
         wd = ps_codec->i4_disp_strd;
@@ -3373,36 +2375,22 @@
         ps_ctl_op->u4_num_disp_bufs = 1;
     else
     {
-        WORD32 pic_size;
-        WORD32 max_dpb_size;
-
         if(ps_codec->i4_sps_done)
         {
             sps_t *ps_sps = (ps_codec->s_parse.ps_sps_base + ps_codec->i4_sps_id);
-            WORD32 reorder_pic_cnt;
-            WORD32 ref_pic_cnt;
-            WORD32 level;
+            WORD32 reorder_pic_cnt, ref_pic_cnt;
+            reorder_pic_cnt = 0;
+            if(ps_codec->e_frm_out_mode != IVD_DECODE_FRAME_OUT)
+                reorder_pic_cnt = ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1];
+            ref_pic_cnt = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
 
-            reorder_pic_cnt = MIN(ps_sps->ai1_sps_max_num_reorder_pics[0], ps_codec->i4_init_num_reorder);
-            pic_size = ps_sps->i2_pic_width_in_luma_samples * ps_sps->i2_pic_height_in_luma_samples;
-
-            level = ps_codec->i4_init_level;
-            max_dpb_size = ihevcd_get_dpb_size(level, pic_size);
-            ref_pic_cnt = max_dpb_size;
             ps_ctl_op->u4_num_disp_bufs = reorder_pic_cnt;
 
             ps_ctl_op->u4_num_disp_bufs += ref_pic_cnt + 1;
-
         }
         else
         {
-            pic_size = ps_codec->i4_max_wd * ps_codec->i4_max_ht;
-            max_dpb_size = ihevcd_get_dpb_size(ps_codec->i4_init_level, pic_size);
-            ps_ctl_op->u4_num_disp_bufs = 2 * max_dpb_size;
-
-            ps_ctl_op->u4_num_disp_bufs = MIN(ps_ctl_op->u4_num_disp_bufs,
-                            (UWORD32)(ps_codec->i4_init_num_ref + ps_codec->i4_init_num_reorder + 1));
-
+            ps_ctl_op->u4_num_disp_bufs = MAX_REF_CNT;
         }
 
         ps_ctl_op->u4_num_disp_bufs = MIN(
@@ -3517,11 +2505,14 @@
 
     for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
     {
-        ps_ctl_op->u4_min_in_buf_size[i] = MAX((ps_codec->i4_wd * ps_codec->i4_ht), MIN_BITSBUF_SIZE);
+        wd = ALIGN64(ps_codec->i4_wd);
+        ht = ALIGN64(ps_codec->i4_ht);
+
+        ps_ctl_op->u4_min_in_buf_size[i] = MAX((wd * ht), MIN_BITSBUF_SIZE);
     }
 
-    wd = ps_codec->i4_max_wd;
-    ht = ps_codec->i4_max_ht;
+    wd = 0;
+    ht = 0;
 
     if(ps_codec->i4_sps_done)
     {
@@ -3553,36 +2544,22 @@
         ps_ctl_op->u4_num_disp_bufs = 1;
     else
     {
-        WORD32 pic_size;
-        WORD32 max_dpb_size;
-
         if(ps_codec->i4_sps_done)
         {
             sps_t *ps_sps = (ps_codec->s_parse.ps_sps_base + ps_codec->i4_sps_id);
-            WORD32 reorder_pic_cnt;
-            WORD32 ref_pic_cnt;
-            WORD32 level;
+            WORD32 reorder_pic_cnt, ref_pic_cnt;
+            reorder_pic_cnt = 0;
+            if(ps_codec->e_frm_out_mode != IVD_DECODE_FRAME_OUT)
+                reorder_pic_cnt = ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1];
+            ref_pic_cnt = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
 
-            reorder_pic_cnt = MIN(ps_sps->ai1_sps_max_num_reorder_pics[0], ps_codec->i4_init_num_reorder);
-            pic_size = ps_sps->i2_pic_width_in_luma_samples * ps_sps->i2_pic_height_in_luma_samples;
-
-            level = ps_codec->i4_init_level;
-            max_dpb_size = ihevcd_get_dpb_size(level, pic_size);
-            ref_pic_cnt = max_dpb_size;
             ps_ctl_op->u4_num_disp_bufs = reorder_pic_cnt;
 
             ps_ctl_op->u4_num_disp_bufs += ref_pic_cnt + 1;
-
         }
         else
         {
-            pic_size = ps_codec->i4_max_wd * ps_codec->i4_max_ht;
-            max_dpb_size = ihevcd_get_dpb_size(ps_codec->i4_init_level, pic_size);
-            ps_ctl_op->u4_num_disp_bufs = 2 * max_dpb_size;
-
-            ps_ctl_op->u4_num_disp_bufs = MIN(ps_ctl_op->u4_num_disp_bufs,
-                            (UWORD32)(ps_codec->i4_init_num_ref + ps_codec->i4_init_num_reorder + 1));
-
+            ps_ctl_op->u4_num_disp_bufs = MAX_REF_CNT;
         }
 
         ps_ctl_op->u4_num_disp_bufs = MIN(
@@ -3692,18 +2669,8 @@
     }
 
 
-    if((-1 != (WORD32)s_ctl_dynparams_ip->u4_disp_wd) &&
-                    (0  != s_ctl_dynparams_ip->u4_disp_wd) &&
-                    (0  != strd) &&
-                    ((WORD32)s_ctl_dynparams_ip->u4_disp_wd < strd))
     {
-        s_ctl_dynparams_op->u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM);
-        s_ctl_dynparams_op->u4_error_code |= IHEVCD_INVALID_DISP_STRD;
-        ret = IV_FAIL;
-    }
-    else
-    {
-        if((WORD32)s_ctl_dynparams_ip->u4_disp_wd >= ps_codec->i4_wd)
+        if((WORD32)s_ctl_dynparams_ip->u4_disp_wd >= ps_codec->i4_disp_wd)
         {
             strd = s_ctl_dynparams_ip->u4_disp_wd;
         }
@@ -3742,6 +2709,15 @@
         ret = IV_FAIL;
     }
 
+    ps_codec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+
+    if((s_ctl_dynparams_ip->e_frm_out_mode != IVD_DECODE_FRAME_OUT) &&
+       (s_ctl_dynparams_ip->e_frm_out_mode != IVD_DISPLAY_FRAME_OUT))
+    {
+        s_ctl_dynparams_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
+        ret = IV_FAIL;
+    }
+    ps_codec->e_frm_out_mode = s_ctl_dynparams_ip->e_frm_out_mode;
 
     return ret;
 
@@ -3950,8 +2926,8 @@
     else
     {
 
-        disp_wd = ps_codec->i4_max_wd;
-        disp_ht = ps_codec->i4_max_ht;
+        disp_wd = 0;
+        disp_ht = 0;
 
         if(0 == ps_codec->i4_share_disp_buf)
         {
@@ -4457,17 +3433,11 @@
 
     switch(command)
     {
-        case IV_CMD_GET_NUM_MEM_REC:
-            ret = ihevcd_get_num_rec((void *)pv_api_ip, (void *)pv_api_op);
-
+        case IVD_CMD_CREATE:
+            ret = ihevcd_create(ps_handle, (void *)pv_api_ip, (void *)pv_api_op);
             break;
-        case IV_CMD_FILL_NUM_MEM_REC:
-
-            ret = ihevcd_fill_num_mem_rec((void *)pv_api_ip, (void *)pv_api_op);
-            break;
-        case IV_CMD_INIT:
-            ret = ihevcd_init_mem_rec(ps_handle, (void *)pv_api_ip,
-                                      (void *)pv_api_op);
+        case IVD_CMD_DELETE:
+            ret = ihevcd_delete(ps_handle, (void *)pv_api_ip, (void *)pv_api_op);
             break;
 
         case IVD_CMD_VIDEO_DECODE:
@@ -4489,11 +3459,6 @@
                                            (void *)pv_api_op);
             break;
 
-        case IV_CMD_RETRIEVE_MEMREC:
-            ret = ihevcd_retrieve_memrec(ps_handle, (void *)pv_api_ip,
-                                         (void *)pv_api_op);
-            break;
-
         case IVD_CMD_VIDEO_CTL:
             ret = ihevcd_ctl(ps_handle, (void *)pv_api_ip, (void *)pv_api_op);
             break;
diff --git a/decoder/ihevcd_cxa.h b/decoder/ihevcd_cxa.h
index 7c71271..c23d1e7 100644
--- a/decoder/ihevcd_cxa.h
+++ b/decoder/ihevcd_cxa.h
@@ -140,159 +140,37 @@
 /* Extended Structures                                                       */
 /*****************************************************************************/
 
+
 /*****************************************************************************/
-/*  Get Number of Memory Records                                             */
+/*  Delete Codec                                                             */
 /*****************************************************************************/
 
+typedef struct {
+    ivd_delete_ip_t               s_ivd_delete_ip_t;
+}ihevcd_cxa_delete_ip_t;
+
 
 typedef struct {
-
-    /**
-     * ivd_num_mem_rec_ip_t
-     */
-    iv_num_mem_rec_ip_t                    s_ivd_num_mem_rec_ip_t;
-}ihevcd_cxa_num_mem_rec_ip_t;
-
-
-typedef struct {
-
-    /**
-     * ivd_num_mem_rec_op_t
-     */
-    iv_num_mem_rec_op_t                    s_ivd_num_mem_rec_op_t;
-}ihevcd_cxa_num_mem_rec_op_t;
-
-
-/*****************************************************************************/
-/*  Fill Memory Records                                                      */
-/*****************************************************************************/
-
-
-typedef struct {
-    /**
-     * ivd_fill_mem_rec_ip_t
-     */
-    iv_fill_mem_rec_ip_t                    s_ivd_fill_mem_rec_ip_t;
-
-    /**
-     * level
-     */
-    WORD32                                  i4_level;
-
-    /**
-     * num_reorder_frames
-     */
-    UWORD32                                 u4_num_reorder_frames;
-
-    /**
-     * num_ref_frames
-     */
-    UWORD32                                 u4_num_ref_frames;
-
-    /**
-     * share_disp_buf
-     */
-    UWORD32                                 u4_share_disp_buf;
-
-    /**
-     * format in which codec has to give out frame data for display
-     */
-    IV_COLOR_FORMAT_T                       e_output_format;
-
-    /**
-     * Number of extra display buffers that will be allocated to handle display pipeline depth
-     */
-    UWORD32                                 u4_num_extra_disp_buf;
-
-}ihevcd_cxa_fill_mem_rec_ip_t;
-
-
-typedef struct {
-
-    /**
-     * ivd_fill_mem_rec_op_t
-     */
-
-    iv_fill_mem_rec_op_t                   s_ivd_fill_mem_rec_op_t;
-
-}ihevcd_cxa_fill_mem_rec_op_t;
-
-/*****************************************************************************/
-/*  Retrieve Memory Records                                                  */
-/*****************************************************************************/
-
-
-typedef struct {
-
-    /**
-     * ivd_retrieve_mem_rec_ip_t
-     */
-    iv_retrieve_mem_rec_ip_t               s_ivd_retrieve_mem_rec_ip_t;
-}ihevcd_cxa_retrieve_mem_rec_ip_t;
-
-
-typedef struct {
-
-    /**
-     * ivd_retrieve_mem_rec_op_t
-     */
-    iv_retrieve_mem_rec_op_t               s_ivd_retrieve_mem_rec_op_t;
-}ihevcd_cxa_retrieve_mem_rec_op_t;
-
+    ivd_delete_op_t               s_ivd_delete_op_t;
+}ihevcd_cxa_delete_op_t;
 
 /*****************************************************************************/
 /*   Initialize decoder                                                      */
 /*****************************************************************************/
 
-
 typedef struct {
-
-    /**
-     * ivd_init_ip_t
-     */
-    ivd_init_ip_t                           s_ivd_init_ip_t;
-
-    /**
-     * level
-     */
-    WORD32                                  i4_level;
-
-    /**
-     * num_reorder_frames
-     */
-    UWORD32                                 u4_num_reorder_frames;
-
-    /**
-     * num_ref_frames
-     */
-    UWORD32                                 u4_num_ref_frames;
-
-    /**
-     * share_disp_buf
-     */
-    UWORD32                                 u4_share_disp_buf;
-
-    /**
-     * Number of extra display buffers that will be allocated to handle display pipeline depth
-     */
-    UWORD32                                 u4_num_extra_disp_buf;
-}ihevcd_cxa_init_ip_t;
+    ivd_create_ip_t                         s_ivd_create_ip_t;
+}ihevcd_cxa_create_ip_t;
 
 
 typedef struct {
-
-    /**
-     * ivd_init_op_t
-     */
-    ivd_init_op_t                           s_ivd_init_op_t;
-}ihevcd_cxa_init_op_t;
-
+    ivd_create_op_t                         s_ivd_create_op_t;
+}ihevcd_cxa_create_op_t;
 
 /*****************************************************************************/
 /*   Video Decode                                                            */
 /*****************************************************************************/
 
-
 typedef struct {
 
     /**
@@ -315,7 +193,6 @@
 /*   Get Display Frame                                                       */
 /*****************************************************************************/
 
-
 typedef struct
 {
     /**
diff --git a/decoder/ihevcd_decode.c b/decoder/ihevcd_decode.c
index c8915be..7b82e84 100644
--- a/decoder/ihevcd_decode.c
+++ b/decoder/ihevcd_decode.c
@@ -90,6 +90,9 @@
                                WORD32 cur_row,
                                WORD32 num_rows);
 WORD32 ihevcd_init(codec_t *ps_codec);
+
+WORD32 ihevcd_allocate_dynamic_bufs(codec_t *ps_codec);
+WORD32 ihevcd_free_dynamic_bufs(codec_t *ps_codec);
 /*****************************************************************************/
 /* Function Prototypes                                                       */
 /*****************************************************************************/
@@ -184,12 +187,7 @@
     ps_dec_op->u4_error_code = ihevcd_map_error((IHEVCD_ERROR_T)ps_codec->i4_error_code);
     ps_dec_op->u4_num_bytes_consumed = ps_dec_ip->u4_num_Bytes
                     - ps_codec->i4_bytes_remaining;
-    if(ps_codec->i4_error_code == IHEVCD_UNSUPPORTED_DIMENSIONS)
-    {
-        ps_dec_op->u4_pic_wd = ps_codec->i4_new_max_wd;
-        ps_dec_op->u4_pic_ht = ps_codec->i4_new_max_ht;
-    }
-    else if(ps_codec->i4_sps_done)
+    if(ps_codec->i4_sps_done)
     {
         ps_dec_op->u4_pic_wd = ps_codec->i4_disp_wd;
         ps_dec_op->u4_pic_ht = ps_codec->i4_disp_ht;
@@ -245,14 +243,25 @@
             }
             else
             {
-                ps_dec_op->s_disp_frm_buf.pv_u_buf =
-                                ps_dec_ip->s_out_buffer.pu1_bufs[1];
-                ps_dec_op->s_disp_frm_buf.pv_v_buf =
-                                ps_dec_ip->s_out_buffer.pu1_bufs[2];
+                WORD32 i;
+                UWORD8 *pu1_u_dst = NULL, *pu1_v_dst = NULL;
+                for(i = 0; i < ps_codec->i4_share_disp_buf_cnt; i++)
+                {
+                    WORD32 diff = ps_disp_buf->pu1_luma - ps_codec->s_disp_buffer[i].pu1_bufs[0];
+                    if(diff == (ps_codec->i4_strd * PAD_TOP + PAD_LEFT))
+                    {
+                        pu1_u_dst = ps_codec->s_disp_buffer[i].pu1_bufs[1];
+                        pu1_u_dst += (ps_codec->i4_strd * PAD_TOP) / 4 + (PAD_LEFT / 2);
 
+                        pu1_v_dst = ps_codec->s_disp_buffer[i].pu1_bufs[2];
+                        pu1_v_dst += (ps_codec->i4_strd * PAD_TOP) / 4 + (PAD_LEFT / 2);
+                        break;
+                    }
+                }
+                ps_dec_op->s_disp_frm_buf.pv_u_buf = pu1_u_dst;
+                ps_dec_op->s_disp_frm_buf.pv_v_buf = pu1_v_dst;
             }
             ps_dec_op->s_disp_frm_buf.u4_y_strd = ps_codec->i4_strd;
-
         }
         else
         {
@@ -559,6 +568,17 @@
                 ps_codec->i4_slice_error = 0;
         }
 
+        if(ps_codec->pu1_bitsbuf_dynamic)
+        {
+            ps_codec->pu1_bitsbuf = ps_codec->pu1_bitsbuf_dynamic;
+            ps_codec->u4_bitsbuf_size = ps_codec->u4_bitsbuf_size_dynamic;
+        }
+        else
+        {
+            ps_codec->pu1_bitsbuf = ps_codec->pu1_bitsbuf_static;
+            ps_codec->u4_bitsbuf_size = ps_codec->u4_bitsbuf_size_static;
+        }
+
         nal_ofst = ihevcd_nal_search_start_code(ps_codec->pu1_inp_bitsbuf,
                                                 ps_codec->i4_bytes_remaining);
 
@@ -571,6 +591,13 @@
                                         ps_codec->pu1_bitsbuf,
                                         bytes_remaining,
                                         &nal_len, &bits_len);
+
+            /* Decoder may read upto 8 extra bytes at the end of frame */
+            /* These are not used, but still set them to zero to avoid uninitialized reads */
+            if(bits_len < (WORD32)(ps_codec->u4_bitsbuf_size - 8))
+            {
+                memset(ps_codec->pu1_bitsbuf + bits_len, 0, 2 * sizeof(UWORD32));
+            }
         }
         /* This may be used to update the offsets for tiles and entropy sync row offsets */
         ps_codec->i4_num_emln_bytes = nal_len - bits_len;
@@ -642,6 +669,23 @@
             break;
         }
 
+        /* Allocate dynamic bitstream buffer once SPS is decoded */
+        if((ps_codec->u4_allocate_dynamic_done == 0) && ps_codec->i4_sps_done)
+        {
+            WORD32 ret;
+            ret = ihevcd_allocate_dynamic_bufs(ps_codec);
+            if(ret != IV_SUCCESS)
+            {
+                /* Free any dynamic buffers that are allocated */
+                ihevcd_free_dynamic_bufs(ps_codec);
+                ps_codec->i4_error_code = IVD_MEM_ALLOC_FAILED;
+                ps_dec_op->u4_error_code |= 1 << IVD_FATALERROR;
+                ps_dec_op->u4_error_code |= IVD_MEM_ALLOC_FAILED;
+
+                return IV_FAIL;
+            }
+        }
+
         BREAK_AFTER_SLICE_NAL();
     }
 
diff --git a/decoder/ihevcd_mv_merge.c b/decoder/ihevcd_mv_merge.c
index 9ec3029..08cec43 100644
--- a/decoder/ihevcd_mv_merge.c
+++ b/decoder/ihevcd_mv_merge.c
@@ -309,7 +309,7 @@
             cur_poc = ps_slice_hdr->i4_abs_pic_order_cnt;
 
             slice_idx = *(ps_mv_buf_col->pu1_pic_slice_map + col_ctb_x + col_ctb_y * ps_sps->i2_pic_wd_in_ctb);
-
+            slice_idx &= (MAX_SLICE_HDR_CNT - 1);
             if(au4_list_col[0] == 0)
             {
                 col_ref_poc_l0 =
diff --git a/decoder/ihevcd_parse_headers.c b/decoder/ihevcd_parse_headers.c
index cf1df16..06f5ef1 100644
--- a/decoder/ihevcd_parse_headers.c
+++ b/decoder/ihevcd_parse_headers.c
@@ -1276,16 +1276,6 @@
     ps_sps->i2_pic_width_in_luma_samples = ALIGN8(ps_sps->i2_pic_width_in_luma_samples);
     ps_sps->i2_pic_height_in_luma_samples = ALIGN8(ps_sps->i2_pic_height_in_luma_samples);
 
-    if((ps_sps->i2_pic_width_in_luma_samples > ps_codec->i4_max_wd) ||
-       (ps_sps->i2_pic_width_in_luma_samples * ps_sps->i2_pic_height_in_luma_samples >
-                       ps_codec->i4_max_wd * ps_codec->i4_max_ht) ||
-       (ps_sps->i2_pic_height_in_luma_samples > MAX(ps_codec->i4_max_wd, ps_codec->i4_max_ht)))
-    {
-        ps_codec->i4_new_max_wd = ps_sps->i2_pic_width_in_luma_samples;
-        ps_codec->i4_new_max_ht = ps_sps->i2_pic_height_in_luma_samples;
-        return (IHEVCD_ERROR_T)IHEVCD_UNSUPPORTED_DIMENSIONS;
-    }
-
     BITS_PARSE("pic_cropping_flag", value, ps_bitstrm, 1);
     ps_sps->i1_pic_cropping_flag = value;
 
@@ -1366,6 +1356,35 @@
         UEV_PARSE("max_latency_increase", value, ps_bitstrm);
         ps_sps->ai1_sps_max_latency_increase[i] = value;
     }
+
+    /* Check if sps_max_dec_pic_buffering or sps_max_num_reorder_pics
+       has changed */
+    if(0 != ps_codec->u4_allocate_dynamic_done)
+    {
+        sps_t *ps_sps_old = ps_codec->s_parse.ps_sps;
+        if(ps_sps_old->ai1_sps_max_dec_pic_buffering[ps_sps_old->i1_sps_max_sub_layers - 1] !=
+                    ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1])
+        {
+            if(0 == ps_codec->i4_first_pic_done)
+            {
+                return IHEVCD_INVALID_PARAMETER;
+            }
+            ps_codec->i4_reset_flag = 1;
+            return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
+        }
+
+        if(ps_sps_old->ai1_sps_max_num_reorder_pics[ps_sps_old->i1_sps_max_sub_layers - 1] !=
+                    ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1])
+        {
+            if(0 == ps_codec->i4_first_pic_done)
+            {
+                return IHEVCD_INVALID_PARAMETER;
+            }
+            ps_codec->i4_reset_flag = 1;
+            return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
+        }
+    }
+
     UEV_PARSE("log2_min_coding_block_size_minus3", value, ps_bitstrm);
     ps_sps->i1_log2_min_coding_block_size = value + 3;
 
@@ -1534,7 +1553,7 @@
         ps_sps->i2_pic_ht_in_min_cb = numerator  /
                         (1 << ps_sps->i1_log2_min_coding_block_size);
     }
-    if((0 != ps_codec->i4_sps_done) &&
+    if((0 != ps_codec->u4_allocate_dynamic_done) &&
                     ((ps_codec->i4_wd != ps_sps->i2_pic_width_in_luma_samples) ||
                     (ps_codec->i4_ht != ps_sps->i2_pic_height_in_luma_samples)))
     {
@@ -1997,10 +2016,13 @@
     WORD32 scaling_mat_size;
     tile_t *ps_tile_backup;
     WORD32 max_tile_cols, max_tile_rows;
+    WORD32 wd, ht;
+    wd = ALIGN64(ps_codec->i4_wd);
+    ht = ALIGN64(ps_codec->i4_ht);
 
     SCALING_MAT_SIZE(scaling_mat_size);
-    max_tile_cols = (ps_codec->i4_max_wd + MIN_TILE_WD - 1) / MIN_TILE_WD;
-    max_tile_rows = (ps_codec->i4_max_ht + MIN_TILE_HT - 1) / MIN_TILE_HT;
+    max_tile_cols = (wd + MIN_TILE_WD - 1) / MIN_TILE_WD;
+    max_tile_rows = (ht + MIN_TILE_HT - 1) / MIN_TILE_HT;
 
     ps_pps_ref = ps_codec->ps_pps_base + pps_id_ref;
     ps_pps = ps_codec->ps_pps_base + pps_id;
diff --git a/decoder/ihevcd_parse_slice_header.c b/decoder/ihevcd_parse_slice_header.c
index fe169c1..e1b50b7 100644
--- a/decoder/ihevcd_parse_slice_header.c
+++ b/decoder/ihevcd_parse_slice_header.c
@@ -420,10 +420,13 @@
             {
                 WORD32 numbits;
 
-                numbits = 32 - CLZ(ps_sps->i1_num_short_term_ref_pic_sets - 1);
-                BITS_PARSE("short_term_ref_pic_set_idx", value, ps_bitstrm, numbits);
-                ps_slice_hdr->i1_short_term_ref_pic_set_idx = value;
-                ps_slice_hdr->i1_short_term_ref_pic_set_idx = CLIP3(ps_slice_hdr->i1_short_term_ref_pic_set_idx, 0, MAX_STREF_PICS_SPS - 1);
+                ps_slice_hdr->i1_short_term_ref_pic_set_idx = 0;
+                if(ps_sps->i1_num_short_term_ref_pic_sets > 1)
+                {
+                    numbits = 32 - CLZ(ps_sps->i1_num_short_term_ref_pic_sets - 1);
+                    BITS_PARSE("short_term_ref_pic_set_idx", value, ps_bitstrm, numbits);
+                    ps_slice_hdr->i1_short_term_ref_pic_set_idx = value;
+                }
 
                 st_rps_idx = ps_slice_hdr->i1_short_term_ref_pic_set_idx;
                 num_neg_pics = ps_sps->as_stref_picset[st_rps_idx].i1_num_neg_pics;
diff --git a/decoder/ihevcd_structs.h b/decoder/ihevcd_structs.h
index a8a7074..1a46984 100644
--- a/decoder/ihevcd_structs.h
+++ b/decoder/ihevcd_structs.h
@@ -196,21 +196,21 @@
     /**
      * Absolute POCs of reference List 0 for all slices in the frame from which this frame is reconstructed
      */
-    WORD32 ai4_l0_collocated_poc[MAX_SLICE_SEGMENTS_IN_FRAME][MAX_DPB_SIZE];
+    WORD32 ai4_l0_collocated_poc[MAX_SLICE_HDR_CNT][MAX_DPB_SIZE];
 
     /**
      * Flag to indicate Long Term reference for POCs of reference List 0 for all slices in the frame from which this frame is reconstructed
      */
-    WORD8 ai1_l0_collocated_poc_lt[MAX_SLICE_SEGMENTS_IN_FRAME][MAX_DPB_SIZE];
+    WORD8 ai1_l0_collocated_poc_lt[MAX_SLICE_HDR_CNT][MAX_DPB_SIZE];
 
     /**
      * Absolute POCs of reference List 1 for all slices in the frame from which this frame is reconstructed
      */
-    WORD32 ai4_l1_collocated_poc[MAX_SLICE_SEGMENTS_IN_FRAME][MAX_DPB_SIZE];
+    WORD32 ai4_l1_collocated_poc[MAX_SLICE_HDR_CNT][MAX_DPB_SIZE];
     /**
      * Flag to indicate Long Term reference for POCs of reference List 1 for all slices in the frame from which this frame is reconstructed
      */
-    WORD8 ai1_l1_collocated_poc_lt[MAX_SLICE_SEGMENTS_IN_FRAME][MAX_DPB_SIZE];
+    WORD8 ai1_l1_collocated_poc_lt[MAX_SLICE_HDR_CNT][MAX_DPB_SIZE];
 
 }mv_buf_t;
 
@@ -1627,16 +1627,6 @@
 struct _codec_t
 {
     /**
-     * Max width the codec can support
-     */
-    WORD32 i4_max_wd;
-
-    /**
-     * Max height the codec can support
-     */
-    WORD32 i4_max_ht;
-
-    /**
      * Width : pic_width_in_luma_samples
      */
     WORD32 i4_wd;
@@ -1661,21 +1651,6 @@
      */
     WORD32 i4_disp_strd;
 
-    /*
-     * In case stream width/height is greater than max_wd/max_ht used during init,
-     * it is stored in the following and in order to decode the current stream
-     * decoder has to be recreated with these dimensions.
-     */
-    /**
-     * Stream width if it is greater than i4_max_wd
-     */
-    WORD32 i4_new_max_wd;
-
-    /**
-     * Stream height if it is greater than i4_max_ht
-     */
-    WORD32 i4_new_max_ht;
-
     /**
      * Stride of reference buffers.
      * For shared mode even display buffer will use the same stride
@@ -1683,26 +1658,6 @@
     WORD32 i4_strd;
 
     /**
-     * Level specified during init
-     */
-    WORD32 i4_init_level;
-
-    /**
-     * number of reference frames specified during init
-     */
-    WORD32 i4_init_num_ref;
-
-    /**
-     * number of reorder frames specified during init
-     */
-    WORD32 i4_init_num_reorder;
-
-    /**
-     * Number of extra display buffers allocated by application
-     */
-    WORD32 i4_init_num_extra_disp_buf;
-
-    /**
      * Number of cores to be used
      */
     WORD32 i4_num_cores;
@@ -1904,19 +1859,36 @@
     UWORD8 *pu1_bitsbuf;
 
     /**
+     * Pointer to static bitstream after emulation prevention
+     * This is a fixed size buffer used initially till SPS is decoded
+     */
+    UWORD8 *pu1_bitsbuf_static;
+
+    /**
+     * Pointer to dynamic bitstream after emulation prevention
+     * This is allocated after SPS is done, based on width and height
+     */
+    UWORD8 *pu1_bitsbuf_dynamic;
+
+    /**
      * Size of intermediate bitstream buffer
      */
     UWORD32 u4_bitsbuf_size;
 
     /**
+     * Size of intermediate static bitstream buffer
+     */
+    UWORD32 u4_bitsbuf_size_static;
+
+    /**
+     * Size of intermediate dynamic bitstream buffer
+     */
+    UWORD32 u4_bitsbuf_size_dynamic;
+
+    /**
      * Pointer to hold TU data for a set of CTBs or a picture
      */
     void *pv_tu_data;
-    /**
-     * Holds mem records passed during init.
-     * This will be used to return the mem records during retrieve call
-     */
-    iv_mem_rec_t *ps_mem_rec_backup;
 
     /**
      * Process Job queue buffer base
@@ -1937,6 +1909,12 @@
      * Current pictures intra mode map at 8x8 level
      */
     UWORD8 *pu1_pic_intra_flag;
+
+    /**
+     * No LPF buffer base
+     */
+    UWORD8 *pu1_pic_no_loop_filter_flag_base;
+
     /**
      * Current pictures loop filter flag map at 8x8 level
      */
@@ -1985,11 +1963,6 @@
     WORD32 i4_total_pic_buf_size;
 
     /**
-     * Remaining pic buffer size - used for shared mode with 420p support
-     */
-    WORD32 i4_remaining_pic_buf_size;
-
-    /**
      * Current chroma buffer base - used for shared mode with 420p output
      */
     UWORD8 *pu1_cur_chroma_ref_buf;
@@ -2127,6 +2100,28 @@
 
     /** Mask used to change MVs to full pel when configured to run in reduced complexity mode */
     WORD32 i4_mv_frac_mask;
+
+    /** Memory holding tile indices */
+    UWORD8 *pu1_tile_idx_base;
+
+    /** Callback for aligned allocation */
+    void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
+
+    /** Callback for aligned free */
+    void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+
+    /** Memory context passed from application */
+    void *pv_mem_ctxt;
+
+    /** Base address of reference buffrers allocated */
+    UWORD8 *pu1_ref_pic_buf_base;
+
+    /** Flag to indicate if dynamic buffers are allocated */
+    UWORD32 u4_allocate_dynamic_done;
+
+    /** Flag to signal display order */
+    IVD_DISPLAY_FRAME_OUT_MODE_T  e_frm_out_mode;
+
     /**  Funtion pointers for inter_pred leaf level functions */
     pf_inter_pred apf_inter_pred[22];
 
diff --git a/decoder/ihevcd_utils.c b/decoder/ihevcd_utils.c
index 952ef42..14cdd2b 100755
--- a/decoder/ihevcd_utils.c
+++ b/decoder/ihevcd_utils.c
@@ -163,59 +163,6 @@
 *******************************************************************************
 *
 * @brief
-*  Used to get DPB size for a given level, and number of luma samples
-*
-* @par Description:
-*  For given width, height and level number of max_dpb_size is computed as per
-*  Annex A.4.1
-*
-* @param[in] level
-*  Level of the stream
-*
-* @param[in] pic_size
-*  Width * Height
-*
-* @returns  Number of buffers in DPB
-*
-* @remarks
-*
-*
-*******************************************************************************
-*/
-WORD32 ihevcd_get_dpb_size(WORD32 level, WORD32 pic_size)
-{
-
-    WORD32 max_luma_samples;
-
-    WORD32 max_dpb_size;
-    WORD32 lvl_idx = ihevcd_get_lvl_idx(level);
-    max_luma_samples = gai4_ihevc_max_luma_pic_size[lvl_idx];
-
-
-
-    if(pic_size <= (max_luma_samples >> 2))
-    {
-        max_dpb_size = MIN(4 * MAX_DPB_PIC_BUF, 16);
-    }
-    else if(pic_size <= (max_luma_samples >> 1))
-    {
-        max_dpb_size = MIN(2 * MAX_DPB_PIC_BUF, 16);
-    }
-    else if(pic_size <= ((3 * max_luma_samples) >> 2))
-    {
-        max_dpb_size = MIN((4 * MAX_DPB_PIC_BUF) / 3, 16);
-    }
-    else
-    {
-        max_dpb_size = MAX_DPB_PIC_BUF;
-    }
-
-    return max_dpb_size;
-}
-/**
-*******************************************************************************
-*
-* @brief
 *  Used to get reference picture buffer size for a given level and
 *  and padding used
 *
@@ -242,85 +189,37 @@
 *
 *******************************************************************************
 */
-WORD32 ihevcd_get_total_pic_buf_size(WORD32 pic_size,
-                                     WORD32 level,
-                                     WORD32 horz_pad,
-                                     WORD32 vert_pad,
-                                     WORD32 init_num_bufs,
-                                     WORD32 init_extra_bufs,
-                                     WORD32 chroma_only)
+WORD32 ihevcd_get_total_pic_buf_size(codec_t *ps_codec,
+                                     WORD32 wd,
+                                     WORD32 ht)
 {
     WORD32 size;
     WORD32 num_luma_samples;
-    WORD32 lvl_idx;
-    WORD32 max_wd, min_ht;
     WORD32 max_dpb_size;
     WORD32 num_samples;
-    WORD32 max_num_bufs;
-    WORD32 pad = MAX(horz_pad, vert_pad);
 
 
+    sps_t *ps_sps = (ps_codec->s_parse.ps_sps_base + ps_codec->i4_sps_id);
+
     /* Get maximum number of buffers for the current picture size */
-    max_dpb_size = ihevcd_get_dpb_size(level, pic_size);
+    max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
 
+    if(ps_codec->e_frm_out_mode != IVD_DECODE_FRAME_OUT)
+        max_dpb_size += ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1];
 
-    max_num_bufs = (2 * max_dpb_size + 1);
-    /* If num_ref_frames and num_reorder_frmaes is specified
-     * Use minimum value
-     */
-    max_num_bufs = MIN(max_num_bufs, init_num_bufs);
-
-    /*
-     * Add extra buffers if required
-     */
-    max_num_bufs += init_extra_bufs;
-    max_num_bufs = MIN(max_num_bufs, BUF_MGR_MAX_CNT);
-
-    /* Get level index */
-    lvl_idx = ihevcd_get_lvl_idx(level);
-
-
-    /* Maximum width of luma samples in a picture at given level */
-    max_wd = ALIGN64(gai4_ihevc_max_wd_ht[lvl_idx]);
-
-    /* Minimum height of luma samples in a picture at given level */
-    min_ht = ALIGN64(gai4_ihevc_min_wd_ht[lvl_idx]);
-
-    /* Use max_wd and min_ht to get maximum number of luma samples for given level */
-    /* Because max_wd and min_ht are aligned to 64, product will be higher than the
-     * value given by the spec for a given level
-     */
-    num_luma_samples = max_wd * min_ht;
-
+    max_dpb_size++;
     /* Allocation is required for
      * (Wd + horz_pad) * (Ht + vert_pad) * (2 * max_dpb_size + 1)
-     *
-     * Above expanded as
-     * ((Wd * Ht) + (horz_pad * vert_pad) + Wd * vert_pad + Ht * horz_pad) * (2 * max_dpb_size + 1)
-     * (Wd * Ht) * (2 * max_dpb_size + 1) + ((horz_pad * vert_pad) + Wd * vert_pad + Ht * horz_pad) * (2 * max_dpb_size + 1)
-     * Now  max_dpb_size increases with smaller Wd and Ht, but Wd * ht * max_dpb_size will still be lesser or equal to max_wd * max_ht * dpb_size
-     *
-     * In the above equation (Wd * Ht) * (2 * max_dpb_size + 1) is accounted by using num_samples * (2 * max_dpb_size + 1) below
-     *
-     * For the padded area use MAX(horz_pad, vert_pad) as pad
-     * ((pad * pad) + pad * (Wd + Ht)) * (2 * max_dpb_size + 1) has to accounted from the above for padding
-     *
-     * Since Width and Height can change worst Wd + Ht is when One of the dimensions is max and other is min
-     * So use max_wd and min_ht
      */
 
     /* Account for padding area */
-
-    num_luma_samples += (pad * pad) + pad * (max_wd + min_ht);
+    num_luma_samples = (wd + PAD_WD) * (ht + PAD_HT);
 
     /* Account for chroma */
-    if(0 == chroma_only)
-        num_samples = num_luma_samples * 3 / 2;
-    else
-        num_samples = num_luma_samples / 2;
+    num_samples = num_luma_samples * 3 / 2;
 
     /* Number of bytes in reference pictures */
-    size = num_samples * max_num_bufs;
+    size = num_samples * max_dpb_size;
 
 
     return size;
@@ -561,43 +460,29 @@
     pic_buf_t *ps_pic_buf;
     WORD32 pic_buf_size_allocated;
 
-    WORD32 max_num_bufs;
-    WORD32 pic_size;
-    WORD32 level;
 
 
-    /* Initialize MV Bank buffer manager */
+
+    /* Initialize Pic buffer manager */
     ps_sps = ps_codec->s_parse.ps_sps;
 
-    pic_size = ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
-                    ALIGN64(ps_sps->i2_pic_height_in_luma_samples);
+    /* Compute the number of Pic buffers needed */
+    max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
 
+    if(ps_codec->e_frm_out_mode != IVD_DECODE_FRAME_OUT)
+        max_dpb_size += ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1];
 
-    /* Compute the number of MB Bank buffers needed */
-    level = ps_codec->i4_init_level;
-    max_dpb_size = ihevcd_get_dpb_size(level, pic_size);
-    /* Allocate twice dpb size to handle worst case reorder without returning more
-     * than one output per call
-     */
-    max_dpb_size *= 2;
     /* Allocate one extra picture to handle current frame
      * In case of asynchronous parsing and processing, number of buffers should increase here
      * based on when parsing and processing threads are synchronized
      */
     max_dpb_size++;
 
-    /* If num_ref_frames and num_reorder_frmaes is specified
-     * Use minimum value
-     */
-    max_num_bufs = MIN(max_dpb_size, (ps_codec->i4_init_num_ref + ps_codec->i4_init_num_reorder + 1));
 
-
-    pu1_buf = (UWORD8 *)ps_codec->ps_pic_buf;
+    pu1_buf = (UWORD8 *)ps_codec->pu1_ref_pic_buf_base;
 
     ps_pic_buf = (pic_buf_t *)ps_codec->ps_pic_buf;
 
-    pu1_buf += BUF_MGR_MAX_CNT  * sizeof(pic_buf_t);
-
     /* In case of non-shared mode, add picture buffers to buffer manager
      * In case of shared mode buffers are added in the run-time
      */
@@ -606,8 +491,7 @@
         WORD32 buf_ret;
         WORD32 luma_samples;
         WORD32 chroma_samples;
-        pic_buf_size_allocated = ps_codec->i4_total_pic_buf_size -
-                        BUF_MGR_MAX_CNT * sizeof(pic_buf_t);
+        pic_buf_size_allocated = ps_codec->i4_total_pic_buf_size;
 
         luma_samples = (ps_codec->i4_strd) *
                         (ps_sps->i2_pic_height_in_luma_samples + PAD_HT);
@@ -618,18 +502,14 @@
         /* If the number of buffers that can be added is less than max_num_bufs
          * return with an error.
          */
-        for(i = 0; i < (2 * MAX_DPB_SIZE) + 1; i++)
+        for(i = 0; i < max_dpb_size; i++)
         {
             pic_buf_size_allocated -= (luma_samples + chroma_samples);
 
             if(pic_buf_size_allocated < 0)
             {
-                if(i < max_num_bufs)
-                {
-                    ps_codec->s_parse.i4_error_code = IHEVCD_INSUFFICIENT_MEM_PICBUF;
-                    return IHEVCD_INSUFFICIENT_MEM_PICBUF;
-                }
-                break;
+                ps_codec->s_parse.i4_error_code = IHEVCD_INSUFFICIENT_MEM_PICBUF;
+                return IHEVCD_INSUFFICIENT_MEM_PICBUF;
             }
 
             ps_pic_buf->pu1_luma = pu1_buf + ps_codec->i4_strd * PAD_TOP + PAD_LEFT;
@@ -640,6 +520,7 @@
 
             buf_ret = ihevc_buf_mgr_add((buf_mgr_t *)ps_codec->pv_pic_buf_mgr, ps_pic_buf, i);
 
+
             if(0 != buf_ret)
             {
                 ps_codec->s_parse.i4_error_code = IHEVCD_BUF_MGR_ERROR;
@@ -648,6 +529,26 @@
             ps_pic_buf++;
         }
     }
+    else
+    {
+        /* In case of shared mode, buffers are added without adjusting for padding.
+           Update luma and chroma pointers here to account for padding as per stride.
+           In some cases stride might not be available when set_display_frame is called.
+           Hence updated luma and chroma pointers here */
+
+        for(i = 0; i < BUF_MGR_MAX_CNT; i++)
+        {
+            ps_pic_buf = ihevc_buf_mgr_get_buf((buf_mgr_t *)ps_codec->pv_pic_buf_mgr, i);
+            if((NULL == ps_pic_buf) ||
+               (NULL == ps_pic_buf->pu1_luma) ||
+               (NULL == ps_pic_buf->pu1_chroma))
+            {
+                break;
+            }
+            ps_pic_buf->pu1_luma += ps_codec->i4_strd * PAD_TOP + PAD_LEFT;
+            ps_pic_buf->pu1_chroma += ps_codec->i4_strd * (PAD_TOP / 2) + PAD_LEFT;
+        }
+    }
 
     return ret;
 }
@@ -678,7 +579,7 @@
     WORD32 max_dpb_size;
     WORD32 mv_bank_size_allocated;
     WORD32 pic_mv_bank_size;
-    WORD32 level;
+
     sps_t *ps_sps;
     UWORD8 *pu1_buf;
     mv_buf_t *ps_mv_buf;
@@ -688,11 +589,8 @@
     ps_sps = ps_codec->s_parse.ps_sps;
 
 
-    /* Compute the number of MB Bank buffers needed */
-    level = ps_codec->i4_init_level;
-    max_dpb_size = ihevcd_get_dpb_size(level,
-                                       ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
-                                       ALIGN64(ps_sps->i2_pic_height_in_luma_samples));
+    /* Compute the number of MV Bank buffers needed */
+    max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
 
     /* Allocate one extra MV Bank to handle current frame
      * In case of asynchronous parsing and processing, number of buffers should increase here
@@ -705,9 +603,9 @@
     pu1_buf = (UWORD8 *)ps_codec->pv_mv_bank_buf_base;
 
     ps_mv_buf = (mv_buf_t *)pu1_buf;
-    pu1_buf += (MAX_DPB_SIZE + 1) * sizeof(mv_buf_t);
+    pu1_buf += max_dpb_size * sizeof(mv_buf_t);
     ps_codec->ps_mv_buf = ps_mv_buf;
-    mv_bank_size_allocated = ps_codec->i4_total_mv_bank_size - (MAX_DPB_SIZE + 1) * sizeof(mv_buf_t);
+    mv_bank_size_allocated = ps_codec->i4_total_mv_bank_size - max_dpb_size  * sizeof(mv_buf_t);
 
     /* Compute MV bank size per picture */
     pic_mv_bank_size = ihevcd_get_pic_mv_bank_size(ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
@@ -1315,7 +1213,7 @@
     /* Get picture to be displayed if number of pictures decoded is more than max allowed reorder */
     /* Since the current will be decoded, check is fore >= instead of > */
     if(((WORD32)(ps_codec->u4_pic_cnt - ps_codec->u4_disp_cnt) >= ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1]) ||
-       ((WORD32)(ps_codec->u4_pic_cnt - ps_codec->u4_disp_cnt) >= ps_codec->i4_init_num_reorder))
+       (ps_codec->e_frm_out_mode == IVD_DECODE_FRAME_OUT))
 
     {
         ps_codec->ps_disp_buf = (pic_buf_t *)ihevc_disp_mgr_get((disp_mgr_t *)ps_codec->pv_disp_buf_mgr, &ps_codec->i4_disp_buf_id);
diff --git a/decoder/ihevcd_utils.h b/decoder/ihevcd_utils.h
index 7282ae7..893acaa 100644
--- a/decoder/ihevcd_utils.h
+++ b/decoder/ihevcd_utils.h
@@ -51,11 +51,7 @@
                                    WORD32 *pi4_ctb_tile_y,
                                    WORD32 *pi4_tile_idx);
 IHEVCD_ERROR_T ihevcd_parse_pic_init(codec_t *ps_codec);
-WORD32 ihevcd_get_total_pic_buf_size(WORD32 pic_size,
-                                     WORD32 level,
-                                     WORD32 horz_pad,
-                                     WORD32 vert_pad,
-                                     WORD32 init_num_bufs,
-                                     WORD32 init_extra_bufs,
-                                     WORD32 chroma_only);
+WORD32 ihevcd_get_total_pic_buf_size(codec_t *ps_codec,
+                                     WORD32 wd,
+                                     WORD32 ht);
 #endif /* _IHEVCD_UTILS_H_ */
diff --git a/decoder/ihevcd_version.c b/decoder/ihevcd_version.c
index b1b6e21..ee214b2 100644
--- a/decoder/ihevcd_version.c
+++ b/decoder/ihevcd_version.c
@@ -62,7 +62,7 @@
  * Version string. First two digits signify major version and last two minor
  * Increment major version for API change or major feature update
  */
-#define CODEC_RELEASE_VER       "04.04"
+#define CODEC_RELEASE_VER       "05.00"
 /**
  * Vendor name
  */
@@ -73,20 +73,18 @@
 * Concatenates various strings to form a version string
 *******************************************************************************
 */
+#define MAXVERSION_STRLEN       511
+#ifdef __ANDROID__
 #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor)    \
-    strcpy(version_string,"@(#)Id:");                                                               \
-    strcat(version_string,codec_name);                                                              \
-    strcat(version_string,"_");                                                                     \
-    strcat(version_string,codec_release_type);                                                      \
-    strcat(version_string," Ver:");                                                                 \
-    strcat(version_string,codec_release_ver);                                                       \
-    strcat(version_string," Released by ");                                                         \
-    strcat(version_string,codec_vendor);                                                            \
-    strcat(version_string," Build: ");                                                              \
-    strcat(version_string,__DATE__);                                                                \
-    strcat(version_string," @ ");                                                                   \
-    strcat(version_string,__TIME__);
-
+    snprintf(version_string, MAXVERSION_STRLEN,                                                     \
+             "@(#)Id:%s_%s Ver:%s Released by %s",                                                  \
+             codec_name, codec_release_type, codec_release_ver, codec_vendor)
+#else
+#define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor)    \
+    snprintf(version_string, MAXVERSION_STRLEN,                                                     \
+             "@(#)Id:%s_%s Ver:%s Released by %s Build: %s @ %s",                                   \
+             codec_name, codec_release_type, codec_release_ver, codec_vendor, __DATE__, __TIME__)
+#endif
 
 /**
 *******************************************************************************
@@ -113,12 +111,13 @@
 IV_API_CALL_STATUS_T ihevcd_get_version(CHAR *pc_version_string,
                                         UWORD32 u4_version_buffer_size)
 {
-    CHAR ac_version_tmp[512];
+    CHAR ac_version_tmp[MAXVERSION_STRLEN + 1];
+    UWORD32 u4_len;
     VERSION(ac_version_tmp, CODEC_NAME, CODEC_RELEASE_TYPE, CODEC_RELEASE_VER, CODEC_VENDOR);
-
-    if(u4_version_buffer_size >= (strlen(ac_version_tmp) + 1))
+    u4_len = strnlen(ac_version_tmp, MAXVERSION_STRLEN) + 1;
+    if(u4_version_buffer_size >= u4_len)
     {
-        memcpy(pc_version_string, ac_version_tmp, (strlen(ac_version_tmp) + 1));
+        memcpy(pc_version_string, ac_version_tmp, u4_len);
         return IV_SUCCESS;
     }
     else
diff --git a/test/decoder/main.c b/test/decoder/main.c
index f102add..680d7c7 100644
--- a/test/decoder/main.c
+++ b/test/decoder/main.c
@@ -56,9 +56,7 @@
 #include "ihevcd_cxa.h"
 #include "ithread.h"
 
-
-//#define MD5_DISABLE
-#ifdef X86_MSVC
+#ifdef WINDOWS_TIMER
 #include <windows.h>
 #else
 #include <sys/time.h>
@@ -68,12 +66,14 @@
 #define NUM_DISPLAY_BUFFERS 4
 #define DEFAULT_FPS         30
 
-
 #define ENABLE_DEGRADE 0
 #define MAX_DISP_BUFFERS    64
 #define EXTRA_DISP_BUFFERS  0
 #define STRLENGTH 1000
 
+#define ADAPTIVE_TEST
+#define ADAPTIVE_MAX_WD 8192
+#define ADAPTIVE_MAX_HT 4096
 //#define TEST_FLUSH
 #define FLUSH_FRM_CNT 100
 
@@ -240,9 +240,9 @@
     void (*set_disp_buffers)(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
     void (*disp_deinit)(void *);
     void (*disp_usleep)(UWORD32);
-    IV_COLOR_FORMAT_T(*get_color_fmt)(void);
-    UWORD32(*get_stride)(void);
-}vid_dec_ctx_t;
+    IV_COLOR_FORMAT_T (*get_color_fmt)(void);
+    UWORD32 (*get_stride)(void);
+} vid_dec_ctx_t;
 
 
 
@@ -266,9 +266,6 @@
     FULLSCREEN,
     FPS,
     TRACE,
-    MAX_WD,
-    MAX_HT,
-    MAX_LEVEL,
     CONFIG,
 
     DEGRADE_TYPE,
@@ -332,12 +329,6 @@
         "FPS to be used for display \n" },
     { "-i",  "--trace",                   TRACE,
         "Trace file\n" },
-    { "--", "--max_wd",      MAX_WD,
-        "Maximum width (Default: 2560) \n" },
-    { "--", "--max_ht",      MAX_HT,
-        "Maximum height (Default: 1600)\n" },
-    { "--", "--max_level",      MAX_LEVEL,
-        "Maximum Decoder Level (Default: 50)\n" },
     { "--",  "--arch", ARCH,
         "Set Architecture. Supported values  ARM_NONEON, ARM_A9Q, ARM_A7, ARM_A5, ARM_NEONINTR, X86_GENERIC, X86_SSSE3, X86_SSE4 \n" },
     { "--",  "--soc", SOC,
@@ -345,11 +336,6 @@
 };
 
 #define PEAK_WINDOW_SIZE            8
-#define MAX_FRAME_WIDTH             2560
-#define MAX_FRAME_HEIGHT            1600
-#define MAX_LEVEL_SUPPORTED         50
-#define MAX_REF_FRAMES              16
-#define MAX_REORDER_FRAMES          16
 #define DEFAULT_SHARE_DISPLAY_BUF   0
 #define STRIDE                      0
 #define DEFAULT_NUM_CORES           1
@@ -422,39 +408,45 @@
 /*                                                                           */
 /*****************************************************************************/
 
-void* ihevca_aligned_malloc(WORD32 alignment, WORD32 size)
+void *ihevca_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
 {
-    return (void *)_aligned_malloc(size, alignment);
+    (void)pv_ctxt;
+    return (void *)_aligned_malloc(i4_size, alignment);
 }
 
-void ihevca_aligned_free(void *pv_buf)
+void ihevca_aligned_free(void *pv_ctxt, void *pv_buf)
 {
+    (void)pv_ctxt;
     _aligned_free(pv_buf);
     return;
 }
 #endif
 
 #if IOS
-void* ihevca_aligned_malloc(WORD32 alignment, WORD32 size)
+void *ihevca_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
 {
-    return malloc(size);
+    (void)pv_ctxt;
+    return malloc(i4_size);
 }
 
-void ihevca_aligned_free(void *pv_buf)
+void ihevca_aligned_free(void *pv_ctxt, void *pv_buf)
 {
+    (void)pv_ctxt;
     free(pv_buf);
     return;
 }
 #endif
 
 #if (!defined(IOS)) && (!defined(_WIN32))
-void* ihevca_aligned_malloc(WORD32 alignment, WORD32 size)
+void *ihevca_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
 {
-    return memalign(alignment, size);
+   (void)pv_ctxt;
+    return memalign(alignment, i4_size);
 }
 
-void ihevca_aligned_free(void *pv_buf)
+void ihevca_aligned_free(void *pv_ctxt, void *pv_buf)
 {
+    (void)pv_ctxt;
     free(pv_buf);
     return;
 }
@@ -934,10 +926,10 @@
     {
 #if DUMP_SINGLE_BUF
         {
-            UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 24 - (s_dump_disp_frm_buf.u4_y_strd * 40);
+            UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 80 - (s_dump_disp_frm_buf.u4_y_strd * 80);
 
-            UWORD32 size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 80) + (s_dump_disp_frm_buf.u4_u_ht + 40));
-            fwrite(buf, 1, size, ps_op_file);
+            UWORD32 size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 160) + (s_dump_disp_frm_buf.u4_u_ht + 80));
+            fwrite(buf, 1, size ,ps_op_file);
 
         }
 #else
@@ -1003,7 +995,7 @@
             UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 24 - (s_dump_disp_frm_buf.u4_y_strd * 40);
 
             UWORD32 size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 80) + (s_dump_disp_frm_buf.u4_u_ht + 40));
-            fwrite(buf, 1, size, ps_op_file);
+            fwrite(buf, 1, size ,ps_op_file);
         }
 #else
         {
@@ -1242,15 +1234,6 @@
             if(ps_app_ctx->fps <= 0)
                 ps_app_ctx->fps = DEFAULT_FPS;
             break;
-        case MAX_WD:
-            sscanf(value, "%d", &ps_app_ctx->max_wd);
-            break;
-        case MAX_HT:
-            sscanf(value, "%d", &ps_app_ctx->max_ht);
-            break;
-        case MAX_LEVEL:
-            sscanf(value, "%d", &ps_app_ctx->max_level);
-            break;
         case ARCH:
             if((strcmp(value, "ARM_NONEON")) == 0)
                 ps_app_ctx->e_arch = ARCH_ARM_NONEON;
@@ -1274,6 +1257,8 @@
                 ps_app_ctx->e_arch = ARCH_MIPS_GENERIC;
             else if((strcmp(value, "MIPS_32")) == 0)
                 ps_app_ctx->e_arch = ARCH_MIPS_32;
+            else if((strcmp(value, "ARMV8_GENERIC")) == 0)
+                ps_app_ctx->e_arch = ARCH_ARMV8_GENERIC;
             else
             {
                 printf("\nInvalid Arch. Setting it to ARM_A9Q\n");
@@ -1527,14 +1512,11 @@
     TIMER   s_first_frame_time;
     UWORD32 first_frame_displayed;
 
-#ifdef X86_MINGW
-    UWORD32 frequency = 0;
-#endif
-#ifdef X86_MSVC
+#ifdef WINDOWS_TIMER
     TIMER frequency;
 #endif
 
-#ifdef X86_MSVC
+#ifdef WINDOWS_TIMER
     QueryPerformanceFrequency(&frequency);
 #endif
     first_frame_displayed = 0;
@@ -1745,17 +1727,15 @@
     WORD32 ret;
     CHAR ac_error_str[STRLENGTH];
     vid_dec_ctx_t s_app_ctx;
-    UWORD8 *pu1_bs_buf;
+    UWORD8 *pu1_bs_buf = NULL;
 
     ivd_out_bufdesc_t *ps_out_buf;
     UWORD32 u4_num_bytes_dec = 0;
     UWORD32 file_pos = 0;
-    IV_API_CALL_STATUS_T e_dec_status;
+
     UWORD32 u4_ip_frm_ts = 0, u4_op_frm_ts = 0;
 
     WORD32 u4_bytes_remaining = 0;
-    void *pv_mem_rec_location;
-    UWORD32 u4_num_mem_recs;
     UWORD32 i;
     UWORD32 u4_ip_buf_len;
     UWORD32 frm_cnt = 0;
@@ -1773,14 +1753,15 @@
 #endif
 #endif
 
-#ifdef X86_MINGW
-    UWORD32 frequency = 0;
-#endif
-#ifdef X86_MSVC
+#ifdef WINDOWS_TIMER
     TIMER frequency;
 #endif
     WORD32 width = 0, height = 0;
     iv_obj_t *codec_obj;
+#if defined(GPU_BUILD) && !defined(X86)
+//    int ioctl_init();
+//    ioctl_init();
+#endif
 
 #ifdef X86_MINGW
     //For getting printfs without any delay
@@ -1844,9 +1825,6 @@
     s_app_ctx.u4_num_cores = DEFAULT_NUM_CORES;
     s_app_ctx.i4_degrade_type = 0;
     s_app_ctx.i4_degrade_pics = 0;
-    s_app_ctx.max_wd = 0;
-    s_app_ctx.max_ht = 0;
-    s_app_ctx.max_level = 0;
     s_app_ctx.e_arch = ARCH_ARM_A9Q;
     s_app_ctx.e_soc = SOC_GENERIC;
 
@@ -2064,217 +2042,37 @@
 
         ps_out_buf = (ivd_out_bufdesc_t *)malloc(sizeof(ivd_out_bufdesc_t));
 
-        {
-            iv_num_mem_rec_ip_t s_no_of_mem_rec_query_ip;
-            iv_num_mem_rec_op_t s_no_of_mem_rec_query_op;
-
-            s_no_of_mem_rec_query_ip.u4_size = sizeof(s_no_of_mem_rec_query_ip);
-            s_no_of_mem_rec_query_op.u4_size = sizeof(s_no_of_mem_rec_query_op);
-            s_no_of_mem_rec_query_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
-
-            /*****************************************************************************/
-            /*   API Call: Get Number of Mem Records                                     */
-            /*****************************************************************************/
-            e_dec_status = ivd_cxa_api_function(
-                            NULL, (void *)&s_no_of_mem_rec_query_ip,
-                            (void *)&s_no_of_mem_rec_query_op);
-            if(IV_SUCCESS != e_dec_status)
-            {
-                sprintf(ac_error_str, "Error in get mem records");
-                codec_exit(ac_error_str);
-            }
-
-            u4_num_mem_recs = s_no_of_mem_rec_query_op.u4_num_mem_rec;
-        }
-
-        pv_mem_rec_location = malloc(u4_num_mem_recs * sizeof(iv_mem_rec_t));
-        if(pv_mem_rec_location == NULL)
-        {
-            sprintf(ac_error_str, "Allocation failure for mem_rec_location");
-            codec_exit(ac_error_str);
-
-        }
-
-        {
-            ihevcd_cxa_fill_mem_rec_ip_t s_fill_mem_rec_ip;
-            ihevcd_cxa_fill_mem_rec_op_t s_fill_mem_rec_op;
-            iv_mem_rec_t *ps_mem_rec;
-            UWORD32 total_size;
-
-            s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.e_cmd =
-                            IV_CMD_FILL_NUM_MEM_REC;
-            s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location =
-                            (iv_mem_rec_t *)pv_mem_rec_location;
-            s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd =
-                            (s_app_ctx.max_wd == 0) ? MAX_FRAME_WIDTH : s_app_ctx.max_wd;
-            s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht =
-                            (s_app_ctx.max_ht == 0) ? MAX_FRAME_HEIGHT : s_app_ctx.max_ht;
-            s_fill_mem_rec_ip.i4_level = (s_app_ctx.max_level == 0) ? MAX_LEVEL_SUPPORTED : s_app_ctx.max_level;
-            s_fill_mem_rec_ip.u4_num_ref_frames = MAX_REF_FRAMES;
-            s_fill_mem_rec_ip.u4_num_reorder_frames = MAX_REORDER_FRAMES;
-            s_fill_mem_rec_ip.u4_share_disp_buf = s_app_ctx.share_disp_buf;
-            s_fill_mem_rec_ip.e_output_format =
-                            (IV_COLOR_FORMAT_T)s_app_ctx.e_output_chroma_format;
-            s_fill_mem_rec_ip.u4_num_extra_disp_buf = EXTRA_DISP_BUFFERS;
-
-            s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_size =
-                            sizeof(ihevcd_cxa_fill_mem_rec_ip_t);
-            s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_size =
-                            sizeof(ihevcd_cxa_fill_mem_rec_op_t);
-
-            ps_mem_rec = (iv_mem_rec_t *)pv_mem_rec_location;
-            for(i = 0; i < u4_num_mem_recs; i++)
-                ps_mem_rec[i].u4_size = sizeof(iv_mem_rec_t);
-
-            /*****************************************************************************/
-            /*   API Call: Fill Mem Records                                     */
-            /*****************************************************************************/
-
-            e_dec_status = ivd_cxa_api_function(NULL,
-                                                (void *)&s_fill_mem_rec_ip,
-                                                (void *)&s_fill_mem_rec_op);
-
-            u4_num_mem_recs =
-                            s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled;
-
-            if(IV_SUCCESS != e_dec_status)
-            {
-                sprintf(ac_error_str, "Error in fill mem records: %x", s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_error_code);
-                codec_exit(ac_error_str);
-            }
-
-            ps_mem_rec = (iv_mem_rec_t *)pv_mem_rec_location;
-            total_size = 0;
-            for(i = 0; i < u4_num_mem_recs; i++)
-            {
-                ps_mem_rec->pv_base = ihevca_aligned_malloc(ps_mem_rec->u4_mem_alignment,
-                                                            ps_mem_rec->u4_mem_size);
-                if(ps_mem_rec->pv_base == NULL)
-                {
-                    sprintf(ac_error_str,
-                            "\nAllocation failure for mem record id %d size %d\n",
-                            i, ps_mem_rec->u4_mem_size);
-                    codec_exit(ac_error_str);
-
-                }
-                total_size += ps_mem_rec->u4_mem_size;
-
-                ps_mem_rec++;
-            }
-            //printf("\nTotal memory for codec %d\n", total_size);
-        }
         /*****************************************************************************/
         /*   API Call: Initialize the Decoder                                        */
         /*****************************************************************************/
         {
-            ihevcd_cxa_init_ip_t s_init_ip;
-            ihevcd_cxa_init_op_t s_init_op;
+            ihevcd_cxa_create_ip_t s_create_ip;
+            ihevcd_cxa_create_op_t s_create_op;
             void *fxns = &ivd_cxa_api_function;
-            iv_mem_rec_t *mem_tab;
 
-            mem_tab = (iv_mem_rec_t *)pv_mem_rec_location;
-            s_init_ip.s_ivd_init_ip_t.e_cmd = (IVD_API_COMMAND_TYPE_T)IV_CMD_INIT;
-            s_init_ip.s_ivd_init_ip_t.pv_mem_rec_location = mem_tab;
-            s_init_ip.s_ivd_init_ip_t.u4_frm_max_wd = (s_app_ctx.max_wd == 0) ? MAX_FRAME_WIDTH : s_app_ctx.max_wd;
-            s_init_ip.s_ivd_init_ip_t.u4_frm_max_ht = (s_app_ctx.max_ht == 0) ? MAX_FRAME_HEIGHT : s_app_ctx.max_ht;
-            s_init_ip.i4_level = (s_app_ctx.max_level == 0) ? MAX_LEVEL_SUPPORTED : s_app_ctx.max_level;
-            s_init_ip.u4_num_ref_frames = MAX_REF_FRAMES;
-            s_init_ip.u4_num_reorder_frames = MAX_REORDER_FRAMES;
-            s_init_ip.u4_share_disp_buf = s_app_ctx.share_disp_buf;
-            s_init_ip.u4_num_extra_disp_buf = EXTRA_DISP_BUFFERS;
-            s_init_ip.s_ivd_init_ip_t.u4_num_mem_rec = u4_num_mem_recs;
-            s_init_ip.s_ivd_init_ip_t.e_output_format =
-                            (IV_COLOR_FORMAT_T)s_app_ctx.e_output_chroma_format;
-            s_init_ip.s_ivd_init_ip_t.u4_size = sizeof(ihevcd_cxa_init_ip_t);
-            s_init_op.s_ivd_init_op_t.u4_size = sizeof(ihevcd_cxa_init_op_t);
+            s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE;
+            s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = s_app_ctx.share_disp_buf;
+            s_create_ip.s_ivd_create_ip_t.e_output_format = (IV_COLOR_FORMAT_T)s_app_ctx.e_output_chroma_format;
+            s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ihevca_aligned_malloc;
+            s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ihevca_aligned_free;
+            s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL;
+            s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ihevcd_cxa_create_ip_t);
+            s_create_op.s_ivd_create_op_t.u4_size = sizeof(ihevcd_cxa_create_op_t);
 
-            codec_obj = (iv_obj_t *)mem_tab[0].pv_base;
-            codec_obj->pv_fxns = fxns;
-            codec_obj->u4_size = sizeof(iv_obj_t);
 
-            s_app_ctx.cocodec_obj = codec_obj;
 
-            ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, (void *)&s_init_ip,
-                                       (void *)&s_init_op);
+            ret = ivd_cxa_api_function(NULL, (void *)&s_create_ip,
+                                       (void *)&s_create_op);
             if(ret != IV_SUCCESS)
             {
-                sprintf(ac_error_str, "Error in Init %8x\n",
-                        s_init_op.s_ivd_init_op_t.u4_error_code);
+                sprintf(ac_error_str, "Error in Create %8x\n",
+                        s_create_op.s_ivd_create_op_t.u4_error_code);
                 codec_exit(ac_error_str);
             }
-
-            /*****************************************************************************/
-            /*  Input and output buffer allocation                                       */
-            /*****************************************************************************/
-            {
-
-                ivd_ctl_getbufinfo_ip_t s_ctl_ip;
-                ivd_ctl_getbufinfo_op_t s_ctl_op;
-
-                s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
-                s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
-                s_ctl_ip.u4_size = sizeof(ivd_ctl_getbufinfo_ip_t);
-                s_ctl_op.u4_size = sizeof(ivd_ctl_getbufinfo_op_t);
-                ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
-                                           (void *)&s_ctl_op);
-                if(ret != IV_SUCCESS)
-                {
-                    sprintf(ac_error_str, "Error in Get Buf Info %x", s_ctl_op.u4_error_code);
-                    codec_exit(ac_error_str);
-                }
-
-                /* Allocate input buffer */
-                u4_ip_buf_len = s_ctl_op.u4_min_in_buf_size[0];
-                pu1_bs_buf = (UWORD8 *)malloc(u4_ip_buf_len);
-
-                if(pu1_bs_buf == NULL)
-                {
-                    sprintf(ac_error_str,
-                            "\nAllocation failure for input buffer of size %d",
-                            u4_ip_buf_len);
-                    codec_exit(ac_error_str);
-                }
-                s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
-                /* Allocate output buffer only if display buffers are not shared */
-                /* Or if shared and output is 420P */
-                if((0 == s_app_ctx.share_disp_buf) || (IV_YUV_420P == s_app_ctx.e_output_chroma_format))
-                {
-                    UWORD32 outlen;
-                    ps_out_buf->u4_min_out_buf_size[0] =
-                                    s_ctl_op.u4_min_out_buf_size[0];
-                    ps_out_buf->u4_min_out_buf_size[1] =
-                                    s_ctl_op.u4_min_out_buf_size[1];
-                    ps_out_buf->u4_min_out_buf_size[2] =
-                                    s_ctl_op.u4_min_out_buf_size[2];
-
-                    outlen = s_ctl_op.u4_min_out_buf_size[0];
-                    if(s_ctl_op.u4_min_num_out_bufs > 1)
-                        outlen += s_ctl_op.u4_min_out_buf_size[1];
-
-                    if(s_ctl_op.u4_min_num_out_bufs > 2)
-                        outlen += s_ctl_op.u4_min_out_buf_size[2];
-
-                    ps_out_buf->pu1_bufs[0] = (UWORD8 *)malloc(outlen);
-                    if(ps_out_buf->pu1_bufs[0] == NULL)
-                    {
-                        sprintf(ac_error_str,
-                                "\nAllocation failure for output buffer of size %d",
-                                outlen);
-                        codec_exit(ac_error_str);
-                    }
-
-                    if(s_ctl_op.u4_min_num_out_bufs > 1)
-                        ps_out_buf->pu1_bufs[1] = ps_out_buf->pu1_bufs[0]
-                                        + (s_ctl_op.u4_min_out_buf_size[0]);
-
-                    if(s_ctl_op.u4_min_num_out_bufs > 2)
-                        ps_out_buf->pu1_bufs[2] = ps_out_buf->pu1_bufs[1]
-                                        + (s_ctl_op.u4_min_out_buf_size[1]);
-
-                    ps_out_buf->u4_num_bufs = s_ctl_op.u4_min_num_out_bufs;
-                }
-
-            }
+            codec_obj = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle;
+            codec_obj->pv_fxns = fxns;
+            codec_obj->u4_size = sizeof(iv_obj_t);
+            s_app_ctx.cocodec_obj = codec_obj;
         }
 
     }
@@ -2328,36 +2126,56 @@
 
     }
 
+    flush_output(codec_obj, &s_app_ctx, ps_out_buf,
+                 pu1_bs_buf, &u4_op_frm_ts,
+                 ps_op_file, ps_op_chksum_file,
+                 u4_ip_frm_ts, u4_bytes_remaining);
 
     /*****************************************************************************/
     /*   Decode header to get width and height and buffer sizes                  */
     /*****************************************************************************/
     {
-
-        ivd_ctl_set_config_ip_t s_ctl_ip;
-        ivd_ctl_set_config_op_t s_ctl_op;
-
         ivd_video_decode_ip_t s_video_decode_ip;
         ivd_video_decode_op_t s_video_decode_op;
 
-        s_ctl_ip.u4_disp_wd = STRIDE;
-        if(1 == s_app_ctx.display)
-            s_ctl_ip.u4_disp_wd = s_app_ctx.get_stride();
 
-        s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
-        s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
-        s_ctl_ip.e_vid_dec_mode = IVD_DECODE_HEADER;
-        s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
-        s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
-        s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
-        s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
 
-        ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
-                                   (void *)&s_ctl_op);
-        if(ret != IV_SUCCESS)
+        {
+            ivd_ctl_set_config_ip_t s_ctl_ip;
+            ivd_ctl_set_config_op_t s_ctl_op;
+
+
+            s_ctl_ip.u4_disp_wd = STRIDE;
+            if(1 == s_app_ctx.display)
+                s_ctl_ip.u4_disp_wd = s_app_ctx.get_stride();
+
+            s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
+            s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+            s_ctl_ip.e_vid_dec_mode = IVD_DECODE_HEADER;
+            s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+            s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
+            s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
+            s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
+
+            ret = ivd_cxa_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_ip,
+                                       (void *)&s_ctl_op);
+            if(ret != IV_SUCCESS)
+            {
+                sprintf(ac_error_str,
+                        "\nError in setting the codec in header decode mode");
+                codec_exit(ac_error_str);
+            }
+        }
+
+        /* Allocate input buffer for header */
+        u4_ip_buf_len = 256 * 1024;
+        pu1_bs_buf = (UWORD8 *)malloc(u4_ip_buf_len);
+
+        if(pu1_bs_buf == NULL)
         {
             sprintf(ac_error_str,
-                    "\nError in setting the codec in header decode mode");
+                    "\nAllocation failure for input buffer of i4_size %d",
+                    u4_ip_buf_len);
             codec_exit(ac_error_str);
         }
 
@@ -2408,7 +2226,7 @@
 
             u4_num_bytes_dec = s_video_decode_op.u4_num_bytes_consumed;
 #ifndef PROFILE_ENABLE
-            printf("%d\n", s_video_decode_op.u4_num_bytes_consumed);
+            printf("%d\n",s_video_decode_op.u4_num_bytes_consumed);
 #endif
             file_pos += u4_num_bytes_dec;
             total_bytes_comsumed += u4_num_bytes_dec;
@@ -2418,10 +2236,177 @@
         s_app_ctx.u4_pic_wd = s_video_decode_op.u4_pic_wd;
         s_app_ctx.u4_pic_ht = s_video_decode_op.u4_pic_ht;
 
+        free(pu1_bs_buf);
+
 #if IOS_DISPLAY
         s_app_ctx.i4_screen_wd = screen_wd;
         s_app_ctx.i4_screen_ht = screen_ht;
 #endif
+        {
+
+            ivd_ctl_getbufinfo_ip_t s_ctl_ip;
+            ivd_ctl_getbufinfo_op_t s_ctl_op;
+            WORD32 outlen = 0;
+
+            s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+            s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
+            s_ctl_ip.u4_size = sizeof(ivd_ctl_getbufinfo_ip_t);
+            s_ctl_op.u4_size = sizeof(ivd_ctl_getbufinfo_op_t);
+            ret = ivd_cxa_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_ip,
+                                       (void *)&s_ctl_op);
+            if(ret != IV_SUCCESS)
+            {
+                sprintf(ac_error_str, "Error in Get Buf Info %x", s_ctl_op.u4_error_code);
+                codec_exit(ac_error_str);
+            }
+
+            /* Allocate bitstream buffer */
+            u4_ip_buf_len = s_ctl_op.u4_min_in_buf_size[0];
+#ifdef ADAPTIVE_TEST
+            u4_ip_buf_len = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 3 >> 1;
+#endif
+            pu1_bs_buf = (UWORD8 *)malloc(u4_ip_buf_len);
+
+            if(pu1_bs_buf == NULL)
+            {
+                sprintf(ac_error_str,
+                        "\nAllocation failure for input buffer of i4_size %d",
+                        u4_ip_buf_len);
+                codec_exit(ac_error_str);
+            }
+
+#ifdef ADAPTIVE_TEST
+            switch(s_app_ctx.e_output_chroma_format)
+            {
+                case IV_YUV_420P:
+                {
+                    s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT;
+                    s_ctl_op.u4_min_out_buf_size[1] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 2;
+                    s_ctl_op.u4_min_out_buf_size[2] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 2;
+                    break;
+                }
+                case IV_YUV_420SP_UV:
+                case IV_YUV_420SP_VU:
+                {
+                    s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT;
+                    s_ctl_op.u4_min_out_buf_size[1] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 1;
+                    s_ctl_op.u4_min_out_buf_size[2] = 0;
+                    break;
+                }
+                case IV_YUV_422ILE:
+                {
+                    s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 2;
+                    s_ctl_op.u4_min_out_buf_size[1] = 0;
+                    s_ctl_op.u4_min_out_buf_size[2] = 0;
+                    break;
+                }
+                case IV_RGBA_8888:
+                {
+                    s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 4;
+                    s_ctl_op.u4_min_out_buf_size[1] = 0;
+                    s_ctl_op.u4_min_out_buf_size[2] = 0;
+                    break;
+                }
+                case IV_RGB_565:
+                {
+                    s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 2;
+                    s_ctl_op.u4_min_out_buf_size[1] = 0;
+                    s_ctl_op.u4_min_out_buf_size[2] = 0;
+                    break;
+                }
+                default:
+                    break;
+
+            }
+#endif
+            /* Allocate output buffer only if display buffers are not shared */
+            /* Or if shared and output is 420P */
+            if((0 == s_app_ctx.share_disp_buf) || (IV_YUV_420P == s_app_ctx.e_output_chroma_format))
+            {
+                ps_out_buf->u4_min_out_buf_size[0] =
+                                s_ctl_op.u4_min_out_buf_size[0];
+                ps_out_buf->u4_min_out_buf_size[1] =
+                                s_ctl_op.u4_min_out_buf_size[1];
+                ps_out_buf->u4_min_out_buf_size[2] =
+                                s_ctl_op.u4_min_out_buf_size[2];
+
+                outlen = s_ctl_op.u4_min_out_buf_size[0];
+                if(s_ctl_op.u4_min_num_out_bufs > 1)
+                    outlen += s_ctl_op.u4_min_out_buf_size[1];
+
+                if(s_ctl_op.u4_min_num_out_bufs > 2)
+                    outlen += s_ctl_op.u4_min_out_buf_size[2];
+
+                ps_out_buf->pu1_bufs[0] = (UWORD8 *)malloc(outlen);
+                if(ps_out_buf->pu1_bufs[0] == NULL)
+                {
+                    sprintf(ac_error_str, "\nAllocation failure for output buffer of i4_size %d",
+                            outlen);
+                    codec_exit(ac_error_str);
+                }
+
+                if(s_ctl_op.u4_min_num_out_bufs > 1)
+                    ps_out_buf->pu1_bufs[1] = ps_out_buf->pu1_bufs[0]
+                                    + (s_ctl_op.u4_min_out_buf_size[0]);
+
+                if(s_ctl_op.u4_min_num_out_bufs > 2)
+                    ps_out_buf->pu1_bufs[2] = ps_out_buf->pu1_bufs[1]
+                                    + (s_ctl_op.u4_min_out_buf_size[1]);
+
+                ps_out_buf->u4_num_bufs = s_ctl_op.u4_min_num_out_bufs;
+            }
+
+#ifdef APP_EXTRA_BUFS
+            s_app_ctx.disp_delay = EXTRA_DISP_BUFFERS;
+            s_ctl_op.u4_num_disp_bufs += EXTRA_DISP_BUFFERS;
+#endif
+
+            /*****************************************************************************/
+            /*   API Call: Allocate display buffers for display buffer shared case       */
+            /*****************************************************************************/
+
+            for(i = 0; i < s_ctl_op.u4_num_disp_bufs; i++)
+            {
+
+                s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[0] =
+                                s_ctl_op.u4_min_out_buf_size[0];
+                s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[1] =
+                                s_ctl_op.u4_min_out_buf_size[1];
+                s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[2] =
+                                s_ctl_op.u4_min_out_buf_size[2];
+
+                outlen = s_ctl_op.u4_min_out_buf_size[0];
+                if(s_ctl_op.u4_min_num_out_bufs > 1)
+                    outlen += s_ctl_op.u4_min_out_buf_size[1];
+
+                if(s_ctl_op.u4_min_num_out_bufs > 2)
+                    outlen += s_ctl_op.u4_min_out_buf_size[2];
+
+                s_app_ctx.s_disp_buffers[i].pu1_bufs[0] = (UWORD8 *)malloc(outlen);
+
+                if(s_app_ctx.s_disp_buffers[i].pu1_bufs[0] == NULL)
+                {
+                    sprintf(ac_error_str,
+                            "\nAllocation failure for output buffer of i4_size %d",
+                            outlen);
+                    codec_exit(ac_error_str);
+                }
+
+                if(s_ctl_op.u4_min_num_out_bufs > 1)
+                    s_app_ctx.s_disp_buffers[i].pu1_bufs[1] =
+                                    s_app_ctx.s_disp_buffers[i].pu1_bufs[0]
+                                                    + (s_ctl_op.u4_min_out_buf_size[0]);
+
+                if(s_ctl_op.u4_min_num_out_bufs > 2)
+                    s_app_ctx.s_disp_buffers[i].pu1_bufs[2] =
+                                    s_app_ctx.s_disp_buffers[i].pu1_bufs[1]
+                                                    + (s_ctl_op.u4_min_out_buf_size[1]);
+
+                s_app_ctx.s_disp_buffers[i].u4_num_bufs =
+                                s_ctl_op.u4_min_num_out_bufs;
+            }
+            s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
+        }
 
         /* Create display thread and wait for the display buffers to be initialized */
         if(1 == s_app_ctx.display)
@@ -2430,7 +2415,7 @@
             {
                 s_app_ctx.display_init_done = 0;
                 ithread_create(s_app_ctx.display_thread_handle, NULL,
-                               (void *)&display_thread, (void *)&s_app_ctx);
+                                                    (void *) &display_thread, (void *) &s_app_ctx);
                 s_app_ctx.display_thread_created = 1;
 
                 while(1)
@@ -2441,84 +2426,9 @@
                     ithread_msleep(1);
                 }
             }
-
             s_app_ctx.u4_strd = s_app_ctx.get_stride();
         }
-    }
 
-    /*************************************************************************/
-    /* Get actual number of output buffers requried, which is dependent      */
-    /* on stream properties such as width, height and level etc              */
-    /* This is needed mainly for shared display mode                         */
-    /*************************************************************************/
-    //if(1 == s_app_ctx.share_disp_buf)
-    {
-        ivd_ctl_getbufinfo_ip_t s_ctl_ip;
-        ivd_ctl_getbufinfo_op_t s_ctl_op;
-        WORD32 outlen = 0;
-
-        s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
-        s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
-        s_ctl_ip.u4_size = sizeof(ivd_ctl_getbufinfo_ip_t);
-        s_ctl_op.u4_size = sizeof(ivd_ctl_getbufinfo_op_t);
-        ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
-                                   (void *)&s_ctl_op);
-        if(ret != IV_SUCCESS)
-        {
-            sprintf(ac_error_str, "Error in Get Buf Info %x", s_ctl_op.u4_error_code);
-            codec_exit(ac_error_str);
-        }
-
-#ifdef APP_EXTRA_BUFS
-        s_app_ctx.disp_delay = EXTRA_DISP_BUFFERS;
-        s_ctl_op.u4_num_disp_bufs += EXTRA_DISP_BUFFERS;
-#endif
-
-        /*****************************************************************************/
-        /*   API Call: Allocate display buffers for display buffer shared case       */
-        /*****************************************************************************/
-
-        for(i = 0; i < s_ctl_op.u4_num_disp_bufs; i++)
-        {
-
-            s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[0] =
-                            s_ctl_op.u4_min_out_buf_size[0];
-            s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[1] =
-                            s_ctl_op.u4_min_out_buf_size[1];
-            s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[2] =
-                            s_ctl_op.u4_min_out_buf_size[2];
-
-            outlen = s_ctl_op.u4_min_out_buf_size[0];
-            if(s_ctl_op.u4_min_num_out_bufs > 1)
-                outlen += s_ctl_op.u4_min_out_buf_size[1];
-
-            if(s_ctl_op.u4_min_num_out_bufs > 2)
-                outlen += s_ctl_op.u4_min_out_buf_size[2];
-
-            s_app_ctx.s_disp_buffers[i].pu1_bufs[0] = (UWORD8 *)malloc(outlen);
-
-            if(s_app_ctx.s_disp_buffers[i].pu1_bufs[0] == NULL)
-            {
-                sprintf(ac_error_str,
-                        "\nAllocation failure for output buffer of size %d",
-                        outlen);
-                codec_exit(ac_error_str);
-            }
-
-            if(s_ctl_op.u4_min_num_out_bufs > 1)
-                s_app_ctx.s_disp_buffers[i].pu1_bufs[1] =
-                                s_app_ctx.s_disp_buffers[i].pu1_bufs[0]
-                                                + (s_ctl_op.u4_min_out_buf_size[0]);
-
-            if(s_ctl_op.u4_min_num_out_bufs > 2)
-                s_app_ctx.s_disp_buffers[i].pu1_bufs[2] =
-                                s_app_ctx.s_disp_buffers[i].pu1_bufs[1]
-                                                + (s_ctl_op.u4_min_out_buf_size[1]);
-
-            s_app_ctx.s_disp_buffers[i].u4_num_bufs =
-                            s_ctl_op.u4_min_num_out_bufs;
-        }
-        s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
 
         /*****************************************************************************/
         /*   API Call: Send the allocated display buffers to codec                   */
@@ -2535,7 +2445,7 @@
 
             memcpy(&(s_set_display_frame_ip.s_disp_buffer),
                    &(s_app_ctx.s_disp_buffers),
-                   s_ctl_op.u4_num_disp_bufs * sizeof(ivd_out_bufdesc_t));
+                   s_app_ctx.num_disp_buf * sizeof(ivd_out_bufdesc_t));
 
             ret = ivd_cxa_api_function((iv_obj_t *)codec_obj,
                                        (void *)&s_set_display_frame_ip,
@@ -2648,7 +2558,7 @@
     /* If required disable deblocking and sao at given level                 */
     /*************************************************************************/
     set_degrade(codec_obj, s_app_ctx.i4_degrade_type, s_app_ctx.i4_degrade_pics);
-#ifdef X86_MSVC
+#ifdef WINDOWS_TIMER
     QueryPerformanceFrequency(&frequency);
 #endif
 #ifndef PRINT_PICSIZE
@@ -3051,39 +2961,21 @@
     }
 
     {
-        iv_retrieve_mem_rec_ip_t s_retrieve_dec_ip;
-        iv_retrieve_mem_rec_op_t s_retrieve_dec_op;
-        s_retrieve_dec_ip.pv_mem_rec_location = (iv_mem_rec_t *)pv_mem_rec_location;
+        ivd_delete_ip_t s_delete_dec_ip;
+        ivd_delete_op_t s_delete_dec_op;
 
-        s_retrieve_dec_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
-        s_retrieve_dec_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
-        s_retrieve_dec_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
+        s_delete_dec_ip.e_cmd = IVD_CMD_DELETE;
+        s_delete_dec_ip.u4_size = sizeof(ivd_delete_ip_t);
+        s_delete_dec_op.u4_size = sizeof(ivd_delete_op_t);
 
-        ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, (void *)&s_retrieve_dec_ip,
-                                   (void *)&s_retrieve_dec_op);
+        ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, (void *)&s_delete_dec_ip,
+                                   (void *)&s_delete_dec_op);
 
         if(IV_SUCCESS != ret)
         {
-            sprintf(ac_error_str, "Error in Retrieve Memrec");
+            sprintf(ac_error_str, "Error in Codec delete");
             codec_exit(ac_error_str);
         }
-
-        {
-            iv_mem_rec_t *ps_mem_rec;
-            UWORD16 u2_i;
-
-            u4_num_mem_recs = s_retrieve_dec_op.u4_num_mem_rec_filled;
-
-            ps_mem_rec = s_retrieve_dec_ip.pv_mem_rec_location;
-
-            for(u2_i = 0; u2_i < u4_num_mem_recs; u2_i++)
-            {
-                ihevca_aligned_free(ps_mem_rec->pv_base);
-                ps_mem_rec++;
-            }
-            free(s_retrieve_dec_ip.pv_mem_rec_location);
-        }
-
     }
     /***********************************************************************/
     /*              Close all the files and free all the memory            */
@@ -3115,5 +3007,8 @@
     free(ps_out_buf);
     free(pu1_bs_buf);
 
+    if(s_app_ctx.display_thread_handle)
+        free(s_app_ctx.display_thread_handle);
+
     return (0);
 }