diff --git a/mm-video-v4l2/vidc/common/inc/extra_data_handler.h b/mm-video-v4l2/vidc/common/inc/extra_data_handler.h
index c7b6e7b..3ad9dc4 100644
--- a/mm-video-v4l2/vidc/common/inc/extra_data_handler.h
+++ b/mm-video-v4l2/vidc/common/inc/extra_data_handler.h
@@ -39,7 +39,7 @@
 
 
 #ifdef _ANDROID_
-extern "C"{
+extern "C" {
 #include<utils/Log.h>
 }
 #ifdef ENABLE_DEBUG_LOW
@@ -79,36 +79,36 @@
 #define VDEC_OMX_SEI 0x7F000007
 #define FRAME_PACK_SIZE 18
 #define H264_EMULATION_BYTE 0x03
-class extra_data_handler 
+class extra_data_handler
 {
-public:
-  extra_data_handler();
-  ~extra_data_handler();
-  OMX_U32 parse_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr);
-  OMX_U32 create_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr);
-  OMX_U32 get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
-  OMX_U32 set_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
-private:
-  OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement;
-  OMX_U8 *rbsp_buf;
-  OMX_U32 bit_ptr;
-  OMX_U32 byte_ptr;
-  OMX_U32 pack_sei;
-  OMX_U32 sei_payload_type;
-  OMX_U32 d_u(OMX_U32 num_bits);
-  OMX_U32 d_ue();
-  OMX_U32 parse_frame_pack(OMX_U32 payload_size);
-  OMX_S32 parse_rbsp(OMX_U8 *buf, OMX_U32 len);
-  OMX_S32 parse_sei(OMX_U8 *buffer, OMX_U32 buffer_length);
-  OMX_U32 e_u(OMX_U32 symbol, OMX_U32 num_bits);
-  OMX_U32 e_ue(OMX_U32 symbol);
-  OMX_U32 create_frame_pack();
-  OMX_S32 create_rbsp(OMX_U8 *buf, OMX_U32 nalu_type);
-  OMX_U32 create_sei(OMX_U8 *buffer);
-  OMX_S32 parse_sliceinfo(OMX_BUFFERHEADERTYPE *pBufHdr,
-     OMX_OTHER_EXTRADATATYPE *pExtra);
-  OMX_S32 parse_ltrinfo(OMX_BUFFERHEADERTYPE *pBufHdr,
-     OMX_OTHER_EXTRADATATYPE *pExtra);
+    public:
+        extra_data_handler();
+        ~extra_data_handler();
+        OMX_U32 parse_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+        OMX_U32 create_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+        OMX_U32 get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
+        OMX_U32 set_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
+    private:
+        OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement;
+        OMX_U8 *rbsp_buf;
+        OMX_U32 bit_ptr;
+        OMX_U32 byte_ptr;
+        OMX_U32 pack_sei;
+        OMX_U32 sei_payload_type;
+        OMX_U32 d_u(OMX_U32 num_bits);
+        OMX_U32 d_ue();
+        OMX_U32 parse_frame_pack(OMX_U32 payload_size);
+        OMX_S32 parse_rbsp(OMX_U8 *buf, OMX_U32 len);
+        OMX_S32 parse_sei(OMX_U8 *buffer, OMX_U32 buffer_length);
+        OMX_U32 e_u(OMX_U32 symbol, OMX_U32 num_bits);
+        OMX_U32 e_ue(OMX_U32 symbol);
+        OMX_U32 create_frame_pack();
+        OMX_S32 create_rbsp(OMX_U8 *buf, OMX_U32 nalu_type);
+        OMX_U32 create_sei(OMX_U8 *buffer);
+        OMX_S32 parse_sliceinfo(OMX_BUFFERHEADERTYPE *pBufHdr,
+                OMX_OTHER_EXTRADATATYPE *pExtra);
+        OMX_S32 parse_ltrinfo(OMX_BUFFERHEADERTYPE *pBufHdr,
+                OMX_OTHER_EXTRADATATYPE *pExtra);
 };
-  
-#endif  
+
+#endif
diff --git a/mm-video-v4l2/vidc/common/inc/vidc_color_converter.h b/mm-video-v4l2/vidc/common/inc/vidc_color_converter.h
index bbfbdae..87a0ef7 100644
--- a/mm-video-v4l2/vidc/common/inc/vidc_color_converter.h
+++ b/mm-video-v4l2/vidc/common/inc/vidc_color_converter.h
@@ -30,24 +30,25 @@
 #include "C2DColorConverter.h"
 
 using namespace android;
-class omx_c2d_conv {
-public:
-    omx_c2d_conv();
-    ~omx_c2d_conv();
-    bool init();
-    void destroy();
-    bool open(unsigned int height,unsigned int width,
-              ColorConvertFormat src,
-              ColorConvertFormat dest);
-    bool convert(int src_fd, void *src_base, void *src_viraddr,
-                 int dest_fd, void *dest_base, void *dest_viraddr);
-    bool get_buffer_size(int port,unsigned int &buf_size);
-    int get_src_format();
-    void close();
-private:
-     C2DColorConverterBase *c2dcc;
-    void *mLibHandle;
-    ColorConvertFormat src_format;
-    createC2DColorConverter_t *mConvertOpen;
-    destroyC2DColorConverter_t *mConvertClose;
+class omx_c2d_conv
+{
+    public:
+        omx_c2d_conv();
+        ~omx_c2d_conv();
+        bool init();
+        void destroy();
+        bool open(unsigned int height,unsigned int width,
+                ColorConvertFormat src,
+                ColorConvertFormat dest);
+        bool convert(int src_fd, void *src_base, void *src_viraddr,
+                int dest_fd, void *dest_base, void *dest_viraddr);
+        bool get_buffer_size(int port,unsigned int &buf_size);
+        int get_src_format();
+        void close();
+    private:
+        C2DColorConverterBase *c2dcc;
+        void *mLibHandle;
+        ColorConvertFormat src_format;
+        createC2DColorConverter_t *mConvertOpen;
+        destroyC2DColorConverter_t *mConvertClose;
 };
diff --git a/mm-video-v4l2/vidc/common/src/extra_data_handler.cpp b/mm-video-v4l2/vidc/common/src/extra_data_handler.cpp
index aa3b563..645699f 100644
--- a/mm-video-v4l2/vidc/common/src/extra_data_handler.cpp
+++ b/mm-video-v4l2/vidc/common/src/extra_data_handler.cpp
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -30,62 +30,66 @@
 
 extra_data_handler::extra_data_handler()
 {
-   rbsp_buf = (OMX_U8 *) calloc(1,100);
-   memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement));
-   frame_packing_arrangement.cancel_flag = 1;
-   pack_sei = false;
-   sei_payload_type = -1;
+    rbsp_buf = (OMX_U8 *) calloc(1,100);
+    memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement));
+    frame_packing_arrangement.cancel_flag = 1;
+    pack_sei = false;
+    sei_payload_type = -1;
 }
 
 extra_data_handler::~extra_data_handler()
 {
-  if(rbsp_buf) {
-    free(rbsp_buf);
-    rbsp_buf = NULL;
-  }
+    if (rbsp_buf) {
+        free(rbsp_buf);
+        rbsp_buf = NULL;
+    }
 }
 
 OMX_U32 extra_data_handler::d_u(OMX_U32 num_bits)
 {
-  OMX_U32 rem_bits = num_bits, bins = 0, shift = 0;
+    OMX_U32 rem_bits = num_bits, bins = 0, shift = 0;
 
-  while(rem_bits >= bit_ptr) {
+    while (rem_bits >= bit_ptr) {
+        DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
+                byte_ptr, rbsp_buf[byte_ptr]);
+        bins <<= shift;
+        shift = (8-bit_ptr);
+        bins |= ((rbsp_buf[byte_ptr] << shift) & 0xFF) >> shift;
+        rem_bits -= bit_ptr;
+        bit_ptr = 8;
+        byte_ptr ++;
+    }
+
     DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
-      byte_ptr, rbsp_buf[byte_ptr]);
-    bins <<= shift;
-    shift = (8-bit_ptr);
-    bins |= ((rbsp_buf[byte_ptr] << shift) & 0xFF) >> shift;
-    rem_bits -= bit_ptr;
-    bit_ptr = 8;
-    byte_ptr ++;
-  }
-  DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
-    byte_ptr, rbsp_buf[byte_ptr]);
+            byte_ptr, rbsp_buf[byte_ptr]);
 
-  if (rem_bits) {
-    bins <<= rem_bits;
-    bins |= ((rbsp_buf[byte_ptr] << (8-bit_ptr)) & 0xFF) >> (8-rem_bits);
-    bit_ptr -= rem_bits;
-	if (bit_ptr == 0) {
-       bit_ptr = 8;
-	   byte_ptr++;
-	}
-  }
-  DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
-    byte_ptr, rbsp_buf[byte_ptr]);
+    if (rem_bits) {
+        bins <<= rem_bits;
+        bins |= ((rbsp_buf[byte_ptr] << (8-bit_ptr)) & 0xFF) >> (8-rem_bits);
+        bit_ptr -= rem_bits;
 
-  DEBUG_PRINT_LOW("\nIn %s() bin/num_bits : %x/%d", __func__, bins, num_bits);
-  return bins;
+        if (bit_ptr == 0) {
+            bit_ptr = 8;
+            byte_ptr++;
+        }
+    }
+
+    DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
+            byte_ptr, rbsp_buf[byte_ptr]);
+
+    DEBUG_PRINT_LOW("\nIn %s() bin/num_bits : %x/%d", __func__, bins, num_bits);
+    return bins;
 }
 
 OMX_U32 extra_data_handler::d_ue()
 {
     OMX_S32 lead_zeros = -1;
     OMX_U32 symbol, bit;
-    do{
+
+    do {
         bit = d_u(1);
         lead_zeros++;
-    }while (!bit);
+    } while (!bit);
 
     symbol = ((1 << lead_zeros) - 1) + d_u(lead_zeros);
 
@@ -95,136 +99,150 @@
 
 OMX_U32 extra_data_handler::parse_frame_pack(OMX_U32 payload_size)
 {
-  frame_packing_arrangement.id = d_ue();
-  frame_packing_arrangement.cancel_flag = d_u(1);
-  if(!frame_packing_arrangement.cancel_flag) {
-     frame_packing_arrangement.type = d_u(7);
-     frame_packing_arrangement.quincunx_sampling_flag = d_u(1);
-     frame_packing_arrangement.content_interpretation_type = d_u(6);
-     frame_packing_arrangement.spatial_flipping_flag = d_u(1);
-     frame_packing_arrangement.frame0_flipped_flag = d_u(1);
-     frame_packing_arrangement.field_views_flag = d_u(1);
-     frame_packing_arrangement.current_frame_is_frame0_flag = d_u(1);
-     frame_packing_arrangement.frame0_self_contained_flag = d_u(1);
-     frame_packing_arrangement.frame1_self_contained_flag = d_u(1);
+    frame_packing_arrangement.id = d_ue();
+    frame_packing_arrangement.cancel_flag = d_u(1);
 
-     if(!frame_packing_arrangement.quincunx_sampling_flag &&
-        frame_packing_arrangement.type != 5) {
-        frame_packing_arrangement.frame0_grid_position_x = d_u(4);
-        frame_packing_arrangement.frame0_grid_position_y = d_u(4);
-        frame_packing_arrangement.frame1_grid_position_x = d_u(4);
-        frame_packing_arrangement.frame1_grid_position_y = d_u(4);
-     }
-     frame_packing_arrangement.reserved_byte = d_u(8);
-     frame_packing_arrangement.repetition_period = d_ue();
-   }
-   frame_packing_arrangement.extension_flag = d_u(1);
+    if (!frame_packing_arrangement.cancel_flag) {
+        frame_packing_arrangement.type = d_u(7);
+        frame_packing_arrangement.quincunx_sampling_flag = d_u(1);
+        frame_packing_arrangement.content_interpretation_type = d_u(6);
+        frame_packing_arrangement.spatial_flipping_flag = d_u(1);
+        frame_packing_arrangement.frame0_flipped_flag = d_u(1);
+        frame_packing_arrangement.field_views_flag = d_u(1);
+        frame_packing_arrangement.current_frame_is_frame0_flag = d_u(1);
+        frame_packing_arrangement.frame0_self_contained_flag = d_u(1);
+        frame_packing_arrangement.frame1_self_contained_flag = d_u(1);
 
-   return 1;
+        if (!frame_packing_arrangement.quincunx_sampling_flag &&
+                frame_packing_arrangement.type != 5) {
+            frame_packing_arrangement.frame0_grid_position_x = d_u(4);
+            frame_packing_arrangement.frame0_grid_position_y = d_u(4);
+            frame_packing_arrangement.frame1_grid_position_x = d_u(4);
+            frame_packing_arrangement.frame1_grid_position_y = d_u(4);
+        }
+
+        frame_packing_arrangement.reserved_byte = d_u(8);
+        frame_packing_arrangement.repetition_period = d_ue();
+    }
+
+    frame_packing_arrangement.extension_flag = d_u(1);
+
+    return 1;
 }
 
 OMX_S32 extra_data_handler::parse_rbsp(OMX_U8 *buf, OMX_U32 len)
 {
-   OMX_U32 i = 3, j=0, startcode;
-   OMX_U32 nal_unit_type, nal_ref_idc, forbidden_zero_bit;
+    OMX_U32 i = 3, j=0, startcode;
+    OMX_U32 nal_unit_type, nal_ref_idc, forbidden_zero_bit;
 
-   bit_ptr  = 8;
-   byte_ptr = 0;
+    bit_ptr  = 8;
+    byte_ptr = 0;
 
-   startcode =  buf[0] << 16 | buf[1] <<8 | buf[2];
+    startcode =  buf[0] << 16 | buf[1] <<8 | buf[2];
 
-   if (!startcode) {
-       startcode |= buf[i++];
-   }
-   if(startcode != H264_START_CODE) {
-       DEBUG_PRINT_ERROR("\nERROR: In %s() Start code not found", __func__);
-       return -1;
-   }
-   forbidden_zero_bit = (buf[i] & 0x80) >>7;
-   if(forbidden_zero_bit) {
-       DEBUG_PRINT_ERROR("\nERROR: In %s() Non-zero forbidden bit", __func__);
-       return -1;
-   }
-   nal_ref_idc = (buf[i] & 0x60) >>5;
-   DEBUG_PRINT_LOW("\nIn %s() nal_ref_idc ; %d", __func__, nal_ref_idc);
+    if (!startcode) {
+        startcode |= buf[i++];
+    }
 
-   nal_unit_type = (buf[i++] & 0x1F);
+    if (startcode != H264_START_CODE) {
+        DEBUG_PRINT_ERROR("\nERROR: In %s() Start code not found", __func__);
+        return -1;
+    }
 
-   while(i<len) {
-     if(!(buf[i] + buf[i+1]) && (buf[i+2] == H264_EMULATION_BYTE) &&
-		(i+2 < len)) {
-        rbsp_buf[j++] = buf[i++];
-        rbsp_buf[j++] = buf[i++];
-        i++;
-     } else
-        rbsp_buf[j++] = buf[i++];
-   }
-   return nal_unit_type;
+    forbidden_zero_bit = (buf[i] & 0x80) >>7;
+
+    if (forbidden_zero_bit) {
+        DEBUG_PRINT_ERROR("\nERROR: In %s() Non-zero forbidden bit", __func__);
+        return -1;
+    }
+
+    nal_ref_idc = (buf[i] & 0x60) >>5;
+    DEBUG_PRINT_LOW("\nIn %s() nal_ref_idc ; %d", __func__, nal_ref_idc);
+
+    nal_unit_type = (buf[i++] & 0x1F);
+
+    while (i<len) {
+        if (!(buf[i] + buf[i+1]) && (buf[i+2] == H264_EMULATION_BYTE) &&
+                (i+2 < len)) {
+            rbsp_buf[j++] = buf[i++];
+            rbsp_buf[j++] = buf[i++];
+            i++;
+        } else
+            rbsp_buf[j++] = buf[i++];
+    }
+
+    return nal_unit_type;
 }
 OMX_S32 extra_data_handler::parse_sei(OMX_U8 *buffer, OMX_U32 buffer_length)
 {
-  OMX_U32 nal_unit_type, payload_type = 0, payload_size = 0;
-  OMX_U32 marker = 0, pad = 0xFF;
+    OMX_U32 nal_unit_type, payload_type = 0, payload_size = 0;
+    OMX_U32 marker = 0, pad = 0xFF;
 
-  nal_unit_type = parse_rbsp(buffer, buffer_length);
+    nal_unit_type = parse_rbsp(buffer, buffer_length);
 
-  if (nal_unit_type != NAL_TYPE_SEI) {
-     DEBUG_PRINT_ERROR("\nERROR: In %s() - Non SEI NAL ", __func__);
-     return -1;
-  } else {
-
-    while(rbsp_buf[byte_ptr] == 0xFF)
-      payload_type += rbsp_buf[byte_ptr++];
-    payload_type += rbsp_buf[byte_ptr++];
-
-    DEBUG_PRINT_LOW("\nIn %s() payload_type : %u", __func__, payload_type);
-
-    while(rbsp_buf[byte_ptr] == 0xFF)
-      payload_size += rbsp_buf[byte_ptr++];
-    payload_size += rbsp_buf[byte_ptr++];
-
-    DEBUG_PRINT_LOW("\nIn %s() payload_size : %u", __func__, payload_size);
-
-    switch(payload_type) {
-      case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT:
-        DEBUG_PRINT_LOW("\nIn %s() Frame Packing SEI ", __func__);
-        parse_frame_pack(payload_size);
-      break;
-      default:
-        DEBUG_PRINT_LOW("\nINFO: In %s() Not Supported SEI NAL ", __func__);
-      break;
-    }
-  }
-  if(bit_ptr != 8) {
-    marker = d_u(1);
-    if(marker) {
-      if(bit_ptr != 8) {
-	 pad = d_u(bit_ptr);
-	 if(pad) {
-	   DEBUG_PRINT_ERROR("\nERROR: In %s() padding Bits Error in SEI",
-	     __func__);
-           return -1;
-	 }
-      }
-    } else {
-      DEBUG_PRINT_ERROR("\nERROR: In %s() Marker Bit Error in SEI",
-        __func__);
+    if (nal_unit_type != NAL_TYPE_SEI) {
+        DEBUG_PRINT_ERROR("\nERROR: In %s() - Non SEI NAL ", __func__);
         return -1;
+    } else {
+
+        while (rbsp_buf[byte_ptr] == 0xFF)
+            payload_type += rbsp_buf[byte_ptr++];
+
+        payload_type += rbsp_buf[byte_ptr++];
+
+        DEBUG_PRINT_LOW("\nIn %s() payload_type : %u", __func__, payload_type);
+
+        while (rbsp_buf[byte_ptr] == 0xFF)
+            payload_size += rbsp_buf[byte_ptr++];
+
+        payload_size += rbsp_buf[byte_ptr++];
+
+        DEBUG_PRINT_LOW("\nIn %s() payload_size : %u", __func__, payload_size);
+
+        switch (payload_type) {
+            case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT:
+                DEBUG_PRINT_LOW("\nIn %s() Frame Packing SEI ", __func__);
+                parse_frame_pack(payload_size);
+                break;
+            default:
+                DEBUG_PRINT_LOW("\nINFO: In %s() Not Supported SEI NAL ", __func__);
+                break;
+        }
     }
-  }
-  DEBUG_PRINT_LOW("\nIn %s() payload_size : %u/%u", __func__,
-    payload_size, byte_ptr);
-  return 1;
+
+    if (bit_ptr != 8) {
+        marker = d_u(1);
+
+        if (marker) {
+            if (bit_ptr != 8) {
+                pad = d_u(bit_ptr);
+
+                if (pad) {
+                    DEBUG_PRINT_ERROR("\nERROR: In %s() padding Bits Error in SEI",
+                            __func__);
+                    return -1;
+                }
+            }
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: In %s() Marker Bit Error in SEI",
+                    __func__);
+            return -1;
+        }
+    }
+
+    DEBUG_PRINT_LOW("\nIn %s() payload_size : %u/%u", __func__,
+            payload_size, byte_ptr);
+    return 1;
 }
 
 OMX_S32 extra_data_handler::parse_ltrinfo(
-  OMX_BUFFERHEADERTYPE *pBufHdr, OMX_OTHER_EXTRADATATYPE *pExtra)
+        OMX_BUFFERHEADERTYPE *pBufHdr, OMX_OTHER_EXTRADATATYPE *pExtra)
 {
-  OMX_U32 *pLTR;
-  pExtra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVideoLTRInfo;
-  pLTR = (OMX_U32* )pExtra + 5;
-  DEBUG_PRINT_HIGH("ExtraData LTR ID %d", *pLTR, 0, 0);
-  return 0;
+    OMX_U32 *pLTR;
+    pExtra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVideoLTRInfo;
+    pLTR = (OMX_U32* )pExtra + 5;
+    DEBUG_PRINT_HIGH("ExtraData LTR ID %d", *pLTR, 0, 0);
+    return 0;
 }
 /*======================================================================
   Slice Information will be available as below (each line is of 4 bytes)
@@ -234,226 +252,244 @@
   | ..               |
   | Nth slice offset |
   | Nth slice size   |
-======================================================================*/
+  ======================================================================*/
 OMX_S32 extra_data_handler::parse_sliceinfo(
-  OMX_BUFFERHEADERTYPE *pBufHdr, OMX_OTHER_EXTRADATATYPE *pExtra)
+        OMX_BUFFERHEADERTYPE *pBufHdr, OMX_OTHER_EXTRADATATYPE *pExtra)
 {
-  OMX_U32 slice_offset = 0, slice_size = 0, total_size = 0;
-  OMX_U8 *pBuffer = (OMX_U8 *)pBufHdr->pBuffer;
-  OMX_U32 *data = (OMX_U32 *)pExtra->data;
-  OMX_U32 num_slices = *data;
-  DEBUG_PRINT_LOW("number of slices = %d", num_slices);
-  if ((4 + num_slices * 8) != (OMX_U32)pExtra->nDataSize) {
-    DEBUG_PRINT_ERROR("unknown error in slice info extradata");
-    return -1;
-  }
-  for (int i = 0; i < num_slices; i++) {
-    slice_offset = (OMX_U32)(*(data + (i*2 + 1)));
-    if ((*(pBuffer + slice_offset + 0) != 0x00) ||
-        (*(pBuffer + slice_offset + 1) != 0x00) ||
-        (*(pBuffer + slice_offset + 2) != 0x00) ||
-        (*(pBuffer + slice_offset + 3) != H264_START_CODE)) {
-      DEBUG_PRINT_ERROR("found 0x%x instead of start code at offset[%d] "
-        "for slice[%d]", (OMX_U32)(*(OMX_U32 *)(pBuffer + slice_offset)),
-        slice_offset, i);
-      return -1;
+    OMX_U32 slice_offset = 0, slice_size = 0, total_size = 0;
+    OMX_U8 *pBuffer = (OMX_U8 *)pBufHdr->pBuffer;
+    OMX_U32 *data = (OMX_U32 *)pExtra->data;
+    OMX_U32 num_slices = *data;
+    DEBUG_PRINT_LOW("number of slices = %d", num_slices);
+
+    if ((4 + num_slices * 8) != (OMX_U32)pExtra->nDataSize) {
+        DEBUG_PRINT_ERROR("unknown error in slice info extradata");
+        return -1;
     }
-    if (slice_offset != total_size) {
-      DEBUG_PRINT_ERROR("offset of slice number %d is not correct "
-          "or previous slice size is not correct", i);
-      return -1;
+
+    for (int i = 0; i < num_slices; i++) {
+        slice_offset = (OMX_U32)(*(data + (i*2 + 1)));
+
+        if ((*(pBuffer + slice_offset + 0) != 0x00) ||
+                (*(pBuffer + slice_offset + 1) != 0x00) ||
+                (*(pBuffer + slice_offset + 2) != 0x00) ||
+                (*(pBuffer + slice_offset + 3) != H264_START_CODE)) {
+            DEBUG_PRINT_ERROR("found 0x%x instead of start code at offset[%d] "
+                    "for slice[%d]", (OMX_U32)(*(OMX_U32 *)(pBuffer + slice_offset)),
+                    slice_offset, i);
+            return -1;
+        }
+
+        if (slice_offset != total_size) {
+            DEBUG_PRINT_ERROR("offset of slice number %d is not correct "
+                    "or previous slice size is not correct", i);
+            return -1;
+        }
+
+        slice_size = (OMX_U32)(*(data + (i*2 + 2)));
+        total_size += slice_size;
+        DEBUG_PRINT_LOW("slice number %d offset/size = %d/%d",
+                i, slice_offset, slice_size);
     }
-    slice_size = (OMX_U32)(*(data + (i*2 + 2)));
-    total_size += slice_size;
-    DEBUG_PRINT_LOW("slice number %d offset/size = %d/%d",
-        i, slice_offset, slice_size);
-  }
-  if (pBufHdr->nFilledLen != total_size) {
-    DEBUG_PRINT_ERROR("frame_size[%d] is not equal to "
-       "total slices size[%d]", pBufHdr->nFilledLen, total_size);
-    return -1;
-  }
-  return 0;
+
+    if (pBufHdr->nFilledLen != total_size) {
+        DEBUG_PRINT_ERROR("frame_size[%d] is not equal to "
+                "total slices size[%d]", pBufHdr->nFilledLen, total_size);
+        return -1;
+    }
+
+    return 0;
 }
 
 OMX_U32 extra_data_handler::parse_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr)
 {
-  DEBUG_PRINT_LOW("In %s() flags: 0x%x", __func__,buf_hdr->nFlags);
+    DEBUG_PRINT_LOW("In %s() flags: 0x%x", __func__,buf_hdr->nFlags);
 
-  if (buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
+    if (buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
 
-    OMX_OTHER_EXTRADATATYPE *extra_data = (OMX_OTHER_EXTRADATATYPE *)
-        ((unsigned)(buf_hdr->pBuffer + buf_hdr->nOffset +
-        buf_hdr->nFilledLen + 3)&(~3));
+        OMX_OTHER_EXTRADATATYPE *extra_data = (OMX_OTHER_EXTRADATATYPE *)
+            ((unsigned)(buf_hdr->pBuffer + buf_hdr->nOffset +
+                buf_hdr->nFilledLen + 3)&(~3));
 
-    while(extra_data &&
-      ((OMX_U32)extra_data > (OMX_U32)buf_hdr->pBuffer) &&
-      ((OMX_U32)extra_data < (OMX_U32)buf_hdr->pBuffer + buf_hdr->nAllocLen)) {
+        while (extra_data &&
+                ((OMX_U32)extra_data > (OMX_U32)buf_hdr->pBuffer) &&
+                ((OMX_U32)extra_data < (OMX_U32)buf_hdr->pBuffer + buf_hdr->nAllocLen)) {
 
-      DEBUG_PRINT_LOW("extradata(0x%x): nSize = 0x%x, eType = 0x%x,"
-         " nDataSize = 0x%x", (unsigned)extra_data, extra_data->nSize,
-         extra_data->eType, extra_data->nDataSize);
+            DEBUG_PRINT_LOW("extradata(0x%x): nSize = 0x%x, eType = 0x%x,"
+                    " nDataSize = 0x%x", (unsigned)extra_data, extra_data->nSize,
+                    extra_data->eType, extra_data->nDataSize);
 
-      if ((extra_data->eType == VDEC_EXTRADATA_NONE) ||
-         (extra_data->eType == VEN_EXTRADATA_NONE)) {
-         DEBUG_PRINT_LOW("No more extradata available");
-            extra_data->eType = OMX_ExtraDataNone;
-         break;
-      }
-      else if (extra_data->eType == VDEC_EXTRADATA_SEI) {
-         DEBUG_PRINT_LOW("Extradata SEI of size %d found, "
-            "parsing it", extra_data->nDataSize);
-         parse_sei(extra_data->data, extra_data->nDataSize);
-      }
-      else if (extra_data->eType == VEN_EXTRADATA_QCOMFILLER) {
-         DEBUG_PRINT_LOW("Extradata Qcom Filler found, skip %d bytes",
-            extra_data->nSize);
-      }
-      else if (extra_data->eType == VEN_EXTRADATA_SLICEINFO) {
-         DEBUG_PRINT_LOW("Extradata SliceInfo of size %d found, "
-            "parsing it", extra_data->nDataSize);
-         parse_sliceinfo(buf_hdr, extra_data);
-      }
+            if ((extra_data->eType == VDEC_EXTRADATA_NONE) ||
+                    (extra_data->eType == VEN_EXTRADATA_NONE)) {
+                DEBUG_PRINT_LOW("No more extradata available");
+                extra_data->eType = OMX_ExtraDataNone;
+                break;
+            } else if (extra_data->eType == VDEC_EXTRADATA_SEI) {
+                DEBUG_PRINT_LOW("Extradata SEI of size %d found, "
+                        "parsing it", extra_data->nDataSize);
+                parse_sei(extra_data->data, extra_data->nDataSize);
+            } else if (extra_data->eType == VEN_EXTRADATA_QCOMFILLER) {
+                DEBUG_PRINT_LOW("Extradata Qcom Filler found, skip %d bytes",
+                        extra_data->nSize);
+            } else if (extra_data->eType == VEN_EXTRADATA_SLICEINFO) {
+                DEBUG_PRINT_LOW("Extradata SliceInfo of size %d found, "
+                        "parsing it", extra_data->nDataSize);
+                parse_sliceinfo(buf_hdr, extra_data);
+            }
+
 #ifndef _MSM8974_
-      else if (extra_data->eType == VEN_EXTRADATA_LTRINFO) {
-         DEBUG_PRINT_LOW("Extradata LTRInfo of size %d found, "
-            "parsing it", extra_data->nDataSize);
-         parse_ltrinfo(buf_hdr, extra_data);
-      }
+            else if (extra_data->eType == VEN_EXTRADATA_LTRINFO) {
+                DEBUG_PRINT_LOW("Extradata LTRInfo of size %d found, "
+                        "parsing it", extra_data->nDataSize);
+                parse_ltrinfo(buf_hdr, extra_data);
+            }
+
 #endif
-      else {
-         DEBUG_PRINT_ERROR("Unknown extradata(0x%x) found, nSize = 0x%x, "
-            "eType = 0x%x, nDataSize = 0x%x", (unsigned)extra_data,
-            extra_data->nSize, extra_data->eType, extra_data->nDataSize);
-         buf_hdr->nFlags &= ~(OMX_BUFFERFLAG_EXTRADATA);
-         break;
-      }
-      extra_data = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) extra_data) +
-        extra_data->nSize);
+            else {
+                DEBUG_PRINT_ERROR("Unknown extradata(0x%x) found, nSize = 0x%x, "
+                        "eType = 0x%x, nDataSize = 0x%x", (unsigned)extra_data,
+                        extra_data->nSize, extra_data->eType, extra_data->nDataSize);
+                buf_hdr->nFlags &= ~(OMX_BUFFERFLAG_EXTRADATA);
+                break;
+            }
+
+            extra_data = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) extra_data) +
+                    extra_data->nSize);
+        }
     }
-  }
-  return 1;
+
+    return 1;
 }
 
 OMX_U32 extra_data_handler::get_frame_pack_data(
-	OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack)
+        OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack)
 {
-   DEBUG_PRINT_LOW("\n%s:%d get frame data", __func__, __LINE__);
-   memcpy(&frame_pack->id,&frame_packing_arrangement.id,
-   FRAME_PACK_SIZE*sizeof(OMX_U32));
-   return 1;
+    DEBUG_PRINT_LOW("\n%s:%d get frame data", __func__, __LINE__);
+    memcpy(&frame_pack->id,&frame_packing_arrangement.id,
+            FRAME_PACK_SIZE*sizeof(OMX_U32));
+    return 1;
 }
 
 OMX_U32 extra_data_handler::set_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT
-   *frame_pack)
+        *frame_pack)
 {
-   DEBUG_PRINT_LOW("\n%s:%d set frame data", __func__, __LINE__);
-   memcpy(&frame_packing_arrangement.id, &frame_pack->id,
-     FRAME_PACK_SIZE*sizeof(OMX_U32));
-   pack_sei = true;
-   sei_payload_type = SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT;
-   return 1;
+    DEBUG_PRINT_LOW("\n%s:%d set frame data", __func__, __LINE__);
+    memcpy(&frame_packing_arrangement.id, &frame_pack->id,
+            FRAME_PACK_SIZE*sizeof(OMX_U32));
+    pack_sei = true;
+    sei_payload_type = SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT;
+    return 1;
 }
 
 OMX_U32 extra_data_handler::e_u(OMX_U32 symbol, OMX_U32 num_bits)
 {
-   OMX_U32 rem_bits = num_bits, shift;
+    OMX_U32 rem_bits = num_bits, shift;
 
-   DEBUG_PRINT_LOW("\n%s bin  : %x/%d", __func__, symbol, num_bits);
+    DEBUG_PRINT_LOW("\n%s bin  : %x/%d", __func__, symbol, num_bits);
 
-   while(rem_bits >= bit_ptr) {
-     shift = rem_bits - bit_ptr;
-     rbsp_buf[byte_ptr] |= (symbol >> shift);
-     symbol = (symbol << (32 - shift)) >> (32 - shift);
-     rem_bits -= bit_ptr;
-     DEBUG_PRINT_LOW("\n%sstream byte/rem_bits %x/%d", __func__,
-     rbsp_buf[byte_ptr], rem_bits);
-     byte_ptr ++;
-     bit_ptr = 8;
-   }
+    while (rem_bits >= bit_ptr) {
+        shift = rem_bits - bit_ptr;
+        rbsp_buf[byte_ptr] |= (symbol >> shift);
+        symbol = (symbol << (32 - shift)) >> (32 - shift);
+        rem_bits -= bit_ptr;
+        DEBUG_PRINT_LOW("\n%sstream byte/rem_bits %x/%d", __func__,
+                rbsp_buf[byte_ptr], rem_bits);
+        byte_ptr ++;
+        bit_ptr = 8;
+    }
 
-   if(rem_bits) {
-     shift = bit_ptr - rem_bits;
-     rbsp_buf[byte_ptr] |= (symbol << shift);
-     bit_ptr -= rem_bits;
-     DEBUG_PRINT_LOW("\n%s 2 stream byte/rem_bits %x", __func__,
-       rbsp_buf[byte_ptr], rem_bits);
-     if(bit_ptr == 0) {
-       bit_ptr = 8;
-       byte_ptr++;
-     }
-   }
-   return 1;
+    if (rem_bits) {
+        shift = bit_ptr - rem_bits;
+        rbsp_buf[byte_ptr] |= (symbol << shift);
+        bit_ptr -= rem_bits;
+        DEBUG_PRINT_LOW("\n%s 2 stream byte/rem_bits %x", __func__,
+                rbsp_buf[byte_ptr], rem_bits);
+
+        if (bit_ptr == 0) {
+            bit_ptr = 8;
+            byte_ptr++;
+        }
+    }
+
+    return 1;
 }
 
 OMX_U32 extra_data_handler::e_ue(OMX_U32 symbol)
 {
-   OMX_U32 i, sym_len, sufix_len, info;
-   OMX_U32 nn =(symbol + 1) >> 1;
+    OMX_U32 i, sym_len, sufix_len, info;
+    OMX_U32 nn =(symbol + 1) >> 1;
 
-   DEBUG_PRINT_LOW("\n%s bin  : %x", __func__, symbol);
+    DEBUG_PRINT_LOW("\n%s bin  : %x", __func__, symbol);
 
-   for(i=0; i < 33 && nn != 0; i++)
-     nn >>= 1;
+    for (i=0; i < 33 && nn != 0; i++)
+        nn >>= 1;
 
-   sym_len = ((i << 1) + 1);
-   info = symbol + 1 - (1 << i);
-   sufix_len = (1 << (sym_len >>1));
-   info = sufix_len | (info & (sufix_len - 1));
-   e_u(info, sym_len);
-   return 1;
+    sym_len = ((i << 1) + 1);
+    info = symbol + 1 - (1 << i);
+    sufix_len = (1 << (sym_len >>1));
+    info = sufix_len | (info & (sufix_len - 1));
+    e_u(info, sym_len);
+    return 1;
 }
 
 OMX_U32 extra_data_handler::create_frame_pack()
 {
-   e_ue(frame_packing_arrangement.id);
-   e_u(frame_packing_arrangement.cancel_flag, 1);
-   if(!frame_packing_arrangement.cancel_flag) {
-     e_u(frame_packing_arrangement.type, 7);
-     e_u(frame_packing_arrangement.quincunx_sampling_flag, 1);
-     e_u(frame_packing_arrangement.content_interpretation_type, 6);
-     e_u(frame_packing_arrangement.spatial_flipping_flag, 1);
-     e_u(frame_packing_arrangement.frame0_flipped_flag, 1);
-     e_u(frame_packing_arrangement.field_views_flag, 1);
-     e_u(frame_packing_arrangement.current_frame_is_frame0_flag, 1);
-     e_u(frame_packing_arrangement.frame0_self_contained_flag, 1);
-     e_u(frame_packing_arrangement.frame1_self_contained_flag, 1);
-     if(!frame_packing_arrangement.quincunx_sampling_flag &&
-        frame_packing_arrangement.type != 5) {
-        e_u(frame_packing_arrangement.frame0_grid_position_x, 4);
-        e_u(frame_packing_arrangement.frame0_grid_position_y, 4);
-        e_u(frame_packing_arrangement.frame1_grid_position_x, 4);
-        e_u(frame_packing_arrangement.frame1_grid_position_y, 4);
-     }
-     e_u(frame_packing_arrangement.reserved_byte, 8);
-     e_ue(frame_packing_arrangement.repetition_period);
-   }
-   e_u(frame_packing_arrangement.extension_flag, 1);
-   return 1;
+    e_ue(frame_packing_arrangement.id);
+    e_u(frame_packing_arrangement.cancel_flag, 1);
+
+    if (!frame_packing_arrangement.cancel_flag) {
+        e_u(frame_packing_arrangement.type, 7);
+        e_u(frame_packing_arrangement.quincunx_sampling_flag, 1);
+        e_u(frame_packing_arrangement.content_interpretation_type, 6);
+        e_u(frame_packing_arrangement.spatial_flipping_flag, 1);
+        e_u(frame_packing_arrangement.frame0_flipped_flag, 1);
+        e_u(frame_packing_arrangement.field_views_flag, 1);
+        e_u(frame_packing_arrangement.current_frame_is_frame0_flag, 1);
+        e_u(frame_packing_arrangement.frame0_self_contained_flag, 1);
+        e_u(frame_packing_arrangement.frame1_self_contained_flag, 1);
+
+        if (!frame_packing_arrangement.quincunx_sampling_flag &&
+                frame_packing_arrangement.type != 5) {
+            e_u(frame_packing_arrangement.frame0_grid_position_x, 4);
+            e_u(frame_packing_arrangement.frame0_grid_position_y, 4);
+            e_u(frame_packing_arrangement.frame1_grid_position_x, 4);
+            e_u(frame_packing_arrangement.frame1_grid_position_y, 4);
+        }
+
+        e_u(frame_packing_arrangement.reserved_byte, 8);
+        e_ue(frame_packing_arrangement.repetition_period);
+    }
+
+    e_u(frame_packing_arrangement.extension_flag, 1);
+    return 1;
 }
 
 OMX_S32 extra_data_handler::create_rbsp(OMX_U8 *buf, OMX_U32 nalu_type)
 {
-   OMX_U32 i, j = 7;
-   for(i = 0;i < 3;i++)
-   *buf++ = 0x00;
-   *buf++ = H264_START_CODE;
-   *buf++ = nalu_type;
-   *buf++ = (sei_payload_type & 0x000000FF);
-   *buf++ = byte_ptr - 1; //payload will contain 1 byte of rbsp_trailing_bits
-                          //that shouldn't be taken into account
+    OMX_U32 i, j = 7;
 
-    for(i = 0;i < byte_ptr ;i += 2) {
-      *buf++ = rbsp_buf[i];
-       j++;
-       if(i+1 < byte_ptr) {
-           *buf++ = rbsp_buf[i+1];
-           j++;
-           if(!(rbsp_buf[i] + rbsp_buf[i+1])) {
-               *buf++ = H264_EMULATION_BYTE;
-               j++;
-           }
-       }
+    for (i = 0; i < 3; i++)
+        *buf++ = 0x00;
+
+    *buf++ = H264_START_CODE;
+    *buf++ = nalu_type;
+    *buf++ = (sei_payload_type & 0x000000FF);
+    *buf++ = byte_ptr - 1; //payload will contain 1 byte of rbsp_trailing_bits
+    //that shouldn't be taken into account
+
+    for (i = 0; i < byte_ptr ; i += 2) {
+        *buf++ = rbsp_buf[i];
+        j++;
+
+        if (i+1 < byte_ptr) {
+            *buf++ = rbsp_buf[i+1];
+            j++;
+
+            if (!(rbsp_buf[i] + rbsp_buf[i+1])) {
+                *buf++ = H264_EMULATION_BYTE;
+                j++;
+            }
+        }
     }
 
     DEBUG_PRINT_LOW("\n%s rbsp length %d", __func__, j);
@@ -462,49 +498,53 @@
 
 OMX_U32 extra_data_handler::create_sei(OMX_U8 *buffer)
 {
-   OMX_U32 i, ret_val = 0;
+    OMX_U32 i, ret_val = 0;
 
-   byte_ptr = 0;
-   bit_ptr  = 8;
+    byte_ptr = 0;
+    bit_ptr  = 8;
 
-   if(sei_payload_type == SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT) {
-     create_frame_pack();
+    if (sei_payload_type == SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT) {
+        create_frame_pack();
 
-     if(bit_ptr != 8) {
-       e_u(1,1);
-       if(bit_ptr != 8)
-         e_u(0,bit_ptr);
-     }
+        if (bit_ptr != 8) {
+            e_u(1,1);
 
-     //Payload will have been byte aligned by now,
-     //insert the rbsp trailing bits
-     e_u(1, 1);
-     e_u(0, 7);
+            if (bit_ptr != 8)
+                e_u(0,bit_ptr);
+        }
 
-     ret_val = create_rbsp(buffer, NAL_TYPE_SEI);
-   }
+        //Payload will have been byte aligned by now,
+        //insert the rbsp trailing bits
+        e_u(1, 1);
+        e_u(0, 7);
 
-   pack_sei = false;
-   sei_payload_type = -1;
+        ret_val = create_rbsp(buffer, NAL_TYPE_SEI);
+    }
 
-   return ret_val;
+    pack_sei = false;
+    sei_payload_type = -1;
+
+    return ret_val;
 }
 
 OMX_U32 extra_data_handler::create_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr)
 {
-   OMX_U8 *buffer = (OMX_U8 *) ((unsigned)(buf_hdr->pBuffer +
-     buf_hdr->nOffset + buf_hdr->nFilledLen));
-   OMX_U32 msg_size;
+    OMX_U8 *buffer = (OMX_U8 *) ((unsigned)(buf_hdr->pBuffer +
+                buf_hdr->nOffset + buf_hdr->nFilledLen));
+    OMX_U32 msg_size;
 
-    if(buf_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
-      DEBUG_PRINT_LOW("\n%s:%d create extra data with config", __func__,
-        __LINE__);
-      if(pack_sei) {
-         msg_size = create_sei(buffer);
-	 if( msg_size > 0)
-           buf_hdr->nFilledLen += msg_size;
-      }
+    if (buf_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+        DEBUG_PRINT_LOW("\n%s:%d create extra data with config", __func__,
+                __LINE__);
+
+        if (pack_sei) {
+            msg_size = create_sei(buffer);
+
+            if ( msg_size > 0)
+                buf_hdr->nFilledLen += msg_size;
+        }
     }
+
     return 1;
 }
 
diff --git a/mm-video-v4l2/vidc/common/src/vidc_color_converter.cpp b/mm-video-v4l2/vidc/common/src/vidc_color_converter.cpp
index e75dd3c..ac5b840 100644
--- a/mm-video-v4l2/vidc/common/src/vidc_color_converter.cpp
+++ b/mm-video-v4l2/vidc/common/src/vidc_color_converter.cpp
@@ -39,116 +39,136 @@
 
 omx_c2d_conv::omx_c2d_conv()
 {
-  c2dcc = NULL;
-  mLibHandle = NULL;
-  mConvertOpen = NULL;
-  mConvertClose = NULL;
-  src_format = NV12_2K;
-}
-
-bool omx_c2d_conv::init() {
-  bool status = true;
-  if(mLibHandle || mConvertOpen || mConvertClose) {
-    DEBUG_PRINT_ERROR("\n omx_c2d_conv::init called twice");
-    status = false;
-  }
-  if(status) {
-    mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY);
-    if(mLibHandle){
-       mConvertOpen = (createC2DColorConverter_t *)
-       dlsym(mLibHandle,"createC2DColorConverter");
-       mConvertClose = (destroyC2DColorConverter_t *)
-       dlsym(mLibHandle,"destroyC2DColorConverter");
-       if(!mConvertOpen || !mConvertClose)
-         status = false;
-    } else
-      status = false;
-  }
-  if(!status && mLibHandle){
-    dlclose(mLibHandle);
+    c2dcc = NULL;
     mLibHandle = NULL;
     mConvertOpen = NULL;
     mConvertClose = NULL;
-  }
-  return status;
+    src_format = NV12_2K;
+}
+
+bool omx_c2d_conv::init()
+{
+    bool status = true;
+
+    if (mLibHandle || mConvertOpen || mConvertClose) {
+        DEBUG_PRINT_ERROR("\n omx_c2d_conv::init called twice");
+        status = false;
+    }
+
+    if (status) {
+        mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY);
+
+        if (mLibHandle) {
+            mConvertOpen = (createC2DColorConverter_t *)
+                dlsym(mLibHandle,"createC2DColorConverter");
+            mConvertClose = (destroyC2DColorConverter_t *)
+                dlsym(mLibHandle,"destroyC2DColorConverter");
+
+            if (!mConvertOpen || !mConvertClose)
+                status = false;
+        } else
+            status = false;
+    }
+
+    if (!status && mLibHandle) {
+        dlclose(mLibHandle);
+        mLibHandle = NULL;
+        mConvertOpen = NULL;
+        mConvertClose = NULL;
+    }
+
+    return status;
 }
 
 bool omx_c2d_conv::convert(int src_fd, void *src_base, void *src_viraddr,
-     int dest_fd, void *dest_base, void *dest_viraddr)
+        int dest_fd, void *dest_base, void *dest_viraddr)
 {
-  int result;
-  if(!src_viraddr || !dest_viraddr || !c2dcc || !dest_base || !src_base){
-    DEBUG_PRINT_ERROR("\n Invalid arguments omx_c2d_conv::convert");
-    return false;
-  }
-  result =  c2dcc->convertC2D(src_fd, src_base, src_viraddr,
-                              dest_fd, dest_base, dest_viraddr);
-  DEBUG_PRINT_LOW("\n Color convert status %d",result);
-  return ((result < 0)?false:true);
+    int result;
+
+    if (!src_viraddr || !dest_viraddr || !c2dcc || !dest_base || !src_base) {
+        DEBUG_PRINT_ERROR("\n Invalid arguments omx_c2d_conv::convert");
+        return false;
+    }
+
+    result =  c2dcc->convertC2D(src_fd, src_base, src_viraddr,
+            dest_fd, dest_base, dest_viraddr);
+    DEBUG_PRINT_LOW("\n Color convert status %d",result);
+    return ((result < 0)?false:true);
 }
 
 bool omx_c2d_conv::open(unsigned int height,unsigned int width,
-     ColorConvertFormat src, ColorConvertFormat dest)
+        ColorConvertFormat src, ColorConvertFormat dest)
 {
-  bool status = false;
-  if(!c2dcc) {
-     c2dcc = mConvertOpen(width, height, width, height,
-             src,dest,0,0);
-     if(c2dcc) {
-       src_format = src;
-       status = true;
-     } else
-       DEBUG_PRINT_ERROR("\n mConvertOpen failed");
-  }
-   return status;
+    bool status = false;
+
+    if (!c2dcc) {
+        c2dcc = mConvertOpen(width, height, width, height,
+                src,dest,0,0);
+
+        if (c2dcc) {
+            src_format = src;
+            status = true;
+        } else
+            DEBUG_PRINT_ERROR("\n mConvertOpen failed");
+    }
+
+    return status;
 }
 void omx_c2d_conv::close()
 {
-  if(mLibHandle) {
-    if(mConvertClose && c2dcc)
-     mConvertClose(c2dcc);
-    c2dcc = NULL;
-  }
+    if (mLibHandle) {
+        if (mConvertClose && c2dcc)
+            mConvertClose(c2dcc);
+
+        c2dcc = NULL;
+    }
 }
 
 void omx_c2d_conv::destroy()
 {
-  DEBUG_PRINT_ERROR("\n Destroy C2D instance");
-  if(mLibHandle) {
-    if(mConvertClose && c2dcc)
-      mConvertClose(c2dcc);
-    dlclose(mLibHandle);
-  }
-  c2dcc = NULL;
-  mLibHandle = NULL;
-  mConvertOpen = NULL;
-  mConvertClose = NULL;
+    DEBUG_PRINT_ERROR("\n Destroy C2D instance");
+
+    if (mLibHandle) {
+        if (mConvertClose && c2dcc)
+            mConvertClose(c2dcc);
+
+        dlclose(mLibHandle);
+    }
+
+    c2dcc = NULL;
+    mLibHandle = NULL;
+    mConvertOpen = NULL;
+    mConvertClose = NULL;
 }
 omx_c2d_conv::~omx_c2d_conv()
 {
-  destroy();
+    destroy();
 }
 int omx_c2d_conv::get_src_format()
 {
-  int format = -1;
-  if(src_format == NV12_2K) {
-    format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE;
-  } else if(src_format == RGBA8888) {
-    format = HAL_PIXEL_FORMAT_RGBA_8888;
-  }
-  return format;
+    int format = -1;
+
+    if (src_format == NV12_2K) {
+        format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE;
+    } else if (src_format == RGBA8888) {
+        format = HAL_PIXEL_FORMAT_RGBA_8888;
+    }
+
+    return format;
 }
 bool omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size)
 {
-  int cret = 0;
-  bool ret = false;
-  C2DBuffReq bufferreq;
-  if(c2dcc){
-    bufferreq.size = 0;
-    cret = c2dcc->getBuffReq(port,&bufferreq);
-    DEBUG_PRINT_LOW("\n Status of getbuffer is %d", cret);
-    ret = (cret)?false:true;
-    buf_size = bufferreq.size;
-  }
-  return ret;
+    int cret = 0;
+    bool ret = false;
+    C2DBuffReq bufferreq;
+
+    if (c2dcc) {
+        bufferreq.size = 0;
+        cret = c2dcc->getBuffReq(port,&bufferreq);
+        DEBUG_PRINT_LOW("\n Status of getbuffer is %d", cret);
+        ret = (cret)?false:true;
+        buf_size = bufferreq.size;
+    }
+
+    return ret;
 }
diff --git a/mm-video-v4l2/vidc/vdec/inc/Map.h b/mm-video-v4l2/vidc/vdec/inc/Map.h
old mode 100755
new mode 100644
index 6d5873e..7b54152
--- a/mm-video-v4l2/vidc/vdec/inc/Map.h
+++ b/mm-video-v4l2/vidc/vdec/inc/Map.h
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -34,24 +34,27 @@
 template <typename T,typename T2>
 class Map
 {
-    struct node
-    {
+    struct node {
         T    data;
         T2   data2;
         node* prev;
         node* next;
         node(T t, T2 t2,node* p, node* n) :
-             data(t), data2(t2), prev(p), next(n) {}
+            data(t), data2(t2), prev(p), next(n) {}
     };
     node* head;
     node* tail;
     node* tmp;
     unsigned size_of_list;
     static Map<T,T2> *m_self;
-public:
+    public:
     Map() : head( NULL ), tail ( NULL ),tmp(head),size_of_list(0) {}
-    bool empty() const { return ( !head || !tail ); }
-    operator bool() const { return !empty(); }
+    bool empty() const {
+        return ( !head || !tail );
+    }
+    operator bool() const {
+        return !empty();
+    }
     void insert(T,T2);
     void show();
     int  size();
@@ -61,10 +64,8 @@
     bool erase(T);
     bool eraseall();
     bool isempty();
-    ~Map()
-    {
-        while(head)
-        {
+    ~Map() {
+        while (head) {
             node* temp(head);
             head=head->next;
             size_of_list--;
@@ -73,88 +74,93 @@
     }
 };
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 T2 Map<T,T2>::find(T d1)
 {
     tmp = head;
-    while(tmp)
-    {
-        if(tmp->data == d1)
-        {
+
+    while (tmp) {
+        if (tmp->data == d1) {
             return tmp->data2;
         }
+
         tmp = tmp->next;
     }
+
     return 0;
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 T Map<T,T2>::find_ele(T d1)
 {
     tmp = head;
-    while(tmp)
-    {
-        if(tmp->data == d1)
-        {
+
+    while (tmp) {
+        if (tmp->data == d1) {
             return tmp->data;
         }
+
         tmp = tmp->next;
     }
+
     return 0;
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 T2 Map<T,T2>::begin()
 {
     tmp = head;
-    if(tmp)
-    {
+
+    if (tmp) {
         return (tmp->data2);
     }
+
     return 0;
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 void Map<T,T2>::show()
 {
     tmp = head;
-    while(tmp)
-    {
+
+    while (tmp) {
         printf("%d-->%d\n",tmp->data,tmp->data2);
         tmp = tmp->next;
     }
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 int Map<T,T2>::size()
 {
     int count =0;
     tmp = head;
-    while(tmp)
-    {
+
+    while (tmp) {
         tmp = tmp->next;
         count++;
     }
+
     return count;
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 void Map<T,T2>::insert(T data, T2 data2)
 {
     tail = new node(data, data2,tail, NULL);
-    if( tail->prev )
+
+    if ( tail->prev )
         tail->prev->next = tail;
 
-    if( empty() )
-    {
+    if ( empty() ) {
         head = tail;
         tmp=head;
     }
+
     tmp = head;
     size_of_list++;
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 bool Map<T,T2>::erase(T d)
 {
     bool found = false;
@@ -162,18 +168,16 @@
     node* prevnode = tmp;
     node *tempnode;
 
-    while(tmp)
-    {
-        if((head == tail) && (head->data == d))
-        {
-           found = true;
-           tempnode = head;
-           head = tail = NULL;
-           delete tempnode;
-           break;
+    while (tmp) {
+        if ((head == tail) && (head->data == d)) {
+            found = true;
+            tempnode = head;
+            head = tail = NULL;
+            delete tempnode;
+            break;
         }
-        if((tmp ==head) && (tmp->data ==d))
-        {
+
+        if ((tmp ==head) && (tmp->data ==d)) {
             found = true;
             tempnode = tmp;
             tmp = tmp->next;
@@ -183,8 +187,8 @@
             delete tempnode;
             break;
         }
-        if((tmp == tail) && (tmp->data ==d))
-        {
+
+        if ((tmp == tail) && (tmp->data ==d)) {
             found = true;
             tempnode = tmp;
             prevnode->next = NULL;
@@ -193,8 +197,8 @@
             delete tempnode;
             break;
         }
-        if(tmp->data == d)
-        {
+
+        if (tmp->data == d) {
             found = true;
             prevnode->next = tmp->next;
             tmp->next->prev = prevnode->next;
@@ -203,34 +207,38 @@
             delete tempnode;
             break;
         }
+
         prevnode = tmp;
         tmp = tmp->next;
     }
-    if(found)size_of_list--;
+
+    if (found)size_of_list--;
+
     return found;
 }
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 bool Map<T,T2>::eraseall()
 {
     node *tempnode;
     tmp = head;
-    while(head)
-    {
-       tempnode = head;
-       tempnode->next = NULL;
-       head = head->next;
-       delete tempnode;
+
+    while (head) {
+        tempnode = head;
+        tempnode->next = NULL;
+        head = head->next;
+        delete tempnode;
     }
+
     tail = head = NULL;
     return true;
 }
 
 
-template <typename T,typename T2>
+    template <typename T,typename T2>
 bool Map<T,T2>::isempty()
 {
-    if(!size_of_list) return true;
+    if (!size_of_list) return true;
     else return false;
 }
 
diff --git a/mm-video-v4l2/vidc/vdec/inc/decoder_driver_test.h b/mm-video-v4l2/vidc/vdec/inc/decoder_driver_test.h
old mode 100755
new mode 100644
index b3afafe..cc42fc1
--- a/mm-video-v4l2/vidc/vdec/inc/decoder_driver_test.h
+++ b/mm-video-v4l2/vidc/vdec/inc/decoder_driver_test.h
@@ -1,70 +1,69 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include <stdio.h>
-#include <stdlib.h>
-#include "message_queue.h"
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <inttypes.h>
-#include <linux/msm_vidc_dec.h>
-#include <pthread.h>
-#include <semaphore.h>
-#include <stdio.h>
-
-struct video_decoder_context
-{
-    enum vdec_codec               decoder_format;
-    enum vdec_output_fromat       output_format;
-    struct vdec_picsize           video_resoultion;
-    struct vdec_allocatorproperty input_buffer;
-    struct vdec_allocatorproperty output_buffer;
-    struct vdec_bufferpayload     **ptr_inputbuffer;
-    struct vdec_bufferpayload     **ptr_outputbuffer;
-    struct vdec_output_frameinfo  **ptr_respbuffer;
-    struct video_queue_context    queue_context;
-    int                           video_driver_fd;
-
-    FILE * inputBufferFile;
-    FILE * outputBufferFile;
-
-    pthread_t videothread_id;
-    pthread_t asyncthread_id;
-    sem_t sem_synchronize;
-};
-
-int init_decoder ( struct video_decoder_context *init_decode );
-int allocate_buffer ( enum vdec_buffer,
-                      struct video_decoder_context *decode_context
-                     );
-int free_buffer ( enum vdec_buffer,
-                  struct video_decoder_context *decode_context
-                 );
-int start_decoding (struct video_decoder_context *decode_context);
-int stop_decoding  (struct video_decoder_context *decode_context);
-int deinit_decoder (struct video_decoder_context *init_decode);
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011,2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include "message_queue.h"
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <inttypes.h>
+#include <linux/msm_vidc_dec.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+struct video_decoder_context {
+    enum vdec_codec               decoder_format;
+    enum vdec_output_fromat       output_format;
+    struct vdec_picsize           video_resoultion;
+    struct vdec_allocatorproperty input_buffer;
+    struct vdec_allocatorproperty output_buffer;
+    struct vdec_bufferpayload     **ptr_inputbuffer;
+    struct vdec_bufferpayload     **ptr_outputbuffer;
+    struct vdec_output_frameinfo  **ptr_respbuffer;
+    struct video_queue_context    queue_context;
+    int                           video_driver_fd;
+
+    FILE * inputBufferFile;
+    FILE * outputBufferFile;
+
+    pthread_t videothread_id;
+    pthread_t asyncthread_id;
+    sem_t sem_synchronize;
+};
+
+int init_decoder ( struct video_decoder_context *init_decode );
+int allocate_buffer ( enum vdec_buffer,
+        struct video_decoder_context *decode_context
+        );
+int free_buffer ( enum vdec_buffer,
+        struct video_decoder_context *decode_context
+        );
+int start_decoding (struct video_decoder_context *decode_context);
+int stop_decoding  (struct video_decoder_context *decode_context);
+int deinit_decoder (struct video_decoder_context *init_decode);
diff --git a/mm-video-v4l2/vidc/vdec/inc/frameparser.h b/mm-video-v4l2/vidc/vdec/inc/frameparser.h
old mode 100755
new mode 100644
index 186c039..075f1aa
--- a/mm-video-v4l2/vidc/vdec/inc/frameparser.h
+++ b/mm-video-v4l2/vidc/vdec/inc/frameparser.h
@@ -33,8 +33,7 @@
 #include "h264_utils.h"
 //#include <stdlib.h>
 
-enum codec_type
-{
+enum codec_type {
     CODEC_TYPE_MPEG4 = 0,
     CODEC_TYPE_DIVX = 0,
     CODEC_TYPE_H263 = 1,
@@ -48,58 +47,56 @@
     CODEC_TYPE_MAX
 };
 
-enum state_start_code_parse
-{
-   A0,
-   A1,
-   A2,
-   A3,
-   A4,
-   A5
+enum state_start_code_parse {
+    A0,
+    A1,
+    A2,
+    A3,
+    A4,
+    A5
 };
 
-enum state_nal_parse
-{
-   NAL_LENGTH_ACC,
-   NAL_PARSING
+enum state_nal_parse {
+    NAL_LENGTH_ACC,
+    NAL_PARSING
 };
 
 class frame_parse
 {
 
-public:
-	H264_Utils *mutils;
-	int init_start_codes (codec_type codec_type_parse);
-	int parse_sc_frame (OMX_BUFFERHEADERTYPE *source,
-                         OMX_BUFFERHEADERTYPE *dest ,
-						             OMX_U32 *partialframe);
-	int init_nal_length (unsigned int nal_length);
-	int parse_h264_nallength (OMX_BUFFERHEADERTYPE *source,
-		                        OMX_BUFFERHEADERTYPE *dest ,
-							              OMX_U32 *partialframe);
-	void flush ();
-	 frame_parse ();
-	~frame_parse ();
+    public:
+        H264_Utils *mutils;
+        int init_start_codes (codec_type codec_type_parse);
+        int parse_sc_frame (OMX_BUFFERHEADERTYPE *source,
+                OMX_BUFFERHEADERTYPE *dest ,
+                OMX_U32 *partialframe);
+        int init_nal_length (unsigned int nal_length);
+        int parse_h264_nallength (OMX_BUFFERHEADERTYPE *source,
+                OMX_BUFFERHEADERTYPE *dest ,
+                OMX_U32 *partialframe);
+        void flush ();
+        frame_parse ();
+        ~frame_parse ();
 
-private:
-   /*Variables for Start code based Parsing*/
-   enum state_start_code_parse parse_state;
-   unsigned char *start_code;
-   unsigned char *mask_code;
-   unsigned char last_byte_h263;
-   unsigned char last_byte;
-   bool header_found;
-   bool skip_frame_boundary;
+    private:
+        /*Variables for Start code based Parsing*/
+        enum state_start_code_parse parse_state;
+        unsigned char *start_code;
+        unsigned char *mask_code;
+        unsigned char last_byte_h263;
+        unsigned char last_byte;
+        bool header_found;
+        bool skip_frame_boundary;
 
-   /*Variables for NAL Length Parsing*/
-   enum state_nal_parse state_nal;
-   unsigned int nal_length;
-   unsigned int accum_length;
-   unsigned int bytes_tobeparsed;
-   /*Functions to support additional start code parsing*/
-   void parse_additional_start_code(OMX_U8 *psource, OMX_U32 *parsed_length);
-   void check_skip_frame_boundary(OMX_U32 *partial_frame);
-   void update_skip_frame();
+        /*Variables for NAL Length Parsing*/
+        enum state_nal_parse state_nal;
+        unsigned int nal_length;
+        unsigned int accum_length;
+        unsigned int bytes_tobeparsed;
+        /*Functions to support additional start code parsing*/
+        void parse_additional_start_code(OMX_U8 *psource, OMX_U32 *parsed_length);
+        void check_skip_frame_boundary(OMX_U32 *partial_frame);
+        void update_skip_frame();
 };
 
 #endif /* FRAMEPARSER_H */
diff --git a/mm-video-v4l2/vidc/vdec/inc/h264_utils.h b/mm-video-v4l2/vidc/vdec/inc/h264_utils.h
old mode 100755
new mode 100644
index 8df11ab..ad05a9e
--- a/mm-video-v4l2/vidc/vdec/inc/h264_utils.h
+++ b/mm-video-v4l2/vidc/vdec/inc/h264_utils.h
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -63,13 +63,13 @@
 
 /* =======================================================================
 
-                        DATA DECLARATIONS
+                          DATA DECLARATIONS
 
-========================================================================== */
+ ========================================================================== */
 
 /* -----------------------------------------------------------------------
-** Constant / Define Declarations
-** ----------------------------------------------------------------------- */
+ ** Constant / Define Declarations
+ ** ----------------------------------------------------------------------- */
 // Common format block header definitions
 #define MT_VIDEO_META_STREAM_HEADER             0x00
 #define MT_VIDEO_MEDIA_STREAM_HEADER            0x01
@@ -97,12 +97,12 @@
 #define MT_VIDEO_H263_FORMAT_BLOCK_HEADER_SIZE  16
 
 /* =======================================================================
-**                          Function Declarations
-** ======================================================================= */
+ **                          Function Declarations
+ ** ======================================================================= */
 
 /* -----------------------------------------------------------------------
-** Type Declarations
-** ----------------------------------------------------------------------- */
+ ** Type Declarations
+ ** ----------------------------------------------------------------------- */
 
 // This type is used when parsing an H.264 bitstream to collect H.264 NAL
 // units that need to go in the meta data.
@@ -128,27 +128,27 @@
 typedef Map<uint32, H264ParamNalu *> H264ParamNaluSet;
 
 typedef enum {
-  NALU_TYPE_UNSPECIFIED = 0,
-  NALU_TYPE_NON_IDR,
-  NALU_TYPE_PARTITION_A,
-  NALU_TYPE_PARTITION_B,
-  NALU_TYPE_PARTITION_C,
-  NALU_TYPE_IDR,
-  NALU_TYPE_SEI,
-  NALU_TYPE_SPS,
-  NALU_TYPE_PPS,
-  NALU_TYPE_ACCESS_DELIM,
-  NALU_TYPE_EOSEQ,
-  NALU_TYPE_EOSTREAM,
-  NALU_TYPE_FILLER_DATA,
-  NALU_TYPE_RESERVED,
+    NALU_TYPE_UNSPECIFIED = 0,
+    NALU_TYPE_NON_IDR,
+    NALU_TYPE_PARTITION_A,
+    NALU_TYPE_PARTITION_B,
+    NALU_TYPE_PARTITION_C,
+    NALU_TYPE_IDR,
+    NALU_TYPE_SEI,
+    NALU_TYPE_SPS,
+    NALU_TYPE_PPS,
+    NALU_TYPE_ACCESS_DELIM,
+    NALU_TYPE_EOSEQ,
+    NALU_TYPE_EOSTREAM,
+    NALU_TYPE_FILLER_DATA,
+    NALU_TYPE_RESERVED,
 } NALU_TYPE;
 
 // NAL header information
 typedef struct {
-  uint32 nal_ref_idc;
-  uint32 nalu_type;
-  uint32 forbidden_zero_bit;
+    uint32 nal_ref_idc;
+    uint32 nalu_type;
+    uint32 forbidden_zero_bit;
 } NALU;
 
 // This structure contains persistent information about an H.264 stream as it
@@ -166,75 +166,74 @@
  ** unit) into RBSP (raw byte sequence payload) and extract bits from it.
  *****************************************************************************/
 {
-public:
-    RbspParser (const uint8 *begin, const uint8 *end);
+    public:
+        RbspParser (const uint8 *begin, const uint8 *end);
 
-    virtual ~RbspParser ();
+        virtual ~RbspParser ();
 
-    uint32 next ();
-    void advance ();
-    uint32 u (uint32 n);
-    uint32 ue ();
-    int32 se ();
+        uint32 next ();
+        void advance ();
+        uint32 u (uint32 n);
+        uint32 ue ();
+        int32 se ();
 
-private:
-    const     uint8 *begin, *end;
-    int32     pos;
-    uint32    bit;
-    uint32    cursor;
-    bool      advanceNeeded;
+    private:
+        const     uint8 *begin, *end;
+        int32     pos;
+        uint32    bit;
+        uint32    cursor;
+        bool      advanceNeeded;
 };
 
 class H264_Utils
 {
-public:
-    H264_Utils();
-    ~H264_Utils();
-    void initialize_frame_checking_environment();
-    void allocate_rbsp_buffer(uint32 inputBufferSize);
-    bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
-                    OMX_IN OMX_U32 size_of_nal_length_field,
-                    OMX_OUT OMX_BOOL &isNewFrame);
-    uint32 nalu_type;
+    public:
+        H264_Utils();
+        ~H264_Utils();
+        void initialize_frame_checking_environment();
+        void allocate_rbsp_buffer(uint32 inputBufferSize);
+        bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
+                OMX_IN OMX_U32 size_of_nal_length_field,
+                OMX_OUT OMX_BOOL &isNewFrame);
+        uint32 nalu_type;
 
-private:
-    boolean extract_rbsp(OMX_IN   OMX_U8  *buffer,
-                         OMX_IN   OMX_U32 buffer_length,
-                         OMX_IN   OMX_U32 size_of_nal_length_field,
-                         OMX_OUT  OMX_U8  *rbsp_bistream,
-                         OMX_OUT  OMX_U32 *rbsp_length,
-                         OMX_OUT  NALU    *nal_unit);
+    private:
+        boolean extract_rbsp(OMX_IN   OMX_U8  *buffer,
+                OMX_IN   OMX_U32 buffer_length,
+                OMX_IN   OMX_U32 size_of_nal_length_field,
+                OMX_OUT  OMX_U8  *rbsp_bistream,
+                OMX_OUT  OMX_U32 *rbsp_length,
+                OMX_OUT  NALU    *nal_unit);
 
-    unsigned          m_height;
-    unsigned          m_width;
-    H264ParamNaluSet  pic;
-    H264ParamNaluSet  seq;
-    uint8             *m_rbspBytes;
-    NALU              m_prv_nalu;
-    bool              m_forceToStichNextNAL;
-    bool              m_au_data;
+        unsigned          m_height;
+        unsigned          m_width;
+        H264ParamNaluSet  pic;
+        H264ParamNaluSet  seq;
+        uint8             *m_rbspBytes;
+        NALU              m_prv_nalu;
+        bool              m_forceToStichNextNAL;
+        bool              m_au_data;
 };
 
 class perf_metrics
 {
-  public:
-    perf_metrics() :
-      start_time(0),
-      proc_time(0),
-      active(false)
-    {
-    };
-    ~perf_metrics() {};
-    void start();
-    void stop();
-    void end(OMX_U32 units_cntr = 0);
-    void reset();
-    OMX_U64 processing_time_us();
-  private:
-    inline OMX_U64 get_act_time();
-    OMX_U64 start_time;
-    OMX_U64 proc_time;
-    bool active;
+    public:
+        perf_metrics() :
+            start_time(0),
+            proc_time(0),
+            active(false) {
+            };
+        ~perf_metrics() {};
+        void start();
+        void stop();
+        void end(OMX_U32 units_cntr = 0);
+        void reset();
+        OMX_U64 processing_time_us();
+    private:
+        inline OMX_U64 get_act_time();
+        OMX_U64 start_time;
+        OMX_U64 proc_time;
+        bool active;
 };
 
 #define EMULATION_PREVENTION_THREE_BYTE 0x03
@@ -244,146 +243,140 @@
 #define VALID_TS(ts)      ((ts < LLONG_MAX)? true : false)
 #define NALU_TYPE_VUI (NALU_TYPE_RESERVED + 1)
 
-enum SEI_PAYLOAD_TYPE
-{
-  BUFFERING_PERIOD = 0,
-  PIC_TIMING,
-  PAN_SCAN_RECT,
-  FILLER_PAYLOAD,
-  USER_DATA_REGISTERED_ITU_T_T35,
-  USER_DATA_UNREGISTERED,
-  RECOVERY_POINT,
-  DEC_REF_PIC_MARKING_REPETITION,
-  SPARE_PIC,
-  SCENE_INFO,
-  SUB_SEQ_INFO,
-  SUB_SEQ_LAYER_CHARACTERISTICS,
-  SUB_SEQ_CHARACTERISTICS,
-  FULL_FRAME_FREEZE,
-  FULL_FRAME_FREEZE_RELEASE,
-  FULL_FRAME_SNAPSHOT,
-  PROGRESSIVE_REFINEMENT_SEGMENT_START,
-  PROGRESSIVE_REFINEMENT_SEGMENT_END,
-  SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT = 0x2D
+enum SEI_PAYLOAD_TYPE {
+    BUFFERING_PERIOD = 0,
+    PIC_TIMING,
+    PAN_SCAN_RECT,
+    FILLER_PAYLOAD,
+    USER_DATA_REGISTERED_ITU_T_T35,
+    USER_DATA_UNREGISTERED,
+    RECOVERY_POINT,
+    DEC_REF_PIC_MARKING_REPETITION,
+    SPARE_PIC,
+    SCENE_INFO,
+    SUB_SEQ_INFO,
+    SUB_SEQ_LAYER_CHARACTERISTICS,
+    SUB_SEQ_CHARACTERISTICS,
+    FULL_FRAME_FREEZE,
+    FULL_FRAME_FREEZE_RELEASE,
+    FULL_FRAME_SNAPSHOT,
+    PROGRESSIVE_REFINEMENT_SEGMENT_START,
+    PROGRESSIVE_REFINEMENT_SEGMENT_END,
+    SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT = 0x2D
 };
 
-typedef struct
-{
-  OMX_U32  cpb_cnt;
-  OMX_U8   bit_rate_scale;
-  OMX_U8   cpb_size_scale;
-  OMX_U32  bit_rate_value[MAX_CPB_COUNT];
-  OMX_U32  cpb_size_value[MAX_CPB_COUNT];
-  OMX_U8   cbr_flag[MAX_CPB_COUNT];
-  OMX_U8   initial_cpb_removal_delay_length;
-  OMX_U8   cpb_removal_delay_length;
-  OMX_U8   dpb_output_delay_length;
-  OMX_U8   time_offset_length;
+typedef struct {
+    OMX_U32  cpb_cnt;
+    OMX_U8   bit_rate_scale;
+    OMX_U8   cpb_size_scale;
+    OMX_U32  bit_rate_value[MAX_CPB_COUNT];
+    OMX_U32  cpb_size_value[MAX_CPB_COUNT];
+    OMX_U8   cbr_flag[MAX_CPB_COUNT];
+    OMX_U8   initial_cpb_removal_delay_length;
+    OMX_U8   cpb_removal_delay_length;
+    OMX_U8   dpb_output_delay_length;
+    OMX_U8   time_offset_length;
 } h264_hrd_param;
 
-typedef struct
-{
-  OMX_U32  aspect_ratio_idc;
-  OMX_U32  aspect_ratio_x;
-  OMX_U32  aspect_ratio_y;
+typedef struct {
+    OMX_U32  aspect_ratio_idc;
+    OMX_U32  aspect_ratio_x;
+    OMX_U32  aspect_ratio_y;
 } h264_aspect_ratio_info;
 
-typedef struct
-{
-  OMX_U8   aspect_ratio_info_present_flag;
-  h264_aspect_ratio_info aspect_ratio_info;
-  OMX_U8   timing_info_present_flag;
-  OMX_U32  num_units_in_tick;
-  OMX_U32  time_scale;
-  OMX_U8   fixed_frame_rate_flag;
-  OMX_U8   nal_hrd_parameters_present_flag;
-  h264_hrd_param   nal_hrd_parameters;
-  OMX_U8   vcl_hrd_parameters_present_flag;
-  h264_hrd_param   vcl_hrd_parameters;
-  OMX_U8   low_delay_hrd_flag;
-  OMX_U8   pic_struct_present_flag;
-  OMX_S64  fixed_fps_prev_ts;
+typedef struct {
+    OMX_U8   aspect_ratio_info_present_flag;
+    h264_aspect_ratio_info aspect_ratio_info;
+    OMX_U8   timing_info_present_flag;
+    OMX_U32  num_units_in_tick;
+    OMX_U32  time_scale;
+    OMX_U8   fixed_frame_rate_flag;
+    OMX_U8   nal_hrd_parameters_present_flag;
+    h264_hrd_param   nal_hrd_parameters;
+    OMX_U8   vcl_hrd_parameters_present_flag;
+    h264_hrd_param   vcl_hrd_parameters;
+    OMX_U8   low_delay_hrd_flag;
+    OMX_U8   pic_struct_present_flag;
+    OMX_S64  fixed_fps_prev_ts;
 } h264_vui_param;
 
-typedef struct
-{
-  OMX_U32 cpb_removal_delay;
-  OMX_U32 dpb_output_delay;
-  OMX_U8  pic_struct;
-  OMX_U32 num_clock_ts;
-  bool    clock_ts_flag;
-  OMX_U8  ct_type;
-  OMX_U32 nuit_field_based_flag;
-  OMX_U8  counting_type;
-  OMX_U8  full_timestamp_flag;
-  OMX_U8  discontinuity_flag;
-  OMX_U8  cnt_dropped_flag;
-  OMX_U32 n_frames;
-  OMX_U32 seconds_value;
-  OMX_U32 minutes_value;
-  OMX_U32 hours_value;
-  OMX_S32 time_offset;
-  bool    is_valid;
+typedef struct {
+    OMX_U32 cpb_removal_delay;
+    OMX_U32 dpb_output_delay;
+    OMX_U8  pic_struct;
+    OMX_U32 num_clock_ts;
+    bool    clock_ts_flag;
+    OMX_U8  ct_type;
+    OMX_U32 nuit_field_based_flag;
+    OMX_U8  counting_type;
+    OMX_U8  full_timestamp_flag;
+    OMX_U8  discontinuity_flag;
+    OMX_U8  cnt_dropped_flag;
+    OMX_U32 n_frames;
+    OMX_U32 seconds_value;
+    OMX_U32 minutes_value;
+    OMX_U32 hours_value;
+    OMX_S32 time_offset;
+    bool    is_valid;
 } h264_sei_pic_timing;
 
-typedef struct
-{
-  OMX_U32  initial_cpb_removal_delay[MAX_CPB_COUNT];
-  OMX_U32  initial_cpb_removal_delay_offset[MAX_CPB_COUNT];
-  OMX_U32  au_cntr;
-  OMX_S64  reference_ts;
-  bool     is_valid;
+typedef struct {
+    OMX_U32  initial_cpb_removal_delay[MAX_CPB_COUNT];
+    OMX_U32  initial_cpb_removal_delay_offset[MAX_CPB_COUNT];
+    OMX_U32  au_cntr;
+    OMX_S64  reference_ts;
+    bool     is_valid;
 } h264_sei_buf_period;
 
-typedef struct
-{
-  OMX_U32  rect_id;
-  OMX_U8   rect_cancel_flag;
-  OMX_U32  cnt;
-  OMX_S32  rect_left_offset[MAX_PAN_SCAN_RECT];
-  OMX_S32  rect_right_offset[MAX_PAN_SCAN_RECT];
-  OMX_S32  rect_top_offset[MAX_PAN_SCAN_RECT];
-  OMX_S32  rect_bottom_offset[MAX_PAN_SCAN_RECT];
-  OMX_U32  rect_repetition_period;
+typedef struct {
+    OMX_U32  rect_id;
+    OMX_U8   rect_cancel_flag;
+    OMX_U32  cnt;
+    OMX_S32  rect_left_offset[MAX_PAN_SCAN_RECT];
+    OMX_S32  rect_right_offset[MAX_PAN_SCAN_RECT];
+    OMX_S32  rect_top_offset[MAX_PAN_SCAN_RECT];
+    OMX_S32  rect_bottom_offset[MAX_PAN_SCAN_RECT];
+    OMX_U32  rect_repetition_period;
 } h264_pan_scan;
 
 #ifdef PANSCAN_HDLR
 template <class NODE_STRUCT>
 class omx_dl_list
 {
-public:
-  omx_dl_list() { head = tail = NULL; } ;
-  ~omx_dl_list() {};
-  void add_multiple(NODE_STRUCT *data_arr, int data_num);
-  NODE_STRUCT *remove_first();
-  NODE_STRUCT *remove_last();
-  void add_last(NODE_STRUCT *data_ptr);
-  NODE_STRUCT *watch_first();
-  NODE_STRUCT *watch_last();
-private:
-  NODE_STRUCT *head, *tail;
+    public:
+        omx_dl_list() {
+            head = tail = NULL;
+        } ;
+        ~omx_dl_list() {};
+        void add_multiple(NODE_STRUCT *data_arr, int data_num);
+        NODE_STRUCT *remove_first();
+        NODE_STRUCT *remove_last();
+        void add_last(NODE_STRUCT *data_ptr);
+        NODE_STRUCT *watch_first();
+        NODE_STRUCT *watch_last();
+    private:
+        NODE_STRUCT *head, *tail;
 };
 
 class panscan_handler
 {
-public:
-  panscan_handler();
-  ~panscan_handler();
-  bool initialize(int num_data);
-  h264_pan_scan *get_free();
-  h264_pan_scan *get_populated(OMX_S64 frame_ts);
-  void update_last(OMX_S64 frame_ts);
-private:
-  typedef struct PANSCAN_NODE
-  {
-    h264_pan_scan pan_scan_param;
-    OMX_S64  start_ts, end_ts;
-    bool active;
-    PANSCAN_NODE *next, *prev;
-  } PANSCAN_NODE;
-  omx_dl_list<PANSCAN_NODE> panscan_used;
-  omx_dl_list<PANSCAN_NODE> panscan_free;
-  PANSCAN_NODE *panscan_data;
+    public:
+        panscan_handler();
+        ~panscan_handler();
+        bool initialize(int num_data);
+        h264_pan_scan *get_free();
+        h264_pan_scan *get_populated(OMX_S64 frame_ts);
+        void update_last(OMX_S64 frame_ts);
+    private:
+        typedef struct PANSCAN_NODE {
+            h264_pan_scan pan_scan_param;
+            OMX_S64  start_ts, end_ts;
+            bool active;
+            PANSCAN_NODE *next, *prev;
+        } PANSCAN_NODE;
+        omx_dl_list<PANSCAN_NODE> panscan_used;
+        omx_dl_list<PANSCAN_NODE> panscan_free;
+        PANSCAN_NODE *panscan_data;
 };
 
 #if 1 // Debug panscan data
@@ -394,23 +387,23 @@
 #else
 
 #define PRINT_PANSCAN_PARAM(H264_PARAM) \
-do {\
-  ALOGE("%s(): left_off(%ld) right_off(%ld) top_off(%ld) bottom_off(%ld)",\
-    __FUNCTION__,\
-    (H264_PARAM).rect_left_offset[0],\
-    (H264_PARAM).rect_right_offset[0],\
-    (H264_PARAM).rect_top_offset[0],\
-    (H264_PARAM).rect_bottom_offset[0]);\
-}while(0)
+    do {\
+        ALOGE("%s(): left_off(%ld) right_off(%ld) top_off(%ld) bottom_off(%ld)",\
+                __FUNCTION__,\
+                (H264_PARAM).rect_left_offset[0],\
+                (H264_PARAM).rect_right_offset[0],\
+                (H264_PARAM).rect_top_offset[0],\
+                (H264_PARAM).rect_bottom_offset[0]);\
+    }while(0)
 
 #define PRINT_PANSCAN_DATA(NODE) \
-do {\
-  if (NODE) {\
-    ALOGE("%s(): PANSCAN DATA start_ts(%lld) end_ts(%lld)", __FUNCTION__,\
-	  (NODE)->start_ts, (NODE)->end_ts);\
-	PRINT_PANSCAN_PARAM(NODE->pan_scan_param);\
-  }\
-}while(0)
+    do {\
+        if (NODE) {\
+            ALOGE("%s(): PANSCAN DATA start_ts(%lld) end_ts(%lld)", __FUNCTION__,\
+                    (NODE)->start_ts, (NODE)->end_ts);\
+            PRINT_PANSCAN_PARAM(NODE->pan_scan_param);\
+        }\
+    }while(0)
 
 #endif // End debug panscan data
 
@@ -418,70 +411,70 @@
 
 class h264_stream_parser
 {
-  public:
-    h264_stream_parser();
-    ~h264_stream_parser();
-    void reset();
-    void fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp);
-    void fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio);
-    void parse_nal(OMX_U8* data_ptr, OMX_U32 data_len,
-                   OMX_U32 nal_type = NALU_TYPE_UNSPECIFIED,
-                   bool enable_emu_sc = true);
-    OMX_S64 process_ts_with_sei_vui(OMX_S64 timestamp);
-    void get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
-    bool is_mbaff();
-    void get_frame_rate(OMX_U32 *frame_rate);
-    OMX_U32 get_profile();
+    public:
+        h264_stream_parser();
+        ~h264_stream_parser();
+        void reset();
+        void fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp);
+        void fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio);
+        void parse_nal(OMX_U8* data_ptr, OMX_U32 data_len,
+                OMX_U32 nal_type = NALU_TYPE_UNSPECIFIED,
+                bool enable_emu_sc = true);
+        OMX_S64 process_ts_with_sei_vui(OMX_S64 timestamp);
+        void get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
+        bool is_mbaff();
+        void get_frame_rate(OMX_U32 *frame_rate);
+        OMX_U32 get_profile();
 #ifdef PANSCAN_HDLR
-    void update_panscan_data(OMX_S64 timestamp);
+        void update_panscan_data(OMX_S64 timestamp);
 #endif
 
-  private:
-    void init_bitstream(OMX_U8* data, OMX_U32 size);
-    OMX_U32 extract_bits(OMX_U32 n);
-    inline bool more_bits();
-    void read_word();
-    OMX_U32 uev();
-    OMX_S32 sev();
-    OMX_S32 iv(OMX_U32 n_bits);
-    void parse_sps();
-    void parse_vui(bool vui_in_extradata = true);
-    void aspect_ratio_info();
-    void hrd_parameters(h264_hrd_param *hrd_param);
-    void parse_sei();
-    void sei_buffering_period();
-    void sei_picture_timing();
-    void sei_pan_scan();
-    void scaling_list(OMX_U32 size_of_scaling_list);
+    private:
+        void init_bitstream(OMX_U8* data, OMX_U32 size);
+        OMX_U32 extract_bits(OMX_U32 n);
+        inline bool more_bits();
+        void read_word();
+        OMX_U32 uev();
+        OMX_S32 sev();
+        OMX_S32 iv(OMX_U32 n_bits);
+        void parse_sps();
+        void parse_vui(bool vui_in_extradata = true);
+        void aspect_ratio_info();
+        void hrd_parameters(h264_hrd_param *hrd_param);
+        void parse_sei();
+        void sei_buffering_period();
+        void sei_picture_timing();
+        void sei_pan_scan();
+        void scaling_list(OMX_U32 size_of_scaling_list);
 
-    void print_pan_data(h264_pan_scan *pan_scan_param);
-    void print_frame_pack();
+        void print_pan_data(h264_pan_scan *pan_scan_param);
+        void print_frame_pack();
 
-    OMX_U32 get_nal_unit_type(OMX_U32 *nal_unit_type);
-    OMX_S64 calculate_buf_period_ts(OMX_S64 timestamp);
-    OMX_S64 calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor);
-    void parse_frame_pack();
+        OMX_U32 get_nal_unit_type(OMX_U32 *nal_unit_type);
+        OMX_S64 calculate_buf_period_ts(OMX_S64 timestamp);
+        OMX_S64 calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor);
+        void parse_frame_pack();
 
-    OMX_U32 curr_32_bit;
-    OMX_U32 bits_read;
-    OMX_U32 profile;
-    OMX_U32 zero_cntr;
-    OMX_U32 emulation_code_skip_cntr;
-    OMX_U8* bitstream;
-    OMX_U32 bitstream_bytes;
-    OMX_U32 frame_rate;
-    bool    emulation_sc_enabled;
+        OMX_U32 curr_32_bit;
+        OMX_U32 bits_read;
+        OMX_U32 profile;
+        OMX_U32 zero_cntr;
+        OMX_U32 emulation_code_skip_cntr;
+        OMX_U8* bitstream;
+        OMX_U32 bitstream_bytes;
+        OMX_U32 frame_rate;
+        bool    emulation_sc_enabled;
 
-    h264_vui_param vui_param;
-    h264_sei_buf_period sei_buf_period;
-    h264_sei_pic_timing sei_pic_timing;
+        h264_vui_param vui_param;
+        h264_sei_buf_period sei_buf_period;
+        h264_sei_pic_timing sei_pic_timing;
 #ifdef PANSCAN_HDLR
-    panscan_handler *panscan_hdl;
+        panscan_handler *panscan_hdl;
 #else
-    h264_pan_scan panscan_param;
+        h264_pan_scan panscan_param;
 #endif
-    OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement;
-	bool 	mbaff_flag;
+        OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement;
+        bool     mbaff_flag;
 };
 
 #endif /* H264_UTILS_H */
diff --git a/mm-video-v4l2/vidc/vdec/inc/hevc_utils.h b/mm-video-v4l2/vidc/vdec/inc/hevc_utils.h
index 6482ee4..797d1d2 100644
--- a/mm-video-v4l2/vidc/vdec/inc/hevc_utils.h
+++ b/mm-video-v4l2/vidc/vdec/inc/hevc_utils.h
@@ -55,92 +55,92 @@
 
 class HEVC_Utils
 {
-public:
-    HEVC_Utils();
-    ~HEVC_Utils();
+    public:
+        HEVC_Utils();
+        ~HEVC_Utils();
 
-	enum {
-		NAL_UNIT_CODED_SLICE_TRAIL_N,	// 0
-		NAL_UNIT_CODED_SLICE_TRAIL_R,	// 1
-		NAL_UNIT_CODED_SLICE_TSA_N,		// 2
-		NAL_UNIT_CODED_SLICE_TLA,		// 3
-		NAL_UNIT_CODED_SLICE_STSA_N,    // 4
-		NAL_UNIT_CODED_SLICE_STSA_R,	// 5
-		NAL_UNIT_CODED_SLICE_RADL_N,	// 6
-		NAL_UNIT_CODED_SLICE_DLP,		// 7
-		NAL_UNIT_CODED_SLICE_RASL_N,	// 8
-		NAL_UNIT_CODED_SLICE_TFD,		// 9
-		NAL_UNIT_RESERVED_10,
-		NAL_UNIT_RESERVED_11,
-		NAL_UNIT_RESERVED_12,
-		NAL_UNIT_RESERVED_13,
-		NAL_UNIT_RESERVED_14,
-		NAL_UNIT_RESERVED_15,
-		NAL_UNIT_CODED_SLICE_BLA,		// 16
-		NAL_UNIT_CODED_SLICE_BLANT,		// 17
-		NAL_UNIT_CODED_SLICE_BLA_N_LP,	// 18
-		NAL_UNIT_CODED_SLICE_IDR,		// 19
-		NAL_UNIT_CODED_SLICE_IDR_N_LP,	// 20
-		NAL_UNIT_CODED_SLICE_CRA,		// 21
-		NAL_UNIT_RESERVED_22,
-		NAL_UNIT_RESERVED_23,
-		NAL_UNIT_RESERVED_24,
-		NAL_UNIT_RESERVED_25,
-		NAL_UNIT_RESERVED_26,
-		NAL_UNIT_RESERVED_27,
+        enum {
+            NAL_UNIT_CODED_SLICE_TRAIL_N,    // 0
+            NAL_UNIT_CODED_SLICE_TRAIL_R,    // 1
+            NAL_UNIT_CODED_SLICE_TSA_N,        // 2
+            NAL_UNIT_CODED_SLICE_TLA,        // 3
+            NAL_UNIT_CODED_SLICE_STSA_N,    // 4
+            NAL_UNIT_CODED_SLICE_STSA_R,    // 5
+            NAL_UNIT_CODED_SLICE_RADL_N,    // 6
+            NAL_UNIT_CODED_SLICE_DLP,        // 7
+            NAL_UNIT_CODED_SLICE_RASL_N,    // 8
+            NAL_UNIT_CODED_SLICE_TFD,        // 9
+            NAL_UNIT_RESERVED_10,
+            NAL_UNIT_RESERVED_11,
+            NAL_UNIT_RESERVED_12,
+            NAL_UNIT_RESERVED_13,
+            NAL_UNIT_RESERVED_14,
+            NAL_UNIT_RESERVED_15,
+            NAL_UNIT_CODED_SLICE_BLA,        // 16
+            NAL_UNIT_CODED_SLICE_BLANT,        // 17
+            NAL_UNIT_CODED_SLICE_BLA_N_LP,    // 18
+            NAL_UNIT_CODED_SLICE_IDR,        // 19
+            NAL_UNIT_CODED_SLICE_IDR_N_LP,    // 20
+            NAL_UNIT_CODED_SLICE_CRA,        // 21
+            NAL_UNIT_RESERVED_22,
+            NAL_UNIT_RESERVED_23,
+            NAL_UNIT_RESERVED_24,
+            NAL_UNIT_RESERVED_25,
+            NAL_UNIT_RESERVED_26,
+            NAL_UNIT_RESERVED_27,
 
-		NAL_UNIT_RESERVED_28,
-		NAL_UNIT_RESERVED_29,
-		NAL_UNIT_RESERVED_30,
-		NAL_UNIT_RESERVED_31,
+            NAL_UNIT_RESERVED_28,
+            NAL_UNIT_RESERVED_29,
+            NAL_UNIT_RESERVED_30,
+            NAL_UNIT_RESERVED_31,
 
-		NAL_UNIT_VPS,					// 32
-		NAL_UNIT_SPS,					// 33
-		NAL_UNIT_PPS,					// 34
-		NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35
-		NAL_UNIT_EOS,					// 36
-		NAL_UNIT_EOB,					// 37
-		NAL_UNIT_FILLER_DATA,			// 38
-		NAL_UNIT_SEI,					// 39 Prefix SEI
-		NAL_UNIT_SEI_SUFFIX,			// 40 Suffix SEI
+            NAL_UNIT_VPS,                    // 32
+            NAL_UNIT_SPS,                    // 33
+            NAL_UNIT_PPS,                    // 34
+            NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35
+            NAL_UNIT_EOS,                    // 36
+            NAL_UNIT_EOB,                    // 37
+            NAL_UNIT_FILLER_DATA,            // 38
+            NAL_UNIT_SEI,                    // 39 Prefix SEI
+            NAL_UNIT_SEI_SUFFIX,            // 40 Suffix SEI
 
-		NAL_UNIT_RESERVED_41,
-		NAL_UNIT_RESERVED_42,
-		NAL_UNIT_RESERVED_43,
-		NAL_UNIT_RESERVED_44,
-		NAL_UNIT_RESERVED_45,
-		NAL_UNIT_RESERVED_46,
-		NAL_UNIT_RESERVED_47,
-		NAL_UNIT_UNSPECIFIED_48,
-		NAL_UNIT_UNSPECIFIED_49,
-		NAL_UNIT_UNSPECIFIED_50,
-		NAL_UNIT_UNSPECIFIED_51,
-		NAL_UNIT_UNSPECIFIED_52,
-		NAL_UNIT_UNSPECIFIED_53,
-		NAL_UNIT_UNSPECIFIED_54,
-		NAL_UNIT_UNSPECIFIED_55,
-		NAL_UNIT_UNSPECIFIED_56,
-		NAL_UNIT_UNSPECIFIED_57,
-		NAL_UNIT_UNSPECIFIED_58,
-		NAL_UNIT_UNSPECIFIED_59,
-		NAL_UNIT_UNSPECIFIED_60,
-		NAL_UNIT_UNSPECIFIED_61,
-		NAL_UNIT_UNSPECIFIED_62,
-		NAL_UNIT_UNSPECIFIED_63,
-		NAL_UNIT_INVALID,
-	};
+            NAL_UNIT_RESERVED_41,
+            NAL_UNIT_RESERVED_42,
+            NAL_UNIT_RESERVED_43,
+            NAL_UNIT_RESERVED_44,
+            NAL_UNIT_RESERVED_45,
+            NAL_UNIT_RESERVED_46,
+            NAL_UNIT_RESERVED_47,
+            NAL_UNIT_UNSPECIFIED_48,
+            NAL_UNIT_UNSPECIFIED_49,
+            NAL_UNIT_UNSPECIFIED_50,
+            NAL_UNIT_UNSPECIFIED_51,
+            NAL_UNIT_UNSPECIFIED_52,
+            NAL_UNIT_UNSPECIFIED_53,
+            NAL_UNIT_UNSPECIFIED_54,
+            NAL_UNIT_UNSPECIFIED_55,
+            NAL_UNIT_UNSPECIFIED_56,
+            NAL_UNIT_UNSPECIFIED_57,
+            NAL_UNIT_UNSPECIFIED_58,
+            NAL_UNIT_UNSPECIFIED_59,
+            NAL_UNIT_UNSPECIFIED_60,
+            NAL_UNIT_UNSPECIFIED_61,
+            NAL_UNIT_UNSPECIFIED_62,
+            NAL_UNIT_UNSPECIFIED_63,
+            NAL_UNIT_INVALID,
+        };
 
 
-    void initialize_frame_checking_environment();
-    bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
-                    OMX_IN OMX_U32 size_of_nal_length_field,
-                    OMX_OUT OMX_BOOL &isNewFrame);
+        void initialize_frame_checking_environment();
+        bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
+                OMX_IN OMX_U32 size_of_nal_length_field,
+                OMX_OUT OMX_BOOL &isNewFrame);
 
-private:
+    private:
 
-    bool              m_forceToStichNextNAL;
-    bool              m_au_data;
-    uint32 nalu_type;
+        bool              m_forceToStichNextNAL;
+        bool              m_au_data;
+        uint32 nalu_type;
 };
 
 #endif /* HEVC_UTILS_H */
diff --git a/mm-video-v4l2/vidc/vdec/inc/message_queue.h b/mm-video-v4l2/vidc/vdec/inc/message_queue.h
old mode 100755
new mode 100644
index d5924e6..7cae154
--- a/mm-video-v4l2/vidc/vdec/inc/message_queue.h
+++ b/mm-video-v4l2/vidc/vdec/inc/message_queue.h
@@ -1,78 +1,76 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#ifndef QUEUE_H
-#define QUEUE_H
-
-#include <pthread.h>
-#include <semaphore.h>
-#include <stdio.h>
-#include <string.h>
-
-/* Message Queue structure */
-struct video_msgq
-{
-    /* Command to be executed */
-    unsigned int cmd;
-
-    unsigned int status;
-
-    /* Client-specific data */
-    void *clientdata;
-};
-
-
-/* Thread & Message Queue information */
-struct video_queue_context
-{
-    /* Message Queue related members */
-    pthread_mutex_t  mutex;
-    sem_t sem_message;
-    int commandq_size;
-    int dataq_size;
-    struct video_msgq *ptr_dataq;
-    struct video_msgq *ptr_cmdq;
-    int write_dataq ;
-    int read_dataq;
-    int write_comq ;
-    int read_comq ;
-
-};
-
-int check_if_queue_empty ( unsigned int queuetocheck,void* queuecontext );
-
-struct video_msgq * queue_get_cmd ( void* queuecontext );
-
-int queue_post_cmdq ( void *queuecontext,
-                       struct video_msgq *post_msg
-                     );
-
-int queue_post_dataq ( void *queuecontext,
-                        struct video_msgq *post_msg
-                      );
-
-#endif /* QUEUE_H */
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013 The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef QUEUE_H
+#define QUEUE_H
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Message Queue structure */
+struct video_msgq {
+    /* Command to be executed */
+    unsigned int cmd;
+
+    unsigned int status;
+
+    /* Client-specific data */
+    void *clientdata;
+};
+
+
+/* Thread & Message Queue information */
+struct video_queue_context {
+    /* Message Queue related members */
+    pthread_mutex_t  mutex;
+    sem_t sem_message;
+    int commandq_size;
+    int dataq_size;
+    struct video_msgq *ptr_dataq;
+    struct video_msgq *ptr_cmdq;
+    int write_dataq ;
+    int read_dataq;
+    int write_comq ;
+    int read_comq ;
+
+};
+
+int check_if_queue_empty ( unsigned int queuetocheck,void* queuecontext );
+
+struct video_msgq * queue_get_cmd ( void* queuecontext );
+
+int queue_post_cmdq ( void *queuecontext,
+        struct video_msgq *post_msg
+        );
+
+int queue_post_dataq ( void *queuecontext,
+        struct video_msgq *post_msg
+        );
+
+#endif /* QUEUE_H */
diff --git a/mm-video-v4l2/vidc/vdec/inc/mp4_utils.h b/mm-video-v4l2/vidc/vdec/inc/mp4_utils.h
index 9a435bf..93c04e7 100644
--- a/mm-video-v4l2/vidc/vdec/inc/mp4_utils.h
+++ b/mm-video-v4l2/vidc/vdec/inc/mp4_utils.h
@@ -122,49 +122,48 @@
 #define MP4_MAX_DECODE_HEIGHT   MP4_720P_HEIGHT
 
 typedef struct {
-   unsigned char *data;
-   unsigned long int numBytes;
+    unsigned char *data;
+    unsigned long int numBytes;
 } mp4StreamType;
 
 #define MAX_FRAMES_IN_CHUNK                 10
 #define VOP_START_CODE                      0x000001B6
 #define VOL_START_CODE                      0x000001B0
 
-typedef enum VOPTYPE
-{
-  NO_VOP = -1, // bitstream contains no VOP.
-  MPEG4_I_VOP = 0,   // bitstream contains an MPEG4 I-VOP
-  MPEG4_P_VOP = 1,   // bitstream contains an MPEG4 P-VOP
-  MPEG4_B_VOP = 2,   // bitstream contains an MPEG4 B-VOP
-  MPEG4_S_VOP = 3,   // bitstream contains an MPEG4 S-VOP
+typedef enum VOPTYPE {
+    NO_VOP = -1, // bitstream contains no VOP.
+    MPEG4_I_VOP = 0,   // bitstream contains an MPEG4 I-VOP
+    MPEG4_P_VOP = 1,   // bitstream contains an MPEG4 P-VOP
+    MPEG4_B_VOP = 2,   // bitstream contains an MPEG4 B-VOP
+    MPEG4_S_VOP = 3,   // bitstream contains an MPEG4 S-VOP
 } VOP_TYPE;
 
-typedef struct
-{
-  uint32    timestamp_increment;
-  uint32    offset;
-  uint32    size;
-  VOP_TYPE  vopType;
+typedef struct {
+    uint32    timestamp_increment;
+    uint32    offset;
+    uint32    size;
+    VOP_TYPE  vopType;
 } mp4_frame_info_type;
 
-class MP4_Utils {
-private:
-   struct posInfoType {
-      uint8 *bytePtr;
-      uint8 bitPos;
-   };
+class MP4_Utils
+{
+    private:
+        struct posInfoType {
+            uint8 *bytePtr;
+            uint8 bitPos;
+        };
 
-   posInfoType m_posInfo;
-   byte *m_dataBeginPtr;
-   unsigned int vop_time_resolution;
-   bool vop_time_found;
-   uint16 m_SrcWidth, m_SrcHeight;   // Dimensions of the source clip
-public:
-    MP4_Utils();
-   ~MP4_Utils();
-   int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits);
-   bool parseHeader(mp4StreamType * psBits);
-   static uint32 read_bit_field(posInfoType * posPtr, uint32 size);
-   bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len);
+        posInfoType m_posInfo;
+        byte *m_dataBeginPtr;
+        unsigned int vop_time_resolution;
+        bool vop_time_found;
+        uint16 m_SrcWidth, m_SrcHeight;   // Dimensions of the source clip
+    public:
+        MP4_Utils();
+        ~MP4_Utils();
+        int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits);
+        bool parseHeader(mp4StreamType * psBits);
+        static uint32 read_bit_field(posInfoType * posPtr, uint32 size);
+        bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len);
 };
 #endif
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 174e99b..638f75a 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -66,7 +66,7 @@
 #endif
 #include <binder/MemoryHeapBase.h>
 #include <ui/ANativeObjectBase.h>
-extern "C"{
+extern "C" {
 #include <utils/Log.h>
 }
 #include <linux/videodev2.h>
@@ -113,29 +113,29 @@
 #include "ts_parser.h"
 #include "vidc_color_converter.h"
 extern "C" {
-  OMX_API void * get_omx_component_factory_fn(void);
+    OMX_API void * get_omx_component_factory_fn(void);
 }
 
 #ifdef _ANDROID_
-    using namespace android;
+using namespace android;
 #ifdef USE_ION
-    class VideoHeap : public MemoryHeapBase
-    {
+class VideoHeap : public MemoryHeapBase
+{
     public:
         VideoHeap(int devicefd, size_t size, void* base,struct ion_handle *handle,int mapfd);
         virtual ~VideoHeap() {}
     private:
-       int m_ion_device_fd;
-       struct ion_handle *m_ion_handle;
-    };
+        int m_ion_device_fd;
+        struct ion_handle *m_ion_handle;
+};
 #else
-    // local pmem heap object
-    class VideoHeap : public MemoryHeapBase
-    {
+// local pmem heap object
+class VideoHeap : public MemoryHeapBase
+{
     public:
         VideoHeap(int fd, size_t size, void* base);
         virtual ~VideoHeap() {}
-    };
+};
 #endif
 #endif // _ANDROID_
 //////////////////////////////////////////////////////////////////////////////
@@ -148,10 +148,10 @@
 //               Macros
 //////////////////////////////////////////////////////////////////////////////
 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
-                       (unsigned) bufHdr,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
+        (unsigned) bufHdr,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
 
 // BitMask Management logic
 #define BITS_PER_BYTE        32
@@ -159,17 +159,17 @@
 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
 #define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
-        &=  ~(BITMASK_FLAG(mIndex))
+    &=  ~(BITMASK_FLAG(mIndex))
 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
-        |=  BITMASK_FLAG(mIndex)
+    |=  BITMASK_FLAG(mIndex)
 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
         & BITMASK_FLAG(mIndex))
 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
-        & BITMASK_FLAG(mIndex)) == 0x0)
+            & BITMASK_FLAG(mIndex)) == 0x0)
 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
         & BITMASK_FLAG(mIndex))
 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
-        & BITMASK_FLAG(mIndex)) == 0x0)
+            & BITMASK_FLAG(mIndex)) == 0x0)
 
 #define OMX_CORE_CONTROL_CMDQ_SIZE   100
 #define OMX_CORE_QCIF_HEIGHT         144
@@ -193,11 +193,11 @@
 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
 
 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
-                                       sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
+            sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
-                                       sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
+            sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
-                                       sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
+            sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
 
 //  Define next macro with required values to enable default extradata,
 //    VDEC_EXTRADATA_MB_ERROR_MAP
@@ -207,14 +207,12 @@
 
 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
 
-enum port_indexes
-{
+enum port_indexes {
     OMX_CORE_INPUT_PORT_INDEX        =0,
     OMX_CORE_OUTPUT_PORT_INDEX       =1
 };
 #ifdef USE_ION
-struct vdec_ion
-{
+struct vdec_ion {
     int ion_device_fd;
     struct ion_fd_data fd_ion_data;
     struct ion_allocation_data ion_alloc_data;
@@ -223,18 +221,17 @@
 
 #ifdef _MSM8974_
 struct extradata_buffer_info {
-	int buffer_size;
-	char* uaddr;
-	int count;
-	int size;
+    int buffer_size;
+    char* uaddr;
+    int count;
+    int size;
 #ifdef USE_ION
-	struct vdec_ion ion;
+    struct vdec_ion ion;
 #endif
 };
 #endif
 
-struct video_driver_context
-{
+struct video_driver_context {
     int video_driver_fd;
     enum vdec_codec decoder_format;
     enum vdec_output_fromat output_format;
@@ -260,8 +257,8 @@
     bool idr_only_decoding;
     unsigned disable_dmx;
 #ifdef _MSM8974_
-	struct extradata_buffer_info extradata_info;
-	int num_planes;
+    struct extradata_buffer_info extradata_info;
+    int num_planes;
 #endif
 };
 
@@ -279,712 +276,697 @@
 class omx_vdec: public qc_omx_component
 {
 
-public:
-    omx_vdec();  // constructor
-    virtual ~omx_vdec();  // destructor
+    public:
+        omx_vdec();  // constructor
+        virtual ~omx_vdec();  // destructor
 
-    static int async_message_process (void *context, void* message);
-    static void process_event_cb(void *ctxt,unsigned char id);
+        static int async_message_process (void *context, void* message);
+        static void process_event_cb(void *ctxt,unsigned char id);
 
-    OMX_ERRORTYPE allocate_buffer(
-                                   OMX_HANDLETYPE hComp,
-                                   OMX_BUFFERHEADERTYPE **bufferHdr,
-                                   OMX_U32 port,
-                                   OMX_PTR appData,
-                                   OMX_U32 bytes
-                                  );
+        OMX_ERRORTYPE allocate_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32 port,
+                OMX_PTR appData,
+                OMX_U32 bytes
+                );
 
 
-    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
 
-    OMX_ERRORTYPE component_init(OMX_STRING role);
+        OMX_ERRORTYPE component_init(OMX_STRING role);
 
-    OMX_ERRORTYPE component_role_enum(
-                                       OMX_HANDLETYPE hComp,
-                                       OMX_U8 *role,
-                                       OMX_U32 index
-                                      );
+        OMX_ERRORTYPE component_role_enum(
+                OMX_HANDLETYPE hComp,
+                OMX_U8 *role,
+                OMX_U32 index
+                );
 
-    OMX_ERRORTYPE component_tunnel_request(
-                                            OMX_HANDLETYPE hComp,
-                                            OMX_U32 port,
-                                            OMX_HANDLETYPE  peerComponent,
-                                            OMX_U32 peerPort,
-                                            OMX_TUNNELSETUPTYPE *tunnelSetup
-                                           );
+        OMX_ERRORTYPE component_tunnel_request(
+                OMX_HANDLETYPE hComp,
+                OMX_U32 port,
+                OMX_HANDLETYPE  peerComponent,
+                OMX_U32 peerPort,
+                OMX_TUNNELSETUPTYPE *tunnelSetup
+                );
 
-    OMX_ERRORTYPE empty_this_buffer(
-                                     OMX_HANDLETYPE hComp,
-                                     OMX_BUFFERHEADERTYPE *buffer
-                                    );
+        OMX_ERRORTYPE empty_this_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
 
 
-    OMX_ERRORTYPE fill_this_buffer(
-                                    OMX_HANDLETYPE hComp,
-                                    OMX_BUFFERHEADERTYPE *buffer
-                                   );
+        OMX_ERRORTYPE fill_this_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
 
-    OMX_ERRORTYPE free_buffer(
-                              OMX_HANDLETYPE hComp,
-                              OMX_U32 port,
-                              OMX_BUFFERHEADERTYPE *buffer
-                              );
+        OMX_ERRORTYPE free_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_U32 port,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
-    OMX_ERRORTYPE get_component_version(
-                                        OMX_HANDLETYPE hComp,
-                                        OMX_STRING componentName,
-                                        OMX_VERSIONTYPE *componentVersion,
-                                        OMX_VERSIONTYPE *specVersion,
-                                        OMX_UUIDTYPE *componentUUID
-                                        );
+        OMX_ERRORTYPE get_component_version(
+                OMX_HANDLETYPE hComp,
+                OMX_STRING componentName,
+                OMX_VERSIONTYPE *componentVersion,
+                OMX_VERSIONTYPE *specVersion,
+                OMX_UUIDTYPE *componentUUID
+                );
 
-    OMX_ERRORTYPE get_config(
-                              OMX_HANDLETYPE hComp,
-                              OMX_INDEXTYPE configIndex,
-                              OMX_PTR configData
-                             );
+        OMX_ERRORTYPE get_config(
+                OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE configIndex,
+                OMX_PTR configData
+                );
 
-    OMX_ERRORTYPE get_extension_index(
-                                      OMX_HANDLETYPE hComp,
-                                      OMX_STRING paramName,
-                                      OMX_INDEXTYPE *indexType
-                                      );
+        OMX_ERRORTYPE get_extension_index(
+                OMX_HANDLETYPE hComp,
+                OMX_STRING paramName,
+                OMX_INDEXTYPE *indexType
+                );
 
-    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
-                                OMX_INDEXTYPE  paramIndex,
-                                OMX_PTR        paramData);
+        OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData);
 
-    OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
-                            OMX_STATETYPE *state);
+        OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
+                OMX_STATETYPE *state);
 
 
 
-    OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
-                               OMX_COMMANDTYPE cmd,
-                               OMX_U32         param1,
-                               OMX_PTR         cmdData);
+        OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
+                OMX_COMMANDTYPE cmd,
+                OMX_U32         param1,
+                OMX_PTR         cmdData);
 
 
-    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
-                                OMX_CALLBACKTYPE *callbacks,
-                                OMX_PTR          appData);
+        OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
+                OMX_CALLBACKTYPE *callbacks,
+                OMX_PTR          appData);
 
-    OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
-                             OMX_INDEXTYPE  configIndex,
-                             OMX_PTR        configData);
+        OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  configIndex,
+                OMX_PTR        configData);
 
-    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
-                                OMX_INDEXTYPE  paramIndex,
-                                OMX_PTR        paramData);
+        OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData);
 
-    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
-                             OMX_BUFFERHEADERTYPE **bufferHdr,
-                             OMX_U32              port,
-                             OMX_PTR              appData,
-                             OMX_U32              bytes,
-                             OMX_U8               *buffer);
+        OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes,
+                OMX_U8               *buffer);
 
-    OMX_ERRORTYPE  use_input_heap_buffers(
-                          OMX_HANDLETYPE            hComp,
-                          OMX_BUFFERHEADERTYPE** bufferHdr,
-                          OMX_U32                   port,
-                          OMX_PTR                   appData,
-                          OMX_U32                   bytes,
-                          OMX_U8*                   buffer);
+        OMX_ERRORTYPE  use_input_heap_buffers(
+                OMX_HANDLETYPE            hComp,
+                OMX_BUFFERHEADERTYPE** bufferHdr,
+                OMX_U32                   port,
+                OMX_PTR                   appData,
+                OMX_U32                   bytes,
+                OMX_U8*                   buffer);
 
-    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
-                                OMX_BUFFERHEADERTYPE **bufferHdr,
-                                OMX_U32              port,
-                                OMX_PTR              appData,
-                                void *               eglImage);
-    void complete_pending_buffer_done_cbs();
-    struct video_driver_context drv_ctx;
+        OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                void *               eglImage);
+        void complete_pending_buffer_done_cbs();
+        struct video_driver_context drv_ctx;
 #ifdef _MSM8974_
-    OMX_ERRORTYPE allocate_extradata();
-	void free_extradata();
-    int update_resolution(int width, int height, int stride, int scan_lines);
-    OMX_ERRORTYPE is_video_session_supported();
+        OMX_ERRORTYPE allocate_extradata();
+        void free_extradata();
+        int update_resolution(int width, int height, int stride, int scan_lines);
+        OMX_ERRORTYPE is_video_session_supported();
 #endif
-    int  m_pipe_in;
-    int  m_pipe_out;
-    pthread_t msg_thread_id;
-    pthread_t async_thread_id;
-    bool is_component_secure();
+        int  m_pipe_in;
+        int  m_pipe_out;
+        pthread_t msg_thread_id;
+        pthread_t async_thread_id;
+        bool is_component_secure();
 
-private:
-    // Bit Positions
-    enum flags_bit_positions
-    {
-        // Defer transition to IDLE
-        OMX_COMPONENT_IDLE_PENDING            =0x1,
-        // Defer transition to LOADING
-        OMX_COMPONENT_LOADING_PENDING         =0x2,
-        // First  Buffer Pending
-        OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
-        // Second Buffer Pending
-        OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
-        // Defer transition to Enable
-        OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
-        // Defer transition to Enable
-        OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
-        // Defer transition to Disable
-        OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
-        // Defer transition to Disable
-        OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
-        //defer flush notification
-        OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
-        OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
-        OMX_COMPONENT_PAUSE_PENDING          =0xB,
-        OMX_COMPONENT_EXECUTE_PENDING        =0xC,
-        OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
-        OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
-    };
+    private:
+        // Bit Positions
+        enum flags_bit_positions {
+            // Defer transition to IDLE
+            OMX_COMPONENT_IDLE_PENDING            =0x1,
+            // Defer transition to LOADING
+            OMX_COMPONENT_LOADING_PENDING         =0x2,
+            // First  Buffer Pending
+            OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
+            // Second Buffer Pending
+            OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
+            // Defer transition to Enable
+            OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
+            // Defer transition to Enable
+            OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
+            // Defer transition to Disable
+            OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
+            // Defer transition to Disable
+            OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
+            //defer flush notification
+            OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
+            OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
+            OMX_COMPONENT_PAUSE_PENDING          =0xB,
+            OMX_COMPONENT_EXECUTE_PENDING        =0xC,
+            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
+            OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
+        };
 
-    // Deferred callback identifiers
-    enum
-    {
-        //Event Callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_EVENT       = 0x1,
-        //Buffer Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
-        //Frame Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
-        //Buffer Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_FTB         = 0x4,
-        //Frame Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_ETB         = 0x5,
-        //Command
-        OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
-        //Push-Pending Buffers
-        OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
-        // Empty Buffer Done callbacks
-        OMX_COMPONENT_GENERATE_EBD         = 0x8,
-        //Flush Event Callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
-        OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
-        OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
-        OMX_COMPONENT_GENERATE_FBD = 0xc,
-        OMX_COMPONENT_GENERATE_START_DONE = 0xD,
-        OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
-        OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
-        OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
-        OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
-        OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
-        OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
-        OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
-        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
-        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
-        OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
-    };
+        // Deferred callback identifiers
+        enum {
+            //Event Callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_EVENT       = 0x1,
+            //Buffer Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
+            //Frame Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
+            //Buffer Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_FTB         = 0x4,
+            //Frame Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_ETB         = 0x5,
+            //Command
+            OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
+            //Push-Pending Buffers
+            OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
+            // Empty Buffer Done callbacks
+            OMX_COMPONENT_GENERATE_EBD         = 0x8,
+            //Flush Event Callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
+            OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
+            OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
+            OMX_COMPONENT_GENERATE_FBD = 0xc,
+            OMX_COMPONENT_GENERATE_START_DONE = 0xD,
+            OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
+            OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
+            OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
+            OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
+            OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
+            OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
+            OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
+            OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
+            OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
+            OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
+        };
 
-    enum vc1_profile_type
-    {
-        VC1_SP_MP_RCV = 1,
-        VC1_AP = 2
-    };
+        enum vc1_profile_type {
+            VC1_SP_MP_RCV = 1,
+            VC1_AP = 2
+        };
 
 #ifdef _MSM8974_
-    enum v4l2_ports
-    {
-        CAPTURE_PORT,
-        OUTPUT_PORT,
-        MAX_PORT
-    };
+        enum v4l2_ports {
+            CAPTURE_PORT,
+            OUTPUT_PORT,
+            MAX_PORT
+        };
 #endif
 
-    struct omx_event
-    {
-        unsigned param1;
-        unsigned param2;
-        unsigned id;
-    };
+        struct omx_event {
+            unsigned param1;
+            unsigned param2;
+            unsigned id;
+        };
 
-    struct omx_cmd_queue
-    {
-        omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
-        unsigned m_read;
-        unsigned m_write;
-        unsigned m_size;
+        struct omx_cmd_queue {
+            omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
+            unsigned m_read;
+            unsigned m_write;
+            unsigned m_size;
 
-        omx_cmd_queue();
-        ~omx_cmd_queue();
-        bool insert_entry(unsigned p1, unsigned p2, unsigned id);
-        bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
-        // get msgtype of the first ele from the queue
-        unsigned get_q_msg_type();
+            omx_cmd_queue();
+            ~omx_cmd_queue();
+            bool insert_entry(unsigned p1, unsigned p2, unsigned id);
+            bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
+            // get msgtype of the first ele from the queue
+            unsigned get_q_msg_type();
 
-    };
+        };
 
 #ifdef _ANDROID_
-    struct ts_entry
-    {
-        OMX_TICKS timestamp;
-        bool valid;
-    };
+        struct ts_entry {
+            OMX_TICKS timestamp;
+            bool valid;
+        };
 
-    struct ts_arr_list
-    {
-        ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
+        struct ts_arr_list {
+            ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
 
-        ts_arr_list();
-        ~ts_arr_list();
+            ts_arr_list();
+            ~ts_arr_list();
 
-        bool insert_ts(OMX_TICKS ts);
-        bool pop_min_ts(OMX_TICKS &ts);
-        bool reset_ts_list();
-    };
+            bool insert_ts(OMX_TICKS ts);
+            bool pop_min_ts(OMX_TICKS &ts);
+            bool reset_ts_list();
+        };
 #endif
 
-    struct desc_buffer_hdr
-    {
-        OMX_U8 *buf_addr;
-        OMX_U32 desc_data_size;
-    };
-    bool allocate_done(void);
-    bool allocate_input_done(void);
-    bool allocate_output_done(void);
+        struct desc_buffer_hdr {
+            OMX_U8 *buf_addr;
+            OMX_U32 desc_data_size;
+        };
+        bool allocate_done(void);
+        bool allocate_input_done(void);
+        bool allocate_output_done(void);
 
-    OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-    OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
-                                    OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
-    OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-    void free_output_buffer_header();
-    void free_input_buffer_header();
+        OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+        OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
+                OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
+        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+        void free_output_buffer_header();
+        void free_input_buffer_header();
 
-    OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
-                                             OMX_BUFFERHEADERTYPE **bufferHdr,
-                                             OMX_U32              port,
-                                             OMX_PTR              appData,
-                                             OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes);
 
 
-    OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
-                                        OMX_BUFFERHEADERTYPE **bufferHdr,
-                                        OMX_U32              port,
-                                        OMX_PTR              appData,
-                                        OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes);
 
-    OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
-                                         OMX_BUFFERHEADERTYPE **bufferHdr,
-                                         OMX_U32 port,OMX_PTR appData,
-                                         OMX_U32              bytes);
-    OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
-                                   OMX_BUFFERHEADERTYPE   **bufferHdr,
-                                   OMX_U32                port,
-                                   OMX_PTR                appData,
-                                   OMX_U32                bytes,
-                                   OMX_U8                 *buffer);
+        OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32 port,OMX_PTR appData,
+                OMX_U32              bytes);
+        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE   **bufferHdr,
+                OMX_U32                port,
+                OMX_PTR                appData,
+                OMX_U32                bytes,
+                OMX_U8                 *buffer);
 #ifdef MAX_RES_720P
-    OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+        OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
 #endif
 #ifdef MAX_RES_1080P
-    OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+        OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
 #endif
 
-    OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
-    OMX_ERRORTYPE allocate_output_headers();
-    bool execute_omx_flush(OMX_U32);
-    bool execute_output_flush();
-    bool execute_input_flush();
-    OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
-                                    OMX_BUFFERHEADERTYPE * buffer);
+        OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
+        OMX_ERRORTYPE allocate_output_headers();
+        bool execute_omx_flush(OMX_U32);
+        bool execute_output_flush();
+        bool execute_input_flush();
+        OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE * buffer);
 
-    OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
-                                    OMX_BUFFERHEADERTYPE * buffer);
-    OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
-                                        OMX_BUFFERHEADERTYPE *buffer);
+        OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE * buffer);
+        OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
 
-    OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
-                                                   OMX_BUFFERHEADERTYPE *buffer
-                                                   );
+        OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
-    OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
 
-    OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
-                                       OMX_BUFFERHEADERTYPE *buffer);
-    bool release_done();
+        OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
+        bool release_done();
 
-    bool release_output_done();
-    bool release_input_done();
-    OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
-    OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
-    OMX_ERRORTYPE start_port_reconfig();
-    OMX_ERRORTYPE update_picture_resolution();
-    int stream_off(OMX_U32 port);
-    void adjust_timestamp(OMX_S64 &act_timestamp);
-    void set_frame_rate(OMX_S64 act_timestamp);
-    void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
-    void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
-    void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        bool release_output_done();
+        bool release_input_done();
+        OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
+        OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
+        OMX_ERRORTYPE start_port_reconfig();
+        OMX_ERRORTYPE update_picture_resolution();
+        int stream_off(OMX_U32 port);
+        void adjust_timestamp(OMX_S64 &act_timestamp);
+        void set_frame_rate(OMX_S64 act_timestamp);
+        void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+        void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+        void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
 #ifdef _MSM8974_
-    void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                    OMX_U32 interlaced_format_type);
-    OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
-		 bool enable = true);
-    void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                               OMX_U32 num_conceal_mb,
-                               OMX_U32 picture_type,
-                               OMX_U32 frame_rate,
-                               struct msm_vidc_panscan_window_payload *panscan_payload,
-                               struct vdec_aspectratioinfo *aspect_ratio_info);
+        void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 interlaced_format_type);
+        OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
+                bool enable = true);
+        void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 num_conceal_mb,
+                OMX_U32 picture_type,
+                OMX_U32 frame_rate,
+                struct msm_vidc_panscan_window_payload *panscan_payload,
+                struct vdec_aspectratioinfo *aspect_ratio_info);
 #else
-    void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                    OMX_U32 interlaced_format_type, OMX_U32 buf_index);
-    OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
+        void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 interlaced_format_type, OMX_U32 buf_index);
+        OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
 #endif
-    void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                               OMX_U32 num_conceal_mb,
-                               OMX_U32 picture_type,
-                               OMX_S64 timestamp,
-                               OMX_U32 frame_rate,
-                               struct vdec_aspectratioinfo *aspect_ratio_info);
-    void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
-                                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
-    void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
-    OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
-    void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
-    void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
-    void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
-    void insert_demux_addr_offset(OMX_U32 address_offset);
-    void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
-    OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
-    OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 num_conceal_mb,
+                OMX_U32 picture_type,
+                OMX_S64 timestamp,
+                OMX_U32 frame_rate,
+                struct vdec_aspectratioinfo *aspect_ratio_info);
+        void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
+                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
+        void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
+        void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
+        void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
+        void insert_demux_addr_offset(OMX_U32 address_offset);
+        void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
+        OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+        OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
 
-    bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                            OMX_U32 alignment);
+        bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
+                OMX_U32 alignment);
 #ifdef USE_ION
-    int alloc_map_ion_memory(OMX_U32 buffer_size,
-              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
-              struct ion_fd_data *fd_data,int flag);
-    void free_ion_memory(struct vdec_ion *buf_ion_info);
+        int alloc_map_ion_memory(OMX_U32 buffer_size,
+                OMX_U32 alignment, struct ion_allocation_data *alloc_data,
+                struct ion_fd_data *fd_data,int flag);
+        void free_ion_memory(struct vdec_ion *buf_ion_info);
 #endif
 
 
-    OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
-                                     OMX_COMMANDTYPE cmd,
-                                     OMX_U32         param1,
-                                     OMX_PTR         cmdData);
-    bool post_event( unsigned int p1,
-                     unsigned int p2,
-                     unsigned int id
-                    );
-    inline int clip2(int x)
-    {
-        x = x -1;
-        x = x | x >> 1;
-        x = x | x >> 2;
-        x = x | x >> 4;
-        x = x | x >> 16;
-        x = x + 1;
-        return x;
-    }
+        OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
+                OMX_COMMANDTYPE cmd,
+                OMX_U32         param1,
+                OMX_PTR         cmdData);
+        bool post_event( unsigned int p1,
+                unsigned int p2,
+                unsigned int id
+                   );
+        inline int clip2(int x) {
+            x = x -1;
+            x = x | x >> 1;
+            x = x | x >> 2;
+            x = x | x >> 4;
+            x = x | x >> 16;
+            x = x + 1;
+            return x;
+        }
 
 #ifdef MAX_RES_1080P
-    OMX_ERRORTYPE vdec_alloc_h264_mv();
-    void vdec_dealloc_h264_mv();
-    OMX_ERRORTYPE vdec_alloc_meta_buffers();
-    void vdec_dealloc_meta_buffers();
+        OMX_ERRORTYPE vdec_alloc_h264_mv();
+        void vdec_dealloc_h264_mv();
+        OMX_ERRORTYPE vdec_alloc_meta_buffers();
+        void vdec_dealloc_meta_buffers();
 #endif
 
-    inline void omx_report_error ()
-    {
-        if (m_cb.EventHandler && !m_error_propogated)
-        {
-            ALOGE("\nERROR: Sending OMX_EventError to Client");
-            m_error_propogated = true;
-            m_cb.EventHandler(&m_cmp,m_app_data,
-                  OMX_EventError,OMX_ErrorHardware,0,NULL);
+        inline void omx_report_error () {
+            if (m_cb.EventHandler && !m_error_propogated) {
+                ALOGE("\nERROR: Sending OMX_EventError to Client");
+                m_error_propogated = true;
+                m_cb.EventHandler(&m_cmp,m_app_data,
+                        OMX_EventError,OMX_ErrorHardware,0,NULL);
+            }
         }
-    }
 
-    inline void omx_report_unsupported_setting ()
-    {
-        if (m_cb.EventHandler && !m_error_propogated)
-        {
-            DEBUG_PRINT_ERROR(
-               "\nERROR: Sending OMX_ErrorUnsupportedSetting to Client");
-            m_error_propogated = true;
-            m_cb.EventHandler(&m_cmp,m_app_data,
-                  OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
+        inline void omx_report_unsupported_setting () {
+            if (m_cb.EventHandler && !m_error_propogated) {
+                DEBUG_PRINT_ERROR(
+                        "\nERROR: Sending OMX_ErrorUnsupportedSetting to Client");
+                m_error_propogated = true;
+                m_cb.EventHandler(&m_cmp,m_app_data,
+                        OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
+            }
         }
-    }
 #ifdef _ANDROID_
-    OMX_ERRORTYPE createDivxDrmContext();
+        OMX_ERRORTYPE createDivxDrmContext();
 #endif //_ANDROID_
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
+        OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
 #endif
 #if defined (_ANDROID_ICS_)
-    struct nativebuffer{
-        native_handle_t *nativehandle;
-	private_handle_t *privatehandle;
-        int inuse;
-    };
-    nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
+        struct nativebuffer {
+            native_handle_t *nativehandle;
+            private_handle_t *privatehandle;
+            int inuse;
+        };
+        nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
 #endif
 
 
-    //*************************************************************
-    //*******************MEMBER VARIABLES *************************
-    //*************************************************************
-    pthread_mutex_t       m_lock;
-    pthread_mutex_t       c_lock;
-    //sem to handle the minimum procesing of commands
-    sem_t                 m_cmd_lock;
-    bool              m_error_propogated;
-    // compression format
-    OMX_VIDEO_CODINGTYPE eCompressionFormat;
-    // OMX State
-    OMX_STATETYPE m_state;
-    // Application data
-    OMX_PTR m_app_data;
-    // Application callbacks
-    OMX_CALLBACKTYPE m_cb;
-    OMX_PRIORITYMGMTTYPE m_priority_mgm ;
-    OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
-    // fill this buffer queue
-    omx_cmd_queue         m_ftb_q;
-    // Command Q for rest of the events
-    omx_cmd_queue         m_cmd_q;
-    omx_cmd_queue         m_etb_q;
-    // Input memory pointer
-    OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
-    // Output memory pointer
-    OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
-    // number of input bitstream error frame count
-    unsigned int m_inp_err_count;
+        //*************************************************************
+        //*******************MEMBER VARIABLES *************************
+        //*************************************************************
+        pthread_mutex_t       m_lock;
+        pthread_mutex_t       c_lock;
+        //sem to handle the minimum procesing of commands
+        sem_t                 m_cmd_lock;
+        bool              m_error_propogated;
+        // compression format
+        OMX_VIDEO_CODINGTYPE eCompressionFormat;
+        // OMX State
+        OMX_STATETYPE m_state;
+        // Application data
+        OMX_PTR m_app_data;
+        // Application callbacks
+        OMX_CALLBACKTYPE m_cb;
+        OMX_PRIORITYMGMTTYPE m_priority_mgm ;
+        OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
+        // fill this buffer queue
+        omx_cmd_queue         m_ftb_q;
+        // Command Q for rest of the events
+        omx_cmd_queue         m_cmd_q;
+        omx_cmd_queue         m_etb_q;
+        // Input memory pointer
+        OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
+        // Output memory pointer
+        OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
+        // number of input bitstream error frame count
+        unsigned int m_inp_err_count;
 #ifdef _ANDROID_
-    // Timestamp list
-    ts_arr_list           m_timestamp_list;
+        // Timestamp list
+        ts_arr_list           m_timestamp_list;
 #endif
 
-    bool input_flush_progress;
-    bool output_flush_progress;
-    bool input_use_buffer;
-    bool output_use_buffer;
-    bool ouput_egl_buffers;
-    OMX_BOOL m_use_output_pmem;
-    OMX_BOOL m_out_mem_region_smi;
-    OMX_BOOL m_out_pvt_entry_pmem;
+        bool input_flush_progress;
+        bool output_flush_progress;
+        bool input_use_buffer;
+        bool output_use_buffer;
+        bool ouput_egl_buffers;
+        OMX_BOOL m_use_output_pmem;
+        OMX_BOOL m_out_mem_region_smi;
+        OMX_BOOL m_out_pvt_entry_pmem;
 
-    int pending_input_buffers;
-    int pending_output_buffers;
-    // bitmask array size for output side
-    unsigned int m_out_bm_count;
-    // bitmask array size for input side
-    unsigned int m_inp_bm_count;
-    //Input port Populated
-    OMX_BOOL m_inp_bPopulated;
-    //Output port Populated
-    OMX_BOOL m_out_bPopulated;
-    // encapsulate the waiting states.
-    unsigned int m_flags;
+        int pending_input_buffers;
+        int pending_output_buffers;
+        // bitmask array size for output side
+        unsigned int m_out_bm_count;
+        // bitmask array size for input side
+        unsigned int m_inp_bm_count;
+        //Input port Populated
+        OMX_BOOL m_inp_bPopulated;
+        //Output port Populated
+        OMX_BOOL m_out_bPopulated;
+        // encapsulate the waiting states.
+        unsigned int m_flags;
 
 #ifdef _ANDROID_
-    // Heap pointer to frame buffers
-    struct vidc_heap
-    {
-        sp<MemoryHeapBase>    video_heap_ptr;
-    };
-    struct vidc_heap *m_heap_ptr;
-    unsigned int m_heap_count;
-#endif //_ANDROID_
-    // store I/P PORT state
-    OMX_BOOL m_inp_bEnabled;
-    // store O/P PORT state
-    OMX_BOOL m_out_bEnabled;
-    OMX_U32 m_in_alloc_cnt;
-    OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
-    // Platform specific details
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
-    // SPS+PPS sent as part of set_config
-    OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
-
-    /*Variables for arbitrary Byte parsing support*/
-    frame_parse m_frame_parser;
-    omx_cmd_queue m_input_pending_q;
-    omx_cmd_queue m_input_free_q;
-    bool arbitrary_bytes;
-    OMX_BUFFERHEADERTYPE  h264_scratch;
-    OMX_BUFFERHEADERTYPE  *psource_frame;
-    OMX_BUFFERHEADERTYPE  *pdest_frame;
-    OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
-    OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
-    unsigned int m_heap_inp_bm_count;
-    codec_type codec_type_parse;
-    bool first_frame_meta;
-    unsigned frame_count;
-    unsigned nal_count;
-    unsigned nal_length;
-    bool look_ahead_nal;
-    int first_frame;
-    unsigned char *first_buffer;
-    int first_frame_size;
-    unsigned char m_hwdevice_name[80];
-    FILE *m_device_file_ptr;
-    enum vc1_profile_type m_vc1_profile;
-    OMX_S64 h264_last_au_ts;
-    OMX_U32 h264_last_au_flags;
-    OMX_U32 m_demux_offsets[8192];
-    OMX_U32 m_demux_entries;
-    OMX_U32 m_disp_hor_size;
-    OMX_U32 m_disp_vert_size;
-
-    OMX_S64 prev_ts;
-    bool rst_prev_ts;
-    OMX_U32 frm_int;
-
-    struct vdec_allocatorproperty op_buf_rcnfg;
-    bool in_reconfig;
-    OMX_NATIVE_WINDOWTYPE m_display_id;
-    h264_stream_parser *h264_parser;
-    OMX_U32 client_extradata;
-#ifdef _ANDROID_
-    bool m_debug_timestamp;
-    bool perf_flag;
-    OMX_U32 proc_frms, latency;
-    perf_metrics fps_metrics;
-    perf_metrics dec_time;
-    bool m_enable_android_native_buffers;
-    bool m_use_android_native_buffers;
-    bool m_debug_extradata;
-    bool m_debug_concealedmb;
-    bool m_reject_avc_1080p_mp;
-#endif
-#ifdef MAX_RES_1080P
-    MP4_Utils mp4_headerparser;
-#endif
-
-    struct h264_mv_buffer{
-        unsigned char* buffer;
-        int size;
-        int count;
-        int pmem_fd;
-        int offset;
-    };
-    h264_mv_buffer h264_mv_buff;
-
-    struct meta_buffer{
-        unsigned char* buffer;
-        int size;
-        int count;
-        int pmem_fd;
-        int pmem_fd_iommu;
-        int offset;
-    };
-    meta_buffer meta_buff;
-	extra_data_handler extra_data_handle;
-#ifdef _ANDROID_
-    DivXDrmDecrypt* iDivXDrmDecrypt;
-#endif //_ANDROID_
-    OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
-    omx_time_stamp_reorder time_stamp_dts;
-    desc_buffer_hdr *m_desc_buffer_ptr;
-    bool secure_mode;
-    bool external_meta_buffer;
-    bool external_meta_buffer_iommu;
-    OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
-    bool codec_config_flag;
-#ifdef _MSM8974_
-    int capture_capability;
-    int output_capability;
-    bool streaming[MAX_PORT];
-    OMX_CONFIG_RECTTYPE rectangle;
-	int prev_n_filled_len;
-#endif
-    bool m_power_hinted;
-    OMX_ERRORTYPE power_module_register();
-    OMX_ERRORTYPE power_module_deregister();
-    bool msg_thread_created;
-    bool async_thread_created;
-
-    OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl;
-    OMX_U32 m_profile;
-
-    unsigned int m_fill_output_msg;
-    bool client_set_fps;
-    class allocate_color_convert_buf {
-    public:
-        allocate_color_convert_buf();
-        ~allocate_color_convert_buf();
-        void set_vdec_client(void *);
-        void update_client();
-        bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
-        bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
-        bool update_buffer_req();
-        bool get_buffer_req(unsigned int &buffer_size);
-        OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
-        OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
-        OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
-        OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
-        OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
-        OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
-             OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
-             OMX_U32 bytes);
-        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-    private:
-        #define MAX_COUNT 32
-        omx_vdec *omx;
-        bool enabled;
-        OMX_COLOR_FORMATTYPE ColorFormat;
-        void init_members();
-        bool color_convert_mode;
-        ColorConvertFormat dest_format;
-        class omx_c2d_conv c2d;
-        unsigned int allocated_count;
-        unsigned int buffer_size_req;
-        unsigned int buffer_alignment_req;
-        OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
-        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
-        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
-        OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
-#ifdef USE_ION
-        struct vdec_ion op_buf_ion_info[MAX_COUNT];
-#endif
-        unsigned char *pmem_baseaddress[MAX_COUNT];
-        int pmem_fd[MAX_COUNT];
-        struct vidc_heap
-        {
+        // Heap pointer to frame buffers
+        struct vidc_heap {
             sp<MemoryHeapBase>    video_heap_ptr;
         };
-        struct vidc_heap m_heap_ptr[MAX_COUNT];
-    };
-#if  defined (_MSM8960_) || defined (_MSM8974_)
-    allocate_color_convert_buf client_buffers;
+        struct vidc_heap *m_heap_ptr;
+        unsigned int m_heap_count;
+#endif //_ANDROID_
+        // store I/P PORT state
+        OMX_BOOL m_inp_bEnabled;
+        // store O/P PORT state
+        OMX_BOOL m_out_bEnabled;
+        OMX_U32 m_in_alloc_cnt;
+        OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
+        // Platform specific details
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
+        // SPS+PPS sent as part of set_config
+        OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
+
+        /*Variables for arbitrary Byte parsing support*/
+        frame_parse m_frame_parser;
+        omx_cmd_queue m_input_pending_q;
+        omx_cmd_queue m_input_free_q;
+        bool arbitrary_bytes;
+        OMX_BUFFERHEADERTYPE  h264_scratch;
+        OMX_BUFFERHEADERTYPE  *psource_frame;
+        OMX_BUFFERHEADERTYPE  *pdest_frame;
+        OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
+        OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
+        unsigned int m_heap_inp_bm_count;
+        codec_type codec_type_parse;
+        bool first_frame_meta;
+        unsigned frame_count;
+        unsigned nal_count;
+        unsigned nal_length;
+        bool look_ahead_nal;
+        int first_frame;
+        unsigned char *first_buffer;
+        int first_frame_size;
+        unsigned char m_hwdevice_name[80];
+        FILE *m_device_file_ptr;
+        enum vc1_profile_type m_vc1_profile;
+        OMX_S64 h264_last_au_ts;
+        OMX_U32 h264_last_au_flags;
+        OMX_U32 m_demux_offsets[8192];
+        OMX_U32 m_demux_entries;
+        OMX_U32 m_disp_hor_size;
+        OMX_U32 m_disp_vert_size;
+
+        OMX_S64 prev_ts;
+        bool rst_prev_ts;
+        OMX_U32 frm_int;
+
+        struct vdec_allocatorproperty op_buf_rcnfg;
+        bool in_reconfig;
+        OMX_NATIVE_WINDOWTYPE m_display_id;
+        h264_stream_parser *h264_parser;
+        OMX_U32 client_extradata;
+#ifdef _ANDROID_
+        bool m_debug_timestamp;
+        bool perf_flag;
+        OMX_U32 proc_frms, latency;
+        perf_metrics fps_metrics;
+        perf_metrics dec_time;
+        bool m_enable_android_native_buffers;
+        bool m_use_android_native_buffers;
+        bool m_debug_extradata;
+        bool m_debug_concealedmb;
+        bool m_reject_avc_1080p_mp;
 #endif
-    struct video_decoder_capability m_decoder_capability;
+#ifdef MAX_RES_1080P
+        MP4_Utils mp4_headerparser;
+#endif
+
+        struct h264_mv_buffer {
+            unsigned char* buffer;
+            int size;
+            int count;
+            int pmem_fd;
+            int offset;
+        };
+        h264_mv_buffer h264_mv_buff;
+
+        struct meta_buffer {
+            unsigned char* buffer;
+            int size;
+            int count;
+            int pmem_fd;
+            int pmem_fd_iommu;
+            int offset;
+        };
+        meta_buffer meta_buff;
+        extra_data_handler extra_data_handle;
+#ifdef _ANDROID_
+        DivXDrmDecrypt* iDivXDrmDecrypt;
+#endif //_ANDROID_
+        OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
+        omx_time_stamp_reorder time_stamp_dts;
+        desc_buffer_hdr *m_desc_buffer_ptr;
+        bool secure_mode;
+        bool external_meta_buffer;
+        bool external_meta_buffer_iommu;
+        OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
+        bool codec_config_flag;
+#ifdef _MSM8974_
+        int capture_capability;
+        int output_capability;
+        bool streaming[MAX_PORT];
+        OMX_CONFIG_RECTTYPE rectangle;
+        int prev_n_filled_len;
+#endif
+        bool m_power_hinted;
+        OMX_ERRORTYPE power_module_register();
+        OMX_ERRORTYPE power_module_deregister();
+        bool msg_thread_created;
+        bool async_thread_created;
+
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl;
+        OMX_U32 m_profile;
+
+        unsigned int m_fill_output_msg;
+        bool client_set_fps;
+        class allocate_color_convert_buf
+        {
+            public:
+                allocate_color_convert_buf();
+                ~allocate_color_convert_buf();
+                void set_vdec_client(void *);
+                void update_client();
+                bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
+                bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
+                bool update_buffer_req();
+                bool get_buffer_req(unsigned int &buffer_size);
+                OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
+                OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
+                OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
+                OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
+                OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
+                OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
+                        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
+                        OMX_U32 bytes);
+                OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+            private:
+#define MAX_COUNT 32
+                omx_vdec *omx;
+                bool enabled;
+                OMX_COLOR_FORMATTYPE ColorFormat;
+                void init_members();
+                bool color_convert_mode;
+                ColorConvertFormat dest_format;
+                class omx_c2d_conv c2d;
+                unsigned int allocated_count;
+                unsigned int buffer_size_req;
+                unsigned int buffer_alignment_req;
+                OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
+                OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
+                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
+                OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
+#ifdef USE_ION
+                struct vdec_ion op_buf_ion_info[MAX_COUNT];
+#endif
+                unsigned char *pmem_baseaddress[MAX_COUNT];
+                int pmem_fd[MAX_COUNT];
+                struct vidc_heap {
+                    sp<MemoryHeapBase>    video_heap_ptr;
+                };
+                struct vidc_heap m_heap_ptr[MAX_COUNT];
+        };
+#if  defined (_MSM8960_) || defined (_MSM8974_)
+        allocate_color_convert_buf client_buffers;
+#endif
+        struct video_decoder_capability m_decoder_capability;
 };
 
 #ifdef _MSM8974_
 enum instance_state {
-	MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
-	MSM_VIDC_CORE_INIT,
-	MSM_VIDC_CORE_INIT_DONE,
-	MSM_VIDC_OPEN,
-	MSM_VIDC_OPEN_DONE,
-	MSM_VIDC_LOAD_RESOURCES,
-	MSM_VIDC_LOAD_RESOURCES_DONE,
-	MSM_VIDC_START,
-	MSM_VIDC_START_DONE,
-	MSM_VIDC_STOP,
-	MSM_VIDC_STOP_DONE,
-	MSM_VIDC_RELEASE_RESOURCES,
-	MSM_VIDC_RELEASE_RESOURCES_DONE,
-	MSM_VIDC_CLOSE,
-	MSM_VIDC_CLOSE_DONE,
-	MSM_VIDC_CORE_UNINIT,
+    MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
+    MSM_VIDC_CORE_INIT,
+    MSM_VIDC_CORE_INIT_DONE,
+    MSM_VIDC_OPEN,
+    MSM_VIDC_OPEN_DONE,
+    MSM_VIDC_LOAD_RESOURCES,
+    MSM_VIDC_LOAD_RESOURCES_DONE,
+    MSM_VIDC_START,
+    MSM_VIDC_START_DONE,
+    MSM_VIDC_STOP,
+    MSM_VIDC_STOP_DONE,
+    MSM_VIDC_RELEASE_RESOURCES,
+    MSM_VIDC_RELEASE_RESOURCES_DONE,
+    MSM_VIDC_CLOSE,
+    MSM_VIDC_CLOSE_DONE,
+    MSM_VIDC_CORE_UNINIT,
 };
 
 enum vidc_resposes_id {
-	MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
-	MSM_VIDC_DECODER_EVENT_CHANGE,
+    MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
+    MSM_VIDC_DECODER_EVENT_CHANGE,
 };
 
 #endif // _MSM8974_
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc.h
index 4360358..2182d5b 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc.h
@@ -64,7 +64,7 @@
 #endif
 #include <binder/MemoryHeapBase.h>
 #include <ui/ANativeObjectBase.h>
-extern "C"{
+extern "C" {
 #include <utils/Log.h>
 }
 #include <linux/videodev2.h>
@@ -107,29 +107,29 @@
 #include "ts_parser.h"
 #include "vidc_color_converter.h"
 extern "C" {
-  OMX_API void * get_omx_component_factory_fn(void);
+    OMX_API void * get_omx_component_factory_fn(void);
 }
 
 #ifdef _ANDROID_
-    using namespace android;
+using namespace android;
 #ifdef USE_ION
-    class VideoHeap : public MemoryHeapBase
-    {
+class VideoHeap : public MemoryHeapBase
+{
     public:
         VideoHeap(int devicefd, size_t size, void* base,struct ion_handle *handle,int mapfd);
         virtual ~VideoHeap() {}
     private:
-       int m_ion_device_fd;
-       struct ion_handle *m_ion_handle;
-    };
+        int m_ion_device_fd;
+        struct ion_handle *m_ion_handle;
+};
 #else
-    // local pmem heap object
-    class VideoHeap : public MemoryHeapBase
-    {
+// local pmem heap object
+class VideoHeap : public MemoryHeapBase
+{
     public:
         VideoHeap(int fd, size_t size, void* base);
         virtual ~VideoHeap() {}
-    };
+};
 #endif
 #endif // _ANDROID_
 //////////////////////////////////////////////////////////////////////////////
@@ -142,10 +142,10 @@
 //               Macros
 //////////////////////////////////////////////////////////////////////////////
 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
-                       (unsigned) bufHdr,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
+        (unsigned) bufHdr,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
 
 // BitMask Management logic
 #define BITS_PER_BYTE        32
@@ -153,17 +153,17 @@
 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
 #define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
-        &=  ~(BITMASK_FLAG(mIndex))
+    &=  ~(BITMASK_FLAG(mIndex))
 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
-        |=  BITMASK_FLAG(mIndex)
+    |=  BITMASK_FLAG(mIndex)
 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
         & BITMASK_FLAG(mIndex))
 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
-        & BITMASK_FLAG(mIndex)) == 0x0)
+            & BITMASK_FLAG(mIndex)) == 0x0)
 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
         & BITMASK_FLAG(mIndex))
 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
-        & BITMASK_FLAG(mIndex)) == 0x0)
+            & BITMASK_FLAG(mIndex)) == 0x0)
 
 #define OMX_CORE_CONTROL_CMDQ_SIZE   100
 #define OMX_CORE_QCIF_HEIGHT         144
@@ -187,11 +187,11 @@
 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
 
 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
-                                       sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
+            sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
-                                       sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
+            sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
-                                       sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
+            sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
 
 //  Define next macro with required values to enable default extradata,
 //    VDEC_EXTRADATA_MB_ERROR_MAP
@@ -201,14 +201,12 @@
 
 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
 
-enum port_indexes
-{
+enum port_indexes {
     OMX_CORE_INPUT_PORT_INDEX        =0,
     OMX_CORE_OUTPUT_PORT_INDEX       =1
 };
 #ifdef USE_ION
-struct vdec_ion
-{
+struct vdec_ion {
     int ion_device_fd;
     struct ion_fd_data fd_ion_data;
     struct ion_allocation_data ion_alloc_data;
@@ -217,18 +215,17 @@
 
 #ifdef _MSM8974_
 struct extradata_buffer_info {
-	int buffer_size;
-	char* uaddr;
-	int count;
-	int size;
+    int buffer_size;
+    char* uaddr;
+    int count;
+    int size;
 #ifdef USE_ION
-	struct vdec_ion ion;
+    struct vdec_ion ion;
 #endif
 };
 #endif
 
-struct video_driver_context
-{
+struct video_driver_context {
     int video_driver_fd;
     enum vdec_codec decoder_format;
     enum vdec_output_fromat output_format;
@@ -254,8 +251,8 @@
     bool idr_only_decoding;
     unsigned disable_dmx;
 #ifdef _MSM8974_
-	struct extradata_buffer_info extradata_info;
-	int num_planes;
+    struct extradata_buffer_info extradata_info;
+    int num_planes;
 #endif
 };
 
@@ -267,693 +264,680 @@
 class omx_vdec: public qc_omx_component
 {
 
-public:
-    omx_vdec();  // constructor
-    virtual ~omx_vdec();  // destructor
+    public:
+        omx_vdec();  // constructor
+        virtual ~omx_vdec();  // destructor
 
-    static int async_message_process (void *context, void* message);
-    static void process_event_cb(void *ctxt,unsigned char id);
+        static int async_message_process (void *context, void* message);
+        static void process_event_cb(void *ctxt,unsigned char id);
 
-    OMX_ERRORTYPE allocate_buffer(
-                                   OMX_HANDLETYPE hComp,
-                                   OMX_BUFFERHEADERTYPE **bufferHdr,
-                                   OMX_U32 port,
-                                   OMX_PTR appData,
-                                   OMX_U32 bytes
-                                  );
+        OMX_ERRORTYPE allocate_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32 port,
+                OMX_PTR appData,
+                OMX_U32 bytes
+                );
 
 
-    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
 
-    OMX_ERRORTYPE component_init(OMX_STRING role);
+        OMX_ERRORTYPE component_init(OMX_STRING role);
 
-    OMX_ERRORTYPE component_role_enum(
-                                       OMX_HANDLETYPE hComp,
-                                       OMX_U8 *role,
-                                       OMX_U32 index
-                                      );
+        OMX_ERRORTYPE component_role_enum(
+                OMX_HANDLETYPE hComp,
+                OMX_U8 *role,
+                OMX_U32 index
+                );
 
-    OMX_ERRORTYPE component_tunnel_request(
-                                            OMX_HANDLETYPE hComp,
-                                            OMX_U32 port,
-                                            OMX_HANDLETYPE  peerComponent,
-                                            OMX_U32 peerPort,
-                                            OMX_TUNNELSETUPTYPE *tunnelSetup
-                                           );
+        OMX_ERRORTYPE component_tunnel_request(
+                OMX_HANDLETYPE hComp,
+                OMX_U32 port,
+                OMX_HANDLETYPE  peerComponent,
+                OMX_U32 peerPort,
+                OMX_TUNNELSETUPTYPE *tunnelSetup
+                );
 
-    OMX_ERRORTYPE empty_this_buffer(
-                                     OMX_HANDLETYPE hComp,
-                                     OMX_BUFFERHEADERTYPE *buffer
-                                    );
+        OMX_ERRORTYPE empty_this_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
 
 
-    OMX_ERRORTYPE fill_this_buffer(
-                                    OMX_HANDLETYPE hComp,
-                                    OMX_BUFFERHEADERTYPE *buffer
-                                   );
+        OMX_ERRORTYPE fill_this_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
 
-    OMX_ERRORTYPE free_buffer(
-                              OMX_HANDLETYPE hComp,
-                              OMX_U32 port,
-                              OMX_BUFFERHEADERTYPE *buffer
-                              );
+        OMX_ERRORTYPE free_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_U32 port,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
-    OMX_ERRORTYPE get_component_version(
-                                        OMX_HANDLETYPE hComp,
-                                        OMX_STRING componentName,
-                                        OMX_VERSIONTYPE *componentVersion,
-                                        OMX_VERSIONTYPE *specVersion,
-                                        OMX_UUIDTYPE *componentUUID
-                                        );
+        OMX_ERRORTYPE get_component_version(
+                OMX_HANDLETYPE hComp,
+                OMX_STRING componentName,
+                OMX_VERSIONTYPE *componentVersion,
+                OMX_VERSIONTYPE *specVersion,
+                OMX_UUIDTYPE *componentUUID
+                );
 
-    OMX_ERRORTYPE get_config(
-                              OMX_HANDLETYPE hComp,
-                              OMX_INDEXTYPE configIndex,
-                              OMX_PTR configData
-                             );
+        OMX_ERRORTYPE get_config(
+                OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE configIndex,
+                OMX_PTR configData
+                );
 
-    OMX_ERRORTYPE get_extension_index(
-                                      OMX_HANDLETYPE hComp,
-                                      OMX_STRING paramName,
-                                      OMX_INDEXTYPE *indexType
-                                      );
+        OMX_ERRORTYPE get_extension_index(
+                OMX_HANDLETYPE hComp,
+                OMX_STRING paramName,
+                OMX_INDEXTYPE *indexType
+                );
 
-    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
-                                OMX_INDEXTYPE  paramIndex,
-                                OMX_PTR        paramData);
+        OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData);
 
-    OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
-                            OMX_STATETYPE *state);
+        OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
+                OMX_STATETYPE *state);
 
 
 
-    OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
-                               OMX_COMMANDTYPE cmd,
-                               OMX_U32         param1,
-                               OMX_PTR         cmdData);
+        OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
+                OMX_COMMANDTYPE cmd,
+                OMX_U32         param1,
+                OMX_PTR         cmdData);
 
 
-    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
-                                OMX_CALLBACKTYPE *callbacks,
-                                OMX_PTR          appData);
+        OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
+                OMX_CALLBACKTYPE *callbacks,
+                OMX_PTR          appData);
 
-    OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
-                             OMX_INDEXTYPE  configIndex,
-                             OMX_PTR        configData);
+        OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  configIndex,
+                OMX_PTR        configData);
 
-    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
-                                OMX_INDEXTYPE  paramIndex,
-                                OMX_PTR        paramData);
+        OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData);
 
-    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
-                             OMX_BUFFERHEADERTYPE **bufferHdr,
-                             OMX_U32              port,
-                             OMX_PTR              appData,
-                             OMX_U32              bytes,
-                             OMX_U8               *buffer);
+        OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes,
+                OMX_U8               *buffer);
 
-    OMX_ERRORTYPE  use_input_heap_buffers(
-                          OMX_HANDLETYPE            hComp,
-                          OMX_BUFFERHEADERTYPE** bufferHdr,
-                          OMX_U32                   port,
-                          OMX_PTR                   appData,
-                          OMX_U32                   bytes,
-                          OMX_U8*                   buffer);
+        OMX_ERRORTYPE  use_input_heap_buffers(
+                OMX_HANDLETYPE            hComp,
+                OMX_BUFFERHEADERTYPE** bufferHdr,
+                OMX_U32                   port,
+                OMX_PTR                   appData,
+                OMX_U32                   bytes,
+                OMX_U8*                   buffer);
 
-    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
-                                OMX_BUFFERHEADERTYPE **bufferHdr,
-                                OMX_U32              port,
-                                OMX_PTR              appData,
-                                void *               eglImage);
-    void complete_pending_buffer_done_cbs();
-    struct video_driver_context drv_ctx;
+        OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                void *               eglImage);
+        void complete_pending_buffer_done_cbs();
+        struct video_driver_context drv_ctx;
 #ifdef _MSM8974_
-    OMX_ERRORTYPE allocate_extradata();
-	void free_extradata();
-    void update_resolution(int width, int height);
+        OMX_ERRORTYPE allocate_extradata();
+        void free_extradata();
+        void update_resolution(int width, int height);
 #endif
-    int  m_pipe_in;
-    int  m_pipe_out;
-    pthread_t msg_thread_id;
-    pthread_t async_thread_id;
-    bool is_component_secure();
+        int  m_pipe_in;
+        int  m_pipe_out;
+        pthread_t msg_thread_id;
+        pthread_t async_thread_id;
+        bool is_component_secure();
 
-private:
-    // Bit Positions
-    enum flags_bit_positions
-    {
-        // Defer transition to IDLE
-        OMX_COMPONENT_IDLE_PENDING            =0x1,
-        // Defer transition to LOADING
-        OMX_COMPONENT_LOADING_PENDING         =0x2,
-        // First  Buffer Pending
-        OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
-        // Second Buffer Pending
-        OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
-        // Defer transition to Enable
-        OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
-        // Defer transition to Enable
-        OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
-        // Defer transition to Disable
-        OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
-        // Defer transition to Disable
-        OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
-        //defer flush notification
-        OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
-        OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
-        OMX_COMPONENT_PAUSE_PENDING          =0xB,
-        OMX_COMPONENT_EXECUTE_PENDING        =0xC,
-        OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
-        OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
-    };
+    private:
+        // Bit Positions
+        enum flags_bit_positions {
+            // Defer transition to IDLE
+            OMX_COMPONENT_IDLE_PENDING            =0x1,
+            // Defer transition to LOADING
+            OMX_COMPONENT_LOADING_PENDING         =0x2,
+            // First  Buffer Pending
+            OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
+            // Second Buffer Pending
+            OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
+            // Defer transition to Enable
+            OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
+            // Defer transition to Enable
+            OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
+            // Defer transition to Disable
+            OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
+            // Defer transition to Disable
+            OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
+            //defer flush notification
+            OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
+            OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
+            OMX_COMPONENT_PAUSE_PENDING          =0xB,
+            OMX_COMPONENT_EXECUTE_PENDING        =0xC,
+            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
+            OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
+        };
 
-    // Deferred callback identifiers
-    enum
-    {
-        //Event Callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_EVENT       = 0x1,
-        //Buffer Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
-        //Frame Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
-        //Buffer Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_FTB         = 0x4,
-        //Frame Done callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_ETB         = 0x5,
-        //Command
-        OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
-        //Push-Pending Buffers
-        OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
-        // Empty Buffer Done callbacks
-        OMX_COMPONENT_GENERATE_EBD         = 0x8,
-        //Flush Event Callbacks from the vdec component thread context
-        OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
-        OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
-        OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
-        OMX_COMPONENT_GENERATE_FBD = 0xc,
-        OMX_COMPONENT_GENERATE_START_DONE = 0xD,
-        OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
-        OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
-        OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
-        OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
-        OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
-        OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
-        OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
-        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
-        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
-    };
+        // Deferred callback identifiers
+        enum {
+            //Event Callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_EVENT       = 0x1,
+            //Buffer Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
+            //Frame Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
+            //Buffer Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_FTB         = 0x4,
+            //Frame Done callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_ETB         = 0x5,
+            //Command
+            OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
+            //Push-Pending Buffers
+            OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
+            // Empty Buffer Done callbacks
+            OMX_COMPONENT_GENERATE_EBD         = 0x8,
+            //Flush Event Callbacks from the vdec component thread context
+            OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
+            OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
+            OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
+            OMX_COMPONENT_GENERATE_FBD = 0xc,
+            OMX_COMPONENT_GENERATE_START_DONE = 0xD,
+            OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
+            OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
+            OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
+            OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
+            OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
+            OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
+            OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
+            OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
+            OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
+        };
 
-    enum vc1_profile_type
-    {
-        VC1_SP_MP_RCV = 1,
-        VC1_AP = 2
-    };
+        enum vc1_profile_type {
+            VC1_SP_MP_RCV = 1,
+            VC1_AP = 2
+        };
 
 #ifdef _MSM8974_
-    enum v4l2_ports
-    {
-        CAPTURE_PORT,
-        OUTPUT_PORT,
-        MAX_PORT
-    };
+        enum v4l2_ports {
+            CAPTURE_PORT,
+            OUTPUT_PORT,
+            MAX_PORT
+        };
 #endif
 
-    struct omx_event
-    {
-        unsigned param1;
-        unsigned param2;
-        unsigned id;
-    };
+        struct omx_event {
+            unsigned param1;
+            unsigned param2;
+            unsigned id;
+        };
 
-    struct omx_cmd_queue
-    {
-        omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
-        unsigned m_read;
-        unsigned m_write;
-        unsigned m_size;
+        struct omx_cmd_queue {
+            omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
+            unsigned m_read;
+            unsigned m_write;
+            unsigned m_size;
 
-        omx_cmd_queue();
-        ~omx_cmd_queue();
-        bool insert_entry(unsigned p1, unsigned p2, unsigned id);
-        bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
-        // get msgtype of the first ele from the queue
-        unsigned get_q_msg_type();
+            omx_cmd_queue();
+            ~omx_cmd_queue();
+            bool insert_entry(unsigned p1, unsigned p2, unsigned id);
+            bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
+            // get msgtype of the first ele from the queue
+            unsigned get_q_msg_type();
 
-    };
+        };
 
 #ifdef _ANDROID_
-    struct ts_entry
-    {
-        OMX_TICKS timestamp;
-        bool valid;
-    };
+        struct ts_entry {
+            OMX_TICKS timestamp;
+            bool valid;
+        };
 
-    struct ts_arr_list
-    {
-        ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
+        struct ts_arr_list {
+            ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
 
-        ts_arr_list();
-        ~ts_arr_list();
+            ts_arr_list();
+            ~ts_arr_list();
 
-        bool insert_ts(OMX_TICKS ts);
-        bool pop_min_ts(OMX_TICKS &ts);
-        bool reset_ts_list();
-    };
+            bool insert_ts(OMX_TICKS ts);
+            bool pop_min_ts(OMX_TICKS &ts);
+            bool reset_ts_list();
+        };
 #endif
 
-    struct desc_buffer_hdr
-    {
-        OMX_U8 *buf_addr;
-        OMX_U32 desc_data_size;
-    };
-    bool allocate_done(void);
-    bool allocate_input_done(void);
-    bool allocate_output_done(void);
+        struct desc_buffer_hdr {
+            OMX_U8 *buf_addr;
+            OMX_U32 desc_data_size;
+        };
+        bool allocate_done(void);
+        bool allocate_input_done(void);
+        bool allocate_output_done(void);
 
-    OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-    OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
-                                    OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
-    OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-    void free_output_buffer_header();
-    void free_input_buffer_header();
+        OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+        OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
+                OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
+        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+        void free_output_buffer_header();
+        void free_input_buffer_header();
 
-    OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
-                                             OMX_BUFFERHEADERTYPE **bufferHdr,
-                                             OMX_U32              port,
-                                             OMX_PTR              appData,
-                                             OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes);
 
 
-    OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
-                                        OMX_BUFFERHEADERTYPE **bufferHdr,
-                                        OMX_U32              port,
-                                        OMX_PTR              appData,
-                                        OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes);
 
-    OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
-                                         OMX_BUFFERHEADERTYPE **bufferHdr,
-                                         OMX_U32 port,OMX_PTR appData,
-                                         OMX_U32              bytes);
-    OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
-                                   OMX_BUFFERHEADERTYPE   **bufferHdr,
-                                   OMX_U32                port,
-                                   OMX_PTR                appData,
-                                   OMX_U32                bytes,
-                                   OMX_U8                 *buffer);
+        OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32 port,OMX_PTR appData,
+                OMX_U32              bytes);
+        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE   **bufferHdr,
+                OMX_U32                port,
+                OMX_PTR                appData,
+                OMX_U32                bytes,
+                OMX_U8                 *buffer);
 #ifdef MAX_RES_720P
-    OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+        OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
 #endif
 #ifdef MAX_RES_1080P
-    OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+        OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
 #endif
 
-    OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
-    OMX_ERRORTYPE allocate_output_headers();
-    bool execute_omx_flush(OMX_U32);
-    bool execute_output_flush();
-    bool execute_input_flush();
-    OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
-                                    OMX_BUFFERHEADERTYPE * buffer);
+        OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
+        OMX_ERRORTYPE allocate_output_headers();
+        bool execute_omx_flush(OMX_U32);
+        bool execute_output_flush();
+        bool execute_input_flush();
+        OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE * buffer);
 
-    OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
-                                    OMX_BUFFERHEADERTYPE * buffer);
-    OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
-                                        OMX_BUFFERHEADERTYPE *buffer);
+        OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE * buffer);
+        OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
 
-    OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
-                                                   OMX_BUFFERHEADERTYPE *buffer
-                                                   );
+        OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
-    OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_hevc (OMX_HANDLETYPE hComp);
-    OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_hevc (OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
 
-    OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
-                                       OMX_BUFFERHEADERTYPE *buffer);
-    bool release_done();
+        OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
+        bool release_done();
 
-    bool release_output_done();
-    bool release_input_done();
-    OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
-    OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
-    OMX_ERRORTYPE start_port_reconfig();
-    OMX_ERRORTYPE update_picture_resolution();
-    int stream_off(OMX_U32 port);
-    void adjust_timestamp(OMX_S64 &act_timestamp);
-    void set_frame_rate(OMX_S64 act_timestamp);
-    void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
-    void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
-    void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        bool release_output_done();
+        bool release_input_done();
+        OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
+        OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
+        OMX_ERRORTYPE start_port_reconfig();
+        OMX_ERRORTYPE update_picture_resolution();
+        int stream_off(OMX_U32 port);
+        void adjust_timestamp(OMX_S64 &act_timestamp);
+        void set_frame_rate(OMX_S64 act_timestamp);
+        void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+        void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+        void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
 #ifdef _MSM8974_
-    void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                    OMX_U32 interlaced_format_type);
-    OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
-		 bool enable = true);
-    void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                               OMX_U32 num_conceal_mb,
-                               OMX_U32 picture_type,
-                               OMX_U32 frame_rate,
-                               struct msm_vidc_panscan_window_payload *panscan_payload,
-                               struct vdec_aspectratioinfo *aspect_ratio_info);
+        void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 interlaced_format_type);
+        OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
+                bool enable = true);
+        void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 num_conceal_mb,
+                OMX_U32 picture_type,
+                OMX_U32 frame_rate,
+                struct msm_vidc_panscan_window_payload *panscan_payload,
+                struct vdec_aspectratioinfo *aspect_ratio_info);
 #else
-    void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                    OMX_U32 interlaced_format_type, OMX_U32 buf_index);
-    OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
+        void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 interlaced_format_type, OMX_U32 buf_index);
+        OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
 #endif
-    void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                               OMX_U32 num_conceal_mb,
-                               OMX_U32 picture_type,
-                               OMX_S64 timestamp,
-                               OMX_U32 frame_rate,
-                               struct vdec_aspectratioinfo *aspect_ratio_info);
-    void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
-                                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
-    void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
-    OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
-    void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
-    void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
-    void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
-    void insert_demux_addr_offset(OMX_U32 address_offset);
-    void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
-    OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
-    OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+                OMX_U32 num_conceal_mb,
+                OMX_U32 picture_type,
+                OMX_S64 timestamp,
+                OMX_U32 frame_rate,
+                struct vdec_aspectratioinfo *aspect_ratio_info);
+        void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
+                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
+        void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
+        void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+        void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
+        void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
+        void insert_demux_addr_offset(OMX_U32 address_offset);
+        void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
+        OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+        OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
 
-    bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                            OMX_U32 alignment);
+        bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
+                OMX_U32 alignment);
 #ifdef USE_ION
-    int alloc_map_ion_memory(OMX_U32 buffer_size,
-              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
-              struct ion_fd_data *fd_data,int flag);
-    void free_ion_memory(struct vdec_ion *buf_ion_info);
+        int alloc_map_ion_memory(OMX_U32 buffer_size,
+                OMX_U32 alignment, struct ion_allocation_data *alloc_data,
+                struct ion_fd_data *fd_data,int flag);
+        void free_ion_memory(struct vdec_ion *buf_ion_info);
 #endif
 
 
-    OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
-                                     OMX_COMMANDTYPE cmd,
-                                     OMX_U32         param1,
-                                     OMX_PTR         cmdData);
-    bool post_event( unsigned int p1,
-                     unsigned int p2,
-                     unsigned int id
-                    );
-    inline int clip2(int x)
-    {
-        x = x -1;
-        x = x | x >> 1;
-        x = x | x >> 2;
-        x = x | x >> 4;
-        x = x | x >> 16;
-        x = x + 1;
-        return x;
-    }
+        OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
+                OMX_COMMANDTYPE cmd,
+                OMX_U32         param1,
+                OMX_PTR         cmdData);
+        bool post_event( unsigned int p1,
+                unsigned int p2,
+                unsigned int id
+                   );
+        inline int clip2(int x) {
+            x = x -1;
+            x = x | x >> 1;
+            x = x | x >> 2;
+            x = x | x >> 4;
+            x = x | x >> 16;
+            x = x + 1;
+            return x;
+        }
 
 #ifdef MAX_RES_1080P
-    OMX_ERRORTYPE vdec_alloc_h264_mv();
-    void vdec_dealloc_h264_mv();
-    OMX_ERRORTYPE vdec_alloc_meta_buffers();
-    void vdec_dealloc_meta_buffers();
+        OMX_ERRORTYPE vdec_alloc_h264_mv();
+        void vdec_dealloc_h264_mv();
+        OMX_ERRORTYPE vdec_alloc_meta_buffers();
+        void vdec_dealloc_meta_buffers();
 #endif
 
-    inline void omx_report_error ()
-    {
-        if (m_cb.EventHandler && !m_error_propogated)
-        {
-            ALOGE("\nERROR: Sending OMX_EventError to Client");
-            m_error_propogated = true;
-            m_cb.EventHandler(&m_cmp,m_app_data,
-                  OMX_EventError,OMX_ErrorHardware,0,NULL);
+        inline void omx_report_error () {
+            if (m_cb.EventHandler && !m_error_propogated) {
+                ALOGE("\nERROR: Sending OMX_EventError to Client");
+                m_error_propogated = true;
+                m_cb.EventHandler(&m_cmp,m_app_data,
+                        OMX_EventError,OMX_ErrorHardware,0,NULL);
+            }
         }
-    }
 #ifdef _ANDROID_
-    OMX_ERRORTYPE createDivxDrmContext();
+        OMX_ERRORTYPE createDivxDrmContext();
 #endif //_ANDROID_
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
+        OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
 #endif
 #if defined (_ANDROID_ICS_)
-    struct nativebuffer{
-        native_handle_t *nativehandle;
-	private_handle_t *privatehandle;
-        int inuse;
-    };
-    nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
+        struct nativebuffer {
+            native_handle_t *nativehandle;
+            private_handle_t *privatehandle;
+            int inuse;
+        };
+        nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
 #endif
 
 
-    //*************************************************************
-    //*******************MEMBER VARIABLES *************************
-    //*************************************************************
-    pthread_mutex_t       m_lock;
-    pthread_mutex_t       c_lock;
-    //sem to handle the minimum procesing of commands
-    sem_t                 m_cmd_lock;
-    bool              m_error_propogated;
-    // compression format
-    OMX_VIDEO_CODINGTYPE eCompressionFormat;
-    // OMX State
-    OMX_STATETYPE m_state;
-    // Application data
-    OMX_PTR m_app_data;
-    // Application callbacks
-    OMX_CALLBACKTYPE m_cb;
-    OMX_PRIORITYMGMTTYPE m_priority_mgm ;
-    OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
-    // fill this buffer queue
-    omx_cmd_queue         m_ftb_q;
-    // Command Q for rest of the events
-    omx_cmd_queue         m_cmd_q;
-    omx_cmd_queue         m_etb_q;
-    // Input memory pointer
-    OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
-    // Output memory pointer
-    OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
-    // number of input bitstream error frame count
-    unsigned int m_inp_err_count;
+        //*************************************************************
+        //*******************MEMBER VARIABLES *************************
+        //*************************************************************
+        pthread_mutex_t       m_lock;
+        pthread_mutex_t       c_lock;
+        //sem to handle the minimum procesing of commands
+        sem_t                 m_cmd_lock;
+        bool              m_error_propogated;
+        // compression format
+        OMX_VIDEO_CODINGTYPE eCompressionFormat;
+        // OMX State
+        OMX_STATETYPE m_state;
+        // Application data
+        OMX_PTR m_app_data;
+        // Application callbacks
+        OMX_CALLBACKTYPE m_cb;
+        OMX_PRIORITYMGMTTYPE m_priority_mgm ;
+        OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
+        // fill this buffer queue
+        omx_cmd_queue         m_ftb_q;
+        // Command Q for rest of the events
+        omx_cmd_queue         m_cmd_q;
+        omx_cmd_queue         m_etb_q;
+        // Input memory pointer
+        OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
+        // Output memory pointer
+        OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
+        // number of input bitstream error frame count
+        unsigned int m_inp_err_count;
 #ifdef _ANDROID_
-    // Timestamp list
-    ts_arr_list           m_timestamp_list;
+        // Timestamp list
+        ts_arr_list           m_timestamp_list;
 #endif
 
-    bool input_flush_progress;
-    bool output_flush_progress;
-    bool input_use_buffer;
-    bool output_use_buffer;
-    bool ouput_egl_buffers;
-    OMX_BOOL m_use_output_pmem;
-    OMX_BOOL m_out_mem_region_smi;
-    OMX_BOOL m_out_pvt_entry_pmem;
+        bool input_flush_progress;
+        bool output_flush_progress;
+        bool input_use_buffer;
+        bool output_use_buffer;
+        bool ouput_egl_buffers;
+        OMX_BOOL m_use_output_pmem;
+        OMX_BOOL m_out_mem_region_smi;
+        OMX_BOOL m_out_pvt_entry_pmem;
 
-    int pending_input_buffers;
-    int pending_output_buffers;
-    // bitmask array size for output side
-    unsigned int m_out_bm_count;
-    // bitmask array size for input side
-    unsigned int m_inp_bm_count;
-    //Input port Populated
-    OMX_BOOL m_inp_bPopulated;
-    //Output port Populated
-    OMX_BOOL m_out_bPopulated;
-    // encapsulate the waiting states.
-    unsigned int m_flags;
+        int pending_input_buffers;
+        int pending_output_buffers;
+        // bitmask array size for output side
+        unsigned int m_out_bm_count;
+        // bitmask array size for input side
+        unsigned int m_inp_bm_count;
+        //Input port Populated
+        OMX_BOOL m_inp_bPopulated;
+        //Output port Populated
+        OMX_BOOL m_out_bPopulated;
+        // encapsulate the waiting states.
+        unsigned int m_flags;
 
 #ifdef _ANDROID_
-    // Heap pointer to frame buffers
-    struct vidc_heap
-    {
-        sp<MemoryHeapBase>    video_heap_ptr;
-    };
-    struct vidc_heap *m_heap_ptr;
-    unsigned int m_heap_count;
-#endif //_ANDROID_
-    // store I/P PORT state
-    OMX_BOOL m_inp_bEnabled;
-    // store O/P PORT state
-    OMX_BOOL m_out_bEnabled;
-    OMX_U32 m_in_alloc_cnt;
-    OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
-    // Platform specific details
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
-    // SPS+PPS sent as part of set_config
-    OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
-
-    /*Variables for arbitrary Byte parsing support*/
-    frame_parse m_frame_parser;
-    omx_cmd_queue m_input_pending_q;
-    omx_cmd_queue m_input_free_q;
-    bool arbitrary_bytes;
-    OMX_BUFFERHEADERTYPE  h264_scratch;
-    OMX_BUFFERHEADERTYPE  *psource_frame;
-    OMX_BUFFERHEADERTYPE  *pdest_frame;
-    OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
-    OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
-    unsigned int m_heap_inp_bm_count;
-    codec_type codec_type_parse;
-    bool first_frame_meta;
-    unsigned frame_count;
-    unsigned nal_count;
-    unsigned nal_length;
-    bool look_ahead_nal;
-    int first_frame;
-    unsigned char *first_buffer;
-    int first_frame_size;
-    unsigned char m_hwdevice_name[80];
-    FILE *m_device_file_ptr;
-    enum vc1_profile_type m_vc1_profile;
-    OMX_S64 h264_last_au_ts;
-    OMX_U32 h264_last_au_flags;
-    OMX_U32 m_demux_offsets[8192];
-    OMX_U32 m_demux_entries;
-    OMX_U32 m_disp_hor_size;
-    OMX_U32 m_disp_vert_size;
-
-    OMX_S64 prev_ts;
-    bool rst_prev_ts;
-    OMX_U32 frm_int;
-
-    struct vdec_allocatorproperty op_buf_rcnfg;
-    bool in_reconfig;
-    OMX_NATIVE_WINDOWTYPE m_display_id;
-    h264_stream_parser *h264_parser;
-    OMX_U32 client_extradata;
-#ifdef _ANDROID_
-    bool m_debug_timestamp;
-    bool perf_flag;
-    OMX_U32 proc_frms, latency;
-    perf_metrics fps_metrics;
-    perf_metrics dec_time;
-    bool m_enable_android_native_buffers;
-    bool m_use_android_native_buffers;
-    bool m_debug_extradata;
-    bool m_debug_concealedmb;
-#endif
-#ifdef MAX_RES_1080P
-    MP4_Utils mp4_headerparser;
-#endif
-
-    struct h264_mv_buffer{
-        unsigned char* buffer;
-        int size;
-        int count;
-        int pmem_fd;
-        int offset;
-    };
-    h264_mv_buffer h264_mv_buff;
-
-    struct meta_buffer{
-        unsigned char* buffer;
-        int size;
-        int count;
-        int pmem_fd;
-        int pmem_fd_iommu;
-        int offset;
-    };
-    meta_buffer meta_buff;
-	extra_data_handler extra_data_handle;
-#ifdef _ANDROID_
-    DivXDrmDecrypt* iDivXDrmDecrypt;
-#endif //_ANDROID_
-    OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
-    omx_time_stamp_reorder time_stamp_dts;
-    desc_buffer_hdr *m_desc_buffer_ptr;
-    bool secure_mode;
-    bool external_meta_buffer;
-    bool external_meta_buffer_iommu;
-    OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
-    bool codec_config_flag;
-#ifdef _MSM8974_
-    int capture_capability;
-    int output_capability;
-    bool streaming[MAX_PORT];
-    OMX_CONFIG_RECTTYPE rectangle;
-#endif
-    bool m_power_hinted;
-    OMX_ERRORTYPE power_module_register();
-    OMX_ERRORTYPE power_module_deregister();
-    bool msg_thread_created;
-    bool async_thread_created;
-
-    unsigned int m_fill_output_msg;
-    class allocate_color_convert_buf {
-    public:
-        allocate_color_convert_buf();
-        ~allocate_color_convert_buf();
-        void set_vdec_client(void *);
-        void update_client();
-        bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
-        bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
-        bool update_buffer_req();
-        bool get_buffer_req(unsigned int &buffer_size);
-        OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
-        OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
-        OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
-        OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
-        OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
-        OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
-             OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
-             OMX_U32 bytes);
-        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-    private:
-        #define MAX_COUNT 32
-        omx_vdec *omx;
-        bool enabled;
-        OMX_COLOR_FORMATTYPE ColorFormat;
-        void init_members();
-        bool color_convert_mode;
-        ColorConvertFormat dest_format;
-        class omx_c2d_conv c2d;
-        unsigned int allocated_count;
-        unsigned int buffer_size_req;
-        unsigned int buffer_alignment_req;
-        OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
-        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
-        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
-        OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
-#ifdef USE_ION
-        struct vdec_ion op_buf_ion_info[MAX_COUNT];
-#endif
-        unsigned char *pmem_baseaddress[MAX_COUNT];
-        int pmem_fd[MAX_COUNT];
-        struct vidc_heap
-        {
+        // Heap pointer to frame buffers
+        struct vidc_heap {
             sp<MemoryHeapBase>    video_heap_ptr;
         };
-        struct vidc_heap m_heap_ptr[MAX_COUNT];
-    };
-#if  defined (_MSM8960_) || defined (_MSM8974_)
-    allocate_color_convert_buf client_buffers;
+        struct vidc_heap *m_heap_ptr;
+        unsigned int m_heap_count;
+#endif //_ANDROID_
+        // store I/P PORT state
+        OMX_BOOL m_inp_bEnabled;
+        // store O/P PORT state
+        OMX_BOOL m_out_bEnabled;
+        OMX_U32 m_in_alloc_cnt;
+        OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
+        // Platform specific details
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
+        // SPS+PPS sent as part of set_config
+        OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
+
+        /*Variables for arbitrary Byte parsing support*/
+        frame_parse m_frame_parser;
+        omx_cmd_queue m_input_pending_q;
+        omx_cmd_queue m_input_free_q;
+        bool arbitrary_bytes;
+        OMX_BUFFERHEADERTYPE  h264_scratch;
+        OMX_BUFFERHEADERTYPE  *psource_frame;
+        OMX_BUFFERHEADERTYPE  *pdest_frame;
+        OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
+        OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
+        unsigned int m_heap_inp_bm_count;
+        codec_type codec_type_parse;
+        bool first_frame_meta;
+        unsigned frame_count;
+        unsigned nal_count;
+        unsigned nal_length;
+        bool look_ahead_nal;
+        int first_frame;
+        unsigned char *first_buffer;
+        int first_frame_size;
+        unsigned char m_hwdevice_name[80];
+        FILE *m_device_file_ptr;
+        enum vc1_profile_type m_vc1_profile;
+        OMX_S64 h264_last_au_ts;
+        OMX_U32 h264_last_au_flags;
+        OMX_U32 m_demux_offsets[8192];
+        OMX_U32 m_demux_entries;
+        OMX_U32 m_disp_hor_size;
+        OMX_U32 m_disp_vert_size;
+
+        OMX_S64 prev_ts;
+        bool rst_prev_ts;
+        OMX_U32 frm_int;
+
+        struct vdec_allocatorproperty op_buf_rcnfg;
+        bool in_reconfig;
+        OMX_NATIVE_WINDOWTYPE m_display_id;
+        h264_stream_parser *h264_parser;
+        OMX_U32 client_extradata;
+#ifdef _ANDROID_
+        bool m_debug_timestamp;
+        bool perf_flag;
+        OMX_U32 proc_frms, latency;
+        perf_metrics fps_metrics;
+        perf_metrics dec_time;
+        bool m_enable_android_native_buffers;
+        bool m_use_android_native_buffers;
+        bool m_debug_extradata;
+        bool m_debug_concealedmb;
 #endif
-    HEVC_Utils mHEVCutils;
+#ifdef MAX_RES_1080P
+        MP4_Utils mp4_headerparser;
+#endif
+
+        struct h264_mv_buffer {
+            unsigned char* buffer;
+            int size;
+            int count;
+            int pmem_fd;
+            int offset;
+        };
+        h264_mv_buffer h264_mv_buff;
+
+        struct meta_buffer {
+            unsigned char* buffer;
+            int size;
+            int count;
+            int pmem_fd;
+            int pmem_fd_iommu;
+            int offset;
+        };
+        meta_buffer meta_buff;
+        extra_data_handler extra_data_handle;
+#ifdef _ANDROID_
+        DivXDrmDecrypt* iDivXDrmDecrypt;
+#endif //_ANDROID_
+        OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
+        omx_time_stamp_reorder time_stamp_dts;
+        desc_buffer_hdr *m_desc_buffer_ptr;
+        bool secure_mode;
+        bool external_meta_buffer;
+        bool external_meta_buffer_iommu;
+        OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
+        bool codec_config_flag;
+#ifdef _MSM8974_
+        int capture_capability;
+        int output_capability;
+        bool streaming[MAX_PORT];
+        OMX_CONFIG_RECTTYPE rectangle;
+#endif
+        bool m_power_hinted;
+        OMX_ERRORTYPE power_module_register();
+        OMX_ERRORTYPE power_module_deregister();
+        bool msg_thread_created;
+        bool async_thread_created;
+
+        unsigned int m_fill_output_msg;
+        class allocate_color_convert_buf
+        {
+            public:
+                allocate_color_convert_buf();
+                ~allocate_color_convert_buf();
+                void set_vdec_client(void *);
+                void update_client();
+                bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
+                bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
+                bool update_buffer_req();
+                bool get_buffer_req(unsigned int &buffer_size);
+                OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
+                OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
+                OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
+                OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
+                OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
+                OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
+                        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
+                        OMX_U32 bytes);
+                OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+            private:
+#define MAX_COUNT 32
+                omx_vdec *omx;
+                bool enabled;
+                OMX_COLOR_FORMATTYPE ColorFormat;
+                void init_members();
+                bool color_convert_mode;
+                ColorConvertFormat dest_format;
+                class omx_c2d_conv c2d;
+                unsigned int allocated_count;
+                unsigned int buffer_size_req;
+                unsigned int buffer_alignment_req;
+                OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
+                OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
+                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
+                OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
+#ifdef USE_ION
+                struct vdec_ion op_buf_ion_info[MAX_COUNT];
+#endif
+                unsigned char *pmem_baseaddress[MAX_COUNT];
+                int pmem_fd[MAX_COUNT];
+                struct vidc_heap {
+                    sp<MemoryHeapBase>    video_heap_ptr;
+                };
+                struct vidc_heap m_heap_ptr[MAX_COUNT];
+        };
+#if  defined (_MSM8960_) || defined (_MSM8974_)
+        allocate_color_convert_buf client_buffers;
+#endif
+        HEVC_Utils mHEVCutils;
 };
 
 #ifdef _MSM8974_
 enum instance_state {
-	MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
-	MSM_VIDC_CORE_INIT,
-	MSM_VIDC_CORE_INIT_DONE,
-	MSM_VIDC_OPEN,
-	MSM_VIDC_OPEN_DONE,
-	MSM_VIDC_LOAD_RESOURCES,
-	MSM_VIDC_LOAD_RESOURCES_DONE,
-	MSM_VIDC_START,
-	MSM_VIDC_START_DONE,
-	MSM_VIDC_STOP,
-	MSM_VIDC_STOP_DONE,
-	MSM_VIDC_RELEASE_RESOURCES,
-	MSM_VIDC_RELEASE_RESOURCES_DONE,
-	MSM_VIDC_CLOSE,
-	MSM_VIDC_CLOSE_DONE,
-	MSM_VIDC_CORE_UNINIT,
+    MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
+    MSM_VIDC_CORE_INIT,
+    MSM_VIDC_CORE_INIT_DONE,
+    MSM_VIDC_OPEN,
+    MSM_VIDC_OPEN_DONE,
+    MSM_VIDC_LOAD_RESOURCES,
+    MSM_VIDC_LOAD_RESOURCES_DONE,
+    MSM_VIDC_START,
+    MSM_VIDC_START_DONE,
+    MSM_VIDC_STOP,
+    MSM_VIDC_STOP_DONE,
+    MSM_VIDC_RELEASE_RESOURCES,
+    MSM_VIDC_RELEASE_RESOURCES_DONE,
+    MSM_VIDC_CLOSE,
+    MSM_VIDC_CLOSE_DONE,
+    MSM_VIDC_CORE_UNINIT,
 };
 
 enum vidc_resposes_id {
-	MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
-	MSM_VIDC_DECODER_EVENT_CHANGE,
+    MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
+    MSM_VIDC_DECODER_EVENT_CHANGE,
 };
 
 #endif // _MSM8974_
diff --git a/mm-video-v4l2/vidc/vdec/inc/power_module.h b/mm-video-v4l2/vidc/vdec/inc/power_module.h
index 59586a1..ba47c2f 100644
--- a/mm-video-v4l2/vidc/vdec/inc/power_module.h
+++ b/mm-video-v4l2/vidc/vdec/inc/power_module.h
@@ -1,5 +1,5 @@
 /*-------------------------------------------------------------------------
-Copyright (c) 2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
 
   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
@@ -32,11 +32,11 @@
 
 class PowerModule
 {
-  public:
-    static PowerModule *getInstance();
-    power_module_t *getPowerModuleHandle();
-  private:
-    static PowerModule *mPowerModuleInstance;
-    power_module_t *mPowerModuleHandle;
-    PowerModule() {}
+    public:
+        static PowerModule *getInstance();
+        power_module_t *getPowerModuleHandle();
+    private:
+        static PowerModule *mPowerModuleInstance;
+        power_module_t *mPowerModuleHandle;
+        PowerModule() {}
 };
diff --git a/mm-video-v4l2/vidc/vdec/inc/qtypes.h b/mm-video-v4l2/vidc/vdec/inc/qtypes.h
old mode 100755
new mode 100644
index 63126af..bef6e2d
--- a/mm-video-v4l2/vidc/vdec/inc/qtypes.h
+++ b/mm-video-v4l2/vidc/vdec/inc/qtypes.h
@@ -58,29 +58,29 @@
 ** Standard Types
 ** ----------------------------------------------------------------------- */
 
-/* The following definitions are the same accross platforms.  This first
-** group are the sanctioned types.
-*/
+    /* The following definitions are the same accross platforms.  This first
+     ** group are the sanctioned types.
+     */
 
-typedef  unsigned char      boolean;     /* Boolean value type. */
+    typedef  unsigned char      boolean;     /* Boolean value type. */
 
-typedef  unsigned int  uint32;      /* Unsigned 32 bit value */
-typedef  unsigned short     uint16;      /* Unsigned 16 bit value */
-typedef  unsigned char      uint8;       /* Unsigned 8  bit value */
+    typedef  unsigned int  uint32;      /* Unsigned 32 bit value */
+    typedef  unsigned short     uint16;      /* Unsigned 16 bit value */
+    typedef  unsigned char      uint8;       /* Unsigned 8  bit value */
 
-typedef  int    int32;       /* Signed 32 bit value */
-typedef  signed short       int16;       /* Signed 16 bit value */
-typedef  signed char        int8;        /* Signed 8  bit value */
+    typedef  int    int32;       /* Signed 32 bit value */
+    typedef  signed short       int16;       /* Signed 16 bit value */
+    typedef  signed char        int8;        /* Signed 8  bit value */
 
-/* This group are the deprecated types.  Their use should be
-** discontinued and new code should use the types above
-*/
-typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */
-typedef  unsigned short    word;         /* Unsinged 16 bit value type. */
-typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */
+    /* This group are the deprecated types.  Their use should be
+     ** discontinued and new code should use the types above
+     */
+    typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */
+    typedef  unsigned short    word;         /* Unsinged 16 bit value type. */
+    typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */
 
-typedef long long           int64;
-typedef unsigned long long  uint64;
+    typedef long long           int64;
+    typedef unsigned long long  uint64;
 
 
 #ifdef __cplusplus
diff --git a/mm-video-v4l2/vidc/vdec/inc/queue.h b/mm-video-v4l2/vidc/vdec/inc/queue.h
old mode 100755
new mode 100644
diff --git a/mm-video-v4l2/vidc/vdec/inc/ts_parser.h b/mm-video-v4l2/vidc/vdec/inc/ts_parser.h
old mode 100755
new mode 100644
index 8e884c7..161b64d
--- a/mm-video-v4l2/vidc/vdec/inc/ts_parser.h
+++ b/mm-video-v4l2/vidc/vdec/inc/ts_parser.h
@@ -1,88 +1,90 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#ifndef __DTSPARSER_H
-#define __DTSPARSER_H
-
-#include "OMX_Core.h"
-#include "OMX_QCOMExtns.h"
-#include "qc_omx_component.h"
-
-#include<stdlib.h>
-
-#include <stdio.h>
-#include <inttypes.h>
-
-#ifdef _ANDROID_
-extern "C"{
-#include<utils/Log.h>
-}
-#else
-#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
-#endif /* _ANDROID_ */
-
-class omx_time_stamp_reorder {
-public:
-	omx_time_stamp_reorder();
-	~omx_time_stamp_reorder();
-	void set_timestamp_reorder_mode(bool flag);
-        void enable_debug_print(bool flag);
-	bool insert_timestamp(OMX_BUFFERHEADERTYPE *header);
-	bool get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced);
-	bool remove_time_stamp(OMX_TICKS ts, bool is_interlaced);
-	void flush_timestamp();
-
-private:
-	#define TIME_SZ 64
-	typedef struct timestamp {
-		OMX_TICKS timestamps;
-		bool in_use;
-	}timestamp;
-	typedef struct time_stamp_list {
-		timestamp input_timestamps[TIME_SZ];
-		time_stamp_list *next;
-		time_stamp_list *prev;
-		unsigned int entries_filled;
-	}time_stamp_list;
-	bool error;
-	time_stamp_list *phead,*pcurrent;
-	bool get_current_list();
-	bool add_new_list();
-	bool update_head();
-	void delete_list();
-	void handle_error()
-	{
-		ALOGE("Error handler called for TS Parser");
-		if (error)
-			return;
-		error = true;
-		delete_list();
-	}
-	bool reorder_ts;
-        bool print_debug;
-};
-#endif
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef __DTSPARSER_H
+#define __DTSPARSER_H
+
+#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
+#include "qc_omx_component.h"
+
+#include<stdlib.h>
+
+#include <stdio.h>
+#include <inttypes.h>
+
+#ifdef _ANDROID_
+extern "C" {
+#include<utils/Log.h>
+}
+#else
+#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
+#endif /* _ANDROID_ */
+
+class omx_time_stamp_reorder
+{
+    public:
+        omx_time_stamp_reorder();
+        ~omx_time_stamp_reorder();
+        void set_timestamp_reorder_mode(bool flag);
+        void enable_debug_print(bool flag);
+        bool insert_timestamp(OMX_BUFFERHEADERTYPE *header);
+        bool get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced);
+        bool remove_time_stamp(OMX_TICKS ts, bool is_interlaced);
+        void flush_timestamp();
+
+    private:
+#define TIME_SZ 64
+        typedef struct timestamp {
+            OMX_TICKS timestamps;
+            bool in_use;
+        } timestamp;
+        typedef struct time_stamp_list {
+            timestamp input_timestamps[TIME_SZ];
+            time_stamp_list *next;
+            time_stamp_list *prev;
+            unsigned int entries_filled;
+        } time_stamp_list;
+        bool error;
+        time_stamp_list *phead,*pcurrent;
+        bool get_current_list();
+        bool add_new_list();
+        bool update_head();
+        void delete_list();
+        void handle_error() {
+            ALOGE("Error handler called for TS Parser");
+
+            if (error)
+                return;
+
+            error = true;
+            delete_list();
+        }
+        bool reorder_ts;
+        bool print_debug;
+};
+#endif
diff --git a/mm-video-v4l2/vidc/vdec/src/frameparser.cpp b/mm-video-v4l2/vidc/vdec/src/frameparser.cpp
old mode 100755
new mode 100644
index c591f5f..2dd9d4e
--- a/mm-video-v4l2/vidc/vdec/src/frameparser.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/frameparser.cpp
@@ -46,9 +46,9 @@
 //#include "omx_vdec.h"
 
 #ifdef _ANDROID_
-    extern "C"{
-        #include<utils/Log.h>
-    }
+extern "C" {
+#include<utils/Log.h>
+}
 #endif//_ANDROID_
 
 #undef DEBUG_PRINT_LOW
@@ -75,17 +75,17 @@
 static unsigned char MPEG2_mask_code[4] = {0xFF, 0xFF, 0xFF, 0xFF};
 
 frame_parse::frame_parse():mutils(NULL),
-                           parse_state(A0),
-                           start_code(NULL),
-                           mask_code(NULL),
-                           last_byte_h263(0),
-                           last_byte(0),
-                           header_found(false),
-                           skip_frame_boundary(false),
-                           state_nal(NAL_LENGTH_ACC),
-                           nal_length(0),
-                           accum_length(0),
-                           bytes_tobeparsed(0)
+    parse_state(A0),
+    start_code(NULL),
+    mask_code(NULL),
+    last_byte_h263(0),
+    last_byte(0),
+    header_found(false),
+    skip_frame_boundary(false),
+    state_nal(NAL_LENGTH_ACC),
+    nal_length(0),
+    accum_length(0),
+    bytes_tobeparsed(0)
 {
 }
 
@@ -99,72 +99,70 @@
 
 int frame_parse::init_start_codes (codec_type codec_type_parse)
 {
-	/*Check if Codec Type is proper and we are in proper state*/
-	if (codec_type_parse > CODEC_TYPE_MAX || parse_state != A0)
-	{
-	  return -1;
-	}
+    /*Check if Codec Type is proper and we are in proper state*/
+    if (codec_type_parse > CODEC_TYPE_MAX || parse_state != A0) {
+        return -1;
+    }
 
-	switch (codec_type_parse)
-	{
-	case CODEC_TYPE_MPEG4:
-		start_code = MPEG4_start_code;
-		mask_code = MPEG4_mask_code;
-		break;
-	case CODEC_TYPE_H263:
-		start_code = H263_start_code;
-		mask_code = H263_mask_code;
-		break;
-	case CODEC_TYPE_H264:
-	case CODEC_TYPE_HEVC:
-		start_code = H264_start_code;
-		mask_code = H264_mask_code;
-		break;
-	case CODEC_TYPE_VC1:
-		start_code = VC1_AP_start_code;
-		mask_code = VC1_AP_mask_code;
-		break;
+    switch (codec_type_parse) {
+        case CODEC_TYPE_MPEG4:
+            start_code = MPEG4_start_code;
+            mask_code = MPEG4_mask_code;
+            break;
+        case CODEC_TYPE_H263:
+            start_code = H263_start_code;
+            mask_code = H263_mask_code;
+            break;
+        case CODEC_TYPE_H264:
+        case CODEC_TYPE_HEVC:
+            start_code = H264_start_code;
+            mask_code = H264_mask_code;
+            break;
+        case CODEC_TYPE_VC1:
+            start_code = VC1_AP_start_code;
+            mask_code = VC1_AP_mask_code;
+            break;
         case CODEC_TYPE_MPEG2:
-                start_code = MPEG2_start_code;
-                mask_code = MPEG2_mask_code;
-                break;
+            start_code = MPEG2_start_code;
+            mask_code = MPEG2_mask_code;
+            break;
 #ifdef _MSM8974_
         case CODEC_TYPE_VP8:
-                break;
+            break;
 #endif
         default:
-                return -1;
-        }
-	return 1;
+            return -1;
+    }
+
+    return 1;
 }
 
 
 int frame_parse::init_nal_length (unsigned int nal_len)
 {
-    if (nal_len == 0 || nal_len > 4 || state_nal != NAL_LENGTH_ACC)
-    {
-       return -1;
+    if (nal_len == 0 || nal_len > 4 || state_nal != NAL_LENGTH_ACC) {
+        return -1;
     }
+
     nal_length = nal_len;
 
     return 1;
 }
 
 int frame_parse::parse_sc_frame ( OMX_BUFFERHEADERTYPE *source,
-                                     OMX_BUFFERHEADERTYPE *dest ,
-                                     OMX_U32 *partialframe)
+        OMX_BUFFERHEADERTYPE *dest ,
+        OMX_U32 *partialframe)
 {
     OMX_U8 *pdest = NULL,*psource = NULL, match_found = FALSE, is_byte_match = 0;
     OMX_U32 dest_len =0, source_len = 0, temp_len = 0;
     OMX_U32 parsed_length = 0,i=0;
     int residue_byte = 0;
 
-    if (source == NULL || dest == NULL || partialframe == NULL)
-    {
+    if (source == NULL || dest == NULL || partialframe == NULL) {
         return -1;
     }
 
-  /*Calculate how many bytes are left in source and destination*/
+    /*Calculate how many bytes are left in source and destination*/
     dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
     psource = source->pBuffer + source->nOffset;
     pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
@@ -172,188 +170,167 @@
 
     /*Need Minimum Start Code size for destination to copy atleast Start code*/
     if ((start_code == H263_start_code && dest_len < 3) ||
-        (start_code != H263_start_code && dest_len < 4) || (source_len == 0))
-    {
+            (start_code != H263_start_code && dest_len < 4) || (source_len == 0)) {
         DEBUG_PRINT_LOW("\n FrameParser: dest_len %d source_len %d",dest_len,source_len);
-        if (source_len == 0 && (source->nFlags & 0x01))
-        {
+
+        if (source_len == 0 && (source->nFlags & 0x01)) {
             DEBUG_PRINT_LOW("\n FrameParser: EOS rxd!! Notify it as a complete frame");
             *partialframe = 0;
             return 1;
         }
+
         DEBUG_PRINT_LOW("\n FrameParser: Bitstream Parsing error");
         return -1;
     }
 
     /*Check if State of the previous find is a Start code*/
-    if (parse_state == A4 || parse_state == A5)
-    {
+    if (parse_state == A4 || parse_state == A5) {
         /*Check for minimun size should be 4*/
         dest->nFlags = source->nFlags;
         dest->nTimeStamp = source->nTimeStamp;
 
-        if(start_code == H263_start_code)
-        {
+        if (start_code == H263_start_code) {
             memcpy (pdest,start_code,2);
             pdest[2] = last_byte_h263;
             dest->nFilledLen += 3;
             pdest += 3;
-        }
-        else
-        {
+        } else {
             memcpy (pdest,start_code,4);
+
             if (start_code == VC1_AP_start_code
-                || start_code == MPEG4_start_code
-                || start_code == MPEG2_start_code)
-            {
+                    || start_code == MPEG4_start_code
+                    || start_code == MPEG2_start_code) {
                 pdest[3] = last_byte;
                 update_skip_frame();
             }
+
             dest->nFilledLen += 4;
             pdest += 4;
         }
+
         parse_state = A0;
     }
 
     /*Entry State Machine*/
     while ( source->nFilledLen > 0 && parse_state != A0
             && parse_state != A4 && parse_state != A5 && dest_len > 0
-          )
-    {
+          ) {
         //printf ("\n In the Entry Loop");
-        switch (parse_state)
-        {
-        case A3:
-            parse_additional_start_code(psource,&parsed_length);
-            if (parse_state == A4) {
-                source->nFilledLen--;
-                source->nOffset++;
-                psource++;
+        switch (parse_state) {
+            case A3:
+                parse_additional_start_code(psource,&parsed_length);
+
+                if (parse_state == A4) {
+                    source->nFilledLen--;
+                    source->nOffset++;
+                    psource++;
+                    break;
+                }
+
+                /*If fourth Byte is matching then start code is found*/
+                if ((*psource & mask_code [3]) == start_code [3]) {
+                    parse_state = A4;
+                    last_byte =  *psource;
+                    source->nFilledLen--;
+                    source->nOffset++;
+                    psource++;
+                } else if ((start_code [1] == start_code [0]) && (start_code [2]  == start_code [1])) {
+                    parse_state = A2;
+                    memcpy (pdest,start_code,1);
+                    pdest++;
+                    dest->nFilledLen++;
+                    dest_len--;
+                } else if (start_code [2] == start_code [0]) {
+                    parse_state = A1;
+                    memcpy (pdest,start_code,2);
+                    pdest += 2;
+                    dest->nFilledLen += 2;
+                    dest_len -= 2;
+                } else {
+                    parse_state = A0;
+                    memcpy (pdest,start_code,3);
+                    pdest += 3;
+                    dest->nFilledLen +=3;
+                    dest_len -= 3;
+                }
+
                 break;
-            }
-             /*If fourth Byte is matching then start code is found*/
-             if ((*psource & mask_code [3]) == start_code [3])
-             {
-               parse_state = A4;
-               last_byte =  *psource;
-               source->nFilledLen--;
-               source->nOffset++;
-               psource++;
-             }
-             else if ((start_code [1] == start_code [0]) && (start_code [2]  == start_code [1]))
-             {
-                 parse_state = A2;
-                 memcpy (pdest,start_code,1);
-                 pdest++;
-                 dest->nFilledLen++;
-                 dest_len--;
-             }
-             else if (start_code [2] == start_code [0])
-             {
-                 parse_state = A1;
-                 memcpy (pdest,start_code,2);
-                 pdest += 2;
-                 dest->nFilledLen += 2;
-                 dest_len -= 2;
-             }
-             else
-             {
-                 parse_state = A0;
-                 memcpy (pdest,start_code,3);
-                 pdest += 3;
-                 dest->nFilledLen +=3;
-                 dest_len -= 3;
-             }
-             break;
 
-        case A2:
-            is_byte_match = ((*psource & mask_code [2]) == start_code [2]);
-            match_found = FALSE;
+            case A2:
+                is_byte_match = ((*psource & mask_code [2]) == start_code [2]);
+                match_found = FALSE;
 
-            if (start_code == H263_start_code)
-            {
-                if (is_byte_match)
-                {
-                  last_byte_h263 = *psource;
-                  parse_state = A5;
-                  match_found = TRUE;
+                if (start_code == H263_start_code) {
+                    if (is_byte_match) {
+                        last_byte_h263 = *psource;
+                        parse_state = A5;
+                        match_found = TRUE;
+                    }
+                } else if (start_code == H264_start_code &&
+                        (*psource & mask_code [3]) == start_code [3]) {
+                    parse_state = A5;
+                    match_found = TRUE;
+                } else {
+                    if (is_byte_match) {
+                        parse_state = A3;
+                        match_found = TRUE;
+                    }
                 }
-            }
-            else if (start_code == H264_start_code &&
-                (*psource & mask_code [3]) == start_code [3])
-            {
-                parse_state = A5;
-                match_found = TRUE;
-            }
-            else
-            {
-                if (is_byte_match)
-                {
-                  parse_state = A3;
-                  match_found = TRUE;
+
+                if (match_found) {
+                    source->nFilledLen--;
+                    source->nOffset++;
+                    psource++;
+                } else if (start_code [1] == start_code [0]) {
+                    parse_state = A1;
+                    memcpy (pdest,start_code,1);
+                    dest->nFilledLen +=1;
+                    dest_len--;
+                    pdest++;
+                } else {
+                    parse_state = A0;
+                    memcpy (pdest,start_code,2);
+                    dest->nFilledLen +=2;
+                    dest_len -= 2;
+                    pdest += 2;
                 }
-            }
 
-            if (match_found)
-            {
-                  source->nFilledLen--;
-                  source->nOffset++;
-                  psource++;
-            }
-            else if (start_code [1] == start_code [0])
-            {
-                 parse_state = A1;
-                 memcpy (pdest,start_code,1);
-                 dest->nFilledLen +=1;
-                 dest_len--;
-                 pdest++;
-            }
-            else
-            {
-                 parse_state = A0;
-                 memcpy (pdest,start_code,2);
-                 dest->nFilledLen +=2;
-                 dest_len -= 2;
-                 pdest += 2;
-            }
+                break;
 
-            break;
+            case A1:
 
-         case A1:
-             if ((*psource & mask_code [1]) == start_code [1])
-             {
-                 parse_state = A2;
-                 source->nFilledLen--;
-                 source->nOffset++;
-                 psource++;
-             }
-             else
-             {
-                 memcpy (pdest,start_code,1);
-                 dest->nFilledLen +=1;
-                 pdest++;
-                 dest_len--;
-                 parse_state = A0;
-             }
-             break;
-         case A4:
-         case A0:
-         case A5:
-             break;
+                if ((*psource & mask_code [1]) == start_code [1]) {
+                    parse_state = A2;
+                    source->nFilledLen--;
+                    source->nOffset++;
+                    psource++;
+                } else {
+                    memcpy (pdest,start_code,1);
+                    dest->nFilledLen +=1;
+                    pdest++;
+                    dest_len--;
+                    parse_state = A0;
+                }
+
+                break;
+            case A4:
+            case A0:
+            case A5:
+                break;
         }
+
         dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
     }
 
-     if (parse_state == A4 || parse_state == A5)
-     {
-         *partialframe = 0;
-         check_skip_frame_boundary(partialframe);
-         DEBUG_PRINT_LOW("\n FrameParser: Parsed Len = %d", dest->nFilledLen);
-         return 1;
-     }
+    if (parse_state == A4 || parse_state == A5) {
+        *partialframe = 0;
+        check_skip_frame_boundary(partialframe);
+        DEBUG_PRINT_LOW("\n FrameParser: Parsed Len = %d", dest->nFilledLen);
+        return 1;
+    }
 
-     /*Partial Frame is true*/
-     *partialframe = 1;
+    /*Partial Frame is true*/
+    *partialframe = 1;
 
     /*Calculate how many bytes are left in source and destination*/
     dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
@@ -364,266 +341,241 @@
     temp_len = (source_len < dest_len)?source_len:dest_len;
 
     /*Check if entry state machine consumed source or destination*/
-    if (temp_len == 0)
-    {
+    if (temp_len == 0) {
         return 1;
     }
 
     /*Parsing State Machine*/
-    while  (parsed_length < temp_len)
-    {
-      switch (parse_state)
-      {
-      case A0:
-          if ((psource [parsed_length] & mask_code [0])  == start_code[0])
-          {
-            parse_state = A1;
-          }
-          parsed_length++;
-          break;
-      case A1:
-          if ((psource [parsed_length] & mask_code [1]) == start_code [1])
-          {
-            parsed_length++;
-            parse_state = A2;
-          }
-          else
-          {
-            parse_state = A0;
-          }
-      break;
-      case A2:
-          is_byte_match = ((psource[parsed_length] & mask_code [2]) == start_code [2]);
-          match_found = FALSE;
+    while  (parsed_length < temp_len) {
+        switch (parse_state) {
+            case A0:
 
-          if (start_code == H263_start_code)
-          {
-              if (is_byte_match)
-              {
-                  last_byte_h263 = psource[parsed_length];
-                  parse_state = A5;
-                  match_found = TRUE;
-              }
-          }
-          else if (start_code == H264_start_code &&
-              (psource[parsed_length] & mask_code [3]) == start_code [3])
-          {
-              parse_state = A5;
-              match_found = TRUE;
-          }
-          else
-          {
-              if(is_byte_match)
-              {
-                parse_state = A3;
-                match_found = TRUE;
-              }
-          }
+                if ((psource [parsed_length] & mask_code [0])  == start_code[0]) {
+                    parse_state = A1;
+                }
 
-          if (match_found)
-          {
-              parsed_length++;
-          }
-          else if (start_code [1] == start_code [0])
-          {
-               parse_state = A1;
-          }
-          else
-          {
-               parse_state = A0;
-          }
+                parsed_length++;
+                break;
+            case A1:
 
-          break;
-      case A3:
-          parse_additional_start_code(psource,&parsed_length);
-          if (parse_state == A4) break;
+                if ((psource [parsed_length] & mask_code [1]) == start_code [1]) {
+                    parsed_length++;
+                    parse_state = A2;
+                } else {
+                    parse_state = A0;
+                }
 
-          if ((psource [parsed_length] & mask_code [3]) == start_code [3])
-          {
-            last_byte = psource [parsed_length];
-            parsed_length++;
-            parse_state = A4;
-          }
-          else if ((start_code [1] == start_code [0]) && (start_code [2] == start_code [1]))
-          {
-             parse_state = A2;
-          }
-          else if (start_code [2] == start_code [0])
-          {
-              parse_state = A1;
-          }
-          else
-          {
-              parse_state = A0;
-          }
-          break;
-       case A4:
-       case A5:
-          break;
-      }
+                break;
+            case A2:
+                is_byte_match = ((psource[parsed_length] & mask_code [2]) == start_code [2]);
+                match_found = FALSE;
 
-      /*Found the code break*/
-      if (parse_state == A4 || parse_state == A5)
-      {
-          break;
-      }
+                if (start_code == H263_start_code) {
+                    if (is_byte_match) {
+                        last_byte_h263 = psource[parsed_length];
+                        parse_state = A5;
+                        match_found = TRUE;
+                    }
+                } else if (start_code == H264_start_code &&
+                        (psource[parsed_length] & mask_code [3]) == start_code [3]) {
+                    parse_state = A5;
+                    match_found = TRUE;
+                } else {
+                    if (is_byte_match) {
+                        parse_state = A3;
+                        match_found = TRUE;
+                    }
+                }
+
+                if (match_found) {
+                    parsed_length++;
+                } else if (start_code [1] == start_code [0]) {
+                    parse_state = A1;
+                } else {
+                    parse_state = A0;
+                }
+
+                break;
+            case A3:
+                parse_additional_start_code(psource,&parsed_length);
+
+                if (parse_state == A4) break;
+
+                if ((psource [parsed_length] & mask_code [3]) == start_code [3]) {
+                    last_byte = psource [parsed_length];
+                    parsed_length++;
+                    parse_state = A4;
+                } else if ((start_code [1] == start_code [0]) && (start_code [2] == start_code [1])) {
+                    parse_state = A2;
+                } else if (start_code [2] == start_code [0]) {
+                    parse_state = A1;
+                } else {
+                    parse_state = A0;
+                }
+
+                break;
+            case A4:
+            case A5:
+                break;
+        }
+
+        /*Found the code break*/
+        if (parse_state == A4 || parse_state == A5) {
+            break;
+        }
     }
 
     /*Exit State Machine*/
     psource = source->pBuffer + source->nOffset;
-    switch (parse_state)
-    {
-    case A5:
-      *partialframe = 0;
-      check_skip_frame_boundary(partialframe);
-      if (parsed_length > 3)
-      {
-        memcpy (pdest,psource,(parsed_length-3));
-        dest->nFilledLen += (parsed_length-3);
-      }
-      break;
-    case A4:
-      *partialframe = 0;
-      check_skip_frame_boundary(partialframe);
-      if (parsed_length > 4)
-      {
-        memcpy (pdest,psource,(parsed_length-4));
-        dest->nFilledLen += (parsed_length-4);
-      }
-      break;
-    case A3:
-      if (parsed_length > 3)
-      {
-        memcpy (pdest,psource,(parsed_length-3));
-        dest->nFilledLen += (parsed_length-3);
-      }
-      break;
-    case A2:
-        if (parsed_length > 2)
-        {
-          memcpy (pdest,psource,(parsed_length-2));
-          dest->nFilledLen += (parsed_length-2);
-        }
-      break;
-    case A1:
-        if (parsed_length > 1)
-        {
-          memcpy (pdest,psource,(parsed_length-1));
-          dest->nFilledLen += (parsed_length-1);
-        }
-      break;
-    case A0:
-      memcpy (pdest,psource,(parsed_length));
-      dest->nFilledLen += (parsed_length);
-      break;
+
+    switch (parse_state) {
+        case A5:
+            *partialframe = 0;
+            check_skip_frame_boundary(partialframe);
+
+            if (parsed_length > 3) {
+                memcpy (pdest,psource,(parsed_length-3));
+                dest->nFilledLen += (parsed_length-3);
+            }
+
+            break;
+        case A4:
+            *partialframe = 0;
+            check_skip_frame_boundary(partialframe);
+
+            if (parsed_length > 4) {
+                memcpy (pdest,psource,(parsed_length-4));
+                dest->nFilledLen += (parsed_length-4);
+            }
+
+            break;
+        case A3:
+
+            if (parsed_length > 3) {
+                memcpy (pdest,psource,(parsed_length-3));
+                dest->nFilledLen += (parsed_length-3);
+            }
+
+            break;
+        case A2:
+
+            if (parsed_length > 2) {
+                memcpy (pdest,psource,(parsed_length-2));
+                dest->nFilledLen += (parsed_length-2);
+            }
+
+            break;
+        case A1:
+
+            if (parsed_length > 1) {
+                memcpy (pdest,psource,(parsed_length-1));
+                dest->nFilledLen += (parsed_length-1);
+            }
+
+            break;
+        case A0:
+            memcpy (pdest,psource,(parsed_length));
+            dest->nFilledLen += (parsed_length);
+            break;
     }
 
-     if (source->nFilledLen < parsed_length)
-     {
-         printf ("\n FATAL Error");
-         return -1;
-     }
-      source->nFilledLen -= parsed_length;
-      source->nOffset += parsed_length;
+    if (source->nFilledLen < parsed_length) {
+        printf ("\n FATAL Error");
+        return -1;
+    }
+
+    source->nFilledLen -= parsed_length;
+    source->nOffset += parsed_length;
 
     return 1;
 }
 
 
 int frame_parse::parse_h264_nallength (OMX_BUFFERHEADERTYPE *source,
-                                       OMX_BUFFERHEADERTYPE *dest ,
-                                       OMX_U32 *partialframe)
+        OMX_BUFFERHEADERTYPE *dest ,
+        OMX_U32 *partialframe)
 {
     OMX_U8 *pdest = NULL,*psource = NULL;
     OMX_U32 dest_len =0, source_len = 0, temp_len = 0,parsed_length = 0;
 
-   if (source == NULL || dest == NULL || partialframe == NULL)
-   {
-       return -1;
-   }
+    if (source == NULL || dest == NULL || partialframe == NULL) {
+        return -1;
+    }
 
-   /*Calculate the length's*/
-   dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
-   source_len = source->nFilledLen;
+    /*Calculate the length's*/
+    dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
+    source_len = source->nFilledLen;
 
-   if (dest_len < 4 || source_len == 0 || nal_length == 0)
-   {
-       DEBUG_PRINT_LOW("\n FrameParser: NAL Parsing Error! dest_len %d "
-           "source_len %d nal_length %d", dest_len, source_len, nal_length);
-       return -1;
-   }
-   *partialframe = 1;
-   temp_len = (source_len < dest_len)?source_len:dest_len;
-   psource = source->pBuffer + source->nOffset;
-   pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
+    if (dest_len < 4 || source_len == 0 || nal_length == 0) {
+        DEBUG_PRINT_LOW("\n FrameParser: NAL Parsing Error! dest_len %d "
+                "source_len %d nal_length %d", dest_len, source_len, nal_length);
+        return -1;
+    }
 
-   /* Find the Bytes to Accumalte*/
-   if (state_nal == NAL_LENGTH_ACC)
-   {
-      while (parsed_length < temp_len )
-      {
-        bytes_tobeparsed |= (((OMX_U32)(*psource))) << (((nal_length-accum_length-1) << 3));
+    *partialframe = 1;
+    temp_len = (source_len < dest_len)?source_len:dest_len;
+    psource = source->pBuffer + source->nOffset;
+    pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
 
-        /*COPY THE DATA FOR C-SIM TO BE REOMVED ON TARGET*/
-        //*pdest = *psource;
-        accum_length++;
-        source->nFilledLen--;
-        source->nOffset++;
-        psource++;
-        //dest->nFilledLen++;
-        //pdest++;
-        parsed_length++;
+    /* Find the Bytes to Accumalte*/
+    if (state_nal == NAL_LENGTH_ACC) {
+        while (parsed_length < temp_len ) {
+            bytes_tobeparsed |= (((OMX_U32)(*psource))) << (((nal_length-accum_length-1) << 3));
 
-        if (accum_length == nal_length)
-        {
-            accum_length = 0;
-            state_nal = NAL_PARSING;
-            memcpy (pdest,H264_start_code,4);
-            dest->nFilledLen += 4;
-            break;
+            /*COPY THE DATA FOR C-SIM TO BE REOMVED ON TARGET*/
+            //*pdest = *psource;
+            accum_length++;
+            source->nFilledLen--;
+            source->nOffset++;
+            psource++;
+            //dest->nFilledLen++;
+            //pdest++;
+            parsed_length++;
+
+            if (accum_length == nal_length) {
+                accum_length = 0;
+                state_nal = NAL_PARSING;
+                memcpy (pdest,H264_start_code,4);
+                dest->nFilledLen += 4;
+                break;
+            }
         }
-      }
-   }
+    }
 
-   dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
-   source_len = source->nFilledLen;
-   temp_len = (source_len < dest_len)?source_len:dest_len;
+    dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
+    source_len = source->nFilledLen;
+    temp_len = (source_len < dest_len)?source_len:dest_len;
 
-   psource = source->pBuffer + source->nOffset;
-   pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
+    psource = source->pBuffer + source->nOffset;
+    pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
 
-   dest->nTimeStamp = source->nTimeStamp;
-   dest->nFlags = source->nFlags;
+    dest->nTimeStamp = source->nTimeStamp;
+    dest->nFlags = source->nFlags;
 
-   /*Already in Parsing state go ahead and copy*/
-   if(state_nal == NAL_PARSING && temp_len > 0)
-   {
-     if (temp_len < bytes_tobeparsed)
-     {
-         memcpy (pdest,psource,temp_len);
-         dest->nFilledLen += temp_len;
-         source->nOffset += temp_len;
-         source->nFilledLen -= temp_len;
-         bytes_tobeparsed -= temp_len;
-     }
-     else
-     {
-         memcpy (pdest,psource,bytes_tobeparsed);
-         temp_len -= bytes_tobeparsed;
-         dest->nFilledLen += bytes_tobeparsed;
-         source->nOffset += bytes_tobeparsed;
-         source->nFilledLen -= bytes_tobeparsed;
-         bytes_tobeparsed = 0;
-     }
-   }
+    /*Already in Parsing state go ahead and copy*/
+    if (state_nal == NAL_PARSING && temp_len > 0) {
+        if (temp_len < bytes_tobeparsed) {
+            memcpy (pdest,psource,temp_len);
+            dest->nFilledLen += temp_len;
+            source->nOffset += temp_len;
+            source->nFilledLen -= temp_len;
+            bytes_tobeparsed -= temp_len;
+        } else {
+            memcpy (pdest,psource,bytes_tobeparsed);
+            temp_len -= bytes_tobeparsed;
+            dest->nFilledLen += bytes_tobeparsed;
+            source->nOffset += bytes_tobeparsed;
+            source->nFilledLen -= bytes_tobeparsed;
+            bytes_tobeparsed = 0;
+        }
+    }
 
-   if (bytes_tobeparsed == 0 && state_nal == NAL_PARSING)
-   {
-       *partialframe = 0;
-       state_nal = NAL_LENGTH_ACC;
-   }
+    if (bytes_tobeparsed == 0 && state_nal == NAL_PARSING) {
+        *partialframe = 0;
+        state_nal = NAL_LENGTH_ACC;
+    }
 
-   return 1;
+    return 1;
 }
 
 void frame_parse::flush ()
@@ -637,28 +589,27 @@
 }
 
 void frame_parse::parse_additional_start_code(OMX_U8 *psource,
-                OMX_U32 *parsed_length)
+        OMX_U32 *parsed_length)
 {
 
     if (((start_code == MPEG4_start_code) ||
-        (start_code == MPEG2_start_code)) &&
-        psource &&
-        parsed_length)
-    {
+                (start_code == MPEG2_start_code)) &&
+            psource &&
+            parsed_length) {
         OMX_U32 index = *parsed_length;
+
         if ((start_code == MPEG4_start_code &&
-            (psource [index] & 0xF0) == 0x20) ||
-            (start_code == MPEG2_start_code &&
-            psource [index] == 0xB3))
-        {
-            if (header_found)
-            {
+                    (psource [index] & 0xF0) == 0x20) ||
+                (start_code == MPEG2_start_code &&
+                 psource [index] == 0xB3)) {
+            if (header_found) {
                 last_byte = psource [index];
                 index++;
                 parse_state = A4;
             } else
                 header_found = true;
         }
+
         *parsed_length = index;
     }
 }
@@ -666,12 +617,14 @@
 void frame_parse::check_skip_frame_boundary(OMX_U32 *partialframe)
 {
     if ((start_code == MPEG4_start_code ||
-          start_code == MPEG2_start_code) &&
-          partialframe) {
+                start_code == MPEG2_start_code) &&
+            partialframe) {
 
         *partialframe = 1;
+
         if (!skip_frame_boundary)
-           *partialframe = 0;
+            *partialframe = 0;
+
         skip_frame_boundary = false;
     }
 }
@@ -679,9 +632,9 @@
 void frame_parse::update_skip_frame()
 {
     if (((start_code == MPEG4_start_code) &&
-        ((last_byte & 0xF0) == 0x20)) ||
-        ((start_code == MPEG2_start_code) &&
-        (last_byte == 0xB3))) {
+                ((last_byte & 0xF0) == 0x20)) ||
+            ((start_code == MPEG2_start_code) &&
+             (last_byte == 0xB3))) {
 
         skip_frame_boundary = true;
     }
diff --git a/mm-video-v4l2/vidc/vdec/src/h264_utils.cpp b/mm-video-v4l2/vidc/vdec/src/h264_utils.cpp
index d689162..1a95e11 100644
--- a/mm-video-v4l2/vidc/vdec/src/h264_utils.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/h264_utils.cpp
@@ -53,27 +53,27 @@
 #include <sys/time.h>
 #ifdef _ANDROID_
 #include <cutils/properties.h>
-    extern "C"{
-        #include<utils/Log.h>
-    }
+extern "C" {
+#include<utils/Log.h>
+}
 
 #endif
 
 /* =======================================================================
 
-                DEFINITIONS AND DECLARATIONS FOR MODULE
+   DEFINITIONS AND DECLARATIONS FOR MODULE
 
-This section contains definitions for constants, macros, types, variables
-and other items needed by this module.
+   This section contains definitions for constants, macros, types, variables
+   and other items needed by this module.
 
-========================================================================== */
+   ========================================================================== */
 
 
 #define MAX_SUPPORTED_LEVEL 32
 
-RbspParser::RbspParser (const uint8 *_begin, const uint8 *_end)
+    RbspParser::RbspParser (const uint8 *_begin, const uint8 *_end)
 : begin (_begin), end(_end), pos (- 1), bit (0),
-cursor (0xFFFFFF), advanceNeeded (true)
+    cursor (0xFFFFFF), advanceNeeded (true)
 {
 }
 
@@ -96,8 +96,7 @@
 {
     ++pos;
     //if (pos >= stop)
-    if (begin + pos == end)
-    {
+    if (begin + pos == end) {
         /*lint -e{730}  Boolean argument to function
          * I don't see a problem here
          */
@@ -107,8 +106,7 @@
     cursor <<= 8;
     //cursor |= static_cast<uint32> (*pos);
     cursor |= static_cast<uint32> (begin[pos]);
-    if ((cursor & 0xFFFFFF) == 0x000003)
-    {
+    if ((cursor & 0xFFFFFF) == 0x000003) {
         advance ();
     }
     advanceNeeded = false;
@@ -118,18 +116,16 @@
 uint32 RbspParser::u (uint32 n)
 {
     uint32 i, s, x = 0;
-    for (i = 0; i < n; i += s)
-    {
+    for (i = 0; i < n; i += s) {
         s = static_cast<uint32>STD_MIN(static_cast<int>(8 - bit),
-            static_cast<int>(n - i));
+                static_cast<int>(n - i));
         x <<= s;
 
         x |= ((next () >> ((8 - static_cast<uint32>(bit)) - s)) &
-            ((1 << s) - 1));
+                ((1 << s) - 1));
 
         bit = (bit + s) % 8;
-        if (!bit)
-        {
+        if (!bit) {
             advanceNeeded = true;
         }
     }
@@ -140,8 +136,7 @@
 uint32 RbspParser::ue ()
 {
     int leadingZeroBits = -1;
-    for (uint32 b = 0; !b; ++leadingZeroBits)
-    {
+    for (uint32 b = 0; !b; ++leadingZeroBits) {
         b = u (1);
     }
     return ((1 << leadingZeroBits) - 1) +
@@ -165,212 +160,202 @@
 }
 
 H264_Utils::H264_Utils(): m_height(0),
-                          m_width(0),
-                          m_rbspBytes(NULL),
-                          m_au_data (false)
+    m_width(0),
+    m_rbspBytes(NULL),
+    m_au_data (false)
 {
     initialize_frame_checking_environment();
 }
 
 H264_Utils::~H264_Utils()
 {
-/*  if(m_pbits)
-  {
-    delete(m_pbits);
-    m_pbits = NULL;
-  }
-*/
-  if (m_rbspBytes)
-  {
-    free(m_rbspBytes);
-    m_rbspBytes = NULL;
-  }
+    /*  if(m_pbits)
+        {
+        delete(m_pbits);
+        m_pbits = NULL;
+        }
+     */
+    if (m_rbspBytes) {
+        free(m_rbspBytes);
+        m_rbspBytes = NULL;
+    }
 }
 
 /***********************************************************************/
 /*
 FUNCTION:
-  H264_Utils::initialize_frame_checking_environment
+H264_Utils::initialize_frame_checking_environment
 
 DESCRIPTION:
-  Extract RBSP data from a NAL
+Extract RBSP data from a NAL
 
 INPUT/OUTPUT PARAMETERS:
-  None
+None
 
 RETURN VALUE:
-  boolean
+boolean
 
 SIDE EFFECTS:
-  None.
-*/
+None.
+ */
 /***********************************************************************/
 void H264_Utils::initialize_frame_checking_environment()
 {
-  m_forceToStichNextNAL = false;
-  m_au_data = false;
-  m_prv_nalu.nal_ref_idc = 0;
-  m_prv_nalu.nalu_type = NALU_TYPE_UNSPECIFIED;
+    m_forceToStichNextNAL = false;
+    m_au_data = false;
+    m_prv_nalu.nal_ref_idc = 0;
+    m_prv_nalu.nalu_type = NALU_TYPE_UNSPECIFIED;
 }
 
 /***********************************************************************/
 /*
 FUNCTION:
-  H264_Utils::extract_rbsp
+H264_Utils::extract_rbsp
 
 DESCRIPTION:
-  Extract RBSP data from a NAL
+Extract RBSP data from a NAL
 
 INPUT/OUTPUT PARAMETERS:
-  <In>
-    buffer : buffer containing start code or nal length + NAL units
-    buffer_length : the length of the NAL buffer
-    start_code : If true, start code is detected,
-                 otherwise size nal length is detected
-    size_of_nal_length_field: size of nal length field
+<In>
+buffer : buffer containing start code or nal length + NAL units
+buffer_length : the length of the NAL buffer
+start_code : If true, start code is detected,
+otherwise size nal length is detected
+size_of_nal_length_field: size of nal length field
 
-  <Out>
-    rbsp_bistream : extracted RBSP bistream
-    rbsp_length : the length of the RBSP bitstream
-    nal_unit : decoded NAL header information
+<Out>
+rbsp_bistream : extracted RBSP bistream
+rbsp_length : the length of the RBSP bitstream
+nal_unit : decoded NAL header information
 
 RETURN VALUE:
-  boolean
+boolean
 
 SIDE EFFECTS:
-  None.
-*/
+None.
+ */
 /***********************************************************************/
 
 boolean H264_Utils::extract_rbsp(OMX_IN   OMX_U8  *buffer,
-                                 OMX_IN   OMX_U32 buffer_length,
-                                 OMX_IN   OMX_U32 size_of_nal_length_field,
-                                 OMX_OUT  OMX_U8  *rbsp_bistream,
-                                 OMX_OUT  OMX_U32 *rbsp_length,
-                                 OMX_OUT  NALU    *nal_unit)
+        OMX_IN   OMX_U32 buffer_length,
+        OMX_IN   OMX_U32 size_of_nal_length_field,
+        OMX_OUT  OMX_U8  *rbsp_bistream,
+        OMX_OUT  OMX_U32 *rbsp_length,
+        OMX_OUT  NALU    *nal_unit)
 {
-  byte coef1, coef2, coef3;
-  uint32 pos = 0;
-  uint32 nal_len = buffer_length;
-  uint32 sizeofNalLengthField = 0;
-  uint32 zero_count;
-  boolean eRet = true;
-  boolean start_code = (size_of_nal_length_field==0)?true:false;
+    byte coef1, coef2, coef3;
+    uint32 pos = 0;
+    uint32 nal_len = buffer_length;
+    uint32 sizeofNalLengthField = 0;
+    uint32 zero_count;
+    boolean eRet = true;
+    boolean start_code = (size_of_nal_length_field==0)?true:false;
 
-  if(start_code) {
-    // Search start_code_prefix_one_3bytes (0x000001)
-    coef2 = buffer[pos++];
-    coef3 = buffer[pos++];
-    do {
-      if(pos >= buffer_length)
-      {
+    if (start_code) {
+        // Search start_code_prefix_one_3bytes (0x000001)
+        coef2 = buffer[pos++];
+        coef3 = buffer[pos++];
+        do {
+            if (pos >= buffer_length) {
+                ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
+                return false;
+            }
+
+            coef1 = coef2;
+            coef2 = coef3;
+            coef3 = buffer[pos++];
+        } while (coef1 || coef2 || coef3 != 1);
+    } else if (size_of_nal_length_field) {
+        /* This is the case to play multiple NAL units inside each access unit*/
+        /* Extract the NAL length depending on sizeOfNALength field */
+        sizeofNalLengthField = size_of_nal_length_field;
+        nal_len = 0;
+        while (size_of_nal_length_field--) {
+            nal_len |= buffer[pos++]<<(size_of_nal_length_field<<3);
+        }
+        if (nal_len >= buffer_length) {
+            ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
+            return false;
+        }
+    }
+
+    if (nal_len > buffer_length) {
         ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
         return false;
-      }
-
-      coef1 = coef2;
-      coef2 = coef3;
-      coef3 = buffer[pos++];
-    } while(coef1 || coef2 || coef3 != 1);
-  }
-  else if (size_of_nal_length_field)
-  {
-    /* This is the case to play multiple NAL units inside each access unit*/
-    /* Extract the NAL length depending on sizeOfNALength field */
-    sizeofNalLengthField = size_of_nal_length_field;
-    nal_len = 0;
-    while(size_of_nal_length_field--)
-    {
-      nal_len |= buffer[pos++]<<(size_of_nal_length_field<<3);
     }
-    if (nal_len >= buffer_length)
-    {
-      ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
-      return false;
+    if (pos + 1 > (nal_len + sizeofNalLengthField)) {
+        ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
+        return false;
     }
-  }
-
-  if (nal_len > buffer_length)
-  {
-    ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
-    return false;
-  }
-  if(pos + 1 > (nal_len + sizeofNalLengthField))
-  {
-    ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
-    return false;
-  }
-  if ((nal_unit->forbidden_zero_bit = (buffer[pos] & 0x80)) != 0)
-  {
-    ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
-  }
-  nal_unit->nal_ref_idc   = (buffer[pos] & 0x60) >> 5;
-  nal_unit->nalu_type = buffer[pos++] & 0x1f;
-  ALOGV("\n@#@# Pos = %x NalType = %x buflen = %d",
-      pos-1, nal_unit->nalu_type, buffer_length);
-  *rbsp_length = 0;
+    if ((nal_unit->forbidden_zero_bit = (buffer[pos] & 0x80)) != 0) {
+        ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
+    }
+    nal_unit->nal_ref_idc   = (buffer[pos] & 0x60) >> 5;
+    nal_unit->nalu_type = buffer[pos++] & 0x1f;
+    ALOGV("\n@#@# Pos = %x NalType = %x buflen = %d",
+            pos-1, nal_unit->nalu_type, buffer_length);
+    *rbsp_length = 0;
 
 
-  if( nal_unit->nalu_type == NALU_TYPE_EOSEQ ||
-      nal_unit->nalu_type == NALU_TYPE_EOSTREAM)
-    return (nal_len + sizeofNalLengthField);
+    if ( nal_unit->nalu_type == NALU_TYPE_EOSEQ ||
+            nal_unit->nalu_type == NALU_TYPE_EOSTREAM)
+        return (nal_len + sizeofNalLengthField);
 
-  zero_count = 0;
-  while (pos < (nal_len+sizeofNalLengthField))    //similar to for in p-42
-   {
-    if( zero_count == 2 ) {
-      if( buffer[pos] == 0x03 ) {
-        pos ++;
-        zero_count = 0;
-        continue;
-      }
-      if( buffer[pos] <= 0x01 ) {
-        if( start_code ) {
-          *rbsp_length -= 2;
-          pos -= 2;
-          return pos;
+    zero_count = 0;
+    while (pos < (nal_len+sizeofNalLengthField)) {  //similar to for in p-42
+        if ( zero_count == 2 ) {
+            if ( buffer[pos] == 0x03 ) {
+                pos ++;
+                zero_count = 0;
+                continue;
+            }
+            if ( buffer[pos] <= 0x01 ) {
+                if ( start_code ) {
+                    *rbsp_length -= 2;
+                    pos -= 2;
+                    return pos;
+                }
+            }
+            zero_count = 0;
         }
-      }
-      zero_count = 0;
+        zero_count ++;
+        if ( buffer[pos] != 0 )
+            zero_count = 0;
+
+        rbsp_bistream[(*rbsp_length)++] = buffer[pos++];
     }
-    zero_count ++;
-    if( buffer[pos] != 0 )
-      zero_count = 0;
 
-    rbsp_bistream[(*rbsp_length)++] = buffer[pos++];
-  }
-
-  return eRet;
+    return eRet;
 }
 
 /*===========================================================================
 FUNCTION:
-  H264_Utils::iSNewFrame
+H264_Utils::iSNewFrame
 
 DESCRIPTION:
-  Returns true if NAL parsing successfull otherwise false.
+Returns true if NAL parsing successfull otherwise false.
 
 INPUT/OUTPUT PARAMETERS:
-  <In>
-    buffer : buffer containing start code or nal length + NAL units
-    buffer_length : the length of the NAL buffer
-    start_code : If true, start code is detected,
-                 otherwise size nal length is detected
-    size_of_nal_length_field: size of nal length field
-  <out>
-    isNewFrame: true if the NAL belongs to a differenet frame
-                false if the NAL belongs to a current frame
+<In>
+buffer : buffer containing start code or nal length + NAL units
+buffer_length : the length of the NAL buffer
+start_code : If true, start code is detected,
+otherwise size nal length is detected
+size_of_nal_length_field: size of nal length field
+<out>
+isNewFrame: true if the NAL belongs to a differenet frame
+false if the NAL belongs to a current frame
 
 RETURN VALUE:
-  boolean  true, if nal parsing is successful
-           false, if the nal parsing has errors
+boolean  true, if nal parsing is successful
+false, if the nal parsing has errors
 
 SIDE EFFECTS:
-  None.
+None.
 ===========================================================================*/
 bool H264_Utils::isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
-                            OMX_IN OMX_U32 size_of_nal_length_field,
-                            OMX_OUT OMX_BOOL &isNewFrame)
+        OMX_IN OMX_U32 size_of_nal_length_field,
+        OMX_OUT OMX_BOOL &isNewFrame)
 {
     NALU nal_unit;
     uint16 first_mb_in_slice = 0;
@@ -380,80 +365,64 @@
     bool eRet = true;
 
     ALOGV("isNewFrame: buffer %p buffer_length %d "
-        "size_of_nal_length_field %d\n", buffer, buffer_length,
-        size_of_nal_length_field);
+            "size_of_nal_length_field %d\n", buffer, buffer_length,
+            size_of_nal_length_field);
 
     if ( false == extract_rbsp(buffer, buffer_length, size_of_nal_length_field,
-                               m_rbspBytes, &numBytesInRBSP, &nal_unit) )
-    {
+                m_rbspBytes, &numBytesInRBSP, &nal_unit) ) {
         ALOGE("ERROR: In %s() - extract_rbsp() failed", __func__);
         isNewFrame = OMX_FALSE;
         eRet = false;
-    }
-    else
-    {
-      nalu_type = nal_unit.nalu_type;
-      switch (nal_unit.nalu_type)
-      {
-        case NALU_TYPE_IDR:
-        case NALU_TYPE_NON_IDR:
-        {
-          ALOGV("\n AU Boundary with NAL type %d ",nal_unit.nalu_type);
-          if (m_forceToStichNextNAL)
-          {
-            isNewFrame = OMX_FALSE;
-          }
-          else
-          {
-            RbspParser rbsp_parser(m_rbspBytes, (m_rbspBytes+numBytesInRBSP));
-            first_mb_in_slice = rbsp_parser.ue();
+    } else {
+        nalu_type = nal_unit.nalu_type;
+        switch (nal_unit.nalu_type) {
+            case NALU_TYPE_IDR:
+            case NALU_TYPE_NON_IDR: {
+                            ALOGV("\n AU Boundary with NAL type %d ",nal_unit.nalu_type);
+                            if (m_forceToStichNextNAL) {
+                                isNewFrame = OMX_FALSE;
+                            } else {
+                                RbspParser rbsp_parser(m_rbspBytes, (m_rbspBytes+numBytesInRBSP));
+                                first_mb_in_slice = rbsp_parser.ue();
 
-            if((!first_mb_in_slice) || /*(slice.prv_frame_num != slice.frame_num ) ||*/
-               ( (m_prv_nalu.nal_ref_idc != nal_unit.nal_ref_idc) && ( nal_unit.nal_ref_idc * m_prv_nalu.nal_ref_idc == 0 ) ) ||
-               /*( ((m_prv_nalu.nalu_type == NALU_TYPE_IDR) && (nal_unit.nalu_type == NALU_TYPE_IDR)) && (slice.idr_pic_id != slice.prv_idr_pic_id) ) || */
-               ( (m_prv_nalu.nalu_type != nal_unit.nalu_type ) && ((m_prv_nalu.nalu_type == NALU_TYPE_IDR) || (nal_unit.nalu_type == NALU_TYPE_IDR)) ) )
-            {
-              //ALOGV("Found a New Frame due to NALU_TYPE_IDR/NALU_TYPE_NON_IDR");
-              isNewFrame = OMX_TRUE;
-            }
-            else
-            {
-              isNewFrame = OMX_FALSE;
-            }
-          }
-          m_au_data = true;
-          m_forceToStichNextNAL = false;
-          break;
-        }
-        case NALU_TYPE_SPS:
-        case NALU_TYPE_PPS:
-        case NALU_TYPE_SEI:
-        {
-          ALOGV("\n Non-AU boundary with NAL type %d", nal_unit.nalu_type);
-          if(m_au_data)
-          {
-            isNewFrame = OMX_TRUE;
-            m_au_data = false;
-          }
-          else
-          {
-            isNewFrame =  OMX_FALSE;
-          }
+                                if ((!first_mb_in_slice) || /*(slice.prv_frame_num != slice.frame_num ) ||*/
+                                        ( (m_prv_nalu.nal_ref_idc != nal_unit.nal_ref_idc) && ( nal_unit.nal_ref_idc * m_prv_nalu.nal_ref_idc == 0 ) ) ||
+                                        /*( ((m_prv_nalu.nalu_type == NALU_TYPE_IDR) && (nal_unit.nalu_type == NALU_TYPE_IDR)) && (slice.idr_pic_id != slice.prv_idr_pic_id) ) || */
+                                        ( (m_prv_nalu.nalu_type != nal_unit.nalu_type ) && ((m_prv_nalu.nalu_type == NALU_TYPE_IDR) || (nal_unit.nalu_type == NALU_TYPE_IDR)) ) ) {
+                                    //ALOGV("Found a New Frame due to NALU_TYPE_IDR/NALU_TYPE_NON_IDR");
+                                    isNewFrame = OMX_TRUE;
+                                } else {
+                                    isNewFrame = OMX_FALSE;
+                                }
+                            }
+                            m_au_data = true;
+                            m_forceToStichNextNAL = false;
+                            break;
+                        }
+            case NALU_TYPE_SPS:
+            case NALU_TYPE_PPS:
+            case NALU_TYPE_SEI: {
+                            ALOGV("\n Non-AU boundary with NAL type %d", nal_unit.nalu_type);
+                            if (m_au_data) {
+                                isNewFrame = OMX_TRUE;
+                                m_au_data = false;
+                            } else {
+                                isNewFrame =  OMX_FALSE;
+                            }
 
-          m_forceToStichNextNAL = true;
-          break;
-        }
-        case NALU_TYPE_ACCESS_DELIM:
-        case NALU_TYPE_UNSPECIFIED:
-        case NALU_TYPE_EOSEQ:
-        case NALU_TYPE_EOSTREAM:
-        default:
-        {
-          isNewFrame =  OMX_FALSE;
-          // Do not update m_forceToStichNextNAL
-          break;
-        }
-      } // end of switch
+                            m_forceToStichNextNAL = true;
+                            break;
+                        }
+            case NALU_TYPE_ACCESS_DELIM:
+            case NALU_TYPE_UNSPECIFIED:
+            case NALU_TYPE_EOSEQ:
+            case NALU_TYPE_EOSTREAM:
+            default: {
+                     isNewFrame =  OMX_FALSE;
+                     // Do not update m_forceToStichNextNAL
+                     break;
+                 }
+        } // end of switch
     } // end of if
     m_prv_nalu = nal_unit;
     ALOGV("get_h264_nal_type - newFrame value %d\n",isNewFrame);
@@ -462,788 +431,732 @@
 
 void perf_metrics::start()
 {
-  if (!active)
-  {
-    start_time = get_act_time();
-    active = true;
-  }
+    if (!active) {
+        start_time = get_act_time();
+        active = true;
+    }
 }
 
 void perf_metrics::stop()
 {
-  OMX_U64 stop_time = get_act_time();
-  if (active)
-  {
-    proc_time += (stop_time - start_time);
-    active = false;
-  }
+    OMX_U64 stop_time = get_act_time();
+    if (active) {
+        proc_time += (stop_time - start_time);
+        active = false;
+    }
 }
 
 void perf_metrics::end(OMX_U32 units_cntr)
 {
-  stop();
-  ALOGV("--> Processing time : [%.2f] Sec", (float)proc_time / 1e6);
-  if (units_cntr)
-  {
-    ALOGV("--> Avrg proc time  : [%.2f] mSec", proc_time / (float)(units_cntr * 1e3));
-  }
+    stop();
+    ALOGV("--> Processing time : [%.2f] Sec", (float)proc_time / 1e6);
+    if (units_cntr) {
+        ALOGV("--> Avrg proc time  : [%.2f] mSec", proc_time / (float)(units_cntr * 1e3));
+    }
 }
 
 void perf_metrics::reset()
 {
-  start_time = 0;
-  proc_time = 0;
-  active = false;
+    start_time = 0;
+    proc_time = 0;
+    active = false;
 }
 
 OMX_U64 perf_metrics::get_act_time()
 {
-  struct timeval act_time = {0, 0};
-  gettimeofday(&act_time, NULL);
-  return (act_time.tv_usec + act_time.tv_sec * 1e6);
+    struct timeval act_time = {0, 0};
+    gettimeofday(&act_time, NULL);
+    return (act_time.tv_usec + act_time.tv_sec * 1e6);
 }
 
 OMX_U64 perf_metrics::processing_time_us()
 {
-  return proc_time;
+    return proc_time;
 }
 
 h264_stream_parser::h264_stream_parser()
 {
-  reset();
+    reset();
 #ifdef PANSCAN_HDLR
-  panscan_hdl = new panscan_handler();
-  if (!panscan_hdl)
-  {
-    ALOGE("ERROR: Panscan hdl was not allocated!");
-  }
-  else if (!panscan_hdl->initialize(10))
-  {
-    ALOGE("ERROR: Allocating memory for panscan!");
-    delete panscan_hdl;
-    panscan_hdl = NULL;
-  }
+    panscan_hdl = new panscan_handler();
+    if (!panscan_hdl) {
+        ALOGE("ERROR: Panscan hdl was not allocated!");
+    } else if (!panscan_hdl->initialize(10)) {
+        ALOGE("ERROR: Allocating memory for panscan!");
+        delete panscan_hdl;
+        panscan_hdl = NULL;
+    }
 #else
-  memset(&panscan_param, 0, sizeof(panscan_param));
-  panscan_param.rect_id = NO_PAN_SCAN_BIT;
+    memset(&panscan_param, 0, sizeof(panscan_param));
+    panscan_param.rect_id = NO_PAN_SCAN_BIT;
 #endif
 }
 
 h264_stream_parser::~h264_stream_parser()
 {
 #ifdef PANSCAN_HDLR
-  if (panscan_hdl)
-  {
-    delete panscan_hdl;
-    panscan_hdl = NULL;
-  }
+    if (panscan_hdl) {
+        delete panscan_hdl;
+        panscan_hdl = NULL;
+    }
 #endif
 }
 
 void h264_stream_parser::reset()
 {
-  curr_32_bit = 0;
-  bits_read = 0;
-  zero_cntr = 0;
-  emulation_code_skip_cntr = 0;
-  emulation_sc_enabled = true;
-  bitstream = NULL;
-  bitstream_bytes = 0;
-  memset(&vui_param, 0, sizeof(vui_param));
-  vui_param.fixed_fps_prev_ts = LLONG_MAX;
-  memset(&sei_buf_period, 0, sizeof(sei_buf_period));
-  memset(&sei_pic_timing, 0, sizeof(sei_pic_timing));
-  memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement));
-  frame_packing_arrangement.cancel_flag = 1;
-  mbaff_flag = 0;
+    curr_32_bit = 0;
+    bits_read = 0;
+    zero_cntr = 0;
+    emulation_code_skip_cntr = 0;
+    emulation_sc_enabled = true;
+    bitstream = NULL;
+    bitstream_bytes = 0;
+    memset(&vui_param, 0, sizeof(vui_param));
+    vui_param.fixed_fps_prev_ts = LLONG_MAX;
+    memset(&sei_buf_period, 0, sizeof(sei_buf_period));
+    memset(&sei_pic_timing, 0, sizeof(sei_pic_timing));
+    memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement));
+    frame_packing_arrangement.cancel_flag = 1;
+    mbaff_flag = 0;
 }
 
 void h264_stream_parser::init_bitstream(OMX_U8* data, OMX_U32 size)
 {
-  bitstream = data;
-  bitstream_bytes = size;
-  curr_32_bit = 0;
-  bits_read = 0;
-  zero_cntr = 0;
-  emulation_code_skip_cntr = 0;
+    bitstream = data;
+    bitstream_bytes = size;
+    curr_32_bit = 0;
+    bits_read = 0;
+    zero_cntr = 0;
+    emulation_code_skip_cntr = 0;
 }
 
 void h264_stream_parser::parse_vui(bool vui_in_extradata)
 {
-  OMX_U32 value = 0;
-  ALOGV("parse_vui: IN");
-  if (vui_in_extradata)
-    while (!extract_bits(1) && more_bits()); // Discard VUI enable flag
-  if (!more_bits())
-    return;
+    OMX_U32 value = 0;
+    ALOGV("parse_vui: IN");
+    if (vui_in_extradata)
+        while (!extract_bits(1) && more_bits()); // Discard VUI enable flag
+    if (!more_bits())
+        return;
 
-  vui_param.aspect_ratio_info_present_flag = extract_bits(1); //aspect_ratio_info_present_flag
-  if (vui_param.aspect_ratio_info_present_flag)
-  {
-      ALOGV("Aspect Ratio Info present!");
-      aspect_ratio_info();
-  }
-
-  if (extract_bits(1)) //overscan_info_present_flag
-    extract_bits(1); //overscan_appropriate_flag
-  if (extract_bits(1)) //video_signal_type_present_flag
-  {
-    extract_bits(3); //video_format
-    extract_bits(1); //video_full_range_flag
-    if (extract_bits(1)) //colour_description_present_flag
-    {
-      extract_bits(8); //colour_primaries
-      extract_bits(8); //transfer_characteristics
-      extract_bits(8); //matrix_coefficients
+    vui_param.aspect_ratio_info_present_flag = extract_bits(1); //aspect_ratio_info_present_flag
+    if (vui_param.aspect_ratio_info_present_flag) {
+        ALOGV("Aspect Ratio Info present!");
+        aspect_ratio_info();
     }
-  }
-  if (extract_bits(1)) //chroma_location_info_present_flag
-  {
-    uev(); //chroma_sample_loc_type_top_field
-    uev(); //chroma_sample_loc_type_bottom_field
-  }
-  vui_param.timing_info_present_flag = extract_bits(1);
-  if (vui_param.timing_info_present_flag)
-  {
-    vui_param.num_units_in_tick = extract_bits(32);
-    vui_param.time_scale = extract_bits(32);
-    vui_param.fixed_frame_rate_flag = extract_bits(1);
-    ALOGV("Timing info present in VUI!");
-    ALOGV("  num units in tick  : %u", vui_param.num_units_in_tick);
-    ALOGV("  time scale         : %u", vui_param.time_scale);
-    ALOGV("  fixed frame rate   : %u", vui_param.fixed_frame_rate_flag);
-  }
-  vui_param.nal_hrd_parameters_present_flag = extract_bits(1);
-  if (vui_param.nal_hrd_parameters_present_flag)
-  {
-    ALOGV("nal hrd params present!");
-    hrd_parameters(&vui_param.nal_hrd_parameters);
-  }
-  vui_param.vcl_hrd_parameters_present_flag = extract_bits(1);
-  if (vui_param.vcl_hrd_parameters_present_flag)
-  {
-    ALOGV("vcl hrd params present!");
-    hrd_parameters(&vui_param.vcl_hrd_parameters);
-  }
-  if (vui_param.nal_hrd_parameters_present_flag ||
-      vui_param.vcl_hrd_parameters_present_flag)
-    vui_param.low_delay_hrd_flag = extract_bits(1);
-  vui_param.pic_struct_present_flag = extract_bits(1);
-  ALOGV("pic_struct_present_flag : %u", vui_param.pic_struct_present_flag);
-  if (extract_bits(1)) //bitstream_restriction_flag
-  {
-    extract_bits(1); //motion_vectors_over_pic_boundaries_flag
-    uev(); //max_bytes_per_pic_denom
-    uev(); //max_bits_per_mb_denom
-    uev(); //log2_max_mv_length_vertical
-    uev(); //log2_max_mv_length_horizontal
-    uev(); //num_reorder_frames
-    uev(); //max_dec_frame_buffering
-  }
-  ALOGV("parse_vui: OUT");
+
+    if (extract_bits(1)) //overscan_info_present_flag
+        extract_bits(1); //overscan_appropriate_flag
+    if (extract_bits(1)) { //video_signal_type_present_flag
+        extract_bits(3); //video_format
+        extract_bits(1); //video_full_range_flag
+        if (extract_bits(1)) { //colour_description_present_flag
+            extract_bits(8); //colour_primaries
+            extract_bits(8); //transfer_characteristics
+            extract_bits(8); //matrix_coefficients
+        }
+    }
+    if (extract_bits(1)) { //chroma_location_info_present_flag
+        uev(); //chroma_sample_loc_type_top_field
+        uev(); //chroma_sample_loc_type_bottom_field
+    }
+    vui_param.timing_info_present_flag = extract_bits(1);
+    if (vui_param.timing_info_present_flag) {
+        vui_param.num_units_in_tick = extract_bits(32);
+        vui_param.time_scale = extract_bits(32);
+        vui_param.fixed_frame_rate_flag = extract_bits(1);
+        ALOGV("Timing info present in VUI!");
+        ALOGV("  num units in tick  : %u", vui_param.num_units_in_tick);
+        ALOGV("  time scale         : %u", vui_param.time_scale);
+        ALOGV("  fixed frame rate   : %u", vui_param.fixed_frame_rate_flag);
+    }
+    vui_param.nal_hrd_parameters_present_flag = extract_bits(1);
+    if (vui_param.nal_hrd_parameters_present_flag) {
+        ALOGV("nal hrd params present!");
+        hrd_parameters(&vui_param.nal_hrd_parameters);
+    }
+    vui_param.vcl_hrd_parameters_present_flag = extract_bits(1);
+    if (vui_param.vcl_hrd_parameters_present_flag) {
+        ALOGV("vcl hrd params present!");
+        hrd_parameters(&vui_param.vcl_hrd_parameters);
+    }
+    if (vui_param.nal_hrd_parameters_present_flag ||
+            vui_param.vcl_hrd_parameters_present_flag)
+        vui_param.low_delay_hrd_flag = extract_bits(1);
+    vui_param.pic_struct_present_flag = extract_bits(1);
+    ALOGV("pic_struct_present_flag : %u", vui_param.pic_struct_present_flag);
+    if (extract_bits(1)) { //bitstream_restriction_flag
+        extract_bits(1); //motion_vectors_over_pic_boundaries_flag
+        uev(); //max_bytes_per_pic_denom
+        uev(); //max_bits_per_mb_denom
+        uev(); //log2_max_mv_length_vertical
+        uev(); //log2_max_mv_length_horizontal
+        uev(); //num_reorder_frames
+        uev(); //max_dec_frame_buffering
+    }
+    ALOGV("parse_vui: OUT");
 }
 
 void h264_stream_parser::aspect_ratio_info()
 {
-  ALOGV("aspect_ratio_info: IN");
-  OMX_U32  aspect_ratio_idc = 0;
-  OMX_U32  aspect_ratio_x = 0;
-  OMX_U32  aspect_ratio_y = 0;
-  aspect_ratio_idc = extract_bits(8); //aspect_ratio_idc
-  switch (aspect_ratio_idc)
-  {
-    case 1:
-      aspect_ratio_x = 1;
-      aspect_ratio_y = 1;
-      break;
-    case 2:
-      aspect_ratio_x = 12;
-      aspect_ratio_y = 11;
-      break;
-    case 3:
-      aspect_ratio_x = 10;
-      aspect_ratio_y = 11;
-      break;
-    case 4:
-      aspect_ratio_x = 16;
-      aspect_ratio_y = 11;
-      break;
-    case 5:
-      aspect_ratio_x = 40;
-      aspect_ratio_y = 33;
-      break;
-    case 6:
-      aspect_ratio_x = 24;
-      aspect_ratio_y = 11;
-      break;
-    case 7:
-      aspect_ratio_x = 20;
-      aspect_ratio_y = 11;
-      break;
-    case 8:
-      aspect_ratio_x = 32;
-      aspect_ratio_y = 11;
-      break;
-    case 9:
-      aspect_ratio_x = 80;
-      aspect_ratio_y = 33;
-      break;
-    case 10:
-      aspect_ratio_x = 18;
-      aspect_ratio_y = 11;
-      break;
-    case 11:
-      aspect_ratio_x = 15;
-      aspect_ratio_y = 11;
-      break;
-    case 12:
-      aspect_ratio_x = 64;
-      aspect_ratio_y = 33;
-      break;
-    case 13:
-      aspect_ratio_x = 160;
-      aspect_ratio_y = 99;
-      break;
-    case 14:
-      aspect_ratio_x = 4;
-      aspect_ratio_y = 3;
-      break;
-    case 15:
-      aspect_ratio_x = 3;
-      aspect_ratio_y = 2;
-      break;
-    case 16:
-      aspect_ratio_x = 2;
-      aspect_ratio_y = 1;
-      break;
-    case 255:
-      aspect_ratio_x = extract_bits(16); //sar_width
-      aspect_ratio_y = extract_bits(16); //sar_height
-      break;
-    default:
-      ALOGV("-->aspect_ratio_idc: Reserved Value ");
-      break;
-  }
-  ALOGV("-->aspect_ratio_idc        : %u", aspect_ratio_idc);
-  ALOGV("-->aspect_ratio_x          : %u", aspect_ratio_x);
-  ALOGV("-->aspect_ratio_y          : %u", aspect_ratio_y);
-  vui_param.aspect_ratio_info.aspect_ratio_idc = aspect_ratio_idc;
-  vui_param.aspect_ratio_info.aspect_ratio_x = aspect_ratio_x;
-  vui_param.aspect_ratio_info.aspect_ratio_y = aspect_ratio_y;
-  ALOGV("aspect_ratio_info: OUT");
+    ALOGV("aspect_ratio_info: IN");
+    OMX_U32  aspect_ratio_idc = 0;
+    OMX_U32  aspect_ratio_x = 0;
+    OMX_U32  aspect_ratio_y = 0;
+    aspect_ratio_idc = extract_bits(8); //aspect_ratio_idc
+    switch (aspect_ratio_idc) {
+        case 1:
+            aspect_ratio_x = 1;
+            aspect_ratio_y = 1;
+            break;
+        case 2:
+            aspect_ratio_x = 12;
+            aspect_ratio_y = 11;
+            break;
+        case 3:
+            aspect_ratio_x = 10;
+            aspect_ratio_y = 11;
+            break;
+        case 4:
+            aspect_ratio_x = 16;
+            aspect_ratio_y = 11;
+            break;
+        case 5:
+            aspect_ratio_x = 40;
+            aspect_ratio_y = 33;
+            break;
+        case 6:
+            aspect_ratio_x = 24;
+            aspect_ratio_y = 11;
+            break;
+        case 7:
+            aspect_ratio_x = 20;
+            aspect_ratio_y = 11;
+            break;
+        case 8:
+            aspect_ratio_x = 32;
+            aspect_ratio_y = 11;
+            break;
+        case 9:
+            aspect_ratio_x = 80;
+            aspect_ratio_y = 33;
+            break;
+        case 10:
+            aspect_ratio_x = 18;
+            aspect_ratio_y = 11;
+            break;
+        case 11:
+            aspect_ratio_x = 15;
+            aspect_ratio_y = 11;
+            break;
+        case 12:
+            aspect_ratio_x = 64;
+            aspect_ratio_y = 33;
+            break;
+        case 13:
+            aspect_ratio_x = 160;
+            aspect_ratio_y = 99;
+            break;
+        case 14:
+            aspect_ratio_x = 4;
+            aspect_ratio_y = 3;
+            break;
+        case 15:
+            aspect_ratio_x = 3;
+            aspect_ratio_y = 2;
+            break;
+        case 16:
+            aspect_ratio_x = 2;
+            aspect_ratio_y = 1;
+            break;
+        case 255:
+            aspect_ratio_x = extract_bits(16); //sar_width
+            aspect_ratio_y = extract_bits(16); //sar_height
+            break;
+        default:
+            ALOGV("-->aspect_ratio_idc: Reserved Value ");
+            break;
+    }
+    ALOGV("-->aspect_ratio_idc        : %u", aspect_ratio_idc);
+    ALOGV("-->aspect_ratio_x          : %u", aspect_ratio_x);
+    ALOGV("-->aspect_ratio_y          : %u", aspect_ratio_y);
+    vui_param.aspect_ratio_info.aspect_ratio_idc = aspect_ratio_idc;
+    vui_param.aspect_ratio_info.aspect_ratio_x = aspect_ratio_x;
+    vui_param.aspect_ratio_info.aspect_ratio_y = aspect_ratio_y;
+    ALOGV("aspect_ratio_info: OUT");
 }
 
 void h264_stream_parser::hrd_parameters(h264_hrd_param *hrd_param)
 {
-  OMX_U32 idx;
-  ALOGV("hrd_parameters: IN");
-  hrd_param->cpb_cnt = uev() + 1;
-  hrd_param->bit_rate_scale = extract_bits(4);
-  hrd_param->cpb_size_scale = extract_bits(4);
-  ALOGV("-->cpb_cnt        : %u", hrd_param->cpb_cnt);
-  ALOGV("-->bit_rate_scale : %u", hrd_param->bit_rate_scale);
-  ALOGV("-->cpb_size_scale : %u", hrd_param->cpb_size_scale);
-  if (hrd_param->cpb_cnt > MAX_CPB_COUNT)
-  {
-    ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
-    return;
-  }
-  for (idx = 0; idx < hrd_param->cpb_cnt && more_bits(); idx++)
-  {
-    hrd_param->bit_rate_value[idx] = uev() + 1;
-    hrd_param->cpb_size_value[idx] = uev() + 1;
-    hrd_param->cbr_flag[idx] = extract_bits(1);
-    ALOGV("-->bit_rate_value [%d] : %u", idx, hrd_param->bit_rate_value[idx]);
-    ALOGV("-->cpb_size_value [%d] : %u", idx, hrd_param->cpb_size_value[idx]);
-    ALOGV("-->cbr_flag       [%d] : %u", idx, hrd_param->cbr_flag[idx]);
-  }
-  hrd_param->initial_cpb_removal_delay_length = extract_bits(5) + 1;
-  hrd_param->cpb_removal_delay_length = extract_bits(5) + 1;
-  hrd_param->dpb_output_delay_length = extract_bits(5) + 1;
-  hrd_param->time_offset_length = extract_bits(5);
-  ALOGV("-->initial_cpb_removal_delay_length : %u", hrd_param->initial_cpb_removal_delay_length);
-  ALOGV("-->cpb_removal_delay_length         : %u", hrd_param->cpb_removal_delay_length);
-  ALOGV("-->dpb_output_delay_length          : %u", hrd_param->dpb_output_delay_length);
-  ALOGV("-->time_offset_length               : %u", hrd_param->time_offset_length);
-  ALOGV("hrd_parameters: OUT");
+    OMX_U32 idx;
+    ALOGV("hrd_parameters: IN");
+    hrd_param->cpb_cnt = uev() + 1;
+    hrd_param->bit_rate_scale = extract_bits(4);
+    hrd_param->cpb_size_scale = extract_bits(4);
+    ALOGV("-->cpb_cnt        : %u", hrd_param->cpb_cnt);
+    ALOGV("-->bit_rate_scale : %u", hrd_param->bit_rate_scale);
+    ALOGV("-->cpb_size_scale : %u", hrd_param->cpb_size_scale);
+    if (hrd_param->cpb_cnt > MAX_CPB_COUNT) {
+        ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
+        return;
+    }
+    for (idx = 0; idx < hrd_param->cpb_cnt && more_bits(); idx++) {
+        hrd_param->bit_rate_value[idx] = uev() + 1;
+        hrd_param->cpb_size_value[idx] = uev() + 1;
+        hrd_param->cbr_flag[idx] = extract_bits(1);
+        ALOGV("-->bit_rate_value [%d] : %u", idx, hrd_param->bit_rate_value[idx]);
+        ALOGV("-->cpb_size_value [%d] : %u", idx, hrd_param->cpb_size_value[idx]);
+        ALOGV("-->cbr_flag       [%d] : %u", idx, hrd_param->cbr_flag[idx]);
+    }
+    hrd_param->initial_cpb_removal_delay_length = extract_bits(5) + 1;
+    hrd_param->cpb_removal_delay_length = extract_bits(5) + 1;
+    hrd_param->dpb_output_delay_length = extract_bits(5) + 1;
+    hrd_param->time_offset_length = extract_bits(5);
+    ALOGV("-->initial_cpb_removal_delay_length : %u", hrd_param->initial_cpb_removal_delay_length);
+    ALOGV("-->cpb_removal_delay_length         : %u", hrd_param->cpb_removal_delay_length);
+    ALOGV("-->dpb_output_delay_length          : %u", hrd_param->dpb_output_delay_length);
+    ALOGV("-->time_offset_length               : %u", hrd_param->time_offset_length);
+    ALOGV("hrd_parameters: OUT");
 }
 
 void h264_stream_parser::parse_sei()
 {
-  OMX_U32 value = 0, processed_bytes = 0;
-  OMX_U8 *sei_msg_start = bitstream;
-  OMX_U32 sei_unit_size = bitstream_bytes;
-  ALOGV("@@parse_sei: IN sei_unit_size(%u)", sei_unit_size);
-  while ((processed_bytes + 2) < sei_unit_size && more_bits())
-  {
-    init_bitstream(sei_msg_start + processed_bytes, sei_unit_size - processed_bytes);
-    ALOGV("-->NALU_TYPE_SEI");
-    OMX_U32 payload_type = 0, payload_size = 0, aux = 0;
-    do {
-      value = extract_bits(8);
-      payload_type += value;
-      processed_bytes++;
-    } while (value == 0xFF);
-    ALOGV("-->payload_type   : %u", payload_type);
-    do {
-      value = extract_bits(8);
-      payload_size += value;
-      processed_bytes++;
-    } while (value == 0xFF);
-    ALOGV("-->payload_size   : %u", payload_size);
-    if (payload_size > 0)
-    {
-      switch (payload_type)
-      {
-        case BUFFERING_PERIOD:
-          sei_buffering_period();
-        break;
-        case PIC_TIMING:
-          sei_picture_timing();
-        break;
-        case PAN_SCAN_RECT:
-          sei_pan_scan();
-        break;
-        case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT:
-          parse_frame_pack();
-        break;
-        default:
-          ALOGV("-->SEI payload type [%u] not implemented! size[%u]", payload_type, payload_size);
-      }
+    OMX_U32 value = 0, processed_bytes = 0;
+    OMX_U8 *sei_msg_start = bitstream;
+    OMX_U32 sei_unit_size = bitstream_bytes;
+    ALOGV("@@parse_sei: IN sei_unit_size(%u)", sei_unit_size);
+    while ((processed_bytes + 2) < sei_unit_size && more_bits()) {
+        init_bitstream(sei_msg_start + processed_bytes, sei_unit_size - processed_bytes);
+        ALOGV("-->NALU_TYPE_SEI");
+        OMX_U32 payload_type = 0, payload_size = 0, aux = 0;
+        do {
+            value = extract_bits(8);
+            payload_type += value;
+            processed_bytes++;
+        } while (value == 0xFF);
+        ALOGV("-->payload_type   : %u", payload_type);
+        do {
+            value = extract_bits(8);
+            payload_size += value;
+            processed_bytes++;
+        } while (value == 0xFF);
+        ALOGV("-->payload_size   : %u", payload_size);
+        if (payload_size > 0) {
+            switch (payload_type) {
+                case BUFFERING_PERIOD:
+                    sei_buffering_period();
+                    break;
+                case PIC_TIMING:
+                    sei_picture_timing();
+                    break;
+                case PAN_SCAN_RECT:
+                    sei_pan_scan();
+                    break;
+                case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT:
+                    parse_frame_pack();
+                    break;
+                default:
+                    ALOGV("-->SEI payload type [%u] not implemented! size[%u]", payload_type, payload_size);
+            }
+        }
+        processed_bytes += (payload_size + emulation_code_skip_cntr);
+        ALOGV("-->SEI processed_bytes[%u]", processed_bytes);
     }
-    processed_bytes += (payload_size + emulation_code_skip_cntr);
-    ALOGV("-->SEI processed_bytes[%u]", processed_bytes);
-  }
-  ALOGV("@@parse_sei: OUT");
+    ALOGV("@@parse_sei: OUT");
 }
 
 void h264_stream_parser::sei_buffering_period()
 {
-  OMX_U32 idx;
-  OMX_U32 value = 0;
-  h264_hrd_param *hrd_param = NULL;
-  ALOGV("@@sei_buffering_period: IN");
-  value = uev(); // seq_parameter_set_id
-  ALOGV("-->seq_parameter_set_id : %u", value);
-  if (value > 31)
-  {
-    ALOGV("ERROR: Invalid seq_parameter_set_id [%u]!", value);
-    return;
-  }
-  sei_buf_period.is_valid = false;
-  if (vui_param.nal_hrd_parameters_present_flag)
-  {
-    hrd_param = &vui_param.nal_hrd_parameters;
-    if (hrd_param->cpb_cnt > MAX_CPB_COUNT)
-    {
-      ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
-      return;
+    OMX_U32 idx;
+    OMX_U32 value = 0;
+    h264_hrd_param *hrd_param = NULL;
+    ALOGV("@@sei_buffering_period: IN");
+    value = uev(); // seq_parameter_set_id
+    ALOGV("-->seq_parameter_set_id : %u", value);
+    if (value > 31) {
+        ALOGV("ERROR: Invalid seq_parameter_set_id [%u]!", value);
+        return;
     }
-    for (idx = 0; idx < hrd_param->cpb_cnt ; idx++)
-    {
-      sei_buf_period.is_valid = true;
-      sei_buf_period.initial_cpb_removal_delay[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
-      sei_buf_period.initial_cpb_removal_delay_offset[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
-      ALOGV("-->initial_cpb_removal_delay        : %u", sei_buf_period.initial_cpb_removal_delay[idx]);
-      ALOGV("-->initial_cpb_removal_delay_offset : %u", sei_buf_period.initial_cpb_removal_delay_offset[idx]);
+    sei_buf_period.is_valid = false;
+    if (vui_param.nal_hrd_parameters_present_flag) {
+        hrd_param = &vui_param.nal_hrd_parameters;
+        if (hrd_param->cpb_cnt > MAX_CPB_COUNT) {
+            ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
+            return;
+        }
+        for (idx = 0; idx < hrd_param->cpb_cnt ; idx++) {
+            sei_buf_period.is_valid = true;
+            sei_buf_period.initial_cpb_removal_delay[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+            sei_buf_period.initial_cpb_removal_delay_offset[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+            ALOGV("-->initial_cpb_removal_delay        : %u", sei_buf_period.initial_cpb_removal_delay[idx]);
+            ALOGV("-->initial_cpb_removal_delay_offset : %u", sei_buf_period.initial_cpb_removal_delay_offset[idx]);
+        }
     }
-  }
-  if (vui_param.vcl_hrd_parameters_present_flag)
-  {
-    hrd_param = &vui_param.vcl_hrd_parameters;
-    if (hrd_param->cpb_cnt > MAX_CPB_COUNT)
-    {
-      ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
-      return;
+    if (vui_param.vcl_hrd_parameters_present_flag) {
+        hrd_param = &vui_param.vcl_hrd_parameters;
+        if (hrd_param->cpb_cnt > MAX_CPB_COUNT) {
+            ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
+            return;
+        }
+        for (idx = 0; idx < hrd_param->cpb_cnt ; idx++) {
+            sei_buf_period.is_valid = true;
+            sei_buf_period.initial_cpb_removal_delay[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+            sei_buf_period.initial_cpb_removal_delay_offset[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+            ALOGV("-->initial_cpb_removal_delay        : %u", sei_buf_period.initial_cpb_removal_delay[idx]);
+            ALOGV("-->initial_cpb_removal_delay_offset : %u", sei_buf_period.initial_cpb_removal_delay_offset[idx]);
+        }
     }
-    for (idx = 0; idx < hrd_param->cpb_cnt ; idx++)
-    {
-      sei_buf_period.is_valid = true;
-      sei_buf_period.initial_cpb_removal_delay[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
-      sei_buf_period.initial_cpb_removal_delay_offset[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
-      ALOGV("-->initial_cpb_removal_delay        : %u", sei_buf_period.initial_cpb_removal_delay[idx]);
-      ALOGV("-->initial_cpb_removal_delay_offset : %u", sei_buf_period.initial_cpb_removal_delay_offset[idx]);
-    }
-  }
-  sei_buf_period.au_cntr = 0;
-  ALOGV("@@sei_buffering_period: OUT");
+    sei_buf_period.au_cntr = 0;
+    ALOGV("@@sei_buffering_period: OUT");
 }
 
 void h264_stream_parser::sei_picture_timing()
 {
-  ALOGV("@@sei_picture_timing: IN");
-  OMX_U32 time_offset_len = 0, cpb_removal_len = 24, dpb_output_len  = 24;
-  OMX_U8 cbr_flag = 0;
-  sei_pic_timing.is_valid = true;
-  if (vui_param.nal_hrd_parameters_present_flag)
-  {
-    cpb_removal_len = vui_param.nal_hrd_parameters.cpb_removal_delay_length;
-    dpb_output_len = vui_param.nal_hrd_parameters.dpb_output_delay_length;
-    time_offset_len = vui_param.nal_hrd_parameters.time_offset_length;
-    cbr_flag = vui_param.nal_hrd_parameters.cbr_flag[0];
-  }
-  else if (vui_param.vcl_hrd_parameters_present_flag)
-  {
-    cpb_removal_len = vui_param.vcl_hrd_parameters.cpb_removal_delay_length;
-    dpb_output_len = vui_param.vcl_hrd_parameters.dpb_output_delay_length;
-    time_offset_len = vui_param.vcl_hrd_parameters.time_offset_length;
-    cbr_flag = vui_param.vcl_hrd_parameters.cbr_flag[0];
-  }
-  sei_pic_timing.cpb_removal_delay = extract_bits(cpb_removal_len);
-  sei_pic_timing.dpb_output_delay = extract_bits(dpb_output_len);
-  ALOGV("-->cpb_removal_len : %u", cpb_removal_len);
-  ALOGV("-->dpb_output_len  : %u", dpb_output_len);
-  ALOGV("-->cpb_removal_delay : %u", sei_pic_timing.cpb_removal_delay);
-  ALOGV("-->dpb_output_delay  : %u", sei_pic_timing.dpb_output_delay);
-  if (vui_param.pic_struct_present_flag)
-  {
-    sei_pic_timing.pic_struct = extract_bits(4);
-    sei_pic_timing.num_clock_ts = 0;
-    switch (sei_pic_timing.pic_struct)
-    {
-      case 0: case 1: case 2: sei_pic_timing.num_clock_ts = 1; break;
-      case 3: case 4: case 7: sei_pic_timing.num_clock_ts = 2; break;
-      case 5: case 6: case 8: sei_pic_timing.num_clock_ts = 3; break;
-      default:
-        ALOGE("sei_picture_timing: pic_struct invalid!");
+    ALOGV("@@sei_picture_timing: IN");
+    OMX_U32 time_offset_len = 0, cpb_removal_len = 24, dpb_output_len  = 24;
+    OMX_U8 cbr_flag = 0;
+    sei_pic_timing.is_valid = true;
+    if (vui_param.nal_hrd_parameters_present_flag) {
+        cpb_removal_len = vui_param.nal_hrd_parameters.cpb_removal_delay_length;
+        dpb_output_len = vui_param.nal_hrd_parameters.dpb_output_delay_length;
+        time_offset_len = vui_param.nal_hrd_parameters.time_offset_length;
+        cbr_flag = vui_param.nal_hrd_parameters.cbr_flag[0];
+    } else if (vui_param.vcl_hrd_parameters_present_flag) {
+        cpb_removal_len = vui_param.vcl_hrd_parameters.cpb_removal_delay_length;
+        dpb_output_len = vui_param.vcl_hrd_parameters.dpb_output_delay_length;
+        time_offset_len = vui_param.vcl_hrd_parameters.time_offset_length;
+        cbr_flag = vui_param.vcl_hrd_parameters.cbr_flag[0];
     }
-    ALOGV("-->num_clock_ts      : %u", sei_pic_timing.num_clock_ts);
-    for (OMX_U32 i = 0; i < sei_pic_timing.num_clock_ts && more_bits(); i++)
-    {
-      sei_pic_timing.clock_ts_flag = extract_bits(1);
-      if(sei_pic_timing.clock_ts_flag)
-      {
-        ALOGV("-->clock_timestamp present!");
-        sei_pic_timing.ct_type = extract_bits(2);
-        sei_pic_timing.nuit_field_based_flag = extract_bits(1);
-        sei_pic_timing.counting_type = extract_bits(5);
-        sei_pic_timing.full_timestamp_flag = extract_bits(1);
-        sei_pic_timing.discontinuity_flag = extract_bits(1);
-        sei_pic_timing.cnt_dropped_flag = extract_bits(1);
-        sei_pic_timing.n_frames = extract_bits(8);
-        ALOGV("-->f_timestamp_flg   : %u", sei_pic_timing.full_timestamp_flag);
-        ALOGV("-->n_frames          : %u", sei_pic_timing.n_frames);
-        sei_pic_timing.seconds_value = 0;
-        sei_pic_timing.minutes_value = 0;
-        sei_pic_timing.hours_value = 0;
-        if (sei_pic_timing.full_timestamp_flag)
-        {
-          sei_pic_timing.seconds_value = extract_bits(6);
-          sei_pic_timing.minutes_value = extract_bits(6);
-          sei_pic_timing.hours_value = extract_bits(5);
+    sei_pic_timing.cpb_removal_delay = extract_bits(cpb_removal_len);
+    sei_pic_timing.dpb_output_delay = extract_bits(dpb_output_len);
+    ALOGV("-->cpb_removal_len : %u", cpb_removal_len);
+    ALOGV("-->dpb_output_len  : %u", dpb_output_len);
+    ALOGV("-->cpb_removal_delay : %u", sei_pic_timing.cpb_removal_delay);
+    ALOGV("-->dpb_output_delay  : %u", sei_pic_timing.dpb_output_delay);
+    if (vui_param.pic_struct_present_flag) {
+        sei_pic_timing.pic_struct = extract_bits(4);
+        sei_pic_timing.num_clock_ts = 0;
+        switch (sei_pic_timing.pic_struct) {
+            case 0:
+            case 1:
+            case 2:
+                sei_pic_timing.num_clock_ts = 1;
+                break;
+            case 3:
+            case 4:
+            case 7:
+                sei_pic_timing.num_clock_ts = 2;
+                break;
+            case 5:
+            case 6:
+            case 8:
+                sei_pic_timing.num_clock_ts = 3;
+                break;
+            default:
+                ALOGE("sei_picture_timing: pic_struct invalid!");
         }
-        else if (extract_bits(1))
-        {
-          ALOGV("-->seconds_flag enabled!");
-          sei_pic_timing.seconds_value = extract_bits(6);
-          if (extract_bits(1))
-          {
-            ALOGV("-->minutes_flag enabled!");
-            sei_pic_timing.minutes_value = extract_bits(6);
-            if (extract_bits(1))
-            {
-              ALOGV("-->hours_flag enabled!");
-              sei_pic_timing.hours_value = extract_bits(5);
+        ALOGV("-->num_clock_ts      : %u", sei_pic_timing.num_clock_ts);
+        for (OMX_U32 i = 0; i < sei_pic_timing.num_clock_ts && more_bits(); i++) {
+            sei_pic_timing.clock_ts_flag = extract_bits(1);
+            if (sei_pic_timing.clock_ts_flag) {
+                ALOGV("-->clock_timestamp present!");
+                sei_pic_timing.ct_type = extract_bits(2);
+                sei_pic_timing.nuit_field_based_flag = extract_bits(1);
+                sei_pic_timing.counting_type = extract_bits(5);
+                sei_pic_timing.full_timestamp_flag = extract_bits(1);
+                sei_pic_timing.discontinuity_flag = extract_bits(1);
+                sei_pic_timing.cnt_dropped_flag = extract_bits(1);
+                sei_pic_timing.n_frames = extract_bits(8);
+                ALOGV("-->f_timestamp_flg   : %u", sei_pic_timing.full_timestamp_flag);
+                ALOGV("-->n_frames          : %u", sei_pic_timing.n_frames);
+                sei_pic_timing.seconds_value = 0;
+                sei_pic_timing.minutes_value = 0;
+                sei_pic_timing.hours_value = 0;
+                if (sei_pic_timing.full_timestamp_flag) {
+                    sei_pic_timing.seconds_value = extract_bits(6);
+                    sei_pic_timing.minutes_value = extract_bits(6);
+                    sei_pic_timing.hours_value = extract_bits(5);
+                } else if (extract_bits(1)) {
+                    ALOGV("-->seconds_flag enabled!");
+                    sei_pic_timing.seconds_value = extract_bits(6);
+                    if (extract_bits(1)) {
+                        ALOGV("-->minutes_flag enabled!");
+                        sei_pic_timing.minutes_value = extract_bits(6);
+                        if (extract_bits(1)) {
+                            ALOGV("-->hours_flag enabled!");
+                            sei_pic_timing.hours_value = extract_bits(5);
+                        }
+                    }
+                }
+                sei_pic_timing.time_offset = 0;
+                if (time_offset_len > 0)
+                    sei_pic_timing.time_offset = iv(time_offset_len);
+                ALOGV("-->seconds_value     : %u", sei_pic_timing.seconds_value);
+                ALOGV("-->minutes_value     : %u", sei_pic_timing.minutes_value);
+                ALOGV("-->hours_value       : %u", sei_pic_timing.hours_value);
+                ALOGV("-->time_offset       : %d", sei_pic_timing.time_offset);
             }
-          }
         }
-        sei_pic_timing.time_offset = 0;
-        if (time_offset_len > 0)
-          sei_pic_timing.time_offset = iv(time_offset_len);
-        ALOGV("-->seconds_value     : %u", sei_pic_timing.seconds_value);
-        ALOGV("-->minutes_value     : %u", sei_pic_timing.minutes_value);
-        ALOGV("-->hours_value       : %u", sei_pic_timing.hours_value);
-        ALOGV("-->time_offset       : %d", sei_pic_timing.time_offset);
-      }
     }
-  }
-  ALOGV("@@sei_picture_timing: OUT");
+    ALOGV("@@sei_picture_timing: OUT");
 }
 
 void h264_stream_parser::sei_pan_scan()
 {
 #ifdef _ANDROID_
-  char property_value[PROPERTY_VALUE_MAX] = {0};
-  OMX_S32 enable_panscan_log = 0;
-  property_get("vidc.dec.debug.panframedata", property_value, "0");
-  enable_panscan_log = atoi(property_value);
+    char property_value[PROPERTY_VALUE_MAX] = {0};
+    OMX_S32 enable_panscan_log = 0;
+    property_get("vidc.dec.debug.panframedata", property_value, "0");
+    enable_panscan_log = atoi(property_value);
 #endif
 #ifdef PANSCAN_HDLR
-  h264_pan_scan *pan_scan_param = panscan_hdl->get_free();
+    h264_pan_scan *pan_scan_param = panscan_hdl->get_free();
 #else
-  h264_pan_scan *pan_scan_param = &panscan_param;
+    h264_pan_scan *pan_scan_param = &panscan_param;
 #endif
 
-  if (!pan_scan_param)
-  {
-    ALOGE("sei_pan_scan: ERROR: Invalid pointer!");
-    return;
-  }
-
-  pan_scan_param->rect_id = uev();
-  if (pan_scan_param->rect_id > 0xFF)
-  {
-    ALOGE("sei_pan_scan: ERROR: Invalid rect_id[%lu]!", pan_scan_param->rect_id);
-    pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
-    return;
-  }
-
-  pan_scan_param->rect_cancel_flag = extract_bits(1);
-
-  if (pan_scan_param->rect_cancel_flag)
-    pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
-  else
-  {
-    pan_scan_param->cnt = uev() + 1;
-    if (pan_scan_param->cnt > MAX_PAN_SCAN_RECT)
-    {
-      ALOGE("sei_pan_scan: ERROR: Invalid num of rect [%lu]!", pan_scan_param->cnt);
-      pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
-      return;
+    if (!pan_scan_param) {
+        ALOGE("sei_pan_scan: ERROR: Invalid pointer!");
+        return;
     }
 
-    for (OMX_U32 i = 0; i < pan_scan_param->cnt; i++)
-    {
-      pan_scan_param->rect_left_offset[i] = sev();
-      pan_scan_param->rect_right_offset[i] = sev();
-      pan_scan_param->rect_top_offset[i] = sev();
-      pan_scan_param->rect_bottom_offset[i] = sev();
-
+    pan_scan_param->rect_id = uev();
+    if (pan_scan_param->rect_id > 0xFF) {
+        ALOGE("sei_pan_scan: ERROR: Invalid rect_id[%lu]!", pan_scan_param->rect_id);
+        pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+        return;
     }
-    pan_scan_param->rect_repetition_period = uev();
+
+    pan_scan_param->rect_cancel_flag = extract_bits(1);
+
+    if (pan_scan_param->rect_cancel_flag)
+        pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+    else {
+        pan_scan_param->cnt = uev() + 1;
+        if (pan_scan_param->cnt > MAX_PAN_SCAN_RECT) {
+            ALOGE("sei_pan_scan: ERROR: Invalid num of rect [%lu]!", pan_scan_param->cnt);
+            pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+            return;
+        }
+
+        for (OMX_U32 i = 0; i < pan_scan_param->cnt; i++) {
+            pan_scan_param->rect_left_offset[i] = sev();
+            pan_scan_param->rect_right_offset[i] = sev();
+            pan_scan_param->rect_top_offset[i] = sev();
+            pan_scan_param->rect_bottom_offset[i] = sev();
+
+        }
+        pan_scan_param->rect_repetition_period = uev();
 #ifdef PANSCAN_HDLR
-    if (pan_scan_param->rect_repetition_period > 1)
-      // Repetition period is decreased by 2 each time panscan data is used
-      pan_scan_param->rect_repetition_period *= 2;
+        if (pan_scan_param->rect_repetition_period > 1)
+            // Repetition period is decreased by 2 each time panscan data is used
+            pan_scan_param->rect_repetition_period *= 2;
 #endif
 #ifdef _ANDROID_
-     if (enable_panscan_log)
-     {
-       print_pan_data(pan_scan_param);
-     }
+        if (enable_panscan_log) {
+            print_pan_data(pan_scan_param);
+        }
 #endif
-  }
+    }
 }
 
 void h264_stream_parser::print_pan_data(h264_pan_scan *pan_scan_param)
 {
-  ALOGE("@@print_pan_data: IN");
+    ALOGE("@@print_pan_data: IN");
 
-  ALOGE("-->rect_id            : %lu", pan_scan_param->rect_id);
-  ALOGE("-->rect_cancel_flag   : %u", pan_scan_param->rect_cancel_flag);
+    ALOGE("-->rect_id            : %lu", pan_scan_param->rect_id);
+    ALOGE("-->rect_cancel_flag   : %u", pan_scan_param->rect_cancel_flag);
 
-  ALOGE("-->cnt                : %lu", pan_scan_param->cnt);
+    ALOGE("-->cnt                : %lu", pan_scan_param->cnt);
 
-  for (OMX_U32 i = 0; i < pan_scan_param->cnt; i++)
-  {
-    ALOGE("-->rect_left_offset   : %ld", pan_scan_param->rect_left_offset[i]);
-    ALOGE("-->rect_right_offset  : %ld", pan_scan_param->rect_right_offset[i]);
-    ALOGE("-->rect_top_offset    : %ld", pan_scan_param->rect_top_offset[i]);
-    ALOGE("-->rect_bottom_offset : %ld", pan_scan_param->rect_bottom_offset[i]);
-  }
-  ALOGE("-->repetition_period  : %lu", pan_scan_param->rect_repetition_period);
+    for (OMX_U32 i = 0; i < pan_scan_param->cnt; i++) {
+        ALOGE("-->rect_left_offset   : %ld", pan_scan_param->rect_left_offset[i]);
+        ALOGE("-->rect_right_offset  : %ld", pan_scan_param->rect_right_offset[i]);
+        ALOGE("-->rect_top_offset    : %ld", pan_scan_param->rect_top_offset[i]);
+        ALOGE("-->rect_bottom_offset : %ld", pan_scan_param->rect_bottom_offset[i]);
+    }
+    ALOGE("-->repetition_period  : %lu", pan_scan_param->rect_repetition_period);
 
-  ALOGE("@@print_pan_data: OUT");
+    ALOGE("@@print_pan_data: OUT");
 }
 
 void h264_stream_parser::parse_sps()
 {
-  OMX_U32 value = 0, scaling_matrix_limit;
-  ALOGV("@@parse_sps: IN");
-  value = extract_bits(8); //profile_idc
-  profile = value;
-  extract_bits(8); //constraint flags and reserved bits
-  extract_bits(8); //level_idc
-  uev(); //sps id
-  if (value == 100 || value == 110 || value == 122 || value == 244 ||
-      value ==  44 || value ==  83 || value ==  86 || value == 118)
-  {
-    if (uev() == 3) //chroma_format_idc
-    {
-      extract_bits(1); //separate_colour_plane_flag
-      scaling_matrix_limit = 12;
-    }
-    else
-      scaling_matrix_limit = 12;
-    uev(); //bit_depth_luma_minus8
-    uev(); //bit_depth_chroma_minus8
-    extract_bits(1); //qpprime_y_zero_transform_bypass_flag
-    if (extract_bits(1)) { //seq_scaling_matrix_present_flag
-      for (unsigned int i = 0; i < scaling_matrix_limit && more_bits(); i++)
-      {
-        if (extract_bits(1)) { ////seq_scaling_list_present_flag[ i ]
-          if (i < 6)
-            scaling_list(16);
-          else
-            scaling_list(64);
+    OMX_U32 value = 0, scaling_matrix_limit;
+    ALOGV("@@parse_sps: IN");
+    value = extract_bits(8); //profile_idc
+    profile = value;
+    extract_bits(8); //constraint flags and reserved bits
+    extract_bits(8); //level_idc
+    uev(); //sps id
+    if (value == 100 || value == 110 || value == 122 || value == 244 ||
+            value ==  44 || value ==  83 || value ==  86 || value == 118) {
+        if (uev() == 3) { //chroma_format_idc
+            extract_bits(1); //separate_colour_plane_flag
+            scaling_matrix_limit = 12;
+        } else
+            scaling_matrix_limit = 12;
+        uev(); //bit_depth_luma_minus8
+        uev(); //bit_depth_chroma_minus8
+        extract_bits(1); //qpprime_y_zero_transform_bypass_flag
+        if (extract_bits(1)) { //seq_scaling_matrix_present_flag
+            for (unsigned int i = 0; i < scaling_matrix_limit && more_bits(); i++) {
+                if (extract_bits(1)) { ////seq_scaling_list_present_flag[ i ]
+                    if (i < 6)
+                        scaling_list(16);
+                    else
+                        scaling_list(64);
+                }
+            }
         }
-      }
     }
-  }
-  uev(); //log2_max_frame_num_minus4
-  value = uev(); //pic_order_cnt_type
-  if (value == 0)
-    uev(); //log2_max_pic_order_cnt_lsb_minus4
-  else if (value == 1)
-  {
-    extract_bits(1); //delta_pic_order_always_zero_flag
-    sev(); //offset_for_non_ref_pic
-    sev(); //offset_for_top_to_bottom_field
-    value = uev(); // num_ref_frames_in_pic_order_cnt_cycle
-    for (unsigned int i = 0; i < value; i++)
-      sev(); //offset_for_ref_frame[ i ]
-  }
-  uev(); //max_num_ref_frames
-  extract_bits(1); //gaps_in_frame_num_value_allowed_flag
-  value = uev(); //pic_width_in_mbs_minus1
-  value = uev(); //pic_height_in_map_units_minus1
-  if (!extract_bits(1)) //frame_mbs_only_flag
-    mbaff_flag = extract_bits(1); //mb_adaptive_frame_field_flag
-  extract_bits(1); //direct_8x8_inference_flag
-  if (extract_bits(1)) //frame_cropping_flag
-  {
-    uev(); //frame_crop_left_offset
-    uev(); //frame_crop_right_offset
-    uev(); //frame_crop_top_offset
-    uev(); //frame_crop_bottom_offset
-  }
-  if (extract_bits(1)) //vui_parameters_present_flag
-    parse_vui(false);
-  ALOGV("@@parse_sps: OUT");
+    uev(); //log2_max_frame_num_minus4
+    value = uev(); //pic_order_cnt_type
+    if (value == 0)
+        uev(); //log2_max_pic_order_cnt_lsb_minus4
+    else if (value == 1) {
+        extract_bits(1); //delta_pic_order_always_zero_flag
+        sev(); //offset_for_non_ref_pic
+        sev(); //offset_for_top_to_bottom_field
+        value = uev(); // num_ref_frames_in_pic_order_cnt_cycle
+        for (unsigned int i = 0; i < value; i++)
+            sev(); //offset_for_ref_frame[ i ]
+    }
+    uev(); //max_num_ref_frames
+    extract_bits(1); //gaps_in_frame_num_value_allowed_flag
+    value = uev(); //pic_width_in_mbs_minus1
+    value = uev(); //pic_height_in_map_units_minus1
+    if (!extract_bits(1)) //frame_mbs_only_flag
+        mbaff_flag = extract_bits(1); //mb_adaptive_frame_field_flag
+    extract_bits(1); //direct_8x8_inference_flag
+    if (extract_bits(1)) { //frame_cropping_flag
+        uev(); //frame_crop_left_offset
+        uev(); //frame_crop_right_offset
+        uev(); //frame_crop_top_offset
+        uev(); //frame_crop_bottom_offset
+    }
+    if (extract_bits(1)) //vui_parameters_present_flag
+        parse_vui(false);
+    ALOGV("@@parse_sps: OUT");
 }
 
 void h264_stream_parser::scaling_list(OMX_U32 size_of_scaling_list)
 {
-  OMX_S32 last_scale = 8, next_scale = 8, delta_scale;
-  for (unsigned int j = 0; j < size_of_scaling_list; j++)
-  {
-    if (next_scale != 0)
-    {
-      delta_scale = sev();
-      next_scale = (last_scale + delta_scale + 256) % 256;
+    OMX_S32 last_scale = 8, next_scale = 8, delta_scale;
+    for (unsigned int j = 0; j < size_of_scaling_list; j++) {
+        if (next_scale != 0) {
+            delta_scale = sev();
+            next_scale = (last_scale + delta_scale + 256) % 256;
+        }
+        last_scale = (next_scale == 0)? last_scale : next_scale;
     }
-    last_scale = (next_scale == 0)? last_scale : next_scale;
-  }
 }
 
 OMX_U32 h264_stream_parser::extract_bits(OMX_U32 n)
 {
-  OMX_U32 value = 0;
-  if (n > 32)
-  {
-    ALOGE("ERROR: extract_bits limit to 32 bits!");
-    return value;
-  }
-  value = curr_32_bit >> (32 - n);
-  if (bits_read < n)
-  {
-    n -= bits_read;
-    read_word();
-    value |= (curr_32_bit >> (32 - n));
-    if (bits_read < n)
-    {
-      ALOGV("ERROR: extract_bits underflow!");
-      value >>= (n - bits_read);
-      n = bits_read;
+    OMX_U32 value = 0;
+    if (n > 32) {
+        ALOGE("ERROR: extract_bits limit to 32 bits!");
+        return value;
     }
-  }
-  bits_read -= n;
-  curr_32_bit <<= n;
-  return value;
+    value = curr_32_bit >> (32 - n);
+    if (bits_read < n) {
+        n -= bits_read;
+        read_word();
+        value |= (curr_32_bit >> (32 - n));
+        if (bits_read < n) {
+            ALOGV("ERROR: extract_bits underflow!");
+            value >>= (n - bits_read);
+            n = bits_read;
+        }
+    }
+    bits_read -= n;
+    curr_32_bit <<= n;
+    return value;
 }
 
 void h264_stream_parser::read_word()
 {
-  curr_32_bit = 0;
-  bits_read = 0;
-  while (bitstream_bytes && bits_read < 32)
-  {
-    if (*bitstream == EMULATION_PREVENTION_THREE_BYTE &&
-        zero_cntr >= 2 && emulation_sc_enabled)
-    {
-      ALOGV("EMULATION_PREVENTION_THREE_BYTE: Skip 0x03 byte aligned!");
-      emulation_code_skip_cntr++;
+    curr_32_bit = 0;
+    bits_read = 0;
+    while (bitstream_bytes && bits_read < 32) {
+        if (*bitstream == EMULATION_PREVENTION_THREE_BYTE &&
+                zero_cntr >= 2 && emulation_sc_enabled) {
+            ALOGV("EMULATION_PREVENTION_THREE_BYTE: Skip 0x03 byte aligned!");
+            emulation_code_skip_cntr++;
+        } else {
+            curr_32_bit <<= 8;
+            curr_32_bit |= *bitstream;
+            bits_read += 8;
+        }
+        if (*bitstream == 0)
+            zero_cntr++;
+        else
+            zero_cntr = 0;
+        bitstream++;
+        bitstream_bytes--;
     }
-    else
-    {
-      curr_32_bit <<= 8;
-      curr_32_bit |= *bitstream;
-      bits_read += 8;
-    }
-    if (*bitstream == 0)
-      zero_cntr++;
-    else
-      zero_cntr = 0;
-    bitstream++;
-    bitstream_bytes--;
-  }
-  curr_32_bit <<= (32 - bits_read);
+    curr_32_bit <<= (32 - bits_read);
 }
 
 OMX_U32 h264_stream_parser::uev()
 {
-  OMX_U32 lead_zero_bits = 0, code_num = 0;
-  while(!extract_bits(1) && more_bits())
-    lead_zero_bits++;
-  code_num = lead_zero_bits == 0 ? 0 :
-    (1 << lead_zero_bits) - 1 + extract_bits(lead_zero_bits);
-  return code_num;
+    OMX_U32 lead_zero_bits = 0, code_num = 0;
+    while (!extract_bits(1) && more_bits())
+        lead_zero_bits++;
+    code_num = lead_zero_bits == 0 ? 0 :
+        (1 << lead_zero_bits) - 1 + extract_bits(lead_zero_bits);
+    return code_num;
 }
 
 bool h264_stream_parser::more_bits()
 {
-  return (bitstream_bytes > 0 || bits_read > 0);
+    return (bitstream_bytes > 0 || bits_read > 0);
 }
 
 OMX_S32 h264_stream_parser::sev()
 {
-  OMX_U32 code_num = uev();
-  OMX_S32 ret;
-  ret = (code_num + 1) >> 1;
-  return ((code_num & 1) ? ret : -ret);
+    OMX_U32 code_num = uev();
+    OMX_S32 ret;
+    ret = (code_num + 1) >> 1;
+    return ((code_num & 1) ? ret : -ret);
 }
 
 OMX_S32 h264_stream_parser::iv(OMX_U32 n_bits)
 {
-  OMX_U32 code_num = extract_bits(n_bits);
-  OMX_S32 ret = (code_num >> (n_bits - 1))? (-1)*(~(code_num & ~(0x1 << (n_bits - 1))) + 1) : code_num;
-  return ret;
+    OMX_U32 code_num = extract_bits(n_bits);
+    OMX_S32 ret = (code_num >> (n_bits - 1))? (-1)*(~(code_num & ~(0x1 << (n_bits - 1))) + 1) : code_num;
+    return ret;
 }
 
 OMX_U32 h264_stream_parser::get_nal_unit_type(OMX_U32 *nal_unit_type)
 {
-  OMX_U32 value = 0, consumed_bytes = 3;
-  *nal_unit_type = NALU_TYPE_UNSPECIFIED;
-  ALOGV("-->get_nal_unit_type: IN");
-  value = extract_bits(24);
-  while (value != 0x00000001 && more_bits())
-  {
-    value <<= 8;
-    value |= extract_bits(8);
-    consumed_bytes++;
-  }
-  if (value != 0x00000001)
-  {
-    ALOGE("ERROR in get_nal_unit_type: Start code not found!");
-  }
-  else
-  {
-    if (extract_bits(1)) // forbidden_zero_bit
-    {
-      ALOGE("WARNING: forbidden_zero_bit should be zero!");
+    OMX_U32 value = 0, consumed_bytes = 3;
+    *nal_unit_type = NALU_TYPE_UNSPECIFIED;
+    ALOGV("-->get_nal_unit_type: IN");
+    value = extract_bits(24);
+    while (value != 0x00000001 && more_bits()) {
+        value <<= 8;
+        value |= extract_bits(8);
+        consumed_bytes++;
     }
-    value = extract_bits(2);
-    ALOGV("-->nal_ref_idc    : %x", value);
-    *nal_unit_type = extract_bits(5);
-    ALOGV("-->nal_unit_type  : %x", *nal_unit_type);
-    consumed_bytes++;
-    if (consumed_bytes > 5)
-    {
-      ALOGE("-->WARNING: Startcode was found after the first 4 bytes!");
+    if (value != 0x00000001) {
+        ALOGE("ERROR in get_nal_unit_type: Start code not found!");
+    } else {
+        if (extract_bits(1)) { // forbidden_zero_bit
+            ALOGE("WARNING: forbidden_zero_bit should be zero!");
+        }
+        value = extract_bits(2);
+        ALOGV("-->nal_ref_idc    : %x", value);
+        *nal_unit_type = extract_bits(5);
+        ALOGV("-->nal_unit_type  : %x", *nal_unit_type);
+        consumed_bytes++;
+        if (consumed_bytes > 5) {
+            ALOGE("-->WARNING: Startcode was found after the first 4 bytes!");
+        }
     }
-  }
-  ALOGV("-->get_nal_unit_type: OUT");
-  return consumed_bytes;
+    ALOGV("-->get_nal_unit_type: OUT");
+    return consumed_bytes;
 }
 
 OMX_U32 h264_stream_parser::get_profile()
@@ -1253,265 +1166,261 @@
 
 OMX_S64 h264_stream_parser::calculate_buf_period_ts(OMX_S64 timestamp)
 {
-  OMX_S64 clock_ts = timestamp;
-  ALOGV("calculate_ts(): IN");
-  if (sei_buf_period.au_cntr == 0)
-    clock_ts = sei_buf_period.reference_ts = timestamp;
-  else if (sei_pic_timing.is_valid && VALID_TS(sei_buf_period.reference_ts))
-  {
-    clock_ts = sei_buf_period.reference_ts + sei_pic_timing.cpb_removal_delay *
-               1e6 * vui_param.num_units_in_tick / vui_param.time_scale;
-  }
-  sei_buf_period.au_cntr++;
-  ALOGV("calculate_ts(): OUT");
-  return clock_ts;
+    OMX_S64 clock_ts = timestamp;
+    ALOGV("calculate_ts(): IN");
+    if (sei_buf_period.au_cntr == 0)
+        clock_ts = sei_buf_period.reference_ts = timestamp;
+    else if (sei_pic_timing.is_valid && VALID_TS(sei_buf_period.reference_ts)) {
+        clock_ts = sei_buf_period.reference_ts + sei_pic_timing.cpb_removal_delay *
+            1e6 * vui_param.num_units_in_tick / vui_param.time_scale;
+    }
+    sei_buf_period.au_cntr++;
+    ALOGV("calculate_ts(): OUT");
+    return clock_ts;
 }
 
 OMX_S64 h264_stream_parser::calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor)
 {
-  if (VALID_TS(timestamp))
-    vui_param.fixed_fps_prev_ts = timestamp;
-  else if (VALID_TS(vui_param.fixed_fps_prev_ts))
-    vui_param.fixed_fps_prev_ts += DeltaTfiDivisor * 1e6 *
-                                   vui_param.num_units_in_tick / vui_param.time_scale;
-  return vui_param.fixed_fps_prev_ts;
+    if (VALID_TS(timestamp))
+        vui_param.fixed_fps_prev_ts = timestamp;
+    else if (VALID_TS(vui_param.fixed_fps_prev_ts))
+        vui_param.fixed_fps_prev_ts += DeltaTfiDivisor * 1e6 *
+            vui_param.num_units_in_tick / vui_param.time_scale;
+    return vui_param.fixed_fps_prev_ts;
 }
 
 void h264_stream_parser::parse_frame_pack()
 {
 #ifdef _ANDROID_
-  char property_value[PROPERTY_VALUE_MAX] = {0};
-  OMX_S32 enable_framepack_log = 0;
+    char property_value[PROPERTY_VALUE_MAX] = {0};
+    OMX_S32 enable_framepack_log = 0;
 
-  property_get("vidc.dec.debug.panframedata", property_value, "0");
-  enable_framepack_log = atoi(property_value);
+    property_get("vidc.dec.debug.panframedata", property_value, "0");
+    enable_framepack_log = atoi(property_value);
 #endif
-  ALOGV("\n%s:%d parse_frame_pack", __func__, __LINE__);
+    ALOGV("\n%s:%d parse_frame_pack", __func__, __LINE__);
 
-  frame_packing_arrangement.id = uev();
+    frame_packing_arrangement.id = uev();
 
-  frame_packing_arrangement.cancel_flag = extract_bits(1);
-  if(!frame_packing_arrangement.cancel_flag) {
-     frame_packing_arrangement.type = extract_bits(7);
-     frame_packing_arrangement.quincunx_sampling_flag = extract_bits(1);
-     frame_packing_arrangement.content_interpretation_type = extract_bits(6);
-     frame_packing_arrangement.spatial_flipping_flag = extract_bits(1);
-     frame_packing_arrangement.frame0_flipped_flag = extract_bits(1);
-     frame_packing_arrangement.field_views_flag = extract_bits(1);
-     frame_packing_arrangement.current_frame_is_frame0_flag = extract_bits(1);
-     frame_packing_arrangement.frame0_self_contained_flag = extract_bits(1);
-     frame_packing_arrangement.frame1_self_contained_flag = extract_bits(1);
+    frame_packing_arrangement.cancel_flag = extract_bits(1);
+    if (!frame_packing_arrangement.cancel_flag) {
+        frame_packing_arrangement.type = extract_bits(7);
+        frame_packing_arrangement.quincunx_sampling_flag = extract_bits(1);
+        frame_packing_arrangement.content_interpretation_type = extract_bits(6);
+        frame_packing_arrangement.spatial_flipping_flag = extract_bits(1);
+        frame_packing_arrangement.frame0_flipped_flag = extract_bits(1);
+        frame_packing_arrangement.field_views_flag = extract_bits(1);
+        frame_packing_arrangement.current_frame_is_frame0_flag = extract_bits(1);
+        frame_packing_arrangement.frame0_self_contained_flag = extract_bits(1);
+        frame_packing_arrangement.frame1_self_contained_flag = extract_bits(1);
 
-     if(!frame_packing_arrangement.quincunx_sampling_flag &&
-        frame_packing_arrangement.type != 5) {
-        frame_packing_arrangement.frame0_grid_position_x = extract_bits(4);
-        frame_packing_arrangement.frame0_grid_position_y = extract_bits(4);
-        frame_packing_arrangement.frame1_grid_position_x = extract_bits(4);
-        frame_packing_arrangement.frame1_grid_position_y = extract_bits(4);
-     }
-     frame_packing_arrangement.reserved_byte = extract_bits(8);
-     frame_packing_arrangement.repetition_period = uev();
-   }
-   frame_packing_arrangement.extension_flag = extract_bits(1);
+        if (!frame_packing_arrangement.quincunx_sampling_flag &&
+                frame_packing_arrangement.type != 5) {
+            frame_packing_arrangement.frame0_grid_position_x = extract_bits(4);
+            frame_packing_arrangement.frame0_grid_position_y = extract_bits(4);
+            frame_packing_arrangement.frame1_grid_position_x = extract_bits(4);
+            frame_packing_arrangement.frame1_grid_position_y = extract_bits(4);
+        }
+        frame_packing_arrangement.reserved_byte = extract_bits(8);
+        frame_packing_arrangement.repetition_period = uev();
+    }
+    frame_packing_arrangement.extension_flag = extract_bits(1);
 
 #ifdef _ANDROID_
-   if (enable_framepack_log)
-   {
-     print_frame_pack();
-   }
+    if (enable_framepack_log) {
+        print_frame_pack();
+    }
 #endif
 }
 
 void h264_stream_parser::print_frame_pack()
 {
-  ALOGV("\n ## frame_packing_arrangement.id = %u", frame_packing_arrangement.id);
-  ALOGV("\n ## frame_packing_arrangement.cancel_flag = %u",
-                       frame_packing_arrangement.cancel_flag);
-  if(!frame_packing_arrangement.cancel_flag)
-  {
-    ALOGV("\n ## frame_packing_arrangement.type = %u",
-                         frame_packing_arrangement.type);
-    ALOGV("\n ## frame_packing_arrangement.quincunx_sampling_flag = %u",
-                         frame_packing_arrangement.quincunx_sampling_flag);
-    ALOGV("\n ## frame_packing_arrangement.content_interpretation_type = %u",
-                         frame_packing_arrangement.content_interpretation_type);
-    ALOGV("\n ## frame_packing_arrangement.spatial_flipping_flag = %u",
-                         frame_packing_arrangement.spatial_flipping_flag);
-    ALOGV("\n ## frame_packing_arrangement.frame0_flipped_flag = %u",
-                         frame_packing_arrangement.frame0_flipped_flag);
-    ALOGV("\n ## frame_packing_arrangement.field_views_flag = %u",
-                         frame_packing_arrangement.field_views_flag);
-    ALOGV("\n ## frame_packing_arrangement.current_frame_is_frame0_flag = %u",
-                         frame_packing_arrangement.current_frame_is_frame0_flag);
-    ALOGV("\n ## frame_packing_arrangement.frame0_self_contained_flag = %u",
-                         frame_packing_arrangement.frame0_self_contained_flag);
-    ALOGV("\n ## frame_packing_arrangement.frame1_self_contained_flag = %u",
-                         frame_packing_arrangement.frame1_self_contained_flag);
-    ALOGV("\n ## frame_packing_arrangement.reserved_byte = %u",
-                         frame_packing_arrangement.reserved_byte);
-    ALOGV("\n ## frame_packing_arrangement.repetition_period = %u",
-                         frame_packing_arrangement.repetition_period);
-    ALOGV("\n ## frame_packing_arrangement.extension_flag = %u",
-                         frame_packing_arrangement.extension_flag);
-  }
+    ALOGV("\n ## frame_packing_arrangement.id = %u", frame_packing_arrangement.id);
+    ALOGV("\n ## frame_packing_arrangement.cancel_flag = %u",
+            frame_packing_arrangement.cancel_flag);
+    if (!frame_packing_arrangement.cancel_flag) {
+        ALOGV("\n ## frame_packing_arrangement.type = %u",
+                frame_packing_arrangement.type);
+        ALOGV("\n ## frame_packing_arrangement.quincunx_sampling_flag = %u",
+                frame_packing_arrangement.quincunx_sampling_flag);
+        ALOGV("\n ## frame_packing_arrangement.content_interpretation_type = %u",
+                frame_packing_arrangement.content_interpretation_type);
+        ALOGV("\n ## frame_packing_arrangement.spatial_flipping_flag = %u",
+                frame_packing_arrangement.spatial_flipping_flag);
+        ALOGV("\n ## frame_packing_arrangement.frame0_flipped_flag = %u",
+                frame_packing_arrangement.frame0_flipped_flag);
+        ALOGV("\n ## frame_packing_arrangement.field_views_flag = %u",
+                frame_packing_arrangement.field_views_flag);
+        ALOGV("\n ## frame_packing_arrangement.current_frame_is_frame0_flag = %u",
+                frame_packing_arrangement.current_frame_is_frame0_flag);
+        ALOGV("\n ## frame_packing_arrangement.frame0_self_contained_flag = %u",
+                frame_packing_arrangement.frame0_self_contained_flag);
+        ALOGV("\n ## frame_packing_arrangement.frame1_self_contained_flag = %u",
+                frame_packing_arrangement.frame1_self_contained_flag);
+        ALOGV("\n ## frame_packing_arrangement.reserved_byte = %u",
+                frame_packing_arrangement.reserved_byte);
+        ALOGV("\n ## frame_packing_arrangement.repetition_period = %u",
+                frame_packing_arrangement.repetition_period);
+        ALOGV("\n ## frame_packing_arrangement.extension_flag = %u",
+                frame_packing_arrangement.extension_flag);
+    }
 }
 /* API'S EXPOSED TO OMX COMPONENT */
 
 void h264_stream_parser::get_frame_pack_data(
-  OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack)
+        OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack)
 {
-   ALOGV("\n%s:%d get frame data", __func__, __LINE__);
-   memcpy(&frame_pack->id,&frame_packing_arrangement.id,
-   FRAME_PACK_SIZE*sizeof(OMX_U32));
-   return;
+    ALOGV("\n%s:%d get frame data", __func__, __LINE__);
+    memcpy(&frame_pack->id,&frame_packing_arrangement.id,
+            FRAME_PACK_SIZE*sizeof(OMX_U32));
+    return;
 }
 
 
 bool h264_stream_parser::is_mbaff()
 {
-   ALOGV("\n%s:%d MBAFF flag=%d", __func__, __LINE__,mbaff_flag);
-   return mbaff_flag;
+    ALOGV("\n%s:%d MBAFF flag=%d", __func__, __LINE__,mbaff_flag);
+    return mbaff_flag;
 }
 
 void h264_stream_parser::get_frame_rate(OMX_U32 *frame_rate)
 {
-  if (vui_param.num_units_in_tick != 0)
-    *frame_rate = vui_param.time_scale / (2 * vui_param.num_units_in_tick);
+    if (vui_param.num_units_in_tick != 0)
+        *frame_rate = vui_param.time_scale / (2 * vui_param.num_units_in_tick);
 }
 
 void h264_stream_parser::parse_nal(OMX_U8* data_ptr, OMX_U32 data_len, OMX_U32 nal_type, bool enable_emu_sc)
 {
-  OMX_U32 nal_unit_type = NALU_TYPE_UNSPECIFIED, cons_bytes = 0;
-  ALOGV("parse_nal(): IN nal_type(%lu)", nal_type);
-  if (!data_len)
-    return;
-  init_bitstream(data_ptr, data_len);
-  emulation_sc_enabled = enable_emu_sc;
-  if (nal_type != NALU_TYPE_VUI)
-  {
-    cons_bytes = get_nal_unit_type(&nal_unit_type);
-    if (nal_type != nal_unit_type && nal_type != NALU_TYPE_UNSPECIFIED)
-    {
-      ALOGV("Unexpected nal_type(%x) expected(%x)", nal_unit_type, nal_type);
-      return;
+    OMX_U32 nal_unit_type = NALU_TYPE_UNSPECIFIED, cons_bytes = 0;
+    ALOGV("parse_nal(): IN nal_type(%lu)", nal_type);
+    if (!data_len)
+        return;
+    init_bitstream(data_ptr, data_len);
+    emulation_sc_enabled = enable_emu_sc;
+    if (nal_type != NALU_TYPE_VUI) {
+        cons_bytes = get_nal_unit_type(&nal_unit_type);
+        if (nal_type != nal_unit_type && nal_type != NALU_TYPE_UNSPECIFIED) {
+            ALOGV("Unexpected nal_type(%x) expected(%x)", nal_unit_type, nal_type);
+            return;
+        }
     }
-  }
-  switch (nal_type)
-  {
-    case NALU_TYPE_SPS:
-      if (more_bits())
-        parse_sps();
+    switch (nal_type) {
+        case NALU_TYPE_SPS:
+            if (more_bits())
+                parse_sps();
 #ifdef PANSCAN_HDLR
-      panscan_hdl->get_free();
+            panscan_hdl->get_free();
 #endif
-    break;
-    case NALU_TYPE_SEI:
-      init_bitstream(data_ptr + cons_bytes, data_len - cons_bytes);
-      parse_sei();
-    break;
-    case NALU_TYPE_VUI:
-      parse_vui(true);
-    break;
-    default:
-      ALOGV("nal_unit_type received : %lu", nal_type);
-  }
-  ALOGV("parse_nal(): OUT");
+            break;
+        case NALU_TYPE_SEI:
+            init_bitstream(data_ptr + cons_bytes, data_len - cons_bytes);
+            parse_sei();
+            break;
+        case NALU_TYPE_VUI:
+            parse_vui(true);
+            break;
+        default:
+            ALOGV("nal_unit_type received : %lu", nal_type);
+    }
+    ALOGV("parse_nal(): OUT");
 }
 
 #ifdef PANSCAN_HDLR
 void h264_stream_parser::update_panscan_data(OMX_S64 timestamp)
 {
-  panscan_hdl->update_last(timestamp);
+    panscan_hdl->update_last(timestamp);
 }
 #endif
 
 void h264_stream_parser::fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio)
 {
-  if(dest_aspect_ratio && vui_param.aspect_ratio_info_present_flag)
-  {
-    dest_aspect_ratio->aspectRatioX = vui_param.aspect_ratio_info.aspect_ratio_x;
-    dest_aspect_ratio->aspectRatioY = vui_param.aspect_ratio_info.aspect_ratio_y;
-  }
+    if (dest_aspect_ratio && vui_param.aspect_ratio_info_present_flag) {
+        dest_aspect_ratio->aspectRatioX = vui_param.aspect_ratio_info.aspect_ratio_x;
+        dest_aspect_ratio->aspectRatioY = vui_param.aspect_ratio_info.aspect_ratio_y;
+    }
 }
 
 void h264_stream_parser::fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp)
 {
 #ifdef PANSCAN_HDLR
-  h264_pan_scan *pan_scan_param = panscan_hdl->get_populated(timestamp);
+    h264_pan_scan *pan_scan_param = panscan_hdl->get_populated(timestamp);
 #else
-  h264_pan_scan *pan_scan_param = &panscan_param;
+    h264_pan_scan *pan_scan_param = &panscan_param;
 #endif
-  if (pan_scan_param) {
-    if (!(pan_scan_param->rect_id & NO_PAN_SCAN_BIT))
-    {
-      PRINT_PANSCAN_PARAM(*pan_scan_param);
-      dest_pan_scan->numWindows = pan_scan_param->cnt;
-      for (unsigned int i = 0; i < dest_pan_scan->numWindows; i++)
-      {
-        dest_pan_scan->window[i].x = pan_scan_param->rect_left_offset[i];
-        dest_pan_scan->window[i].y = pan_scan_param->rect_top_offset[i];
-        dest_pan_scan->window[i].dx = pan_scan_param->rect_right_offset[i];
-        dest_pan_scan->window[i].dy = pan_scan_param->rect_bottom_offset[i];
-      }
+    if (pan_scan_param) {
+        if (!(pan_scan_param->rect_id & NO_PAN_SCAN_BIT)) {
+            PRINT_PANSCAN_PARAM(*pan_scan_param);
+            dest_pan_scan->numWindows = pan_scan_param->cnt;
+            for (unsigned int i = 0; i < dest_pan_scan->numWindows; i++) {
+                dest_pan_scan->window[i].x = pan_scan_param->rect_left_offset[i];
+                dest_pan_scan->window[i].y = pan_scan_param->rect_top_offset[i];
+                dest_pan_scan->window[i].dx = pan_scan_param->rect_right_offset[i];
+                dest_pan_scan->window[i].dy = pan_scan_param->rect_bottom_offset[i];
+            }
 #ifndef PANSCAN_HDLR
-      if (pan_scan_param->rect_repetition_period == 0)
-        pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
-      else if (pan_scan_param->rect_repetition_period > 1)
-        pan_scan_param->rect_repetition_period =
-        (pan_scan_param->rect_repetition_period == 2)? 0 :
-        (pan_scan_param->rect_repetition_period - 1);
+            if (pan_scan_param->rect_repetition_period == 0)
+                pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+            else if (pan_scan_param->rect_repetition_period > 1)
+                pan_scan_param->rect_repetition_period =
+                    (pan_scan_param->rect_repetition_period == 2)? 0 :
+                    (pan_scan_param->rect_repetition_period - 1);
 #endif
+        } else
+            pan_scan_param->rect_repetition_period = 0;
     }
-    else
-      pan_scan_param->rect_repetition_period = 0;
-  }
 }
 
 OMX_S64 h264_stream_parser::process_ts_with_sei_vui(OMX_S64 timestamp)
 {
-  bool clock_ts_flag = false;
-  OMX_S64 clock_ts = timestamp;
-  OMX_U32 deltaTfiDivisor = 2;
-  if (vui_param.timing_info_present_flag)
-  {
-    if (vui_param.pic_struct_present_flag)
-    {
-      if(sei_pic_timing.clock_ts_flag)
-      {
-        clock_ts = ((sei_pic_timing.hours_value * 60 + sei_pic_timing.minutes_value) * 60 + sei_pic_timing.seconds_value) * 1e6 +
+    bool clock_ts_flag = false;
+    OMX_S64 clock_ts = timestamp;
+    OMX_U32 deltaTfiDivisor = 2;
+    if (vui_param.timing_info_present_flag) {
+        if (vui_param.pic_struct_present_flag) {
+            if (sei_pic_timing.clock_ts_flag) {
+                clock_ts = ((sei_pic_timing.hours_value * 60 + sei_pic_timing.minutes_value) * 60 + sei_pic_timing.seconds_value) * 1e6 +
                     (sei_pic_timing.n_frames * (vui_param.num_units_in_tick * (1 + sei_pic_timing.nuit_field_based_flag)) + sei_pic_timing.time_offset) *
                     1e6 / vui_param.time_scale;
-        ALOGV("-->CLOCK TIMESTAMP   : %lld", clock_ts);
-        clock_ts_flag = true;
-      }
-      if (vui_param.fixed_frame_rate_flag)
-      {
-        switch (sei_pic_timing.pic_struct)
-        {
-          case 1: case 2:         deltaTfiDivisor = 1; break;
-          case 0: case 3: case 4: deltaTfiDivisor = 2; break;
-          case 5: case 6:         deltaTfiDivisor = 3; break;
-          case 7:                 deltaTfiDivisor = 4; break;
-          case 8:                 deltaTfiDivisor = 6; break;
-          default:
-            ALOGE("process_ts_with_sei_vui: pic_struct invalid!");
+                ALOGV("-->CLOCK TIMESTAMP   : %lld", clock_ts);
+                clock_ts_flag = true;
+            }
+            if (vui_param.fixed_frame_rate_flag) {
+                switch (sei_pic_timing.pic_struct) {
+                    case 1:
+                    case 2:
+                        deltaTfiDivisor = 1;
+                        break;
+                    case 0:
+                    case 3:
+                    case 4:
+                        deltaTfiDivisor = 2;
+                        break;
+                    case 5:
+                    case 6:
+                        deltaTfiDivisor = 3;
+                        break;
+                    case 7:
+                        deltaTfiDivisor = 4;
+                        break;
+                    case 8:
+                        deltaTfiDivisor = 6;
+                        break;
+                    default:
+                        ALOGE("process_ts_with_sei_vui: pic_struct invalid!");
+                }
+            }
         }
-      }
+        if (!clock_ts_flag) {
+            if (vui_param.fixed_frame_rate_flag)
+                clock_ts = calculate_fixed_fps_ts(timestamp, deltaTfiDivisor);
+            else if (sei_buf_period.is_valid)
+                clock_ts = calculate_buf_period_ts(timestamp);
+        }
+    } else {
+        ALOGV("NO TIMING information present in VUI!");
     }
-    if (!clock_ts_flag)
-    {
-      if (vui_param.fixed_frame_rate_flag)
-        clock_ts = calculate_fixed_fps_ts(timestamp, deltaTfiDivisor);
-      else if (sei_buf_period.is_valid)
-        clock_ts = calculate_buf_period_ts(timestamp);
-    }
-  }
-  else
-  {
-    ALOGV("NO TIMING information present in VUI!");
-  }
-  sei_pic_timing.is_valid = false; // SEI data is valid only for current frame
-  return clock_ts;
+    sei_pic_timing.is_valid = false; // SEI data is valid only for current frame
+    return clock_ts;
 }
 
 #ifdef PANSCAN_HDLR
@@ -1520,183 +1429,159 @@
 
 panscan_handler::~panscan_handler()
 {
-  if (panscan_data)
-  {
-    free(panscan_data);
-    panscan_data = NULL;
-  }
+    if (panscan_data) {
+        free(panscan_data);
+        panscan_data = NULL;
+    }
 }
 
 bool panscan_handler::initialize(int num_data)
 {
-  bool ret = false;
-  if (!panscan_data)
-  {
-    panscan_data = (PANSCAN_NODE *) malloc (sizeof(PANSCAN_NODE) * num_data);
-    if (panscan_data)
-    {
-      panscan_free.add_multiple(panscan_data, num_data);
-      ret = true;
+    bool ret = false;
+    if (!panscan_data) {
+        panscan_data = (PANSCAN_NODE *) malloc (sizeof(PANSCAN_NODE) * num_data);
+        if (panscan_data) {
+            panscan_free.add_multiple(panscan_data, num_data);
+            ret = true;
+        }
+    } else {
+        ALOGE("ERROR: Old panscan memory must be freed to allocate new");
     }
-  }
-  else
-  {
-    ALOGE("ERROR: Old panscan memory must be freed to allocate new");
-  }
-  return ret;
+    return ret;
 }
 
 h264_pan_scan *panscan_handler::get_free()
 {
-  h264_pan_scan *data = NULL;
-  PANSCAN_NODE *panscan_node = panscan_used.watch_last();
-  panscan_node = (!panscan_node || VALID_TS(panscan_node->start_ts))?
-                 panscan_free.remove_first() :
-                 panscan_used.remove_last();
-  if (panscan_node)
-  {
-    panscan_node->start_ts = LLONG_MAX;
-    panscan_node->end_ts = LLONG_MAX;
-    panscan_node->pan_scan_param.rect_id = NO_PAN_SCAN_BIT;
-    panscan_node->active = false;
-    panscan_used.add_last(panscan_node);
-    data = &panscan_node->pan_scan_param;
-  }
-  return data;
+    h264_pan_scan *data = NULL;
+    PANSCAN_NODE *panscan_node = panscan_used.watch_last();
+    panscan_node = (!panscan_node || VALID_TS(panscan_node->start_ts))?
+        panscan_free.remove_first() :
+        panscan_used.remove_last();
+    if (panscan_node) {
+        panscan_node->start_ts = LLONG_MAX;
+        panscan_node->end_ts = LLONG_MAX;
+        panscan_node->pan_scan_param.rect_id = NO_PAN_SCAN_BIT;
+        panscan_node->active = false;
+        panscan_used.add_last(panscan_node);
+        data = &panscan_node->pan_scan_param;
+    }
+    return data;
 }
 
 h264_pan_scan *panscan_handler::get_populated(OMX_S64 frame_ts)
 {
-  h264_pan_scan *data = NULL;
-  PANSCAN_NODE *panscan_node = panscan_used.watch_first();
-  while (panscan_node && !data)
-  {
-    if (VALID_TS(panscan_node->start_ts))
-    {
-      if (panscan_node->active && frame_ts < panscan_node->start_ts)
-        panscan_node->start_ts = frame_ts;
-      if (frame_ts >= panscan_node->start_ts)
-        if (frame_ts < panscan_node->end_ts)
-        {
-          data = &panscan_node->pan_scan_param;
-          panscan_node->active = true;
+    h264_pan_scan *data = NULL;
+    PANSCAN_NODE *panscan_node = panscan_used.watch_first();
+    while (panscan_node && !data) {
+        if (VALID_TS(panscan_node->start_ts)) {
+            if (panscan_node->active && frame_ts < panscan_node->start_ts)
+                panscan_node->start_ts = frame_ts;
+            if (frame_ts >= panscan_node->start_ts)
+                if (frame_ts < panscan_node->end_ts) {
+                    data = &panscan_node->pan_scan_param;
+                    panscan_node->active = true;
+                } else {
+                    panscan_free.add_last(panscan_used.remove_first());
+                    panscan_node = panscan_used.watch_first();
+                }
+                else
+                    // Finish search if current timestamp has not reached
+                    // start timestamp of first panscan data.
+                    panscan_node = NULL;
+        } else {
+            // Only one panscan data is stored for clips
+            // with invalid timestamps in every frame
+            data = &panscan_node->pan_scan_param;
+            panscan_node->active = true;
         }
-        else
-        {
-          panscan_free.add_last(panscan_used.remove_first());
-          panscan_node = panscan_used.watch_first();
-        }
-      else
-        // Finish search if current timestamp has not reached
-        // start timestamp of first panscan data.
-        panscan_node = NULL;
     }
-    else
-    {
-      // Only one panscan data is stored for clips
-      // with invalid timestamps in every frame
-      data = &panscan_node->pan_scan_param;
-      panscan_node->active = true;
+    if (data) {
+        if (data->rect_repetition_period == 0)
+            panscan_free.add_last(panscan_used.remove_first());
+        else if (data->rect_repetition_period > 1)
+            data->rect_repetition_period -= 2;
     }
-  }
-  if (data) {
-    if (data->rect_repetition_period == 0)
-      panscan_free.add_last(panscan_used.remove_first());
-    else if (data->rect_repetition_period > 1)
-      data->rect_repetition_period -= 2;
-  }
-  PRINT_PANSCAN_DATA(panscan_node);
-  return data;
+    PRINT_PANSCAN_DATA(panscan_node);
+    return data;
 }
 
 void panscan_handler::update_last(OMX_S64 frame_ts)
 {
-  PANSCAN_NODE *panscan_node = panscan_used.watch_last();
-  if (panscan_node && !VALID_TS(panscan_node->start_ts))
-  {
-    panscan_node->start_ts = frame_ts;
-    PRINT_PANSCAN_DATA(panscan_node);
-    if (panscan_node->prev)
-    {
-      if (frame_ts < panscan_node->prev->end_ts)
-        panscan_node->prev->end_ts = frame_ts;
-      else if (!VALID_TS(frame_ts))
-        panscan_node->prev->pan_scan_param.rect_repetition_period = 0;
-      PRINT_PANSCAN_DATA(panscan_node->prev);
+    PANSCAN_NODE *panscan_node = panscan_used.watch_last();
+    if (panscan_node && !VALID_TS(panscan_node->start_ts)) {
+        panscan_node->start_ts = frame_ts;
+        PRINT_PANSCAN_DATA(panscan_node);
+        if (panscan_node->prev) {
+            if (frame_ts < panscan_node->prev->end_ts)
+                panscan_node->prev->end_ts = frame_ts;
+            else if (!VALID_TS(frame_ts))
+                panscan_node->prev->pan_scan_param.rect_repetition_period = 0;
+            PRINT_PANSCAN_DATA(panscan_node->prev);
+        }
     }
-  }
 }
 
-template <class NODE_STRUCT>
+    template <class NODE_STRUCT>
 void omx_dl_list<NODE_STRUCT>::add_multiple(NODE_STRUCT *data_arr, int data_num)
 {
-  for (int idx = 0; idx < data_num; idx++)
-    add_last(&data_arr[idx]);
+    for (int idx = 0; idx < data_num; idx++)
+        add_last(&data_arr[idx]);
 }
 
-template <class NODE_STRUCT>
+    template <class NODE_STRUCT>
 NODE_STRUCT *omx_dl_list<NODE_STRUCT>::remove_first()
 {
-  NODE_STRUCT *data = head;
-  if (head)
-  {
-    if (head->next)
-    {
-      head = head->next;
-      head->prev = NULL;
+    NODE_STRUCT *data = head;
+    if (head) {
+        if (head->next) {
+            head = head->next;
+            head->prev = NULL;
+        } else
+            head = tail = NULL;
+        data->next = data->prev = NULL;
     }
-    else
-      head = tail = NULL;
-    data->next = data->prev = NULL;
-  }
-  return data;
+    return data;
 }
 
-template <class NODE_STRUCT>
+    template <class NODE_STRUCT>
 NODE_STRUCT *omx_dl_list<NODE_STRUCT>::remove_last()
 {
-  NODE_STRUCT *data = tail;
-  if (tail)
-  {
-    if (tail->prev)
-    {
-      tail = tail->prev;
-      tail->next = NULL;
+    NODE_STRUCT *data = tail;
+    if (tail) {
+        if (tail->prev) {
+            tail = tail->prev;
+            tail->next = NULL;
+        } else
+            head = tail = NULL;
+        data->next = data->prev = NULL;
     }
-    else
-      head = tail = NULL;
-    data->next = data->prev = NULL;
-  }
-  return data;
+    return data;
 }
 
-template <class NODE_STRUCT>
+    template <class NODE_STRUCT>
 void omx_dl_list<NODE_STRUCT>::add_last(NODE_STRUCT* data_ptr)
 {
-  if (data_ptr)
-  {
-    data_ptr->next = NULL;
-    data_ptr->prev = tail;
-    if (tail)
-    {
-      tail->next = data_ptr;
-      tail = data_ptr;
+    if (data_ptr) {
+        data_ptr->next = NULL;
+        data_ptr->prev = tail;
+        if (tail) {
+            tail->next = data_ptr;
+            tail = data_ptr;
+        } else
+            head = tail = data_ptr;
     }
-    else
-      head = tail = data_ptr;
-  }
 }
 
-template <class NODE_STRUCT>
+    template <class NODE_STRUCT>
 NODE_STRUCT* omx_dl_list<NODE_STRUCT>::watch_first()
 {
-  return head;
+    return head;
 }
 
-template <class NODE_STRUCT>
+    template <class NODE_STRUCT>
 NODE_STRUCT* omx_dl_list<NODE_STRUCT>::watch_last()
 {
-  return tail;
+    return tail;
 }
 
 #endif
diff --git a/mm-video-v4l2/vidc/vdec/src/hevc_utils.cpp b/mm-video-v4l2/vidc/vdec/src/hevc_utils.cpp
index a283f0e..6585ce0 100644
--- a/mm-video-v4l2/vidc/vdec/src/hevc_utils.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/hevc_utils.cpp
@@ -70,7 +70,7 @@
 
 HEVC_Utils::HEVC_Utils()
 {
-	initialize_frame_checking_environment();
+    initialize_frame_checking_environment();
 }
 
 HEVC_Utils::~HEVC_Utils()
@@ -80,149 +80,144 @@
 /***********************************************************************/
 /*
 FUNCTION:
-  HEVC_Utils::initialize_frame_checking_environment
+HEVC_Utils::initialize_frame_checking_environment
 
 DESCRIPTION:
-  Extract RBSP data from a NAL
+Extract RBSP data from a NAL
 
 INPUT/OUTPUT PARAMETERS:
-  None
+None
 
 RETURN VALUE:
-  boolean
+boolean
 
 SIDE EFFECTS:
-  None.
-*/
+None.
+ */
 /***********************************************************************/
 void HEVC_Utils::initialize_frame_checking_environment()
 {
-	m_forceToStichNextNAL = false;
-	m_au_data = false;
-	nalu_type = NAL_UNIT_INVALID;
+    m_forceToStichNextNAL = false;
+    m_au_data = false;
+    nalu_type = NAL_UNIT_INVALID;
 }
 
 /*===========================================================================
 FUNCTION:
-  HEVC_Utils::iSNewFrame
+HEVC_Utils::iSNewFrame
 
 DESCRIPTION:
-  Returns true if NAL parsing successfull otherwise false.
+Returns true if NAL parsing successfull otherwise false.
 
 INPUT/OUTPUT PARAMETERS:
-  <In>
-    buffer : buffer containing start code or nal length + NAL units
-    buffer_length : the length of the NAL buffer
-    start_code : If true, start code is detected,
-                 otherwise size nal length is detected
-    size_of_nal_length_field: size of nal length field
-  <out>
-    isNewFrame: true if the NAL belongs to a differenet frame
-                false if the NAL belongs to a current frame
+<In>
+buffer : buffer containing start code or nal length + NAL units
+buffer_length : the length of the NAL buffer
+start_code : If true, start code is detected,
+otherwise size nal length is detected
+size_of_nal_length_field: size of nal length field
+<out>
+isNewFrame: true if the NAL belongs to a differenet frame
+false if the NAL belongs to a current frame
 
 RETURN VALUE:
-  boolean  true, if nal parsing is successful
-           false, if the nal parsing has errors
+boolean  true, if nal parsing is successful
+false, if the nal parsing has errors
 
 SIDE EFFECTS:
-  None.
+None.
 ===========================================================================*/
 bool HEVC_Utils::isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
-                            OMX_IN OMX_U32 size_of_nal_length_field,
-                            OMX_OUT OMX_BOOL &isNewFrame)
+        OMX_IN OMX_U32 size_of_nal_length_field,
+        OMX_OUT OMX_BOOL &isNewFrame)
 {
-	OMX_IN OMX_U8 *buffer = p_buf_hdr->pBuffer;
-	OMX_IN OMX_U32 buffer_length = p_buf_hdr->nFilledLen;
-	byte bFirstSliceInPic = 0;
+    OMX_IN OMX_U8 *buffer = p_buf_hdr->pBuffer;
+    OMX_IN OMX_U32 buffer_length = p_buf_hdr->nFilledLen;
+    byte bFirstSliceInPic = 0;
 
-	byte coef1=1, coef2=0, coef3=0;
-	uint32 pos = 0;
-	uint32 nal_len = buffer_length;
-	uint32 sizeofNalLengthField = 0;
-	uint32 zero_count;
-	boolean start_code = (size_of_nal_length_field==0)?true:false;
+    byte coef1=1, coef2=0, coef3=0;
+    uint32 pos = 0;
+    uint32 nal_len = buffer_length;
+    uint32 sizeofNalLengthField = 0;
+    uint32 zero_count;
+    boolean start_code = (size_of_nal_length_field==0)?true:false;
 
-	if(start_code) {
-	  // Search start_code_prefix_one_3bytes (0x000001)
-	  coef2 = buffer[pos++];
-	  coef3 = buffer[pos++];
-	  do {
-		if(pos >= buffer_length)
-		{
-		  DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
-		  return false;
-		}
+    if (start_code) {
+        // Search start_code_prefix_one_3bytes (0x000001)
+        coef2 = buffer[pos++];
+        coef3 = buffer[pos++];
 
-		coef1 = coef2;
-		coef2 = coef3;
-		coef3 = buffer[pos++];
-	  } while(coef1 || coef2 || coef3 != 1);
-	}
-	else if (size_of_nal_length_field)
-	{
-	  /* This is the case to play multiple NAL units inside each access unit*/
-	  /* Extract the NAL length depending on sizeOfNALength field */
-	  sizeofNalLengthField = size_of_nal_length_field;
-	  nal_len = 0;
-	  while(size_of_nal_length_field--)
-	  {
-		nal_len |= buffer[pos++]<<(size_of_nal_length_field<<3);
-	  }
-	  if (nal_len >= buffer_length)
-	  {
-		DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
-		return false;
-	  }
-	}
+        do {
+            if (pos >= buffer_length) {
+                DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+                return false;
+            }
 
-	if (nal_len > buffer_length)
-	{
-	  DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
-	  return false;
-	}
+            coef1 = coef2;
+            coef2 = coef3;
+            coef3 = buffer[pos++];
+        } while (coef1 || coef2 || coef3 != 1);
+    } else if (size_of_nal_length_field) {
+        /* This is the case to play multiple NAL units inside each access unit*/
+        /* Extract the NAL length depending on sizeOfNALength field */
+        sizeofNalLengthField = size_of_nal_length_field;
+        nal_len = 0;
 
-	if(pos + 2 > (nal_len + sizeofNalLengthField))
-	{
-	  DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
-	  return false;
-	}
+        while (size_of_nal_length_field--) {
+            nal_len |= buffer[pos++]<<(size_of_nal_length_field<<3);
+        }
 
-	nalu_type = (buffer[pos] & 0x7E)>>1 ;	  //=== nal_unit_type
+        if (nal_len >= buffer_length) {
+            DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+            return false;
+        }
+    }
 
-	DEBUG_PRINT_LOW("\n@#@# Pos = %x NalType = %x buflen = %d", pos-1, nalu_type, buffer_length);
+    if (nal_len > buffer_length) {
+        DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+        return false;
+    }
 
-	isNewFrame =  OMX_FALSE;
+    if (pos + 2 > (nal_len + sizeofNalLengthField)) {
+        DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+        return false;
+    }
 
-	if (nalu_type == NAL_UNIT_VPS ||
-		nalu_type == NAL_UNIT_SPS ||
-		nalu_type == NAL_UNIT_PPS ||
-		nalu_type == NAL_UNIT_SEI)
-	{
-	  	DEBUG_PRINT_LOW("\n Non-AU boundary with NAL type %d", nalu_type);
-		if(m_au_data)
-		{
-			isNewFrame = OMX_TRUE;
-			m_au_data = false;
-		}
+    nalu_type = (buffer[pos] & 0x7E)>>1 ;      //=== nal_unit_type
 
-		m_forceToStichNextNAL = true;
-	}
-	else if (nalu_type <= NAL_UNIT_RESERVED_23)
-	{
-		DEBUG_PRINT_LOW("\n AU Boundary with NAL type %d ",nal_unit.nalu_type);
-		if (!m_forceToStichNextNAL)
-		{
-			bFirstSliceInPic = ((buffer[pos+2] & 0x80)>>7);
-			if (bFirstSliceInPic)	//=== first_ctb_in_slice is only 1'b1  coded tree block
-			{
-				DEBUG_PRINT_LOW("Found a New Frame due to 1st coded tree block");
-				isNewFrame = OMX_TRUE;
-			}
-		}
-		m_au_data = true;
-		m_forceToStichNextNAL = false;
-	}
-	DEBUG_PRINT_LOW("get_HEVC_nal_type - newFrame value %d\n",isNewFrame);
-	return true;
+    DEBUG_PRINT_LOW("\n@#@# Pos = %x NalType = %x buflen = %d", pos-1, nalu_type, buffer_length);
+
+    isNewFrame =  OMX_FALSE;
+
+    if (nalu_type == NAL_UNIT_VPS ||
+            nalu_type == NAL_UNIT_SPS ||
+            nalu_type == NAL_UNIT_PPS ||
+            nalu_type == NAL_UNIT_SEI) {
+        DEBUG_PRINT_LOW("\n Non-AU boundary with NAL type %d", nalu_type);
+
+        if (m_au_data) {
+            isNewFrame = OMX_TRUE;
+            m_au_data = false;
+        }
+
+        m_forceToStichNextNAL = true;
+    } else if (nalu_type <= NAL_UNIT_RESERVED_23) {
+        DEBUG_PRINT_LOW("\n AU Boundary with NAL type %d ",nal_unit.nalu_type);
+
+        if (!m_forceToStichNextNAL) {
+            bFirstSliceInPic = ((buffer[pos+2] & 0x80)>>7);
+
+            if (bFirstSliceInPic) {    //=== first_ctb_in_slice is only 1'b1  coded tree block
+                DEBUG_PRINT_LOW("Found a New Frame due to 1st coded tree block");
+                isNewFrame = OMX_TRUE;
+            }
+        }
+
+        m_au_data = true;
+        m_forceToStichNextNAL = false;
+    }
+
+    DEBUG_PRINT_LOW("get_HEVC_nal_type - newFrame value %d\n",isNewFrame);
+    return true;
 }
 
diff --git a/mm-video-v4l2/vidc/vdec/src/message_queue.c b/mm-video-v4l2/vidc/vdec/src/message_queue.c
old mode 100755
new mode 100644
index a6b491e..a96e120
--- a/mm-video-v4l2/vidc/vdec/src/message_queue.c
+++ b/mm-video-v4l2/vidc/vdec/src/message_queue.c
@@ -1,178 +1,163 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "message_queue.h"
-
-int check_if_queue_empty ( unsigned int queuetocheck, void* queuecontext )
-{
-    struct video_queue_context *ptr_q = NULL;
-    /*
-     * queuetocheck - 0 command queue
-     * queuetocheck - 1 data queue
-     */
-    if ( queuecontext == NULL || (queuetocheck > 1 ) )
-    {
-        return 1;
-    }
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-    if (queuetocheck == 0)
-    {
-      if (ptr_q->read_comq == ptr_q->write_comq)
-      {
-          return 1;
-      }
-    }
-    else if (queuetocheck == 1)
-    {
-        if (ptr_q->write_dataq == ptr_q->read_dataq)
-        {
-            return 1;
-        }
-    }
-
-    return 0;
-}
-
-
-
-struct video_msgq * queue_get_cmd (void* queuecontext )
-{
-    struct video_queue_context *ptr_q = NULL;
-    struct video_msgq *pitem = NULL;
-
-    if( NULL == queuecontext )
-    {
-        printf("\n queue_get_cmd: Invalid Input parameter\n");
-        return NULL;
-    }
-
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-    /* Wait on the semaphore till it is released */
-    sem_wait(&ptr_q->sem_message);
-
-    /* Lock the mutex to protect the critical section */
-    pthread_mutex_lock(&ptr_q->mutex);
-
-    if (ptr_q->read_comq != ptr_q->write_comq)
-    {
-        pitem = &ptr_q->ptr_cmdq [ptr_q->read_comq];
-        ptr_q->read_comq = (ptr_q->read_comq + 1) % \
-                            ptr_q->commandq_size;
-    }
-    else if (ptr_q->write_dataq != ptr_q->read_dataq)
-    {
-        pitem = &ptr_q->ptr_dataq [ptr_q->read_dataq];
-        ptr_q->read_dataq = (ptr_q->read_dataq + 1) % \
-                            ptr_q->dataq_size;
-    }
-
-    /* Unlock the mutex to release the critical section */
-    pthread_mutex_unlock(&ptr_q->mutex);
-
-    return pitem;
-}
-
-
-int queue_post_cmdq ( void* queuecontext,
-                     struct video_msgq *pitem
-                     )
-{
-    struct video_queue_context *ptr_q = NULL;
-
-    if (pitem == NULL || queuecontext == NULL)
-    {
-        return -1;
-    }
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-    /* Lock the mutex to protect the critical section */
-    pthread_mutex_lock(&ptr_q->mutex);
-
-    if ((ptr_q->write_comq + 1) % ptr_q->commandq_size == ptr_q->read_comq)
-    {
-        printf("\n QUEUE is FULL");
-        /* Unlock the mutex to release the critical section */
-        pthread_mutex_unlock(&ptr_q->mutex);
-        return 0;
-    }
-    else
-    {
-        /* Store the command in the Message Queue & increment write offset */
-        memcpy ( &ptr_q->ptr_cmdq [ptr_q->write_comq],pitem, \
-                 sizeof (struct video_msgq));
-        ptr_q->write_comq = (ptr_q->write_comq + 1) % ptr_q->commandq_size;
-    }
-
-    /* Unlock the mutex to release the critical section */
-    pthread_mutex_unlock(&ptr_q->mutex);
-
-    /* Post the semaphore */
-    sem_post(&ptr_q->sem_message);
-    return 1;
-}
-
-
-int queue_post_dataq ( void *queuecontext,
-                       struct video_msgq *pitem
-                      )
-{
-    struct video_queue_context *ptr_q = NULL;
-
-    if (pitem == NULL || queuecontext == NULL)
-    {
-        return -1;
-    }
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-    /* Lock the mutex to protect the critical section */
-    pthread_mutex_lock(&ptr_q->mutex);
-
-    if ((ptr_q->write_dataq + 1) % ptr_q->dataq_size == ptr_q->read_dataq)
-    {
-        printf("\n QUEUE is FULL");
-        /* Unlock the mutex to release the critical section */
-        pthread_mutex_unlock(&ptr_q->mutex);
-        return 0;
-    }
-    else
-    {
-        /* Store the command in the Message Queue & increment write offset */
-        memcpy ( &ptr_q->ptr_dataq [ptr_q->write_dataq],pitem, \
-                 sizeof (struct video_msgq));
-        ptr_q->write_dataq = (ptr_q->write_dataq + 1) % ptr_q->dataq_size;
-    }
-
-    /* Unlock the mutex to release the critical section */
-    pthread_mutex_unlock(&ptr_q->mutex);
-
-    /* Post the semaphore */
-    sem_post(&ptr_q->sem_message);
-    return 1;
-
-}
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "message_queue.h"
+
+int check_if_queue_empty ( unsigned int queuetocheck, void* queuecontext )
+{
+    struct video_queue_context *ptr_q = NULL;
+
+    /*
+     * queuetocheck - 0 command queue
+     * queuetocheck - 1 data queue
+     */
+    if ( queuecontext == NULL || (queuetocheck > 1 ) ) {
+        return 1;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    if (queuetocheck == 0) {
+        if (ptr_q->read_comq == ptr_q->write_comq) {
+            return 1;
+        }
+    } else if (queuetocheck == 1) {
+        if (ptr_q->write_dataq == ptr_q->read_dataq) {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+
+
+struct video_msgq * queue_get_cmd (void* queuecontext ) {
+    struct video_queue_context *ptr_q = NULL;
+    struct video_msgq *pitem = NULL;
+
+    if ( NULL == queuecontext ) {
+        printf("\n queue_get_cmd: Invalid Input parameter\n");
+        return NULL;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    /* Wait on the semaphore till it is released */
+    sem_wait(&ptr_q->sem_message);
+
+    /* Lock the mutex to protect the critical section */
+    pthread_mutex_lock(&ptr_q->mutex);
+
+    if (ptr_q->read_comq != ptr_q->write_comq) {
+        pitem = &ptr_q->ptr_cmdq [ptr_q->read_comq];
+        ptr_q->read_comq = (ptr_q->read_comq + 1) % \
+                   ptr_q->commandq_size;
+    } else if (ptr_q->write_dataq != ptr_q->read_dataq) {
+        pitem = &ptr_q->ptr_dataq [ptr_q->read_dataq];
+        ptr_q->read_dataq = (ptr_q->read_dataq + 1) % \
+                    ptr_q->dataq_size;
+    }
+
+    /* Unlock the mutex to release the critical section */
+    pthread_mutex_unlock(&ptr_q->mutex);
+
+    return pitem;
+}
+
+
+int queue_post_cmdq ( void* queuecontext,
+        struct video_msgq *pitem
+        )
+{
+    struct video_queue_context *ptr_q = NULL;
+
+    if (pitem == NULL || queuecontext == NULL) {
+        return -1;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    /* Lock the mutex to protect the critical section */
+    pthread_mutex_lock(&ptr_q->mutex);
+
+    if ((ptr_q->write_comq + 1) % ptr_q->commandq_size == ptr_q->read_comq) {
+        printf("\n QUEUE is FULL");
+        /* Unlock the mutex to release the critical section */
+        pthread_mutex_unlock(&ptr_q->mutex);
+        return 0;
+    } else {
+        /* Store the command in the Message Queue & increment write offset */
+        memcpy ( &ptr_q->ptr_cmdq [ptr_q->write_comq],pitem, \
+                sizeof (struct video_msgq));
+        ptr_q->write_comq = (ptr_q->write_comq + 1) % ptr_q->commandq_size;
+    }
+
+    /* Unlock the mutex to release the critical section */
+    pthread_mutex_unlock(&ptr_q->mutex);
+
+    /* Post the semaphore */
+    sem_post(&ptr_q->sem_message);
+    return 1;
+}
+
+
+int queue_post_dataq ( void *queuecontext,
+        struct video_msgq *pitem
+        )
+{
+    struct video_queue_context *ptr_q = NULL;
+
+    if (pitem == NULL || queuecontext == NULL) {
+        return -1;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    /* Lock the mutex to protect the critical section */
+    pthread_mutex_lock(&ptr_q->mutex);
+
+    if ((ptr_q->write_dataq + 1) % ptr_q->dataq_size == ptr_q->read_dataq) {
+        printf("\n QUEUE is FULL");
+        /* Unlock the mutex to release the critical section */
+        pthread_mutex_unlock(&ptr_q->mutex);
+        return 0;
+    } else {
+        /* Store the command in the Message Queue & increment write offset */
+        memcpy ( &ptr_q->ptr_dataq [ptr_q->write_dataq],pitem, \
+                sizeof (struct video_msgq));
+        ptr_q->write_dataq = (ptr_q->write_dataq + 1) % ptr_q->dataq_size;
+    }
+
+    /* Unlock the mutex to release the critical section */
+    pthread_mutex_unlock(&ptr_q->mutex);
+
+    /* Post the semaphore */
+    sem_post(&ptr_q->sem_message);
+    return 1;
+
+}
diff --git a/mm-video-v4l2/vidc/vdec/src/mp4_utils.cpp b/mm-video-v4l2/vidc/vdec/src/mp4_utils.cpp
index 95335d0..d47179f 100644
--- a/mm-video-v4l2/vidc/vdec/src/mp4_utils.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/mp4_utils.cpp
@@ -29,9 +29,9 @@
 //#include "omx_vdec.h"
 # include <stdio.h>
 #ifdef _ANDROID_
-    extern "C"{
-        #include<utils/Log.h>
-    }
+extern "C" {
+#include<utils/Log.h>
+}
 #endif//_ANDROID_
 
 #undef DEBUG_PRINT_LOW
@@ -44,259 +44,304 @@
 
 MP4_Utils::MP4_Utils()
 {
-   m_SrcWidth = 0;
-   m_SrcHeight = 0;
-   vop_time_resolution = 0;
-   vop_time_found = false;
+    m_SrcWidth = 0;
+    m_SrcHeight = 0;
+    vop_time_resolution = 0;
+    vop_time_found = false;
 
 }
 MP4_Utils::~MP4_Utils()
 {
 }
 
-uint32 MP4_Utils::read_bit_field(posInfoType * posPtr, uint32 size) {
-   uint8 *bits = &posPtr->bytePtr[0];
-   uint32 bitBuf =
-       (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3];
+uint32 MP4_Utils::read_bit_field(posInfoType * posPtr, uint32 size)
+{
+    uint8 *bits = &posPtr->bytePtr[0];
+    uint32 bitBuf =
+        (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3];
 
-   uint32 value = (bitBuf >> (32 - posPtr->bitPos - size)) & MASK(size);
+    uint32 value = (bitBuf >> (32 - posPtr->bitPos - size)) & MASK(size);
 
-   /* Update the offset in preparation for next field    */
-   posPtr->bitPos += size;
+    /* Update the offset in preparation for next field    */
+    posPtr->bitPos += size;
 
-   while (posPtr->bitPos >= 8) {
-      posPtr->bitPos -= 8;
-      posPtr->bytePtr++;
-   }
-   return value;
+    while (posPtr->bitPos >= 8) {
+        posPtr->bitPos -= 8;
+        posPtr->bytePtr++;
+    }
+
+    return value;
 }
-static uint8 *find_code
-    (uint8 * bytePtr, uint32 size, uint32 codeMask, uint32 referenceCode) {
-   uint32 code = 0xFFFFFFFF;
-   for (uint32 i = 0; i < size; i++) {
-      code <<= 8;
-      code |= *bytePtr++;
+    static uint8 *find_code
+(uint8 * bytePtr, uint32 size, uint32 codeMask, uint32 referenceCode)
+{
+    uint32 code = 0xFFFFFFFF;
 
-      if ((code & codeMask) == referenceCode) {
-         return bytePtr;
-      }
-   }
+    for (uint32 i = 0; i < size; i++) {
+        code <<= 8;
+        code |= *bytePtr++;
 
-   DEBUG_PRINT_LOW("Unable to find code 0x%x\n", referenceCode);
-   return NULL;
+        if ((code & codeMask) == referenceCode) {
+            return bytePtr;
+        }
+    }
+
+    DEBUG_PRINT_LOW("Unable to find code 0x%x\n", referenceCode);
+    return NULL;
 }
-bool MP4_Utils::parseHeader(mp4StreamType * psBits) {
-   uint32 profile_and_level_indication = 0;
-   uint8 VerID = 1; /* default value */
-   long hxw = 0;
+bool MP4_Utils::parseHeader(mp4StreamType * psBits)
+{
+    uint32 profile_and_level_indication = 0;
+    uint8 VerID = 1; /* default value */
+    long hxw = 0;
 
-   m_posInfo.bitPos = 0;
-   m_posInfo.bytePtr = psBits->data;
-   m_dataBeginPtr = psBits->data;
+    m_posInfo.bitPos = 0;
+    m_posInfo.bytePtr = psBits->data;
+    m_dataBeginPtr = psBits->data;
 
-   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
-                                 MASK(32),VOP_START_CODE);
-   if(m_posInfo.bytePtr) {
-      return false;
-   }
+    m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
+            MASK(32),VOP_START_CODE);
 
-   m_posInfo.bitPos = 0;
-   m_posInfo.bytePtr = psBits->data;
-   m_dataBeginPtr = psBits->data;
-   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
-                                 MASK(32),GOV_START_CODE);
-   if(m_posInfo.bytePtr) {
-      return false;
-   }
-
-   m_posInfo.bitPos = 0;
-   m_posInfo.bytePtr = psBits->data;
-   m_dataBeginPtr = psBits->data;
-   /* parsing Visual Object Seqence(VOS) header */
-   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
-                                 psBits->numBytes,
-                                 MASK(32),
-                                 VISUAL_OBJECT_SEQUENCE_START_CODE);
-   if ( m_posInfo.bytePtr == NULL ){
-      m_posInfo.bitPos  = 0;
-      m_posInfo.bytePtr = psBits->data;
-   }
-   else {
-      uint32 profile_and_level_indication = read_bit_field (&m_posInfo, 8);
-   }
-   /* parsing Visual Object(VO) header*/
-   /* note: for now, we skip over the user_data */
-   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
-                             MASK(32),VISUAL_OBJECT_START_CODE);
-   if(m_posInfo.bytePtr == NULL) {
-      m_posInfo.bitPos = 0;
-      m_posInfo.bytePtr = psBits->data;
-   }
-   else {
-      uint32 is_visual_object_identifier = read_bit_field (&m_posInfo, 1);
-      if ( is_visual_object_identifier ) {
-         /* visual_object_verid*/
-         read_bit_field (&m_posInfo, 4);
-         /* visual_object_priority*/
-         read_bit_field (&m_posInfo, 3);
-      }
-
-      /* visual_object_type*/
-      uint32 visual_object_type = read_bit_field (&m_posInfo, 4);
-      if ( visual_object_type != VISUAL_OBJECT_TYPE_VIDEO_ID ) {
+    if (m_posInfo.bytePtr) {
         return false;
-      }
-      /* skipping video_signal_type params*/
-      /*parsing Video Object header*/
-      m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
-                                    VIDEO_OBJECT_START_CODE_MASK,VIDEO_OBJECT_START_CODE);
-      if ( m_posInfo.bytePtr == NULL ) {
+    }
+
+    m_posInfo.bitPos = 0;
+    m_posInfo.bytePtr = psBits->data;
+    m_dataBeginPtr = psBits->data;
+    m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
+            MASK(32),GOV_START_CODE);
+
+    if (m_posInfo.bytePtr) {
         return false;
-      }
-   }
+    }
 
-   /* parsing Video Object Layer(VOL) header */
-   m_posInfo.bitPos = 0;
-   m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
-                            psBits->numBytes,
-                            VIDEO_OBJECT_LAYER_START_CODE_MASK,
-                            VIDEO_OBJECT_LAYER_START_CODE);
-   if ( m_posInfo.bytePtr == NULL ) {
-      m_posInfo.bitPos = 0;
-      m_posInfo.bytePtr = psBits->data;
-   }
+    m_posInfo.bitPos = 0;
+    m_posInfo.bytePtr = psBits->data;
+    m_dataBeginPtr = psBits->data;
+    /* parsing Visual Object Seqence(VOS) header */
+    m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
+            psBits->numBytes,
+            MASK(32),
+            VISUAL_OBJECT_SEQUENCE_START_CODE);
 
-   // 1 -> random accessible VOL
-   read_bit_field(&m_posInfo, 1);
+    if ( m_posInfo.bytePtr == NULL ) {
+        m_posInfo.bitPos  = 0;
+        m_posInfo.bytePtr = psBits->data;
+    } else {
+        uint32 profile_and_level_indication = read_bit_field (&m_posInfo, 8);
+    }
 
-   uint32 video_object_type_indication = read_bit_field (&m_posInfo, 8);
-   if ( (video_object_type_indication != SIMPLE_OBJECT_TYPE) &&
-       (video_object_type_indication != SIMPLE_SCALABLE_OBJECT_TYPE) &&
-       (video_object_type_indication != CORE_OBJECT_TYPE) &&
-       (video_object_type_indication != ADVANCED_SIMPLE) &&
-       (video_object_type_indication != RESERVED_OBJECT_TYPE) &&
-       (video_object_type_indication != MAIN_OBJECT_TYPE)) {
-      return false;
-   }
-   /* is_object_layer_identifier*/
-   uint32 is_object_layer_identifier = read_bit_field (&m_posInfo, 1);
-   if (is_object_layer_identifier) {
-      uint32 video_object_layer_verid = read_bit_field (&m_posInfo, 4);
-      uint32 video_object_layer_priority = read_bit_field (&m_posInfo, 3);
-      VerID = (unsigned char)video_object_layer_verid;
-   }
+    /* parsing Visual Object(VO) header*/
+    /* note: for now, we skip over the user_data */
+    m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
+            MASK(32),VISUAL_OBJECT_START_CODE);
 
-  /* aspect_ratio_info*/
-  uint32 aspect_ratio_info = read_bit_field (&m_posInfo, 4);
-  if ( aspect_ratio_info == EXTENDED_PAR ) {
-    /* par_width*/
-    read_bit_field (&m_posInfo, 8);
-    /* par_height*/
-    read_bit_field (&m_posInfo, 8);
-  }
-   /* vol_control_parameters */
-   uint32 vol_control_parameters = read_bit_field (&m_posInfo, 1);
-   if ( vol_control_parameters ) {
-      /* chroma_format*/
-      uint32 chroma_format = read_bit_field (&m_posInfo, 2);
-      if ( chroma_format != 1 ) {
-         return false;
-      }
-      /* low_delay*/
-      uint32 low_delay = read_bit_field (&m_posInfo, 1);
-      /* vbv_parameters (annex D)*/
-      uint32 vbv_parameters = read_bit_field (&m_posInfo, 1);
-      if ( vbv_parameters ) {
-         /* first_half_bitrate*/
-         uint32 first_half_bitrate = read_bit_field (&m_posInfo, 15);
-         uint32 marker_bit = read_bit_field (&m_posInfo, 1);
-         if ( marker_bit != 1) {
-            return false;
-         }
-         /* latter_half_bitrate*/
-         uint32 latter_half_bitrate = read_bit_field (&m_posInfo, 15);
-         marker_bit = read_bit_field (&m_posInfo, 1);
-         if ( marker_bit != 1) {
-            return false;
-         }
-         uint32 VBVPeakBitRate = (first_half_bitrate << 15) + latter_half_bitrate;
-         /* first_half_vbv_buffer_size*/
-         uint32 first_half_vbv_buffer_size = read_bit_field (&m_posInfo, 15);
-         marker_bit = read_bit_field (&m_posInfo, 1);
-         if ( marker_bit != 1) {
-            return false;
-         }
-         /* latter_half_vbv_buffer_size*/
-         uint32 latter_half_vbv_buffer_size = read_bit_field (&m_posInfo, 3);
-         uint32 VBVBufferSize = (first_half_vbv_buffer_size << 3) + latter_half_vbv_buffer_size;
-         /* first_half_vbv_occupancy*/
-         uint32 first_half_vbv_occupancy = read_bit_field (&m_posInfo, 11);
-         marker_bit = read_bit_field (&m_posInfo, 1);
-         if ( marker_bit != 1) {
-            return false;
-         }
-         /* latter_half_vbv_occupancy*/
-         uint32 latter_half_vbv_occupancy = read_bit_field (&m_posInfo, 15);
-         marker_bit = read_bit_field (&m_posInfo, 1);
-         if ( marker_bit != 1) {
-            return false;
-         }
-      }/* vbv_parameters*/
-   }/*vol_control_parameters*/
+    if (m_posInfo.bytePtr == NULL) {
+        m_posInfo.bitPos = 0;
+        m_posInfo.bytePtr = psBits->data;
+    } else {
+        uint32 is_visual_object_identifier = read_bit_field (&m_posInfo, 1);
 
-   /* video_object_layer_shape*/
-   uint32 video_object_layer_shape = read_bit_field (&m_posInfo, 2);
-   uint8 VOLShape = (unsigned char)video_object_layer_shape;
-   if ( VOLShape != MPEG4_SHAPE_RECTANGULAR ) {
-       return false;
-   }
-   /* marker_bit*/
-   uint32 marker_bit = read_bit_field (&m_posInfo, 1);
-   if ( marker_bit != 1 ) {
-      return false;
-   }
-   /* vop_time_increment_resolution*/
-   uint32 vop_time_increment_resolution = read_bit_field (&m_posInfo, 16);
-   vop_time_resolution = vop_time_increment_resolution;
-   vop_time_found = true;
-   return true;
+        if ( is_visual_object_identifier ) {
+            /* visual_object_verid*/
+            read_bit_field (&m_posInfo, 4);
+            /* visual_object_priority*/
+            read_bit_field (&m_posInfo, 3);
+        }
+
+        /* visual_object_type*/
+        uint32 visual_object_type = read_bit_field (&m_posInfo, 4);
+
+        if ( visual_object_type != VISUAL_OBJECT_TYPE_VIDEO_ID ) {
+            return false;
+        }
+
+        /* skipping video_signal_type params*/
+        /*parsing Video Object header*/
+        m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
+                VIDEO_OBJECT_START_CODE_MASK,VIDEO_OBJECT_START_CODE);
+
+        if ( m_posInfo.bytePtr == NULL ) {
+            return false;
+        }
+    }
+
+    /* parsing Video Object Layer(VOL) header */
+    m_posInfo.bitPos = 0;
+    m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
+            psBits->numBytes,
+            VIDEO_OBJECT_LAYER_START_CODE_MASK,
+            VIDEO_OBJECT_LAYER_START_CODE);
+
+    if ( m_posInfo.bytePtr == NULL ) {
+        m_posInfo.bitPos = 0;
+        m_posInfo.bytePtr = psBits->data;
+    }
+
+    // 1 -> random accessible VOL
+    read_bit_field(&m_posInfo, 1);
+
+    uint32 video_object_type_indication = read_bit_field (&m_posInfo, 8);
+
+    if ( (video_object_type_indication != SIMPLE_OBJECT_TYPE) &&
+            (video_object_type_indication != SIMPLE_SCALABLE_OBJECT_TYPE) &&
+            (video_object_type_indication != CORE_OBJECT_TYPE) &&
+            (video_object_type_indication != ADVANCED_SIMPLE) &&
+            (video_object_type_indication != RESERVED_OBJECT_TYPE) &&
+            (video_object_type_indication != MAIN_OBJECT_TYPE)) {
+        return false;
+    }
+
+    /* is_object_layer_identifier*/
+    uint32 is_object_layer_identifier = read_bit_field (&m_posInfo, 1);
+
+    if (is_object_layer_identifier) {
+        uint32 video_object_layer_verid = read_bit_field (&m_posInfo, 4);
+        uint32 video_object_layer_priority = read_bit_field (&m_posInfo, 3);
+        VerID = (unsigned char)video_object_layer_verid;
+    }
+
+    /* aspect_ratio_info*/
+    uint32 aspect_ratio_info = read_bit_field (&m_posInfo, 4);
+
+    if ( aspect_ratio_info == EXTENDED_PAR ) {
+        /* par_width*/
+        read_bit_field (&m_posInfo, 8);
+        /* par_height*/
+        read_bit_field (&m_posInfo, 8);
+    }
+
+    /* vol_control_parameters */
+    uint32 vol_control_parameters = read_bit_field (&m_posInfo, 1);
+
+    if ( vol_control_parameters ) {
+        /* chroma_format*/
+        uint32 chroma_format = read_bit_field (&m_posInfo, 2);
+
+        if ( chroma_format != 1 ) {
+            return false;
+        }
+
+        /* low_delay*/
+        uint32 low_delay = read_bit_field (&m_posInfo, 1);
+        /* vbv_parameters (annex D)*/
+        uint32 vbv_parameters = read_bit_field (&m_posInfo, 1);
+
+        if ( vbv_parameters ) {
+            /* first_half_bitrate*/
+            uint32 first_half_bitrate = read_bit_field (&m_posInfo, 15);
+            uint32 marker_bit = read_bit_field (&m_posInfo, 1);
+
+            if ( marker_bit != 1) {
+                return false;
+            }
+
+            /* latter_half_bitrate*/
+            uint32 latter_half_bitrate = read_bit_field (&m_posInfo, 15);
+            marker_bit = read_bit_field (&m_posInfo, 1);
+
+            if ( marker_bit != 1) {
+                return false;
+            }
+
+            uint32 VBVPeakBitRate = (first_half_bitrate << 15) + latter_half_bitrate;
+            /* first_half_vbv_buffer_size*/
+            uint32 first_half_vbv_buffer_size = read_bit_field (&m_posInfo, 15);
+            marker_bit = read_bit_field (&m_posInfo, 1);
+
+            if ( marker_bit != 1) {
+                return false;
+            }
+
+            /* latter_half_vbv_buffer_size*/
+            uint32 latter_half_vbv_buffer_size = read_bit_field (&m_posInfo, 3);
+            uint32 VBVBufferSize = (first_half_vbv_buffer_size << 3) + latter_half_vbv_buffer_size;
+            /* first_half_vbv_occupancy*/
+            uint32 first_half_vbv_occupancy = read_bit_field (&m_posInfo, 11);
+            marker_bit = read_bit_field (&m_posInfo, 1);
+
+            if ( marker_bit != 1) {
+                return false;
+            }
+
+            /* latter_half_vbv_occupancy*/
+            uint32 latter_half_vbv_occupancy = read_bit_field (&m_posInfo, 15);
+            marker_bit = read_bit_field (&m_posInfo, 1);
+
+            if ( marker_bit != 1) {
+                return false;
+            }
+        }/* vbv_parameters*/
+    }/*vol_control_parameters*/
+
+    /* video_object_layer_shape*/
+    uint32 video_object_layer_shape = read_bit_field (&m_posInfo, 2);
+    uint8 VOLShape = (unsigned char)video_object_layer_shape;
+
+    if ( VOLShape != MPEG4_SHAPE_RECTANGULAR ) {
+        return false;
+    }
+
+    /* marker_bit*/
+    uint32 marker_bit = read_bit_field (&m_posInfo, 1);
+
+    if ( marker_bit != 1 ) {
+        return false;
+    }
+
+    /* vop_time_increment_resolution*/
+    uint32 vop_time_increment_resolution = read_bit_field (&m_posInfo, 16);
+    vop_time_resolution = vop_time_increment_resolution;
+    vop_time_found = true;
+    return true;
 }
 
 bool MP4_Utils::is_notcodec_vop(unsigned char *pbuffer, unsigned int len)
 {
-   unsigned int index = 4,vop_bits=0;
-   unsigned int temp = vop_time_resolution - 1;
-   unsigned char vop_type=0,modulo_bit=0,not_coded=0;
-   if (!vop_time_found || !pbuffer || len < 5) {
-      return false;
-   }
-   if((pbuffer[0] == 0) && (pbuffer[1] == 0) && (pbuffer[2] == 1) && (pbuffer[3] == 0xB6)){
-      while(temp) {
-         vop_bits++;
-         temp >>= 1;
-      }
-      vop_type = (pbuffer[index] & 0xc0) >> 6;
-      unsigned bits_parsed = 2;
-      do {
+    unsigned int index = 4,vop_bits=0;
+    unsigned int temp = vop_time_resolution - 1;
+    unsigned char vop_type=0,modulo_bit=0,not_coded=0;
+
+    if (!vop_time_found || !pbuffer || len < 5) {
+        return false;
+    }
+
+    if ((pbuffer[0] == 0) && (pbuffer[1] == 0) && (pbuffer[2] == 1) && (pbuffer[3] == 0xB6)) {
+        while (temp) {
+            vop_bits++;
+            temp >>= 1;
+        }
+
+        vop_type = (pbuffer[index] & 0xc0) >> 6;
+        unsigned bits_parsed = 2;
+
+        do {
             modulo_bit = pbuffer[index]  & (1 << (7-bits_parsed));
             bits_parsed++;
             index += bits_parsed/8;
             bits_parsed = bits_parsed %8;
-            if(index >= len) {
-               return false;
+
+            if (index >= len) {
+                return false;
             }
-      }while(modulo_bit);
-      bits_parsed++; //skip marker bit
-      bits_parsed += vop_bits + 1;//Vop bit & Marker bits
-      index += bits_parsed/8;
-      if(index >= len) {
-         return false;
-      }
-      bits_parsed = bits_parsed % 8;
-      not_coded = pbuffer[index] & (1 << (7 - bits_parsed));
-      if(!not_coded){
-         return true;
-      }
-   }
-   return false;
+        } while (modulo_bit);
+
+        bits_parsed++; //skip marker bit
+        bits_parsed += vop_bits + 1;//Vop bit & Marker bits
+        index += bits_parsed/8;
+
+        if (index >= len) {
+            return false;
+        }
+
+        bits_parsed = bits_parsed % 8;
+        not_coded = pbuffer[index] & (1 << (7 - bits_parsed));
+
+        if (!not_coded) {
+            return true;
+        }
+    }
+
+    return false;
 }
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec.cpp
index f9ca19c..663fe6c 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec.cpp
@@ -124,12 +124,12 @@
 #define VC1_SEQ_LAYER_SIZE          36
 
 #ifdef USE_ION
-    #define MEM_DEVICE "/dev/ion"
-    #ifdef MAX_RES_720P
-    #define MEM_HEAP_ID ION_CAMERA_HEAP_ID
-    #else
-    #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
-    #endif
+#define MEM_DEVICE "/dev/ion"
+#ifdef MAX_RES_720P
+#define MEM_HEAP_ID ION_CAMERA_HEAP_ID
+#else
+#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
+#endif
 #elif MAX_RES_720P
 #define MEM_DEVICE "/dev/pmem_adsp"
 #elif MAX_RES_1080P_EBI
@@ -147,11 +147,11 @@
 
 /*
 #ifdef _ANDROID_
-    extern "C"{
-        #include<utils/Log.h>
-    }
+extern "C"{
+#include<utils/Log.h>
+}
 #endif//_ANDROID_
-*/
+ */
 
 #ifndef _ANDROID_
 #include <glib.h>
@@ -163,81 +163,78 @@
 
 void* async_message_thread (void *input)
 {
-  struct vdec_ioctl_msg ioctl_msg;
-  struct vdec_msginfo vdec_msg;
-  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
-  int error_code = 0;
-  DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
-  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
-  while (1)
-  {
-    ioctl_msg.in = NULL;
-    ioctl_msg.out = (void*)&vdec_msg;
-    /*Wait for a message from the video decoder driver*/
-    error_code = ioctl ( omx->drv_ctx.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,
-                         (void*)&ioctl_msg);
-    if (error_code == -512) // ERESTARTSYS
-    {
-      DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
+    struct vdec_ioctl_msg ioctl_msg;
+    struct vdec_msginfo vdec_msg;
+    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
+    int error_code = 0;
+    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
+    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
+
+    while (1) {
+        ioctl_msg.in = NULL;
+        ioctl_msg.out = (void*)&vdec_msg;
+        /*Wait for a message from the video decoder driver*/
+        error_code = ioctl ( omx->drv_ctx.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,
+                (void*)&ioctl_msg);
+
+        if (error_code == -512) { // ERESTARTSYS
+            DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
+        } else if (error_code < 0) {
+            DEBUG_PRINT_ERROR("\n Error in ioctl read next msg");
+            break;
+        }        /*Call Instance specific process function*/
+        else if (omx->async_message_process(input,&vdec_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message");
+        }
     }
-    else if (error_code < 0)
-    {
-      DEBUG_PRINT_ERROR("\n Error in ioctl read next msg");
-      break;
-    }        /*Call Instance specific process function*/
-    else if (omx->async_message_process(input,&vdec_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message");
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
-  return NULL;
+
+    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
+    return NULL;
 }
 
 void* message_thread(void *input)
 {
-  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
-  unsigned char id;
-  int n;
+    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
+    unsigned char id;
+    int n;
 
-  DEBUG_PRINT_HIGH("omx_vdec: message thread start");
-  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
-  while (1)
-  {
+    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
+    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
 
-    n = read(omx->m_pipe_in, &id, 1);
+    while (1) {
 
-    if(0 == n)
-    {
-      break;
+        n = read(omx->m_pipe_in, &id, 1);
+
+        if (0 == n) {
+            break;
+        }
+
+        if (1 == n) {
+            omx->process_event_cb(omx, id);
+        }
+
+        if ((n < 0) && (errno != EINTR)) {
+            DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
+            break;
+        }
     }
 
-    if (1 == n)
-    {
-        omx->process_event_cb(omx, id);
-    }
-    if ((n < 0) && (errno != EINTR))
-    {
-      DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
-      break;
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
-  return 0;
+    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
+    return 0;
 }
 
 void post_message(omx_vdec *omx, unsigned char id)
 {
-      int ret_value;
-      DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
-      ret_value = write(omx->m_pipe_out, &id, 1);
-      DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
+    int ret_value;
+    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
+    ret_value = write(omx->m_pipe_out, &id, 1);
+    DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
 }
 
 // omx_cmd_queue destructor
 omx_vdec::omx_cmd_queue::~omx_cmd_queue()
 {
-  // Nothing to do
+    // Nothing to do
 }
 
 // omx cmd queue constructor
@@ -249,49 +246,47 @@
 // omx cmd queue insert
 bool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
 {
-  bool ret = true;
-  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
-  {
-    m_q[m_write].id       = id;
-    m_q[m_write].param1   = p1;
-    m_q[m_write].param2   = p2;
-    m_write++;
-    m_size ++;
-    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_write = 0;
+    bool ret = true;
+
+    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
+        m_q[m_write].id       = id;
+        m_q[m_write].param1   = p1;
+        m_q[m_write].param2   = p2;
+        m_write++;
+        m_size ++;
+
+        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_write = 0;
+        }
+    } else {
+        ret = false;
+        DEBUG_PRINT_ERROR("\n ERROR: %s()::Command Queue Full", __func__);
     }
-  }
-  else
-  {
-    ret = false;
-    DEBUG_PRINT_ERROR("\n ERROR: %s()::Command Queue Full", __func__);
-  }
-  return ret;
+
+    return ret;
 }
 
 // omx cmd queue pop
 bool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
 {
-  bool ret = true;
-  if (m_size > 0)
-  {
-    *id = m_q[m_read].id;
-    *p1 = m_q[m_read].param1;
-    *p2 = m_q[m_read].param2;
-    // Move the read pointer ahead
-    ++m_read;
-    --m_size;
-    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_read = 0;
+    bool ret = true;
+
+    if (m_size > 0) {
+        *id = m_q[m_read].id;
+        *p1 = m_q[m_read].param1;
+        *p2 = m_q[m_read].param2;
+        // Move the read pointer ahead
+        ++m_read;
+        --m_size;
+
+        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_read = 0;
+        }
+    } else {
+        ret = false;
     }
-  }
-  else
-  {
-    ret = false;
-  }
-  return ret;
+
+    return ret;
 }
 
 // Retrieve the first mesg type in the queue
@@ -303,114 +298,105 @@
 #ifdef _ANDROID_
 omx_vdec::ts_arr_list::ts_arr_list()
 {
-  //initialize timestamps array
-  memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
+    //initialize timestamps array
+    memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
 }
 omx_vdec::ts_arr_list::~ts_arr_list()
 {
-  //free m_ts_arr_list?
+    //free m_ts_arr_list?
 }
 
 bool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
 {
-  bool ret = true;
-  bool duplicate_ts = false;
-  int idx = 0;
+    bool ret = true;
+    bool duplicate_ts = false;
+    int idx = 0;
 
-  //insert at the first available empty location
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
-    if (!m_ts_arr_list[idx].valid)
-    {
-      //found invalid or empty entry, save timestamp
-      m_ts_arr_list[idx].valid = true;
-      m_ts_arr_list[idx].timestamp = ts;
-      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
-                       ts, idx);
-      break;
+    //insert at the first available empty location
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+        if (!m_ts_arr_list[idx].valid) {
+            //found invalid or empty entry, save timestamp
+            m_ts_arr_list[idx].valid = true;
+            m_ts_arr_list[idx].timestamp = ts;
+            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
+                    ts, idx);
+            break;
+        }
     }
-  }
 
-  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
-  {
-    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
-    ret = false;
-  }
-  return ret;
+    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
+        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
+        ret = false;
+    }
+
+    return ret;
 }
 
 bool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
 {
-  bool ret = true;
-  int min_idx = -1;
-  OMX_TICKS min_ts = 0;
-  int idx = 0;
+    bool ret = true;
+    int min_idx = -1;
+    OMX_TICKS min_ts = 0;
+    int idx = 0;
 
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
 
-    if (m_ts_arr_list[idx].valid)
-    {
-      //found valid entry, save index
-      if (min_idx < 0)
-      {
-        //first valid entry
-        min_ts = m_ts_arr_list[idx].timestamp;
-        min_idx = idx;
-      }
-      else if (m_ts_arr_list[idx].timestamp < min_ts)
-      {
-        min_ts = m_ts_arr_list[idx].timestamp;
-        min_idx = idx;
-      }
+        if (m_ts_arr_list[idx].valid) {
+            //found valid entry, save index
+            if (min_idx < 0) {
+                //first valid entry
+                min_ts = m_ts_arr_list[idx].timestamp;
+                min_idx = idx;
+            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
+                min_ts = m_ts_arr_list[idx].timestamp;
+                min_idx = idx;
+            }
+        }
+
     }
 
-  }
+    if (min_idx < 0) {
+        //no valid entries found
+        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
+        ts = 0;
+        ret = false;
+    } else {
+        ts = m_ts_arr_list[min_idx].timestamp;
+        m_ts_arr_list[min_idx].valid = false;
+        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
+                ts, min_idx);
+    }
 
-  if (min_idx < 0)
-  {
-    //no valid entries found
-    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
-    ts = 0;
-    ret = false;
-  }
-  else
-  {
-    ts = m_ts_arr_list[min_idx].timestamp;
-    m_ts_arr_list[min_idx].valid = false;
-    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
-                     ts, min_idx);
-  }
-
-  return ret;
+    return ret;
 
 }
 
 
 bool omx_vdec::ts_arr_list::reset_ts_list()
 {
-  bool ret = true;
-  int idx = 0;
+    bool ret = true;
+    int idx = 0;
 
-  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
-    m_ts_arr_list[idx].valid = false;
-  }
-  return ret;
+    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
+
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+        m_ts_arr_list[idx].valid = false;
+    }
+
+    return ret;
 }
 #endif
 
 // factory function executed by the core to create instances
 void *get_omx_component_factory_fn(void)
 {
-  return (new omx_vdec);
+    return (new omx_vdec);
 }
 
 #ifdef _ANDROID_
 #ifdef USE_ION
 VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
-                     struct ion_handle *handle, int ionMapfd)
+        struct ion_handle *handle, int ionMapfd)
 {
     m_ion_device_fd = devicefd;
     m_ion_handle = handle;
@@ -426,1319 +412,1275 @@
 #endif
 #endif // _ANDROID_
 /* ======================================================================
-FUNCTION
-  omx_vdec::omx_vdec
+   FUNCTION
+   omx_vdec::omx_vdec
 
-DESCRIPTION
-  Constructor
+   DESCRIPTION
+   Constructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
-                      m_app_data(NULL),
-                      m_inp_mem_ptr(NULL),
-                      m_out_mem_ptr(NULL),
-                      m_phdr_pmem_ptr(NULL),
-                      pending_input_buffers(0),
-                      pending_output_buffers(0),
-                      m_out_bm_count(0),
-                      m_inp_bm_count(0),
-                      m_inp_bPopulated(OMX_FALSE),
-                      m_out_bPopulated(OMX_FALSE),
-                      m_flags(0),
-                      m_inp_bEnabled(OMX_TRUE),
-                      m_out_bEnabled(OMX_TRUE),
-                      m_platform_list(NULL),
-                      m_platform_entry(NULL),
-                      m_pmem_info(NULL),
-                      output_flush_progress (false),
-                      input_flush_progress (false),
-                      input_use_buffer (false),
-                      output_use_buffer (false),
-                      arbitrary_bytes (true),
-                      psource_frame (NULL),
-                      pdest_frame (NULL),
-                      m_inp_heap_ptr (NULL),
-                      m_heap_inp_bm_count (0),
-                      codec_type_parse ((codec_type)0),
-                      first_frame_meta (true),
-                      frame_count (0),
-                      nal_length(0),
-                      nal_count (0),
-                      look_ahead_nal (false),
-                      first_frame(0),
-                      first_buffer(NULL),
-                      first_frame_size (0),
-                      m_error_propogated(false),
-                      m_device_file_ptr(NULL),
-                      m_vc1_profile((vc1_profile_type)0),
-                      prev_ts(LLONG_MAX),
-                      rst_prev_ts(true),
-                      frm_int(0),
-                      m_in_alloc_cnt(0),
-                      m_display_id(NULL),
-                      ouput_egl_buffers(false),
-                      h264_parser(NULL),
-                      client_extradata(0),
-                      h264_last_au_ts(LLONG_MAX),
-                      h264_last_au_flags(0),
-                      m_inp_err_count(0),
-                      m_disp_hor_size(0),
-                      m_disp_vert_size(0),
+    m_app_data(NULL),
+    m_inp_mem_ptr(NULL),
+    m_out_mem_ptr(NULL),
+    m_phdr_pmem_ptr(NULL),
+    pending_input_buffers(0),
+    pending_output_buffers(0),
+    m_out_bm_count(0),
+    m_inp_bm_count(0),
+    m_inp_bPopulated(OMX_FALSE),
+    m_out_bPopulated(OMX_FALSE),
+    m_flags(0),
+    m_inp_bEnabled(OMX_TRUE),
+    m_out_bEnabled(OMX_TRUE),
+    m_platform_list(NULL),
+    m_platform_entry(NULL),
+    m_pmem_info(NULL),
+    output_flush_progress (false),
+    input_flush_progress (false),
+    input_use_buffer (false),
+    output_use_buffer (false),
+    arbitrary_bytes (true),
+    psource_frame (NULL),
+    pdest_frame (NULL),
+    m_inp_heap_ptr (NULL),
+    m_heap_inp_bm_count (0),
+    codec_type_parse ((codec_type)0),
+    first_frame_meta (true),
+    frame_count (0),
+    nal_length(0),
+    nal_count (0),
+    look_ahead_nal (false),
+    first_frame(0),
+    first_buffer(NULL),
+    first_frame_size (0),
+    m_error_propogated(false),
+    m_device_file_ptr(NULL),
+    m_vc1_profile((vc1_profile_type)0),
+    prev_ts(LLONG_MAX),
+    rst_prev_ts(true),
+    frm_int(0),
+    m_in_alloc_cnt(0),
+    m_display_id(NULL),
+    ouput_egl_buffers(false),
+    h264_parser(NULL),
+    client_extradata(0),
+    h264_last_au_ts(LLONG_MAX),
+    h264_last_au_flags(0),
+    m_inp_err_count(0),
+    m_disp_hor_size(0),
+    m_disp_vert_size(0),
 #ifdef _ANDROID_
-                      m_heap_ptr(NULL),
-                      m_heap_count(0),
-                      m_enable_android_native_buffers(OMX_FALSE),
-                      m_use_android_native_buffers(OMX_FALSE),
+    m_heap_ptr(NULL),
+    m_heap_count(0),
+    m_enable_android_native_buffers(OMX_FALSE),
+    m_use_android_native_buffers(OMX_FALSE),
 #endif
-                      in_reconfig(false),
-                      m_use_output_pmem(OMX_FALSE),
-                      m_out_mem_region_smi(OMX_FALSE),
-                      m_out_pvt_entry_pmem(OMX_FALSE),
-                      secure_mode(false),
-                      external_meta_buffer(false),
-                      external_meta_buffer_iommu(false)
+    in_reconfig(false),
+    m_use_output_pmem(OMX_FALSE),
+    m_out_mem_region_smi(OMX_FALSE),
+    m_out_pvt_entry_pmem(OMX_FALSE),
+    secure_mode(false),
+    external_meta_buffer(false),
+    external_meta_buffer_iommu(false)
 #ifdef _ANDROID_
-                    ,iDivXDrmDecrypt(NULL)
+,iDivXDrmDecrypt(NULL)
 #endif
-                    ,m_desc_buffer_ptr(NULL)
-                    ,m_extradata(NULL)
-                    ,m_power_hinted(false)
+    ,m_desc_buffer_ptr(NULL)
+    ,m_extradata(NULL)
+,m_power_hinted(false)
 {
-  /* Assumption is that , to begin with , we have all the frames with decoder */
-  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
+    /* Assumption is that , to begin with , we have all the frames with decoder */
+    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
 #ifdef _ANDROID_
-  char property_value[PROPERTY_VALUE_MAX] = {0};
-  property_get("vidc.dec.debug.perf", property_value, "0");
-  perf_flag = atoi(property_value);
-  if (perf_flag)
-  {
-    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
-    dec_time.start();
-    proc_frms = latency = 0;
-  }
-  property_value[0] = NULL;
-  property_get("vidc.dec.debug.ts", property_value, "0");
-  m_debug_timestamp = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
-  if (m_debug_timestamp)
-  {
-    time_stamp_dts.set_timestamp_reorder_mode(true);
-    time_stamp_dts.enable_debug_print(true);
-  }
+    char property_value[PROPERTY_VALUE_MAX] = {0};
+    property_get("vidc.dec.debug.perf", property_value, "0");
+    perf_flag = atoi(property_value);
 
-  property_value[0] = NULL;
-  property_get("vidc.dec.debug.concealedmb", property_value, "0");
-  m_debug_concealedmb = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
+    if (perf_flag) {
+        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
+        dec_time.start();
+        proc_frms = latency = 0;
+    }
+
+    property_value[0] = NULL;
+    property_get("vidc.dec.debug.ts", property_value, "0");
+    m_debug_timestamp = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
+
+    if (m_debug_timestamp) {
+        time_stamp_dts.set_timestamp_reorder_mode(true);
+        time_stamp_dts.enable_debug_print(true);
+    }
+
+    property_value[0] = NULL;
+    property_get("vidc.dec.debug.concealedmb", property_value, "0");
+    m_debug_concealedmb = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
 
 #endif
-  memset(&m_cmp,0,sizeof(m_cmp));
-  memset(&m_cb,0,sizeof(m_cb));
-  memset (&drv_ctx,0,sizeof(drv_ctx));
-  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
-  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
-  memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
-  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-  m_demux_entries = 0;
-  msg_thread_created = false;
-  async_thread_created = false;
+    memset(&m_cmp,0,sizeof(m_cmp));
+    memset(&m_cb,0,sizeof(m_cb));
+    memset (&drv_ctx,0,sizeof(drv_ctx));
+    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
+    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
+    memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
+    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+    m_demux_entries = 0;
+    msg_thread_created = false;
+    async_thread_created = false;
 #ifdef _ANDROID_ICS_
-  memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
 #endif
-  drv_ctx.timestamp_adjust = false;
-  drv_ctx.video_driver_fd = -1;
-  m_vendor_config.pData = NULL;
-  pthread_mutex_init(&m_lock, NULL);
-  sem_init(&m_cmd_lock,0,0);
+    drv_ctx.timestamp_adjust = false;
+    drv_ctx.video_driver_fd = -1;
+    m_vendor_config.pData = NULL;
+    pthread_mutex_init(&m_lock, NULL);
+    sem_init(&m_cmd_lock,0,0);
 #ifdef _ANDROID_
-  char extradata_value[PROPERTY_VALUE_MAX] = {0};
-  property_get("vidc.dec.debug.extradata", extradata_value, "0");
-  m_debug_extradata = atoi(extradata_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
+    char extradata_value[PROPERTY_VALUE_MAX] = {0};
+    property_get("vidc.dec.debug.extradata", extradata_value, "0");
+    m_debug_extradata = atoi(extradata_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
 #endif
-  m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
-  client_buffers.set_vdec_client(this);
+    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
+    client_buffers.set_vdec_client(this);
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::~omx_vdec
+   FUNCTION
+   omx_vdec::~omx_vdec
 
-DESCRIPTION
-  Destructor
+   DESCRIPTION
+   Destructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_vdec::~omx_vdec()
 {
-  m_pmem_info = NULL;
-  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
-  if(m_pipe_in) close(m_pipe_in);
-  if(m_pipe_out) close(m_pipe_out);
-  m_pipe_in = -1;
-  m_pipe_out = -1;
-  if (msg_thread_created)
-  {
-    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
-    pthread_join(msg_thread_id,NULL);
-  }
-  if (async_thread_created)
-  {
-    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
-    pthread_join(async_thread_id,NULL);
-  }
-  DEBUG_PRINT_HIGH("Calling close() on Video Driver");
-  close (drv_ctx.video_driver_fd);
-  drv_ctx.video_driver_fd = -1;
+    m_pmem_info = NULL;
+    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
 
-  pthread_mutex_destroy(&m_lock);
-  sem_destroy(&m_cmd_lock);
+    if (m_pipe_in) close(m_pipe_in);
+
+    if (m_pipe_out) close(m_pipe_out);
+
+    m_pipe_in = -1;
+    m_pipe_out = -1;
+
+    if (msg_thread_created) {
+        DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
+        pthread_join(msg_thread_id,NULL);
+    }
+
+    if (async_thread_created) {
+        DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
+        pthread_join(async_thread_id,NULL);
+    }
+
+    DEBUG_PRINT_HIGH("Calling close() on Video Driver");
+    close (drv_ctx.video_driver_fd);
+    drv_ctx.video_driver_fd = -1;
+
+    pthread_mutex_destroy(&m_lock);
+    sem_destroy(&m_cmd_lock);
 #ifdef _ANDROID_
-  if (perf_flag)
-  {
-    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
-    dec_time.end();
-  }
+
+    if (perf_flag) {
+        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
+        dec_time.end();
+    }
+
 #endif /* _ANDROID_ */
-  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
+    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::OMXCntrlProcessMsgCb
+   FUNCTION
+   omx_vdec::OMXCntrlProcessMsgCb
 
-DESCRIPTION
-  IL Client callbacks are generated through this routine. The decoder
-  provides the thread context for this routine.
+   DESCRIPTION
+   IL Client callbacks are generated through this routine. The decoder
+   provides the thread context for this routine.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
 {
-  unsigned p1; // Parameter - 1
-  unsigned p2; // Parameter - 2
-  unsigned ident;
-  unsigned qsize=0; // qsize
-  omx_vdec *pThis = (omx_vdec *) ctxt;
+    unsigned p1; // Parameter - 1
+    unsigned p2; // Parameter - 2
+    unsigned ident;
+    unsigned qsize=0; // qsize
+    omx_vdec *pThis = (omx_vdec *) ctxt;
 
-  if(!pThis)
-  {
-    DEBUG_PRINT_ERROR("\n ERROR: %s()::Context is incorrect, bailing out",
-        __func__);
-    return;
-  }
-
-  // Protect the shared queue data structure
-  do
-  {
-    /*Read the message id's from the queue*/
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if(qsize)
-    {
-      pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
+    if (!pThis) {
+        DEBUG_PRINT_ERROR("\n ERROR: %s()::Context is incorrect, bailing out",
+                __func__);
+        return;
     }
 
-    if (qsize == 0 && pThis->m_state != OMX_StatePause)
-    {
-      qsize = pThis->m_ftb_q.m_size;
-      if (qsize)
-      {
-        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
-      }
-    }
+    // Protect the shared queue data structure
+    do {
+        /*Read the message id's from the queue*/
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
 
-    if (qsize == 0 && pThis->m_state != OMX_StatePause)
-    {
-      qsize = pThis->m_etb_q.m_size;
-      if (qsize)
-      {
-        pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
-      }
-    }
-    pthread_mutex_unlock(&pThis->m_lock);
+        if (qsize) {
+            pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
+        }
 
-    /*process message if we have one*/
-    if(qsize > 0)
-    {
-      id = ident;
-      switch (id)
-      {
-        case OMX_COMPONENT_GENERATE_EVENT:
-          if (pThis->m_cb.EventHandler)
-          {
-            switch (p1)
-            {
-              case OMX_CommandStateSet:
-                pThis->m_state = (OMX_STATETYPE) p2;
-                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
-                    pThis->m_state);
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventCmdComplete, p1, p2, NULL);
-                break;
+        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+            qsize = pThis->m_ftb_q.m_size;
 
-              case OMX_EventError:
-                if(p2 == OMX_StateInvalid)
-                {
-                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
-                    pThis->m_state = (OMX_STATETYPE) p2;
-                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
-                }
-                else if (p2 == OMX_ErrorHardware)
-                {
-                   pThis->omx_report_error();
-                }
-                else
-                {
-                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventError, p2, NULL, NULL );
-                }
-                break;
-
-              case OMX_CommandPortDisable:
-                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2);
-                if (BITMASK_PRESENT(&pThis->m_flags,
-                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
-                {
-                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
-                  break;
-                }
-                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
-                {
-                  pThis->in_reconfig = false;
-                  pThis->drv_ctx.op_buf = pThis->op_buf_rcnfg;
-                  OMX_ERRORTYPE eRet = pThis->set_buffer_req(&pThis->drv_ctx.op_buf);
-                  if(eRet !=  OMX_ErrorNone)
-                  {
-                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
-                      pThis->omx_report_error();
-                      break;
-                  }
-                }
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-              case OMX_CommandPortEnable:
-                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
-                                      OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-
-              default:
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                         OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-
+            if (qsize) {
+                pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
             }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("\n ERROR: %s()::EventHandler is NULL", __func__);
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
-          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
-              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
-            pThis->omx_report_error ();
-          }
-      break;
-        case OMX_COMPONENT_GENERATE_ETB:
-          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
-            pThis->omx_report_error ();
-          }
-         break;
+        }
 
-        case OMX_COMPONENT_GENERATE_FTB:
-          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
-             pThis->omx_report_error ();
-          }
-        break;
+        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+            qsize = pThis->m_etb_q.m_size;
 
-        case OMX_COMPONENT_GENERATE_COMMAND:
-          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
-                                    (OMX_U32)p2,(OMX_PTR)NULL);
-          break;
-
-        case OMX_COMPONENT_GENERATE_EBD:
-
-          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
-          {
-            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
-            pThis->omx_report_error ();
-          }
-          else
-          {
-            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
-            {
-              pThis->m_inp_err_count++;
-              pThis->time_stamp_dts.remove_time_stamp(
-              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
-              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-                ?true:false);
+            if (qsize) {
+                pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
             }
-            else
-            {
-              pThis->m_inp_err_count = 0;
-            }
-            if ( pThis->empty_buffer_done(&pThis->m_cmp,
-                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-            {
-               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
-               pThis->omx_report_error ();
-            }
-            if(!pThis->arbitrary_bytes && pThis->m_inp_err_count > MAX_INPUT_ERROR)
-            {
-               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
-               pThis->omx_report_error ();
-            }
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
-          {
-            int64_t *timestamp = (int64_t *)p1;
-            if (p1)
-            {
-              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
-              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-              ?true:false);
-              free(timestamp);
-            }
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_FBD:
-          if (p2 != VDEC_S_SUCCESS)
-          {
-            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
-            pThis->omx_report_error ();
-          }
-          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
-                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-          {
-            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
-            pThis->omx_report_error ();
-          }
-          break;
+        }
 
-        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
-          DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
-          if (!pThis->input_flush_progress)
-          {
-            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
-          }
-          else
-          {
-            pThis->execute_input_flush();
-            if (pThis->m_cb.EventHandler)
-            {
-              if (p2 != VDEC_S_SUCCESS)
-              {
-                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
-                pThis->omx_report_error ();
-              }
-              else
-              {
-                /*Check if we need generate event for Flush done*/
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
-                {
-                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
-                  DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
-                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                           OMX_EventCmdComplete,OMX_CommandFlush,
-                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
-                }
-                if (BITMASK_PRESENT(&pThis->m_flags,
-                                         OMX_COMPONENT_IDLE_PENDING))
-                {
-                  if (!pThis->output_flush_progress)
-                  {
-                     DEBUG_PRINT_LOW("Output flush done hence issue stop");
-                     if (ioctl (pThis->drv_ctx.video_driver_fd,
-                                VDEC_IOCTL_CMD_STOP,NULL ) < 0)
-                     {
-                       DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
-                       pThis->omx_report_error ();
-                     }
-                  }
-                }
-              }
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-          break;
+        pthread_mutex_unlock(&pThis->m_lock);
 
-        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
-          DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
-          if (!pThis->output_flush_progress)
-          {
-            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
-          }
-          else
-          {
-            pThis->execute_output_flush();
-            if (pThis->m_cb.EventHandler)
-            {
-              if (p2 != VDEC_S_SUCCESS)
-              {
-                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
-                pThis->omx_report_error ();
-              }
-              else
-              {
-                /*Check if we need generate event for Flush done*/
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
-                {
-                  DEBUG_PRINT_LOW("Notify Output Flush done");
-                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                           OMX_EventCmdComplete,OMX_CommandFlush,
-                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
-                }
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
-                {
-                  DEBUG_PRINT_LOW("Internal flush complete");
-                  BITMASK_CLEAR (&pThis->m_flags,
-                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
-                  if (BITMASK_PRESENT(&pThis->m_flags,
-                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
-                  {
-                    pThis->post_event(OMX_CommandPortDisable,
-                               OMX_CORE_OUTPUT_PORT_INDEX,
-                               OMX_COMPONENT_GENERATE_EVENT);
-                    BITMASK_CLEAR (&pThis->m_flags,
-                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+        /*process message if we have one*/
+        if (qsize > 0) {
+            id = ident;
 
-                  }
-                }
+            switch (id) {
+                case OMX_COMPONENT_GENERATE_EVENT:
 
-                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
-                {
-                  if (!pThis->input_flush_progress)
-                  {
-                    DEBUG_PRINT_LOW("Input flush done hence issue stop");
-                    if (ioctl (pThis->drv_ctx.video_driver_fd,
-                               VDEC_IOCTL_CMD_STOP,NULL ) < 0)
-                    {
-                      DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
-                      pThis->omx_report_error ();
+                    if (pThis->m_cb.EventHandler) {
+                        switch (p1) {
+                            case OMX_CommandStateSet:
+                                pThis->m_state = (OMX_STATETYPE) p2;
+                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
+                                        pThis->m_state);
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL);
+                                break;
+
+                            case OMX_EventError:
+
+                                if (p2 == OMX_StateInvalid) {
+                                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
+                                    pThis->m_state = (OMX_STATETYPE) p2;
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
+                                } else if (p2 == OMX_ErrorHardware) {
+                                    pThis->omx_report_error();
+                                } else {
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, p2, NULL, NULL );
+                                }
+
+                                break;
+
+                            case OMX_CommandPortDisable:
+                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2);
+
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+                                    break;
+                                }
+
+                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) {
+                                    pThis->in_reconfig = false;
+                                    pThis->drv_ctx.op_buf = pThis->op_buf_rcnfg;
+                                    OMX_ERRORTYPE eRet = pThis->set_buffer_req(&pThis->drv_ctx.op_buf);
+
+                                    if (eRet !=  OMX_ErrorNone) {
+                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
+                                        pThis->omx_report_error();
+                                        break;
+                                    }
+                                }
+
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+                            case OMX_CommandPortEnable:
+                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+
+                            default:
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("\n ERROR: %s()::EventHandler is NULL", __func__);
                     }
-                  }
-                }
-              }
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-          break;
 
-        case OMX_COMPONENT_GENERATE_START_DONE:
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
 
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
-              pThis->omx_report_error ();
+                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
+                        pThis->omx_report_error ();
+                    }
+
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB:
+
+                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
+                        pThis->omx_report_error ();
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_FTB:
+
+                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
+                        pThis->omx_report_error ();
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_COMMAND:
+                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
+                            (OMX_U32)p2,(OMX_PTR)NULL);
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EBD:
+
+                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
+                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
+                        pThis->omx_report_error ();
+                    } else {
+                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
+                            pThis->m_inp_err_count++;
+                            pThis->time_stamp_dts.remove_time_stamp(
+                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
+                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                                    ?true:false);
+                        } else {
+                            pThis->m_inp_err_count = 0;
+                        }
+
+                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
+                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                            DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
+                            pThis->omx_report_error ();
+                        }
+
+                        if (!pThis->arbitrary_bytes && pThis->m_inp_err_count > MAX_INPUT_ERROR) {
+                            DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
+                            pThis->omx_report_error ();
+                        }
+                    }
+
+                    break;
+                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
+                    {
+                        int64_t *timestamp = (int64_t *)p1;
+
+                        if (p1) {
+                            pThis->time_stamp_dts.remove_time_stamp(*timestamp,
+                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                                    ?true:false);
+                            free(timestamp);
+                        }
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_FBD:
+
+                    if (p2 != VDEC_S_SUCCESS) {
+                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
+                        pThis->omx_report_error ();
+                    } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
+                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                        DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
+                        pThis->omx_report_error ();
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
+                    DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
+
+                    if (!pThis->input_flush_progress) {
+                        DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
+                    } else {
+                        pThis->execute_input_flush();
+
+                        if (pThis->m_cb.EventHandler) {
+                            if (p2 != VDEC_S_SUCCESS) {
+                                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
+                                pThis->omx_report_error ();
+                            } else {
+                                /*Check if we need generate event for Flush done*/
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
+                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
+                                    DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventCmdComplete,OMX_CommandFlush,
+                                            OMX_CORE_INPUT_PORT_INDEX,NULL );
+                                }
+
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_IDLE_PENDING)) {
+                                    if (!pThis->output_flush_progress) {
+                                        DEBUG_PRINT_LOW("Output flush done hence issue stop");
+
+                                        if (ioctl (pThis->drv_ctx.video_driver_fd,
+                                                    VDEC_IOCTL_CMD_STOP,NULL ) < 0) {
+                                            DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
+                                            pThis->omx_report_error ();
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
+                    DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
+
+                    if (!pThis->output_flush_progress) {
+                        DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
+                    } else {
+                        pThis->execute_output_flush();
+
+                        if (pThis->m_cb.EventHandler) {
+                            if (p2 != VDEC_S_SUCCESS) {
+                                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
+                                pThis->omx_report_error ();
+                            } else {
+                                /*Check if we need generate event for Flush done*/
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
+                                    DEBUG_PRINT_LOW("Notify Output Flush done");
+                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventCmdComplete,OMX_CommandFlush,
+                                            OMX_CORE_OUTPUT_PORT_INDEX,NULL );
+                                }
+
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+                                    DEBUG_PRINT_LOW("Internal flush complete");
+                                    BITMASK_CLEAR (&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+
+                                    if (BITMASK_PRESENT(&pThis->m_flags,
+                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
+                                        pThis->post_event(OMX_CommandPortDisable,
+                                                OMX_CORE_OUTPUT_PORT_INDEX,
+                                                OMX_COMPONENT_GENERATE_EVENT);
+                                        BITMASK_CLEAR (&pThis->m_flags,
+                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+
+                                    }
+                                }
+
+                                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
+                                    if (!pThis->input_flush_progress) {
+                                        DEBUG_PRINT_LOW("Input flush done hence issue stop");
+
+                                        if (ioctl (pThis->drv_ctx.video_driver_fd,
+                                                    VDEC_IOCTL_CMD_STOP,NULL ) < 0) {
+                                            DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
+                                            pThis->omx_report_error ();
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_START_DONE:
+                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
+
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
+                            pThis->omx_report_error ();
+                        } else {
+                            DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
+
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                                DEBUG_PRINT_LOW("Move to executing");
+                                // Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                                pThis->m_state = OMX_StateExecuting;
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StateExecuting, NULL);
+                            } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                        OMX_COMPONENT_PAUSE_PENDING)) {
+                                if (ioctl (pThis->drv_ctx.video_driver_fd,
+                                            VDEC_IOCTL_CMD_PAUSE,NULL ) < 0) {
+                                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
+                                    pThis->omx_report_error ();
+                                }
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("\n Event Handler callback is NULL");
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
+                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
+
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
+                            pThis->omx_report_error ();
+                        } else {
+                            pThis->complete_pending_buffer_done_cbs();
+
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
+                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
+                                //Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
+                                pThis->m_state = OMX_StatePause;
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StatePause, NULL);
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_RESUME_DONE:
+                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
+
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
+                            pThis->omx_report_error ();
+                        } else {
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                                DEBUG_PRINT_LOW("Moving the decoder to execute state");
+                                // Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                                pThis->m_state = OMX_StateExecuting;
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StateExecuting,NULL);
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_STOP_DONE:
+                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
+
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
+                            pThis->omx_report_error ();
+                        } else {
+                            pThis->complete_pending_buffer_done_cbs();
+
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
+                                // Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
+                                pThis->m_state = OMX_StateIdle;
+                                DEBUG_PRINT_LOW("Move to Idle State");
+                                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StateIdle,NULL);
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
+                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
+
+                    if (pThis->start_port_reconfig() != OMX_ErrorNone)
+                        pThis->omx_report_error();
+                    else {
+                        if (pThis->in_reconfig) {
+                            if (pThis->m_cb.EventHandler) {
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
+                            } else {
+                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                            }
+                        }
+
+                        if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
+                            OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
+                            OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
+
+                            if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+                                format = OMX_InterlaceInterleaveFrameTopFieldFirst;
+                            else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+                                format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
+                            else //unsupported interlace format; raise a error
+                                event = OMX_EventError;
+
+                            if (pThis->m_cb.EventHandler) {
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        event, format, 0, NULL );
+                            } else {
+                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                            }
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EOS_DONE:
+                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
+
+                    if (pThis->m_cb.EventHandler) {
+                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
+                                OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    pThis->prev_ts = LLONG_MAX;
+                    pThis->rst_prev_ts = true;
+                    break;
+
+                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
+                    DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
+                    pThis->omx_report_error ();
+                    break;
+                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
+                    {
+                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
+
+                        if (pThis->m_cb.EventHandler) {
+                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+
+                        //update power HAL with new width, height and bitrate
+                        pThis->power_module_deregister();
+                        pThis->power_module_register();
+                    }
+                default:
+                    break;
             }
-            else
-            {
-              DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-              {
-                DEBUG_PRINT_LOW("Move to executing");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-                pThis->m_state = OMX_StateExecuting;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StateExecuting, NULL);
-              }
-              else if (BITMASK_PRESENT(&pThis->m_flags,
-                                       OMX_COMPONENT_PAUSE_PENDING))
-              {
-                if (ioctl (pThis->drv_ctx.video_driver_fd,
-                           VDEC_IOCTL_CMD_PAUSE,NULL ) < 0)
-                {
-                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
-                  pThis->omx_report_error ();
-                }
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("\n Event Handler callback is NULL");
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              pThis->complete_pending_buffer_done_cbs();
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
-              {
-                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
-                //Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
-                pThis->m_state = OMX_StatePause;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StatePause, NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_RESUME_DONE:
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-              {
-                DEBUG_PRINT_LOW("Moving the decoder to execute state");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-                pThis->m_state = OMX_StateExecuting;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StateExecuting,NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_STOP_DONE:
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              pThis->complete_pending_buffer_done_cbs();
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
-              {
-                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
-                pThis->m_state = OMX_StateIdle;
-                DEBUG_PRINT_LOW("Move to Idle State");
-                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
-                                         OMX_EventCmdComplete,OMX_CommandStateSet,
-                                         OMX_StateIdle,NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
-          if (pThis->start_port_reconfig() != OMX_ErrorNone)
-              pThis->omx_report_error();
-          else
-          {
-            if (pThis->in_reconfig)
-            {
-              if (pThis->m_cb.EventHandler) {
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                    OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
-              } else {
-                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-              }
-            }
-            if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-            {
-              OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
-              OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
-              if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
-                  format = OMX_InterlaceInterleaveFrameTopFieldFirst;
-              else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
-                  format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
-              else //unsupported interlace format; raise a error
-                  event = OMX_EventError;
-              if (pThis->m_cb.EventHandler) {
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                    event, format, 0, NULL );
-              } else {
-                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-              }
-            }
-          }
-        break;
-
-        case OMX_COMPONENT_GENERATE_EOS_DONE:
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
-                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-          pThis->prev_ts = LLONG_MAX;
-          pThis->rst_prev_ts = true;
-          break;
-
-        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
-          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
-          pThis->omx_report_error ();
-          break;
-        case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
-        {
-          DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          //update power HAL with new width, height and bitrate
-          pThis->power_module_deregister();
-          pThis->power_module_register();
         }
-        default:
-          break;
-        }
-      }
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if (pThis->m_state != OMX_StatePause)
-        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
-    pthread_mutex_unlock(&pThis->m_lock);
-  }
-  while(qsize>0);
+
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
+
+        if (pThis->m_state != OMX_StatePause)
+            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
+
+        pthread_mutex_unlock(&pThis->m_lock);
+    } while (qsize>0);
 
 }
 
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentInit
+   FUNCTION
+   omx_vdec::ComponentInit
 
-DESCRIPTION
-  Initialize the component.
+   DESCRIPTION
+   Initialize the component.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  unsigned int   alignment = 0,buffer_size = 0;
-  int is_secure = 0;
-  int i = 0;
-  int fds[2];
-  int r;
-  OMX_STRING device_name = "/dev/msm_vidc_dec";
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    unsigned int   alignment = 0,buffer_size = 0;
+    int is_secure = 0;
+    int i = 0;
+    int fds[2];
+    int r;
+    OMX_STRING device_name = "/dev/msm_vidc_dec";
 
 #ifndef JB_MR1
-  sp<IServiceManager> sm;
-  sp<hwcService::IHWComposer> hwcBinder = NULL;
+    sp<IServiceManager> sm;
+    sp<hwcService::IHWComposer> hwcBinder = NULL;
 #endif
-  if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
-      secure_mode = true;
-      arbitrary_bytes = false;
-      role = "OMX.qcom.video.decoder.avc";
-      device_name =  "/dev/msm_vidc_dec_sec";
-      is_secure = 1;
-  } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",OMX_MAX_STRINGNAME_SIZE)){
-      secure_mode = true;
-      arbitrary_bytes = false;
-      role = "OMX.qcom.video.decoder.mpeg2";
-      device_name =  "/dev/msm_vidc_dec_sec";
-      is_secure = 1;
-  }
-#ifndef JB_MR1
-  if (secure_mode) {
-    sm = defaultServiceManager();
-    hwcBinder =
-      interface_cast<hwcService::IHWComposer>(sm->getService(String16("display.hwcservice")));
-    if (hwcBinder != NULL) {
-        hwcBinder->setOpenSecureStart();
-    } else {
-        DEBUG_PRINT_HIGH("Failed to get ref to hwcBinder, "
-                         "cannot call secure display start");
+
+    if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) {
+        secure_mode = true;
+        arbitrary_bytes = false;
+        role = "OMX.qcom.video.decoder.avc";
+        device_name =  "/dev/msm_vidc_dec_sec";
+        is_secure = 1;
+    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",OMX_MAX_STRINGNAME_SIZE)) {
+        secure_mode = true;
+        arbitrary_bytes = false;
+        role = "OMX.qcom.video.decoder.mpeg2";
+        device_name =  "/dev/msm_vidc_dec_sec";
+        is_secure = 1;
     }
-  }
+
+#ifndef JB_MR1
+
+    if (secure_mode) {
+        sm = defaultServiceManager();
+        hwcBinder =
+            interface_cast<hwcService::IHWComposer>(sm->getService(String16("display.hwcservice")));
+
+        if (hwcBinder != NULL) {
+            hwcBinder->setOpenSecureStart();
+        } else {
+            DEBUG_PRINT_HIGH("Failed to get ref to hwcBinder, "
+                    "cannot call secure display start");
+        }
+    }
+
 #endif
-  DEBUG_PRINT_HIGH("omx_vdec::component_init(): Start of New Playback : role  = %s : DEVICE = %s",
-        role, device_name);
+    DEBUG_PRINT_HIGH("omx_vdec::component_init(): Start of New Playback : role  = %s : DEVICE = %s",
+            role, device_name);
 
-  drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
-
-  DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open returned fd %d, errno %d",
-                   drv_ctx.video_driver_fd, errno);
-
-  if(drv_ctx.video_driver_fd == 0){
     drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
-  }
 
-  if(is_secure && drv_ctx.video_driver_fd < 0) {
-      do {
-          usleep(100 * 1000);
-          drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
-          if (drv_ctx.video_driver_fd > 0) {
-              break;
-          }
-      } while(i++ < 50);
-  }
-  if(drv_ctx.video_driver_fd < 0)
-  {
-      DEBUG_PRINT_ERROR("\n Omx_vdec::Comp Init Returning failure, errno %d", errno);
-      return OMX_ErrorInsufficientResources;
-  }
-  drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
-  drv_ctx.frame_rate.fps_denominator = 1;
+    DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open returned fd %d, errno %d",
+            drv_ctx.video_driver_fd, errno);
+
+    if (drv_ctx.video_driver_fd == 0) {
+        drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
+    }
+
+    if (is_secure && drv_ctx.video_driver_fd < 0) {
+        do {
+            usleep(100 * 1000);
+            drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
+
+            if (drv_ctx.video_driver_fd > 0) {
+                break;
+            }
+        } while (i++ < 50);
+    }
+
+    if (drv_ctx.video_driver_fd < 0) {
+        DEBUG_PRINT_ERROR("\n Omx_vdec::Comp Init Returning failure, errno %d", errno);
+        return OMX_ErrorInsufficientResources;
+    }
+
+    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
+    drv_ctx.frame_rate.fps_denominator = 1;
 
 
 #ifdef INPUT_BUFFER_LOG
     strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-  outputBufferFile1 = fopen (outputfilename, "ab");
+    outputBufferFile1 = fopen (outputfilename, "ab");
 #endif
 #ifdef OUTPUT_EXTRADATA_LOG
-  outputExtradataFile = fopen (ouputextradatafilename, "ab");
+    outputExtradataFile = fopen (ouputextradatafilename, "ab");
 #endif
 
-  // Copy the role information which provides the decoder kind
-  strlcpy(drv_ctx.kind,role,128);
-  if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
-      OMX_MAX_STRINGNAME_SIZE))
-  {
-     strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
-     OMX_MAX_STRINGNAME_SIZE);
-     drv_ctx.timestamp_adjust = true;
-     drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
-     eCompressionFormat = OMX_VIDEO_CodingMPEG4;
-     /*Initialize Start Code for MPEG4*/
-     codec_type_parse = CODEC_TYPE_MPEG4;
-     m_frame_parser.init_start_codes (codec_type_parse);
+    // Copy the role information which provides the decoder kind
+    strlcpy(drv_ctx.kind,role,128);
+
+    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.timestamp_adjust = true;
+        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
+        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+        /*Initialize Start Code for MPEG4*/
+        codec_type_parse = CODEC_TYPE_MPEG4;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-    strcat(inputfilename, "m4v");
+        strcat(inputfilename, "m4v");
 #endif
-  }
-  else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
-        OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
-        OMX_MAX_STRINGNAME_SIZE);
-    drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
-    eCompressionFormat = OMX_VIDEO_CodingMPEG2;
-    /*Initialize Start Code for MPEG2*/
-    codec_type_parse = CODEC_TYPE_MPEG2;
-    m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
+                OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
+        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
+        /*Initialize Start Code for MPEG2*/
+        codec_type_parse = CODEC_TYPE_MPEG2;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-    strcat(inputfilename, "mpg");
+        strcat(inputfilename, "mpg");
 #endif
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-     strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-     DEBUG_PRINT_LOW("H263 Decoder selected");
-     drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
-     eCompressionFormat = OMX_VIDEO_CodingH263;
-     codec_type_parse = CODEC_TYPE_H263;
-     m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_LOW("H263 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
+        eCompressionFormat = OMX_VIDEO_CodingH263;
+        codec_type_parse = CODEC_TYPE_H263;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-    strcat(inputfilename, "263");
+        strcat(inputfilename, "263");
 #endif
-  }
+    }
+
 #ifdef MAX_RES_1080P
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-     DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
-     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
-     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-     codec_type_parse = CODEC_TYPE_DIVX;
-     m_frame_parser.init_start_codes (codec_type_parse);
+    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef _ANDROID_
-     OMX_ERRORTYPE err = createDivxDrmContext();
-     if( err != OMX_ErrorNone ) {
-         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-         eRet = err;
-         goto cleanup;
-     }
+        OMX_ERRORTYPE err = createDivxDrmContext();
+
+        if ( err != OMX_ErrorNone ) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            eRet = err;
+            goto cleanup;
+        }
+
 #endif //_ANDROID_
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-     DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
-     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
-     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-     codec_type_parse = CODEC_TYPE_DIVX;
-     m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef _ANDROID_
-     OMX_ERRORTYPE err = createDivxDrmContext();
-     if( err != OMX_ErrorNone ) {
-         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-         eRet = err;
-         goto cleanup;
-     }
+        OMX_ERRORTYPE err = createDivxDrmContext();
+
+        if ( err != OMX_ErrorNone ) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            eRet = err;
+            goto cleanup;
+        }
+
 #endif //_ANDROID_
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-     DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
-     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
-     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-     codec_type_parse = CODEC_TYPE_DIVX;
-     m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef _ANDROID_
-     OMX_ERRORTYPE err = createDivxDrmContext();
-     if( err != OMX_ErrorNone ) {
-         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-         eRet = err;
-         goto cleanup;
-     }
+        OMX_ERRORTYPE err = createDivxDrmContext();
+
+        if ( err != OMX_ErrorNone ) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            eRet = err;
+            goto cleanup;
+        }
+
 #endif //_ANDROID_
-  }
+    }
+
 #else
-  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
-         OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, \
-         "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)))
-  {
-     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-     DEBUG_PRINT_ERROR ("DIVX Decoder selected");
-     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_5;
-     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-     codec_type_parse = CODEC_TYPE_DIVX;
-     m_frame_parser.init_start_codes (codec_type_parse);
+    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
+                    OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, \
+                        "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE))) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("DIVX Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_5;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
 #ifdef _ANDROID_
-     OMX_ERRORTYPE err = createDivxDrmContext();
-     if( err != OMX_ErrorNone ) {
-         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-         eRet = err;
-         goto cleanup;
-     }
+        OMX_ERRORTYPE err = createDivxDrmContext();
+
+        if ( err != OMX_ErrorNone ) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            eRet = err;
+            goto cleanup;
+        }
+
 #endif //_ANDROID_
-  }
+    }
+
 #endif
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-    drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
-    eCompressionFormat = OMX_VIDEO_CodingAVC;
-    codec_type_parse = CODEC_TYPE_H264;
-    m_frame_parser.init_start_codes (codec_type_parse);
-    m_frame_parser.init_nal_length(nal_length);
+    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
+        eCompressionFormat = OMX_VIDEO_CodingAVC;
+        codec_type_parse = CODEC_TYPE_H264;
+        m_frame_parser.init_start_codes (codec_type_parse);
+        m_frame_parser.init_nal_length(nal_length);
 #ifdef INPUT_BUFFER_LOG
-    strcat(inputfilename, "264");
+        strcat(inputfilename, "264");
 #endif
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-    drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
-    eCompressionFormat = OMX_VIDEO_CodingWMV;
-    codec_type_parse = CODEC_TYPE_VC1;
-    m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
+        eCompressionFormat = OMX_VIDEO_CodingWMV;
+        codec_type_parse = CODEC_TYPE_VC1;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-    strcat(inputfilename, "vc1");
+        strcat(inputfilename, "vc1");
 #endif
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
-         OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-    drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
-    eCompressionFormat = OMX_VIDEO_CodingWMV;
-    codec_type_parse = CODEC_TYPE_VC1;
-    m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
+        eCompressionFormat = OMX_VIDEO_CodingWMV;
+        codec_type_parse = CODEC_TYPE_VC1;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-    strcat(inputfilename, "vc1");
+        strcat(inputfilename, "vc1");
 #endif
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
-    eRet = OMX_ErrorInvalidComponentName;
-  }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
+    }
+
 #ifdef INPUT_BUFFER_LOG
-  inputBufferFile1 = fopen (inputfilename, "ab");
+    inputBufferFile1 = fopen (inputfilename, "ab");
 #endif
-  if (eRet == OMX_ErrorNone)
-  {
+
+    if (eRet == OMX_ErrorNone) {
 #ifdef MAX_RES_720P
-    drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
+        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
 
 #endif
 #ifdef MAX_RES_1080P
-    drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
-    OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
-    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
-    if (!client_buffers.set_color_format(dest_color_format)) {
-      DEBUG_PRINT_ERROR("\n Setting color format failed");
-      eRet = OMX_ErrorInsufficientResources;
-    }
+        drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
+        OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
+            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+
+        if (!client_buffers.set_color_format(dest_color_format)) {
+            DEBUG_PRINT_ERROR("\n Setting color format failed");
+            eRet = OMX_ErrorInsufficientResources;
+        }
+
 #endif
-    /*Initialize Decoder with codec type and resolution*/
-    ioctl_msg.in = &drv_ctx.decoder_format;
-    ioctl_msg.out = NULL;
+        /*Initialize Decoder with codec type and resolution*/
+        ioctl_msg.in = &drv_ctx.decoder_format;
+        ioctl_msg.out = NULL;
 
-    if ( (eRet == OMX_ErrorNone) &&
-         ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_CODEC,
-                (void*)&ioctl_msg) < 0)
+        if ( (eRet == OMX_ErrorNone) &&
+                ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_CODEC,
+                    (void*)&ioctl_msg) < 0)
 
-    {
-      DEBUG_PRINT_ERROR("\n Set codec type failed");
-      eRet = OMX_ErrorInsufficientResources;
-    }
+        {
+            DEBUG_PRINT_ERROR("\n Set codec type failed");
+            eRet = OMX_ErrorInsufficientResources;
+        }
 
-    /*Set the output format*/
-    ioctl_msg.in = &drv_ctx.output_format;
-    ioctl_msg.out = NULL;
+        /*Set the output format*/
+        ioctl_msg.in = &drv_ctx.output_format;
+        ioctl_msg.out = NULL;
 
-    if ( (eRet == OMX_ErrorNone) &&
-         ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
-           (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\n Set output format failed");
-      eRet = OMX_ErrorInsufficientResources;
-    }
+        if ( (eRet == OMX_ErrorNone) &&
+                ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\n Set output format failed");
+            eRet = OMX_ErrorInsufficientResources;
+        }
 
 #ifdef MAX_RES_720P
-    drv_ctx.video_resolution.frame_height =
-        drv_ctx.video_resolution.scan_lines = 720;
-    drv_ctx.video_resolution.frame_width =
-        drv_ctx.video_resolution.stride = 1280;
+        drv_ctx.video_resolution.frame_height =
+            drv_ctx.video_resolution.scan_lines = 720;
+        drv_ctx.video_resolution.frame_width =
+            drv_ctx.video_resolution.stride = 1280;
 #endif
 #ifdef MAX_RES_1080P
-    drv_ctx.video_resolution.frame_height =
-        drv_ctx.video_resolution.scan_lines = 1088;
-    drv_ctx.video_resolution.frame_width =
-        drv_ctx.video_resolution.stride = 1920;
+        drv_ctx.video_resolution.frame_height =
+            drv_ctx.video_resolution.scan_lines = 1088;
+        drv_ctx.video_resolution.frame_width =
+            drv_ctx.video_resolution.stride = 1920;
 #endif
 
-    ioctl_msg.in = &drv_ctx.video_resolution;
-    ioctl_msg.out = NULL;
+        ioctl_msg.in = &drv_ctx.video_resolution;
+        ioctl_msg.out = NULL;
 
-    if ( (eRet == OMX_ErrorNone) &&
-        ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES,
-           (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\n Set Resolution failed");
-      eRet = OMX_ErrorInsufficientResources;
-    }
+        if ( (eRet == OMX_ErrorNone) &&
+                ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES,
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\n Set Resolution failed");
+            eRet = OMX_ErrorInsufficientResources;
+        }
 
-    /*Get the Buffer requirements for input and output ports*/
-    drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-    drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-    drv_ctx.extradata = 0;
-    drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
-    drv_ctx.idr_only_decoding = 0;
+        /*Get the Buffer requirements for input and output ports*/
+        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+        drv_ctx.extradata = 0;
+        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
+        drv_ctx.idr_only_decoding = 0;
 
-    if (eRet == OMX_ErrorNone)
-        eRet = get_buffer_req(&drv_ctx.ip_buf);
-    if (eRet == OMX_ErrorNone)
-        eRet = get_buffer_req(&drv_ctx.op_buf);
-    m_state = OMX_StateLoaded;
+        if (eRet == OMX_ErrorNone)
+            eRet = get_buffer_req(&drv_ctx.ip_buf);
+
+        if (eRet == OMX_ErrorNone)
+            eRet = get_buffer_req(&drv_ctx.op_buf);
+
+        m_state = OMX_StateLoaded;
 #ifdef DEFAULT_EXTRADATA
-    if (eRet == OMX_ErrorNone)
-      eRet = enable_extradata(DEFAULT_EXTRADATA);
+
+        if (eRet == OMX_ErrorNone)
+            eRet = enable_extradata(DEFAULT_EXTRADATA);
+
 #endif
-    if ( (codec_type_parse == CODEC_TYPE_VC1) ||
-        (codec_type_parse == CODEC_TYPE_H264)) //add CP check here
-    {
-      //Check if dmx can be disabled
-      struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-      OMX_ERRORTYPE eRet = OMX_ErrorNone;
-      ioctl_msg.out = &drv_ctx.disable_dmx;
-      if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT, &ioctl_msg))
-      {
-        DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT");
-        eRet = OMX_ErrorHardware;
-      }
-      else
-      {
-        if (drv_ctx.disable_dmx && !secure_mode)
-        {
-          DEBUG_PRINT_HIGH("DMX disable is supported");
 
-          int rc = ioctl(drv_ctx.video_driver_fd,
-                      VDEC_IOCTL_SET_DISABLE_DMX);
-          if(rc < 0) {
-              DEBUG_PRINT_ERROR("Failed to disable dmx on driver.");
-              drv_ctx.disable_dmx = false;
-              eRet = OMX_ErrorHardware;
-          }
+        if ( (codec_type_parse == CODEC_TYPE_VC1) ||
+                (codec_type_parse == CODEC_TYPE_H264)) { //add CP check here
+            //Check if dmx can be disabled
+            struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+            OMX_ERRORTYPE eRet = OMX_ErrorNone;
+            ioctl_msg.out = &drv_ctx.disable_dmx;
+
+            if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT, &ioctl_msg)) {
+                DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT");
+                eRet = OMX_ErrorHardware;
+            } else {
+                if (drv_ctx.disable_dmx && !secure_mode) {
+                    DEBUG_PRINT_HIGH("DMX disable is supported");
+
+                    int rc = ioctl(drv_ctx.video_driver_fd,
+                            VDEC_IOCTL_SET_DISABLE_DMX);
+
+                    if (rc < 0) {
+                        DEBUG_PRINT_ERROR("Failed to disable dmx on driver.");
+                        drv_ctx.disable_dmx = false;
+                        eRet = OMX_ErrorHardware;
+                    }
+                } else {
+                    drv_ctx.disable_dmx = false;
+                }
+            }
         }
-        else {
-          drv_ctx.disable_dmx = false;
+
+        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+            if (m_frame_parser.mutils == NULL) {
+                m_frame_parser.mutils = new H264_Utils();
+
+                if (m_frame_parser.mutils == NULL) {
+                    DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
+                    eRet = OMX_ErrorInsufficientResources;
+                } else {
+                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
+                    h264_scratch.pBuffer = (OMX_U8 *)malloc (h264_scratch.nAllocLen);
+                    h264_scratch.nFilledLen = 0;
+                    h264_scratch.nOffset = 0;
+
+                    if (h264_scratch.pBuffer == NULL) {
+                        DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
+                        return OMX_ErrorInsufficientResources;
+                    }
+
+                    m_frame_parser.mutils->initialize_frame_checking_environment();
+                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
+                }
+            }
+
+            h264_parser = new h264_stream_parser();
+
+            if (!h264_parser) {
+                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
+                eRet = OMX_ErrorInsufficientResources;
+            }
         }
-      }
-    }
-    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-    {
-      if (m_frame_parser.mutils == NULL)
-      {
-        m_frame_parser.mutils = new H264_Utils();
 
-        if (m_frame_parser.mutils == NULL)
-        {
-           DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
-           eRet = OMX_ErrorInsufficientResources;
+        if (pipe(fds)) {
+            DEBUG_PRINT_ERROR("\n pipe creation failed.");
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            int temp1[2];
+
+            if (fds[0] == 0 || fds[1] == 0) {
+                if (pipe (temp1)) {
+                    DEBUG_PRINT_ERROR("\n pipe creation failed..");
+                    return OMX_ErrorInsufficientResources;
+                }
+
+                //close (fds[0]);
+                //close (fds[1]);
+                fds[0] = temp1 [0];
+                fds[1] = temp1 [1];
+            }
+
+            m_pipe_in = fds[0];
+            m_pipe_out = fds[1];
+            r = pthread_create(&msg_thread_id,0,message_thread,this);
+
+            if (r < 0) {
+                DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
+                eRet = OMX_ErrorInsufficientResources;
+            } else {
+                msg_thread_created = true;
+                r = pthread_create(&async_thread_id,0,async_message_thread,this);
+
+                if (r < 0) {
+                    DEBUG_PRINT_ERROR("\n component_init(): async_message_thread creation failed");
+                    eRet = OMX_ErrorInsufficientResources;
+                } else {
+                    async_thread_created = true;
+                }
+            }
         }
-        else
-        {
-         h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
-         h264_scratch.pBuffer = (OMX_U8 *)malloc (h264_scratch.nAllocLen);
-         h264_scratch.nFilledLen = 0;
-         h264_scratch.nOffset = 0;
-
-         if (h264_scratch.pBuffer == NULL)
-         {
-           DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
-           return OMX_ErrorInsufficientResources;
-         }
-         m_frame_parser.mutils->initialize_frame_checking_environment();
-         m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
-       }
-      }
-
-      h264_parser = new h264_stream_parser();
-      if (!h264_parser)
-      {
-        DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
-        eRet = OMX_ErrorInsufficientResources;
-      }
     }
 
-    if(pipe(fds))
-    {
-      DEBUG_PRINT_ERROR("\n pipe creation failed.");
-      eRet = OMX_ErrorInsufficientResources;
+    if (eRet != OMX_ErrorNone) {
+        DEBUG_PRINT_ERROR("\n Component Init Failed");
+        DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG");
+        (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
+                NULL);
+    } else {
+        DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
     }
-    else
-    {
-      int temp1[2];
-      if(fds[0] == 0 || fds[1] == 0)
-      {
-        if (pipe (temp1))
-        {
-          DEBUG_PRINT_ERROR("\n pipe creation failed..");
-          return OMX_ErrorInsufficientResources;
-        }
-        //close (fds[0]);
-        //close (fds[1]);
-        fds[0] = temp1 [0];
-        fds[1] = temp1 [1];
-      }
-      m_pipe_in = fds[0];
-      m_pipe_out = fds[1];
-      r = pthread_create(&msg_thread_id,0,message_thread,this);
-      if(r < 0)
-      {
-        DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
-        eRet = OMX_ErrorInsufficientResources;
-      }
-      else
-      {
-        msg_thread_created = true;
-        r = pthread_create(&async_thread_id,0,async_message_thread,this);
-        if(r < 0)
-        {
-          DEBUG_PRINT_ERROR("\n component_init(): async_message_thread creation failed");
-          eRet = OMX_ErrorInsufficientResources;
-        }
-        else
-        {
-          async_thread_created = true;
-        }
-      }
-    }
-  }
 
-  if (eRet != OMX_ErrorNone)
-  {
-    DEBUG_PRINT_ERROR("\n Component Init Failed");
-    DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG");
-    (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
-        NULL);
-  }
-  else
-  {
-    DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
-  }
-
-  memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
-  memset(&meta_buff,0,sizeof(struct meta_buffer));
+    memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
+    memset(&meta_buff,0,sizeof(struct meta_buffer));
 cleanup:
-  if (!secure_mode) {
-      return eRet;
-  }
+
+    if (!secure_mode) {
+        return eRet;
+    }
+
 #ifndef JB_MR1
-  if (hwcBinder != NULL) {
-      (eRet == OMX_ErrorNone) ?
-          hwcBinder->setOpenSecureEnd() :
-          hwcBinder->setCloseSecureEnd();
-  } else {
-      DEBUG_PRINT_HIGH("hwcBinder not found, "
-                       "not calling secure end");
-  }
+
+    if (hwcBinder != NULL) {
+        (eRet == OMX_ErrorNone) ?
+            hwcBinder->setOpenSecureEnd() :
+            hwcBinder->setCloseSecureEnd();
+    } else {
+        DEBUG_PRINT_HIGH("hwcBinder not found, "
+                "not calling secure end");
+    }
+
 #endif
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetComponentVersion
+   FUNCTION
+   omx_vdec::GetComponentVersion
 
-DESCRIPTION
-  Returns the component version.
+   DESCRIPTION
+   Returns the component version.
 
-PARAMETERS
-  TBD.
+   PARAMETERS
+   TBD.
 
-RETURN VALUE
-  OMX_ErrorNone.
+   RETURN VALUE
+   OMX_ErrorNone.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_component_version
-                                     (
-                                      OMX_IN OMX_HANDLETYPE hComp,
-                                      OMX_OUT OMX_STRING componentName,
-                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
-                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
-                                      OMX_OUT OMX_UUIDTYPE* componentUUID
-                                      )
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID
+ )
 {
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("\n Get Comp Version in Invalid State");
         return OMX_ErrorInvalidState;
     }
-  /* TBD -- Return the proper version */
-  if (specVersion)
-  {
-    specVersion->nVersion = OMX_SPEC_VERSION;
-  }
-  return OMX_ErrorNone;
+
+    /* TBD -- Return the proper version */
+    if (specVersion) {
+        specVersion->nVersion = OMX_SPEC_VERSION;
+    }
+
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommand
+   FUNCTION
+   omx_vdec::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
-                                      OMX_IN OMX_COMMANDTYPE cmd,
-                                      OMX_IN OMX_U32 param1,
-                                      OMX_IN OMX_PTR cmdData
-                                      )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
     DEBUG_PRINT_HIGH("send_command: Recieved a Command from Client");
-    if(m_state == OMX_StateInvalid)
-    {
+
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("\n ERROR: Send Command in Invalid State");
         return OMX_ErrorInvalidState;
     }
+
     if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
-      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
-    {
-      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
-        "to invalid port: %d", param1);
-      return OMX_ErrorBadPortIndex;
+            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
+        DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
+                "to invalid port: %d", param1);
+        return OMX_ErrorBadPortIndex;
     }
+
     post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
     sem_wait(&m_cmd_lock);
     DEBUG_PRINT_HIGH("send_command: Command Processed");
@@ -1746,1260 +1688,1132 @@
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommand
+   FUNCTION
+   omx_vdec::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
-                                            OMX_IN OMX_COMMANDTYPE cmd,
-                                            OMX_IN OMX_U32 param1,
-                                            OMX_IN OMX_PTR cmdData
-                                            )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
-  int bFlag = 1,sem_posted = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
+    int bFlag = 1,sem_posted = 0;
 
-  DEBUG_PRINT_HIGH("send_command_proxy(): cmd = %d, Current State %d, Expected State %d",
-    cmd, m_state, eState);
+    DEBUG_PRINT_HIGH("send_command_proxy(): cmd = %d, Current State %d, Expected State %d",
+            cmd, m_state, eState);
 
-  if(cmd == OMX_CommandStateSet)
-  {
-    DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
-    DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
-    /***************************/
-    /* Current State is Loaded */
-    /***************************/
-    if(m_state == OMX_StateLoaded)
-    {
-      if(eState == OMX_StateIdle)
-      {
-        //if all buffers are allocated or all ports disabled
-        if(allocate_done() ||
-          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Loaded to Loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("\n ERROR::send_command_proxy(): Loaded-->Loaded");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Loaded to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        /* Since error is None , we will post an event
-           at the end of this function definition */
-        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
-      }
-      /* Requesting transition from Loaded to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
-                          eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
+    if (cmd == OMX_CommandStateSet) {
+        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
+        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
 
-    /***************************/
-    /* Current State is IDLE */
-    /***************************/
-    else if(m_state == OMX_StateIdle)
-    {
-      if(eState == OMX_StateLoaded)
-      {
-        if(release_done())
-        {
-          /*
-             Since error is None , we will post an event at the end
-             of this function definition
-          */
-          DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Loaded");
-        }
-        else
-        {
-          DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Loaded-Pending");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Idle to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Executing");
-        BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
-        bFlag = 0;
-        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
-                    NULL) < 0)
-        {
-          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
-          omx_report_error ();
-          eRet = OMX_ErrorHardware;
-        } else {
-          power_module_register();
-        }
-      }
-      /* Requesting transition from Idle to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Idle to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-       /* Requesting transition from Idle to Pause */
-       else if(eState == OMX_StatePause)
-      {
-         /*To pause the Video core we need to start the driver*/
-         if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
-                    NULL) < 0)
-         {
-           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
-           omx_report_error ();
-           eRet = OMX_ErrorHardware;
-         }
-         else
-         {
-           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
-           DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Pause");
-           bFlag = 0;
-         }
-      }
-      /* Requesting transition from Idle to Invalid */
-       else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
+        /***************************/
 
-    /******************************/
-    /* Current State is Executing */
-    /******************************/
-    else if(m_state == OMX_StateExecuting)
-    {
-       DEBUG_PRINT_HIGH("Command Recieved in OMX_StateExecuting");
-       /* Requesting transition from Executing to Idle */
-       if(eState == OMX_StateIdle)
-       {
-         /* Since error is None , we will post an event
-         at the end of this function definition
-         */
-         DEBUG_PRINT_HIGH("send_command_proxy(): Executing --> Idle");
-         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-         if(!sem_posted)
-         {
-           sem_posted = 1;
-           sem_post (&m_cmd_lock);
-           execute_omx_flush(OMX_ALL);
-         }
-         bFlag = 0;
-       }
-       /* Requesting transition from Executing to Paused */
-       else if(eState == OMX_StatePause)
-       {
-         DEBUG_PRINT_HIGH("PAUSE Command Issued");
-         if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
-                    NULL) < 0)
-         {
-           DEBUG_PRINT_ERROR("\n Error In Pause State");
-           post_event(OMX_EventError,OMX_ErrorHardware,\
-                      OMX_COMPONENT_GENERATE_EVENT);
-           eRet = OMX_ErrorHardware;
-         }
-         else
-         {
-           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
-           DEBUG_PRINT_HIGH("send_command_proxy(): Executing-->Pause");
-           bFlag = 0;
-         }
-       }
-       /* Requesting transition from Executing to Loaded */
-       else if(eState == OMX_StateLoaded)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
-         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorIncorrectStateTransition;
-       }
-       /* Requesting transition from Executing to WaitForResources */
-       else if(eState == OMX_StateWaitForResources)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
-         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorIncorrectStateTransition;
-       }
-       /* Requesting transition from Executing to Executing */
-       else if(eState == OMX_StateExecuting)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
-         post_event(OMX_EventError,OMX_ErrorSameState,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorSameState;
-       }
-       /* Requesting transition from Executing to Invalid */
-       else if(eState == OMX_StateInvalid)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
-         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorInvalidState;
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
-         eRet = OMX_ErrorBadParameter;
-       }
-    }
-    /***************************/
-    /* Current State is Pause  */
-    /***************************/
-    else if(m_state == OMX_StatePause)
-    {
-      /* Requesting transition from Pause to Executing */
-      if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_HIGH("Pause --> Executing");
-        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
-                   NULL) < 0)
-        {
-          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
-          post_event(OMX_EventError,OMX_ErrorHardware,\
-                     OMX_COMPONENT_GENERATE_EVENT);
-          eRet = OMX_ErrorHardware;
-        }
-        else
-        {
-          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
-          DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Executing");
-          post_event (NULL,VDEC_S_SUCCESS,\
-                      OMX_COMPONENT_GENERATE_RESUME_DONE);
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Pause to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_HIGH("Pause --> Idle..");
-         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-         if(!sem_posted)
-         {
-           sem_posted = 1;
-           sem_post (&m_cmd_lock);
-           execute_omx_flush(OMX_ALL);
-         }
-         bFlag = 0;
-      }
-      /* Requesting transition from Pause to loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-       /* Requesting transition from Pause to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-     /***************************/
-    /* Current State is WaitForResources  */
-    /***************************/
-    else if(m_state == OMX_StateWaitForResources)
-    {
-      /* Requesting transition from WaitForResources to Loaded */
-      if(eState == OMX_StateLoaded)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_HIGH("send_command_proxy(): WaitForResources-->Loaded");
-      }
-      /* Requesting transition from WaitForResources to WaitForResources */
-      else if (eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from WaitForResources to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      /* Requesting transition from WaitForResources to Loaded -
-      is NOT tested by Khronos TS */
+        /* Current State is Loaded */
 
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
-      eRet = OMX_ErrorBadParameter;
-    }
-  }
-  /********************************/
-  /* Current State is Invalid */
-  /*******************************/
-  else if(m_state == OMX_StateInvalid)
-  {
-    /* State Transition from Inavlid to any state */
-    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
-                  || OMX_StateIdle || OMX_StateExecuting
-                  || OMX_StatePause || OMX_StateInvalid))
-    {
-      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
-      post_event(OMX_EventError,OMX_ErrorInvalidState,\
-                 OMX_COMPONENT_GENERATE_EVENT);
-      eRet = OMX_ErrorInvalidState;
-    }
-  }
-  else if (cmd == OMX_CommandFlush)
-  {
-    DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued "
-        "with param1: %d", param1);
-    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
-    }
-    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-    }
-    if (!sem_posted){
-      sem_posted = 1;
-      DEBUG_PRINT_LOW("Set the Semaphore");
-      sem_post (&m_cmd_lock);
-      execute_omx_flush(param1);
-    }
-    bFlag = 0;
-  }
-  else if ( cmd == OMX_CommandPortEnable)
-  {
-    DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued "
-        "with param1: %d", param1);
-    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-        m_inp_bEnabled = OMX_TRUE;
-
-        if( (m_state == OMX_StateLoaded &&
-             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-            || allocate_input_done())
-        {
-          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
-                     OMX_COMPONENT_GENERATE_EVENT);
-        }
-        else
-        {
-          DEBUG_PRINT_HIGH("send_command_proxy(): Disabled-->Enabled Pending");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          DEBUG_PRINT_HIGH("Enable output Port command recieved");
-          m_out_bEnabled = OMX_TRUE;
-
-          if( (m_state == OMX_StateLoaded &&
-              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-              || (allocate_output_done()))
-          {
-             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
-                        OMX_COMPONENT_GENERATE_EVENT);
-
-          }
-          else
-          {
-              DEBUG_PRINT_HIGH("send_command_proxy(): Disabled-->Enabled Pending");
-              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-              // Skip the event notification
-              bFlag = 0;
-          }
-      }
-  }
-  else if (cmd == OMX_CommandPortDisable)
-  {
-      DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued "
-          "with param1: %d", param1);
-      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          m_inp_bEnabled = OMX_FALSE;
-          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-              && release_input_done())
-          {
-             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
-                        OMX_COMPONENT_GENERATE_EVENT);
-          }
-          else
-          {
-             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
-             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-             {
-               if(!sem_posted)
-               {
-                 sem_posted = 1;
-                 sem_post (&m_cmd_lock);
-               }
-               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
-             }
-
-             // Skip the event notification
-             bFlag = 0;
-          }
-      }
-      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          m_out_bEnabled = OMX_FALSE;
-          DEBUG_PRINT_HIGH("Disable output Port command recieved");
-          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-              && release_output_done())
-          {
-             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
-                        OMX_COMPONENT_GENERATE_EVENT);
-          }
-          else
-         {
-            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
-            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-            {
-              if (!sem_posted)
-              {
-                sem_posted = 1;
-                sem_post (&m_cmd_lock);
-              }
-                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
-                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+        /***************************/
+        if (m_state == OMX_StateLoaded) {
+            if (eState == OMX_StateIdle) {
+                //if all buffers are allocated or all ports disabled
+                if (allocate_done() ||
+                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
+                } else {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
             }
-            // Skip the event notification
-            bFlag = 0;
+            /* Requesting transition from Loaded to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n ERROR::send_command_proxy(): Loaded-->Loaded");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Loaded to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
+            }
+            /* Requesting transition from Loaded to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
+                        eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
 
-         }
-      }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
-    eRet = OMX_ErrorNotImplemented;
-  }
-  if(eRet == OMX_ErrorNone && bFlag)
-  {
-    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
-  }
-  if(!sem_posted)
-  {
-    sem_post(&m_cmd_lock);
-  }
+        /***************************/
+        /* Current State is IDLE */
+        /***************************/
+        else if (m_state == OMX_StateIdle) {
+            if (eState == OMX_StateLoaded) {
+                if (release_done()) {
+                    /*
+                       Since error is None , we will post an event at the end
+                       of this function definition
+                     */
+                    DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Loaded");
+                } else {
+                    DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Loaded-Pending");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Executing");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
+                bFlag = 0;
 
-  return eRet;
+                if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
+                            NULL) < 0) {
+                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
+                    omx_report_error ();
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    power_module_register();
+                }
+            }
+            /* Requesting transition from Idle to Idle */
+            else if (eState == OMX_StateIdle) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Idle to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Idle to Pause */
+            else if (eState == OMX_StatePause) {
+                /*To pause the Video core we need to start the driver*/
+                if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
+                            NULL) < 0) {
+                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
+                    omx_report_error ();
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+                    DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Pause");
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+
+        /******************************/
+        /* Current State is Executing */
+        /******************************/
+        else if (m_state == OMX_StateExecuting) {
+            DEBUG_PRINT_HIGH("Command Recieved in OMX_StateExecuting");
+
+            /* Requesting transition from Executing to Idle */
+            if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition
+                 */
+                DEBUG_PRINT_HIGH("send_command_proxy(): Executing --> Idle");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+
+                if (!sem_posted) {
+                    sem_posted = 1;
+                    sem_post (&m_cmd_lock);
+                    execute_omx_flush(OMX_ALL);
+                }
+
+                bFlag = 0;
+            }
+            /* Requesting transition from Executing to Paused */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_HIGH("PAUSE Command Issued");
+
+                if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
+                            NULL) < 0) {
+                    DEBUG_PRINT_ERROR("\n Error In Pause State");
+                    post_event(OMX_EventError,OMX_ErrorHardware,\
+                            OMX_COMPONENT_GENERATE_EVENT);
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+                    DEBUG_PRINT_HIGH("send_command_proxy(): Executing-->Pause");
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Executing to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Executing to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is Pause  */
+        /***************************/
+        else if (m_state == OMX_StatePause) {
+            /* Requesting transition from Pause to Executing */
+            if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_HIGH("Pause --> Executing");
+
+                if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
+                            NULL) < 0) {
+                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
+                    post_event(OMX_EventError,OMX_ErrorHardware,\
+                            OMX_COMPONENT_GENERATE_EVENT);
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
+                    DEBUG_PRINT_HIGH("send_command_proxy(): Idle-->Executing");
+                    post_event (NULL,VDEC_S_SUCCESS,\
+                            OMX_COMPONENT_GENERATE_RESUME_DONE);
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Pause to Idle */
+            else if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_HIGH("Pause --> Idle..");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+
+                if (!sem_posted) {
+                    sem_posted = 1;
+                    sem_post (&m_cmd_lock);
+                    execute_omx_flush(OMX_ALL);
+                }
+
+                bFlag = 0;
+            }
+            /* Requesting transition from Pause to loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Pause to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is WaitForResources  */
+        /***************************/
+        else if (m_state == OMX_StateWaitForResources) {
+            /* Requesting transition from WaitForResources to Loaded */
+            if (eState == OMX_StateLoaded) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_HIGH("send_command_proxy(): WaitForResources-->Loaded");
+            }
+            /* Requesting transition from WaitForResources to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from WaitForResources to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            }
+
+            /* Requesting transition from WaitForResources to Loaded -
+               is NOT tested by Khronos TS */
+
+        } else {
+            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
+            eRet = OMX_ErrorBadParameter;
+        }
+    }
+    /********************************/
+    /* Current State is Invalid */
+    /*******************************/
+    else if (m_state == OMX_StateInvalid) {
+        /* State Transition from Inavlid to any state */
+        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
+                    || OMX_StateIdle || OMX_StateExecuting
+                    || OMX_StatePause || OMX_StateInvalid)) {
+            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
+            post_event(OMX_EventError,OMX_ErrorInvalidState,\
+                    OMX_COMPONENT_GENERATE_EVENT);
+            eRet = OMX_ErrorInvalidState;
+        }
+    } else if (cmd == OMX_CommandFlush) {
+        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued "
+                "with param1: %d", param1);
+
+        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
+        }
+
+        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+        }
+
+        if (!sem_posted) {
+            sem_posted = 1;
+            DEBUG_PRINT_LOW("Set the Semaphore");
+            sem_post (&m_cmd_lock);
+            execute_omx_flush(param1);
+        }
+
+        bFlag = 0;
+    } else if ( cmd == OMX_CommandPortEnable) {
+        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued "
+                "with param1: %d", param1);
+
+        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_inp_bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || allocate_input_done()) {
+                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                DEBUG_PRINT_HIGH("send_command_proxy(): Disabled-->Enabled Pending");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+
+        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+            DEBUG_PRINT_HIGH("Enable output Port command recieved");
+            m_out_bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || (allocate_output_done())) {
+                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+
+            } else {
+                DEBUG_PRINT_HIGH("send_command_proxy(): Disabled-->Enabled Pending");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+    } else if (cmd == OMX_CommandPortDisable) {
+        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued "
+                "with param1: %d", param1);
+
+        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_inp_bEnabled = OMX_FALSE;
+
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_input_done()) {
+                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
+
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    if (!sem_posted) {
+                        sem_posted = 1;
+                        sem_post (&m_cmd_lock);
+                    }
+
+                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
+                }
+
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+
+        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_out_bEnabled = OMX_FALSE;
+            DEBUG_PRINT_HIGH("Disable output Port command recieved");
+
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_output_done()) {
+                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    if (!sem_posted) {
+                        sem_posted = 1;
+                        sem_post (&m_cmd_lock);
+                    }
+
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+                }
+
+                // Skip the event notification
+                bFlag = 0;
+
+            }
+        }
+    } else {
+        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
+        eRet = OMX_ErrorNotImplemented;
+    }
+
+    if (eRet == OMX_ErrorNone && bFlag) {
+        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
+    }
+
+    if (!sem_posted) {
+        sem_post(&m_cmd_lock);
+    }
+
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ExecuteOmxFlush
+   FUNCTION
+   omx_vdec::ExecuteOmxFlush
 
-DESCRIPTION
-  Executes the OMX flush.
+   DESCRIPTION
+   Executes the OMX flush.
 
-PARAMETERS
-  flushtype - input flush(1)/output flush(0)/ both.
+   PARAMETERS
+   flushtype - input flush(1)/output flush(0)/ both.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
 {
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  enum vdec_bufferflush flush_dir;
-  bool bRet = false;
-  switch (flushType)
-  {
-    case OMX_CORE_INPUT_PORT_INDEX:
-      input_flush_progress = true;
-      flush_dir = VDEC_FLUSH_TYPE_INPUT;
-    break;
-    case OMX_CORE_OUTPUT_PORT_INDEX:
-      output_flush_progress = true;
-      flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
-    break;
-    default:
-      input_flush_progress = true;
-      output_flush_progress = true;
-      flush_dir = VDEC_FLUSH_TYPE_ALL;
-  }
-  ioctl_msg.in = &flush_dir;
-  ioctl_msg.out = NULL;
-  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
-    bRet = false;
-  }
-  return bRet;
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+    enum vdec_bufferflush flush_dir;
+    bool bRet = false;
+
+    switch (flushType) {
+        case OMX_CORE_INPUT_PORT_INDEX:
+            input_flush_progress = true;
+            flush_dir = VDEC_FLUSH_TYPE_INPUT;
+            break;
+        case OMX_CORE_OUTPUT_PORT_INDEX:
+            output_flush_progress = true;
+            flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
+            break;
+        default:
+            input_flush_progress = true;
+            output_flush_progress = true;
+            flush_dir = VDEC_FLUSH_TYPE_ALL;
+    }
+
+    ioctl_msg.in = &flush_dir;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
+        bRet = false;
+    }
+
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_output_flush
 
 DESCRIPTION
-  Executes the OMX flush at OUTPUT PORT.
+Executes the OMX flush at OUTPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_vdec::execute_output_flush()
 {
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate FBD for all Buffers in the FTBq*/
-  pthread_mutex_lock(&m_lock);
-  DEBUG_PRINT_HIGH("Initiate Output Flush");
-  while (m_ftb_q.m_size)
-  {
-    DEBUG_PRINT_HIGH("Buffer queue size %d pending buf cnt %d",
-                       m_ftb_q.m_size,pending_output_buffers);
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    DEBUG_PRINT_HIGH("ID(%x) P1(%x) P2(%x)", ident, p1, p2);
-    if(ident == m_fill_output_msg )
-    {
-      m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
-    }
-    else if (ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-  pthread_mutex_unlock(&m_lock);
-  output_flush_progress = false;
+    /*Generate FBD for all Buffers in the FTBq*/
+    pthread_mutex_lock(&m_lock);
+    DEBUG_PRINT_HIGH("Initiate Output Flush");
 
-  if (arbitrary_bytes)
-  {
-    prev_ts = LLONG_MAX;
-    rst_prev_ts = true;
-  }
-  DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
-  return bRet;
+    while (m_ftb_q.m_size) {
+        DEBUG_PRINT_HIGH("Buffer queue size %d pending buf cnt %d",
+                m_ftb_q.m_size,pending_output_buffers);
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+        DEBUG_PRINT_HIGH("ID(%x) P1(%x) P2(%x)", ident, p1, p2);
+
+        if (ident == m_fill_output_msg ) {
+            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
+    }
+
+    pthread_mutex_unlock(&m_lock);
+    output_flush_progress = false;
+
+    if (arbitrary_bytes) {
+        prev_ts = LLONG_MAX;
+        rst_prev_ts = true;
+    }
+
+    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_input_flush
 
 DESCRIPTION
-  Executes the OMX flush at INPUT PORT.
+Executes the OMX flush at INPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_vdec::execute_input_flush()
 {
-  unsigned       i =0;
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned       i =0;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate EBD for all Buffers in the ETBq*/
-  DEBUG_PRINT_HIGH("Initiate Input Flush");
+    /*Generate EBD for all Buffers in the ETBq*/
+    DEBUG_PRINT_HIGH("Initiate Input Flush");
 
-  pthread_mutex_lock(&m_lock);
-  DEBUG_PRINT_LOW("Check if the Queue is empty");
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
+    pthread_mutex_lock(&m_lock);
+    DEBUG_PRINT_LOW("Check if the Queue is empty");
 
-    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
-    {
-      DEBUG_PRINT_HIGH("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
-    }
-    else if(ident == OMX_COMPONENT_GENERATE_ETB)
-    {
-      pending_input_buffers++;
-      DEBUG_PRINT_HIGH("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
-        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
-    }
-    else if (ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      DEBUG_PRINT_HIGH("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
-        (OMX_BUFFERHEADERTYPE *)p1);
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-  time_stamp_dts.flush_timestamp();
-  /*Check if Heap Buffers are to be flushed*/
-  if (arbitrary_bytes && !(codec_config_flag))
-  {
-    DEBUG_PRINT_HIGH("Reset all the variables before flusing");
-    h264_scratch.nFilledLen = 0;
-    nal_count = 0;
-    look_ahead_nal = false;
-    frame_count = 0;
-    h264_last_au_ts = LLONG_MAX;
-    h264_last_au_flags = 0;
-    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-    m_demux_entries = 0;
-    DEBUG_PRINT_HIGH("Initialize parser");
-    if (m_frame_parser.mutils)
-    {
-      m_frame_parser.mutils->initialize_frame_checking_environment();
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+
+        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+            DEBUG_PRINT_HIGH("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
+            pending_input_buffers++;
+            DEBUG_PRINT_HIGH("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
+                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            DEBUG_PRINT_HIGH("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
+                    (OMX_BUFFERHEADERTYPE *)p1);
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
 
-    while (m_input_pending_q.m_size)
-    {
-      m_input_pending_q.pop_entry(&p1,&p2,&ident);
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
+    time_stamp_dts.flush_timestamp();
+
+    /*Check if Heap Buffers are to be flushed*/
+    if (arbitrary_bytes && !(codec_config_flag)) {
+        DEBUG_PRINT_HIGH("Reset all the variables before flusing");
+        h264_scratch.nFilledLen = 0;
+        nal_count = 0;
+        look_ahead_nal = false;
+        frame_count = 0;
+        h264_last_au_ts = LLONG_MAX;
+        h264_last_au_flags = 0;
+        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+        m_demux_entries = 0;
+        DEBUG_PRINT_HIGH("Initialize parser");
+
+        if (m_frame_parser.mutils) {
+            m_frame_parser.mutils->initialize_frame_checking_environment();
+        }
+
+        while (m_input_pending_q.m_size) {
+            m_input_pending_q.pop_entry(&p1,&p2,&ident);
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
+        }
+
+        if (psource_frame) {
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
+            psource_frame = NULL;
+        }
+
+        if (pdest_frame) {
+            pdest_frame->nFilledLen = 0;
+            m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
+            pdest_frame = NULL;
+        }
+
+        m_frame_parser.flush();
+    } else if (codec_config_flag) {
+        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
+                "is not sent to the driver yet");
     }
 
-    if (psource_frame)
-    {
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
-      psource_frame = NULL;
+    pthread_mutex_unlock(&m_lock);
+    input_flush_progress = false;
+
+    if (!arbitrary_bytes) {
+        prev_ts = LLONG_MAX;
+        rst_prev_ts = true;
     }
 
-    if (pdest_frame)
-    {
-      pdest_frame->nFilledLen = 0;
-      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
-      pdest_frame = NULL;
-    }
-    m_frame_parser.flush();
-  }
-  else if (codec_config_flag)
-  {
-    DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
-       "is not sent to the driver yet");
-  }
-  pthread_mutex_unlock(&m_lock);
-  input_flush_progress = false;
-  if (!arbitrary_bytes)
-  {
-    prev_ts = LLONG_MAX;
-    rst_prev_ts = true;
-  }
 #ifdef _ANDROID_
-  if (m_debug_timestamp)
-  {
-    m_timestamp_list.reset_ts_list();
-  }
+
+    if (m_debug_timestamp) {
+        m_timestamp_list.reset_ts_list();
+    }
+
 #endif
-  DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
-  return bRet;
+    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommandEvent
+   FUNCTION
+   omx_vdec::SendCommandEvent
 
-DESCRIPTION
-  Send the event to decoder pipe.  This is needed to generate the callbacks
-  in decoder thread context.
+   DESCRIPTION
+   Send the event to decoder pipe.  This is needed to generate the callbacks
+   in decoder thread context.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::post_event(unsigned int p1,
-                          unsigned int p2,
-                          unsigned int id)
+        unsigned int p2,
+        unsigned int id)
 {
-  bool bRet      =                      false;
+    bool bRet      =                      false;
 
 
-  pthread_mutex_lock(&m_lock);
+    pthread_mutex_lock(&m_lock);
 
-  if (id == m_fill_output_msg ||
-      id == OMX_COMPONENT_GENERATE_FBD)
-  {
-    m_ftb_q.insert_entry(p1,p2,id);
-  }
-  else if (id == OMX_COMPONENT_GENERATE_ETB ||
-           id == OMX_COMPONENT_GENERATE_EBD ||
-           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
-  {
-    m_etb_q.insert_entry(p1,p2,id);
-  }
-  else
-  {
-    m_cmd_q.insert_entry(p1,p2,id);
-  }
+    if (id == m_fill_output_msg ||
+            id == OMX_COMPONENT_GENERATE_FBD) {
+        m_ftb_q.insert_entry(p1,p2,id);
+    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
+            id == OMX_COMPONENT_GENERATE_EBD ||
+            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+        m_etb_q.insert_entry(p1,p2,id);
+    } else {
+        m_cmd_q.insert_entry(p1,p2,id);
+    }
 
-  bRet = true;
-  DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
-  post_message(this, id);
+    bRet = true;
+    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
+    post_message(this, id);
 
-  pthread_mutex_unlock(&m_lock);
+    pthread_mutex_unlock(&m_lock);
 
-  return bRet;
+    return bRet;
 }
 #ifdef MAX_RES_720P
 OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!profileLevelType)
-    return OMX_ErrorBadParameter;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if(profileLevelType->nPortIndex == 0) {
-    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+    if (!profileLevelType)
+        return OMX_ErrorBadParameter;
 
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
-      }
-      else
-      {
-        DEBUG_PRINT_HIGH("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    } else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+    if (profileLevelType->nPortIndex == 0) {
+        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+            } else {
+                DEBUG_PRINT_HIGH("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        }
+    } else {
+        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  return eRet;
+
+    return eRet;
 }
 #endif
 #ifdef MAX_RES_1080P
 OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
-  if(!profileLevelType)
-    return OMX_ErrorBadParameter;
+    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
 
-  if(profileLevelType->nPortIndex == 0) {
-    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+    if (!profileLevelType)
+        return OMX_ErrorBadParameter;
 
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else
-      {
-        DEBUG_PRINT_HIGH("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+    if (profileLevelType->nPortIndex == 0) {
+        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else {
+                DEBUG_PRINT_HIGH("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore\n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore\n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  return eRet;
+
+    return eRet;
 }
 #endif
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetParameter
+   FUNCTION
+   omx_vdec::GetParameter
 
-DESCRIPTION
-  OMX Get Parameter method implementation
+   DESCRIPTION
+   OMX Get Parameter method implementation
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if successful.
+   RETURN VALUE
+   Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                           OMX_IN OMX_INDEXTYPE paramIndex,
-                                           OMX_INOUT OMX_PTR     paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_INOUT OMX_PTR     paramData)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
     DEBUG_PRINT_LOW("get_parameter:");
-    if(m_state == OMX_StateInvalid)
-    {
+
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    if(paramData == NULL)
-    {
+
+    if (paramData == NULL) {
         DEBUG_PRINT_ERROR("\n Get Param in Invalid paramData");
         return OMX_ErrorBadParameter;
     }
-  switch(paramIndex)
-  {
-    case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
-                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      eRet = update_portdef(portDefn);
-      if (eRet == OMX_ErrorNone)
-          m_port_def = *portDefn;
-      DEBUG_PRINT_HIGH("Get_parameter: OMX_IndexParamPortDefinition: "
-        "nPortIndex (%d), nFrameWidth (%d), nFrameHeight (%d), "
-        "nStride (%d), nSliceHeight (%d), nBitrate (%d), xFramerate (0x%x), "
-        "nBufferSize (%d), nBufferCountMin (%d), nBufferCountActual (%d), "
-        "bBuffersContiguous (%d), nBufferAlignment (%d), "
-        "bEnabled (%d), bPopulated (%d), eCompressionFormat (0x%x), "
-        "eColorFormat (0x%x)" , (int)portDefn->nPortIndex,
-        (int)portDefn->format.video.nFrameWidth, (int)portDefn->format.video.nFrameHeight,
-        (int)portDefn->format.video.nStride, (int)portDefn->format.video.nSliceHeight,
-        (int)portDefn->format.video.nBitrate, (int)portDefn->format.video.xFramerate,
-        (int)portDefn->nBufferSize, (int)portDefn->nBufferCountMin,
-        (int)portDefn->nBufferCountActual, (int)portDefn->bBuffersContiguous,
-        (int)portDefn->nBufferAlignment, (int)portDefn->bEnabled, (int)portDefn->bPopulated,
-        (int)portDefn->format.video.eCompressionFormat, (int)portDefn->format.video.eColorFormat);
-      break;
-    }
-    case OMX_IndexParamVideoInit:
-    {
-      OMX_PORT_PARAM_TYPE *portParamType =
-                              (OMX_PORT_PARAM_TYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
 
-      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-      portParamType->nSize = sizeof(portParamType);
-      portParamType->nPorts           = 2;
-      portParamType->nStartPortNumber = 0;
-      break;
-    }
-    case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
-      portFmt->nSize             = sizeof(portFmt);
+    switch (paramIndex) {
+        case OMX_IndexParamPortDefinition:
+            {
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
+                    (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                eRet = update_portdef(portDefn);
 
-      if (0 == portFmt->nPortIndex)
-      {
-        if (0 == portFmt->nIndex)
-        {
-              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
-              portFmt->eCompressionFormat = eCompressionFormat;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
-              " NoMore compression formats\n");
-          eRet =  OMX_ErrorNoMore;
-        }
-      }
-      else if (1 == portFmt->nPortIndex)
-      {
-        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
-        if(0 == portFmt->nIndex)
-          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
-            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
-        else if (1 == portFmt->nIndex)
-        {
-          portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
-        }
-        else
-        {
-           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
-                  " NoMore Color formats\n");
-           eRet =  OMX_ErrorNoMore;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
-                          (int)portFmt->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      DEBUG_PRINT_HIGH("Get_parameter: OMX_IndexParamVideoPortFormat: "
-          "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), "
-          "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex,
-          (int)portFmt->nIndex, (int)portFmt->eCompressionFormat,
-          (int)portFmt->eColorFormat, (int)portFmt->xFramerate);
-      break;
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamAudioInit:
-    {
-        OMX_PORT_PARAM_TYPE *audioPortParamType =
-                                              (OMX_PORT_PARAM_TYPE *) paramData;
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
-        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-        audioPortParamType->nSize = sizeof(audioPortParamType);
-        audioPortParamType->nPorts           = 0;
-        audioPortParamType->nStartPortNumber = 0;
-        break;
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamImageInit:
-    {
-        OMX_PORT_PARAM_TYPE *imagePortParamType =
-                                              (OMX_PORT_PARAM_TYPE *) paramData;
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
-        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-        imagePortParamType->nSize = sizeof(imagePortParamType);
-        imagePortParamType->nPorts           = 0;
-        imagePortParamType->nStartPortNumber = 0;
-        break;
+                if (eRet == OMX_ErrorNone)
+                    m_port_def = *portDefn;
 
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamOtherInit:
-    {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
-                          paramIndex);
-        eRet =OMX_ErrorUnsupportedIndex;
-        break;
-    }
-    case OMX_IndexParamStandardComponentRole:
-    {
-        OMX_PARAM_COMPONENTROLETYPE *comp_role;
-        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
-        comp_role->nSize = sizeof(*comp_role);
+                DEBUG_PRINT_HIGH("Get_parameter: OMX_IndexParamPortDefinition: "
+                        "nPortIndex (%d), nFrameWidth (%d), nFrameHeight (%d), "
+                        "nStride (%d), nSliceHeight (%d), nBitrate (%d), xFramerate (0x%x), "
+                        "nBufferSize (%d), nBufferCountMin (%d), nBufferCountActual (%d), "
+                        "bBuffersContiguous (%d), nBufferAlignment (%d), "
+                        "bEnabled (%d), bPopulated (%d), eCompressionFormat (0x%x), "
+                        "eColorFormat (0x%x)" , (int)portDefn->nPortIndex,
+                        (int)portDefn->format.video.nFrameWidth, (int)portDefn->format.video.nFrameHeight,
+                        (int)portDefn->format.video.nStride, (int)portDefn->format.video.nSliceHeight,
+                        (int)portDefn->format.video.nBitrate, (int)portDefn->format.video.xFramerate,
+                        (int)portDefn->nBufferSize, (int)portDefn->nBufferCountMin,
+                        (int)portDefn->nBufferCountActual, (int)portDefn->bBuffersContiguous,
+                        (int)portDefn->nBufferAlignment, (int)portDefn->bEnabled, (int)portDefn->bPopulated,
+                        (int)portDefn->format.video.eCompressionFormat, (int)portDefn->format.video.eColorFormat);
+                break;
+            }
+        case OMX_IndexParamVideoInit:
+            {
+                OMX_PORT_PARAM_TYPE *portParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
 
-        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
-                    paramIndex);
-        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
-                    OMX_MAX_STRINGNAME_SIZE);
-        break;
-    }
-    /* Added for parameter test */
-    case OMX_IndexParamPriorityMgmt:
-        {
+                portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                portParamType->nSize = sizeof(portParamType);
+                portParamType->nPorts           = 2;
+                portParamType->nStartPortNumber = 0;
+                break;
+            }
+        case OMX_IndexParamVideoPortFormat:
+            {
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
+                portFmt->nSize             = sizeof(portFmt);
 
-            OMX_PRIORITYMGMTTYPE *priorityMgmType =
-                                             (OMX_PRIORITYMGMTTYPE *) paramData;
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
-            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
-            priorityMgmType->nSize = sizeof(priorityMgmType);
+                if (0 == portFmt->nPortIndex) {
+                    if (0 == portFmt->nIndex) {
+                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
+                        portFmt->eCompressionFormat = eCompressionFormat;
+                    } else {
+                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
+                                " NoMore compression formats\n");
+                        eRet =  OMX_ErrorNoMore;
+                    }
+                } else if (1 == portFmt->nPortIndex) {
+                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
 
-            break;
-        }
-    /* Added for parameter test */
-    case OMX_IndexParamCompBufferSupplier:
-        {
-            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
-                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
+                    if (0 == portFmt->nIndex)
+                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+                    else if (1 == portFmt->nIndex) {
+                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+                    } else {
+                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
+                                " NoMore Color formats\n");
+                        eRet =  OMX_ErrorNoMore;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
+                            (int)portFmt->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
 
-            bufferSupplierType->nSize = sizeof(bufferSupplierType);
-            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
-            if(0 == bufferSupplierType->nPortIndex)
-                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
-            else if (1 == bufferSupplierType->nPortIndex)
-                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
-            else
-                eRet = OMX_ErrorBadPortIndex;
+                DEBUG_PRINT_HIGH("Get_parameter: OMX_IndexParamVideoPortFormat: "
+                        "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), "
+                        "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex,
+                        (int)portFmt->nIndex, (int)portFmt->eCompressionFormat,
+                        (int)portFmt->eColorFormat, (int)portFmt->xFramerate);
+                break;
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamAudioInit:
+            {
+                OMX_PORT_PARAM_TYPE *audioPortParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
+                audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                audioPortParamType->nSize = sizeof(audioPortParamType);
+                audioPortParamType->nPorts           = 0;
+                audioPortParamType->nStartPortNumber = 0;
+                break;
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamImageInit:
+            {
+                OMX_PORT_PARAM_TYPE *imagePortParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
+                imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                imagePortParamType->nSize = sizeof(imagePortParamType);
+                imagePortParamType->nPorts           = 0;
+                imagePortParamType->nStartPortNumber = 0;
+                break;
 
-
-            break;
-        }
-    case OMX_IndexParamVideoAvc:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamOtherInit:
+            {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
                         paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoH263:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
+                eRet =OMX_ErrorUnsupportedIndex;
+                break;
+            }
+        case OMX_IndexParamStandardComponentRole:
+            {
+                OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
+                comp_role->nSize = sizeof(*comp_role);
+
+                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
                         paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoMpeg4:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
+                strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
+                        OMX_MAX_STRINGNAME_SIZE);
+                break;
+            }
+            /* Added for parameter test */
+        case OMX_IndexParamPriorityMgmt:
+            {
+
+                OMX_PRIORITYMGMTTYPE *priorityMgmType =
+                    (OMX_PRIORITYMGMTTYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
+                priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
+                priorityMgmType->nSize = sizeof(priorityMgmType);
+
+                break;
+            }
+            /* Added for parameter test */
+        case OMX_IndexParamCompBufferSupplier:
+            {
+                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
+                    (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
+
+                bufferSupplierType->nSize = sizeof(bufferSupplierType);
+                bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
+
+                if (0 == bufferSupplierType->nPortIndex)
+                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+                else if (1 == bufferSupplierType->nPortIndex)
+                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+                else
+                    eRet = OMX_ErrorBadPortIndex;
+
+
+                break;
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
                         paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoMpeg2:
-        {
-          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
-              paramIndex);
-          break;
-        }
-    case OMX_IndexParamVideoProfileLevelQuerySupported:
-        {
-          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
-          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
-            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg2:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelQuerySupported:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
+                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
 #ifdef MAX_RES_720P
-          eRet = get_supported_profile_level_for_720p(profileLevelType);
+                eRet = get_supported_profile_level_for_720p(profileLevelType);
 #endif
 #ifdef MAX_RES_1080P
-          eRet = get_supported_profile_level_for_1080p(profileLevelType);
+                eRet = get_supported_profile_level_for_1080p(profileLevelType);
 #endif
-          break;
-        }
+                break;
+            }
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
-        {
-            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
-            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
-            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
+            {
+                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
+                GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
+
+                if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
 #ifdef USE_ION
 #if defined (MAX_RES_720P)
-                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_CAMERA_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
-                DEBUG_PRINT_HIGH("ION:720P: nUsage 0x%x",nativeBuffersUsage->nUsage);
+                    nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_CAMERA_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+                    DEBUG_PRINT_HIGH("ION:720P: nUsage 0x%x",nativeBuffersUsage->nUsage);
 #else
-                if(secure_mode) {
+
+                    if (secure_mode) {
                         nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
-                                                      GRALLOC_USAGE_PRIVATE_UNCACHED);
+                                GRALLOC_USAGE_PRIVATE_UNCACHED);
                         DEBUG_PRINT_HIGH("ION:secure_mode: nUsage 0x%x",nativeBuffersUsage->nUsage);
-                } else {
+                    } else {
                         nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP |
-                                                         GRALLOC_USAGE_PRIVATE_IOMMU_HEAP);
+                                GRALLOC_USAGE_PRIVATE_IOMMU_HEAP);
                         DEBUG_PRINT_HIGH("ION:non_secure_mode: nUsage 0x%x",nativeBuffersUsage->nUsage);
-                }
+                    }
+
 #endif //(MAX_RES_720P)
 #else // USE_ION
 #if defined (MAX_RES_720P) ||  defined (MAX_RES_1080P_EBI)
-                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
-                DEBUG_PRINT_HIGH("720P/1080P_EBI: nUsage 0x%x",nativeBuffersUsage->nUsage);
+                    nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+                    DEBUG_PRINT_HIGH("720P/1080P_EBI: nUsage 0x%x",nativeBuffersUsage->nUsage);
 #elif MAX_RES_1080P
-                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
-                DEBUG_PRINT_HIGH("1080P: nUsage 0x%x",nativeBuffersUsage->nUsage);
+                    nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+                    DEBUG_PRINT_HIGH("1080P: nUsage 0x%x",nativeBuffersUsage->nUsage);
 #endif
 #endif // USE_ION
-            } else {
-                DEBUG_PRINT_ERROR("\n get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
-                eRet = OMX_ErrorBadParameter;
+                } else {
+                    DEBUG_PRINT_ERROR("\n get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
+                    eRet = OMX_ErrorBadParameter;
+                }
             }
-        }
-        break;
+            break;
 #endif
 
-    default:
-    {
-      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
-      eRet =OMX_ErrorUnsupportedIndex;
+        default:
+            {
+                DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
+                eRet =OMX_ErrorUnsupportedIndex;
+            }
+
     }
 
-  }
+    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
+            drv_ctx.video_resolution.frame_width,
+            drv_ctx.video_resolution.frame_height,
+            drv_ctx.video_resolution.stride,
+            drv_ctx.video_resolution.scan_lines);
 
-  DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
-      drv_ctx.video_resolution.frame_width,
-      drv_ctx.video_resolution.frame_height,
-      drv_ctx.video_resolution.stride,
-      drv_ctx.video_resolution.scan_lines);
-
-  return eRet;
+    return eRet;
 }
 
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
@@ -3009,1583 +2823,1546 @@
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
 
-    if((params == NULL) ||
-      (params->nativeBuffer == NULL) ||
-      (params->nativeBuffer->handle == NULL) ||
-      !m_enable_android_native_buffers)
+    if ((params == NULL) ||
+            (params->nativeBuffer == NULL) ||
+            (params->nativeBuffer->handle == NULL) ||
+            !m_enable_android_native_buffers)
         return OMX_ErrorBadParameter;
+
     m_use_android_native_buffers = OMX_TRUE;
     sp<android_native_buffer_t> nBuf = params->nativeBuffer;
     private_handle_t *handle = (private_handle_t *)nBuf->handle;
 
     if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
         DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
-                          " expected %u, got %lu",
-                          drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
+                " expected %u, got %lu",
+                drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
         return OMX_ErrorBadParameter;
     }
 
-    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
+    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
         OMX_U8 *buffer = NULL;
-        if(!secure_mode) {
-                buffer = (OMX_U8*)mmap(0, handle->size,
+
+        if (!secure_mode) {
+            buffer = (OMX_U8*)mmap(0, handle->size,
                     PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
-                if(buffer == MAP_FAILED) {
-                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
-                    return OMX_ErrorInsufficientResources;
+
+            if (buffer == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+                return OMX_ErrorInsufficientResources;
             }
         }
+
         eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
     } else {
         eRet = OMX_ErrorBadParameter;
     }
+
     return eRet;
 }
 #endif
 /* ======================================================================
-FUNCTION
-  omx_vdec::Setparameter
+   FUNCTION
+   omx_vdec::Setparameter
 
-DESCRIPTION
-  OMX Set Parameter method implementation.
+   DESCRIPTION
+   OMX Set Parameter method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                           OMX_IN OMX_INDEXTYPE paramIndex,
-                                           OMX_IN OMX_PTR        paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_IN OMX_PTR        paramData)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
 
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    if(paramData == NULL)
-    {
-         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
-         return OMX_ErrorBadParameter;
+
+    if (paramData == NULL) {
+        DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
+        return OMX_ErrorBadParameter;
     }
-    if((m_state != OMX_StateLoaded) &&
-          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
-          (m_out_bEnabled == OMX_TRUE) &&
-          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
-          (m_inp_bEnabled == OMX_TRUE)) {
+
+    if ((m_state != OMX_StateLoaded) &&
+            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
+            (m_out_bEnabled == OMX_TRUE) &&
+            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
+            (m_inp_bEnabled == OMX_TRUE)) {
         DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
         return OMX_ErrorIncorrectStateOperation;
     }
 
-  switch(paramIndex)
-  {
-    case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
-      //been called.
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
-             (int)portDefn->format.video.nFrameHeight,
-             (int)portDefn->format.video.nFrameWidth);
-      if(OMX_DirOutput == portDefn->eDir)
-      {
-          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
-          m_display_id = portDefn->format.video.pNativeWindow;
-          unsigned int buffer_size;
-          if (!client_buffers.get_buffer_req(buffer_size)) {
-            DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
-            eRet = OMX_ErrorBadParameter;
-          } else {
-            if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
-                 portDefn->nBufferSize >=  buffer_size)
-              {
-                drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
-                drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
-                eRet = set_buffer_req(&drv_ctx.op_buf);
-                if (eRet == OMX_ErrorNone)
-                    m_port_def = *portDefn;
-            }
-            else
+    switch (paramIndex) {
+        case OMX_IndexParamPortDefinition:
             {
-                DEBUG_PRINT_HIGH("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
-                  drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
-                  portDefn->nBufferCountActual, portDefn->nBufferSize);
-                eRet = OMX_ErrorBadParameter;
-            }
-          }
-      }
-      else if(OMX_DirInput == portDefn->eDir)
-      {
-        if((portDefn->format.video.xFramerate >> 16) > 0 &&
-           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
-        {
-            // Frame rate only should be set if this is a "known value" or to
-            // activate ts prediction logic (arbitrary mode only) sending input
-            // timestamps with max value (LLONG_MAX).
-            DEBUG_PRINT_LOW("set_parameter: frame rate set by omx client : %d",
-                             portDefn->format.video.xFramerate >> 16);
-            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
-                          drv_ctx.frame_rate.fps_denominator);
-            if(!drv_ctx.frame_rate.fps_numerator)
-            {
-              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
-              drv_ctx.frame_rate.fps_numerator = 30;
-            }
-            if(drv_ctx.frame_rate.fps_denominator)
-              drv_ctx.frame_rate.fps_numerator = (int)
-                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
-              drv_ctx.frame_rate.fps_denominator = 1;
-            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
-                      drv_ctx.frame_rate.fps_numerator;
-            ioctl_msg.in = &drv_ctx.frame_rate;
-            if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
-                       (void*)&ioctl_msg) < 0)
-            {
-              DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
-            }
-            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
-                             frm_int, drv_ctx.frame_rate.fps_numerator /
-                             (float)drv_ctx.frame_rate.fps_denominator);
-        }
-         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
-         if(drv_ctx.video_resolution.frame_height !=
-               portDefn->format.video.nFrameHeight ||
-             drv_ctx.video_resolution.frame_width  !=
-               portDefn->format.video.nFrameWidth)
-         {
-             DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)",
-                           portDefn->format.video.nFrameWidth,
-                           portDefn->format.video.nFrameHeight);
-             if (portDefn->format.video.nFrameHeight != 0x0 &&
-                 portDefn->format.video.nFrameWidth != 0x0)
-             {
-               drv_ctx.video_resolution.frame_height =
-                 drv_ctx.video_resolution.scan_lines =
-                 portDefn->format.video.nFrameHeight;
-               drv_ctx.video_resolution.frame_width =
-                 drv_ctx.video_resolution.stride =
-                 portDefn->format.video.nFrameWidth;
-               ioctl_msg.in = &drv_ctx.video_resolution;
-               ioctl_msg.out = NULL;
-               if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
-                            (void*)&ioctl_msg) < 0)
-               {
-                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
-                   eRet = OMX_ErrorUnsupportedSetting;
-               }
-               else
-                   eRet = get_buffer_req(&drv_ctx.op_buf);
-             }
-         }
-         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
-                  && portDefn->nBufferSize == (drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH))
-         {
-             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
-             drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize + DEVICE_SCRATCH;
-             eRet = set_buffer_req(&drv_ctx.ip_buf);
-         }
-         else
-         {
-             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
-               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
-               portDefn->nBufferCountActual, portDefn->nBufferSize);
-             eRet = OMX_ErrorBadParameter;
-         }
-      }
-      else if (portDefn->eDir ==  OMX_DirMax)
-      {
-          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
-                      (int)portDefn->nPortIndex);
-          eRet = OMX_ErrorBadPortIndex;
-      }
-      DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamPortDefinition: "
-        "nPortIndex (%d), nFrameWidth (%d), nFrameHeight (%d), "
-        "nStride (%d), nSliceHeight (%d), nBitrate (%d), xFramerate (0x%x), "
-        "nBufferSize (%d), nBufferCountMin (%d), nBufferCountActual (%d), "
-        "bBuffersContiguous (%d), nBufferAlignment (%d), "
-        "bEnabled (%d), bPopulated (%d), eCompressionFormat (0x%x), "
-        "eColorFormat (0x%x)" , (int)portDefn->nPortIndex,
-        (int)portDefn->format.video.nFrameWidth, (int)portDefn->format.video.nFrameHeight,
-        (int)portDefn->format.video.nStride, (int)portDefn->format.video.nSliceHeight,
-        (int)portDefn->format.video.nBitrate, (int)portDefn->format.video.xFramerate,
-        (int)portDefn->nBufferSize, (int)portDefn->nBufferCountMin,
-        (int)portDefn->nBufferCountActual, (int)portDefn->bBuffersContiguous,
-        (int)portDefn->nBufferAlignment, (int)portDefn->bEnabled, (int)portDefn->bPopulated,
-        (int)portDefn->format.video.eCompressionFormat, (int)portDefn->format.video.eColorFormat);
-    }
-    break;
-    case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      if(1 == portFmt->nPortIndex)
-      {
-         enum vdec_output_fromat op_format;
-         if(portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
-           op_format = VDEC_YUV_FORMAT_NV12;
-         else if(portFmt->eColorFormat ==
-           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka ||
-            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)
-           op_format = VDEC_YUV_FORMAT_TILE_4x2;
-         else
-           eRet = OMX_ErrorBadParameter;
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
+                //been called.
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
+                        (int)portDefn->format.video.nFrameHeight,
+                        (int)portDefn->format.video.nFrameWidth);
 
-         if(eRet == OMX_ErrorNone && drv_ctx.output_format != op_format)
-         {
-           /*Set the output format*/
-           drv_ctx.output_format = op_format;
-           ioctl_msg.in = &drv_ctx.output_format;
-           ioctl_msg.out = NULL;
-           if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT,
-                 (void*)&ioctl_msg) < 0)
-           {
-             DEBUG_PRINT_ERROR("\n Set output format failed");
-             eRet = OMX_ErrorUnsupportedSetting;
-           }
-           else {
-             eRet = get_buffer_req(&drv_ctx.op_buf);
-           }
-         }
-         if (eRet == OMX_ErrorNone){
-           if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
-             DEBUG_PRINT_ERROR("\n Set color format failed");
-             eRet = OMX_ErrorBadParameter;
-           }
-         }
-       }
-       DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamVideoPortFormat: "
-          "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), "
-          "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex,
-          (int)portFmt->nIndex, (int)portFmt->eCompressionFormat,
-          (int)portFmt->eColorFormat, (int)portFmt->xFramerate);
-    }
-    break;
+                if (OMX_DirOutput == portDefn->eDir) {
+                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
+                    m_display_id = portDefn->format.video.pNativeWindow;
+                    unsigned int buffer_size;
 
-    case OMX_QcomIndexPortDefn:
-    {
-        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
-            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
-        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d",
-            portFmt->nFramePackingFormat);
+                    if (!client_buffers.get_buffer_req(buffer_size)) {
+                        DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
+                        eRet = OMX_ErrorBadParameter;
+                    } else {
+                        if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
+                                portDefn->nBufferSize >=  buffer_size) {
+                            drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
+                            drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
+                            eRet = set_buffer_req(&drv_ctx.op_buf);
 
-        /* Input port */
-        if (portFmt->nPortIndex == 0)
-        {
-            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
-            {
-              if(secure_mode) {
-                arbitrary_bytes = false;
-                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
-                eRet = OMX_ErrorUnsupportedSetting;
-              } else {
-               arbitrary_bytes = true;
-               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled");
-              }
+                            if (eRet == OMX_ErrorNone)
+                                m_port_def = *portDefn;
+                        } else {
+                            DEBUG_PRINT_HIGH("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
+                                    drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
+                                    portDefn->nBufferCountActual, portDefn->nBufferSize);
+                            eRet = OMX_ErrorBadParameter;
+                        }
+                    }
+                } else if (OMX_DirInput == portDefn->eDir) {
+                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
+                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
+                        // Frame rate only should be set if this is a "known value" or to
+                        // activate ts prediction logic (arbitrary mode only) sending input
+                        // timestamps with max value (LLONG_MAX).
+                        DEBUG_PRINT_LOW("set_parameter: frame rate set by omx client : %d",
+                                portDefn->format.video.xFramerate >> 16);
+                        Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
+                                drv_ctx.frame_rate.fps_denominator);
+
+                        if (!drv_ctx.frame_rate.fps_numerator) {
+                            DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
+                            drv_ctx.frame_rate.fps_numerator = 30;
+                        }
+
+                        if (drv_ctx.frame_rate.fps_denominator)
+                            drv_ctx.frame_rate.fps_numerator = (int)
+                                drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
+
+                        drv_ctx.frame_rate.fps_denominator = 1;
+                        frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
+                            drv_ctx.frame_rate.fps_numerator;
+                        ioctl_msg.in = &drv_ctx.frame_rate;
+
+                        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
+                                    (void*)&ioctl_msg) < 0) {
+                            DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
+                        }
+
+                        DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
+                                frm_int, drv_ctx.frame_rate.fps_numerator /
+                                (float)drv_ctx.frame_rate.fps_denominator);
+                    }
+
+                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
+
+                    if (drv_ctx.video_resolution.frame_height !=
+                            portDefn->format.video.nFrameHeight ||
+                            drv_ctx.video_resolution.frame_width  !=
+                            portDefn->format.video.nFrameWidth) {
+                        DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)",
+                                portDefn->format.video.nFrameWidth,
+                                portDefn->format.video.nFrameHeight);
+
+                        if (portDefn->format.video.nFrameHeight != 0x0 &&
+                                portDefn->format.video.nFrameWidth != 0x0) {
+                            drv_ctx.video_resolution.frame_height =
+                                drv_ctx.video_resolution.scan_lines =
+                                portDefn->format.video.nFrameHeight;
+                            drv_ctx.video_resolution.frame_width =
+                                drv_ctx.video_resolution.stride =
+                                portDefn->format.video.nFrameWidth;
+                            ioctl_msg.in = &drv_ctx.video_resolution;
+                            ioctl_msg.out = NULL;
+
+                            if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
+                                        (void*)&ioctl_msg) < 0) {
+                                DEBUG_PRINT_ERROR("\n Set Resolution failed");
+                                eRet = OMX_ErrorUnsupportedSetting;
+                            } else
+                                eRet = get_buffer_req(&drv_ctx.op_buf);
+                        }
+                    } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
+                            && portDefn->nBufferSize == (drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH)) {
+                        drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
+                        drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize + DEVICE_SCRATCH;
+                        eRet = set_buffer_req(&drv_ctx.ip_buf);
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
+                                drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
+                                portDefn->nBufferCountActual, portDefn->nBufferSize);
+                        eRet = OMX_ErrorBadParameter;
+                    }
+                } else if (portDefn->eDir ==  OMX_DirMax) {
+                    DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
+                            (int)portDefn->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+
+                DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamPortDefinition: "
+                        "nPortIndex (%d), nFrameWidth (%d), nFrameHeight (%d), "
+                        "nStride (%d), nSliceHeight (%d), nBitrate (%d), xFramerate (0x%x), "
+                        "nBufferSize (%d), nBufferCountMin (%d), nBufferCountActual (%d), "
+                        "bBuffersContiguous (%d), nBufferAlignment (%d), "
+                        "bEnabled (%d), bPopulated (%d), eCompressionFormat (0x%x), "
+                        "eColorFormat (0x%x)" , (int)portDefn->nPortIndex,
+                        (int)portDefn->format.video.nFrameWidth, (int)portDefn->format.video.nFrameHeight,
+                        (int)portDefn->format.video.nStride, (int)portDefn->format.video.nSliceHeight,
+                        (int)portDefn->format.video.nBitrate, (int)portDefn->format.video.xFramerate,
+                        (int)portDefn->nBufferSize, (int)portDefn->nBufferCountMin,
+                        (int)portDefn->nBufferCountActual, (int)portDefn->bBuffersContiguous,
+                        (int)portDefn->nBufferAlignment, (int)portDefn->bEnabled, (int)portDefn->bPopulated,
+                        (int)portDefn->format.video.eCompressionFormat, (int)portDefn->format.video.eColorFormat);
             }
-            else if (portFmt->nFramePackingFormat ==
-                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
-            {
-               arbitrary_bytes = false;
-               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled");
-            }
-            else
-            {
-                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
-                    portFmt->nFramePackingFormat);
-                eRet = OMX_ErrorUnsupportedSetting;
-            }
-        }
-        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
-        {
-          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
-          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
-               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
-              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
-          {
-            m_out_mem_region_smi = OMX_TRUE;
-            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
-            {
-              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: set use_output_pmem");
-              m_use_output_pmem = OMX_TRUE;
-            }
-          }
-        }
-    }
-    break;
-
-     case OMX_IndexParamStandardComponentRole:
-     {
-          OMX_PARAM_COMPONENTROLETYPE *comp_role;
-          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
-                       comp_role->cRole);
-
-          if((m_state == OMX_StateLoaded)&&
-              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-          {
-           DEBUG_PRINT_LOW("Set Parameter called in valid state");
-          }
-          else
-          {
-             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-             return OMX_ErrorIncorrectStateOperation;
-          }
-
-          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet = OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-          {
-            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-            {
-              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-          }
-#ifdef MAX_RES_1080P
-          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
-                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
-                  )
-#else
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
-#endif
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
-                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
-                    )
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else
-          {
-               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
-               eRet = OMX_ErrorInvalidComponentName;
-          }
-          break;
-     }
-
-    case OMX_IndexParamPriorityMgmt:
-        {
-            if(m_state != OMX_StateLoaded)
-            {
-               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-               return OMX_ErrorIncorrectStateOperation;
-            }
-            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
-            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
-              priorityMgmtype->nGroupID);
-
-            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
-             priorityMgmtype->nGroupPriority);
-
-            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
-            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
-
             break;
-        }
-
-      case OMX_IndexParamCompBufferSupplier:
-      {
-          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
-                bufferSupplierType->eBufferSupplier);
-             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
-                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
-
-             else
-
-             eRet = OMX_ErrorBadPortIndex;
-
-          break;
-
-      }
-      case OMX_IndexParamVideoAvc:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoH263:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoMpeg4:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoMpeg2:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
-                    paramIndex);
-              break;
-          }
-       case OMX_QcomIndexParamVideoDecoderPictureOrder:
-          {
-              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
-                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
-              enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
-              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
-                    pictureOrder->eOutputPictureOrder);
-              if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
-                  pic_order = VDEC_ORDER_DISPLAY;
-              else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
-                  pic_order = VDEC_ORDER_DECODE;
-                  time_stamp_dts.set_timestamp_reorder_mode(false);
-              }
-              else
-                  eRet = OMX_ErrorBadParameter;
-#ifdef MAX_RES_720P
-              if (drv_ctx.idr_only_decoding)
-              {
-                  if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER)
-                  {
-                      DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode");
-                      eRet = OMX_ErrorBadParameter;
-                  }
-              }
-#endif
-              if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
-              {
-                  drv_ctx.picture_order = pic_order;
-                  ioctl_msg.in = &drv_ctx.picture_order;
-                  ioctl_msg.out = NULL;
-                  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
-                      (void*)&ioctl_msg) < 0)
-                  {
-                      DEBUG_PRINT_ERROR("\n Set picture order failed");
-                      eRet = OMX_ErrorUnsupportedSetting;
-                  }
-              }
-              break;
-          }
-    case OMX_QcomIndexParamConcealMBMapExtraData:
-      {
-          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
-                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      }
-      break;
-    case OMX_QcomIndexParamFrameInfoExtraData:
-      {
-            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
-                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
-        }
-       break;
-    case OMX_QcomIndexParamInterlaceExtraData:
-      {
-          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      }
-      break;
-    case OMX_QcomIndexParamH264TimeInfo:
-      {
-          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      }
-      break;
-    case OMX_QcomIndexParamVideoDivx:
-      {
-#ifdef MAX_RES_720P
-        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
-        if((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) {
-            DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core.");
-            eRet = OMX_ErrorUnsupportedSetting;
-        }
-#endif
-      }
-      break;
-    case OMX_QcomIndexPlatformPvt:
-      {
-        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
-        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
-        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
-        {
-          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
-          eRet = OMX_ErrorUnsupportedSetting;
-        }
-        else
-        {
-          m_out_pvt_entry_pmem = OMX_TRUE;
-          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
-          {
-            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: use output pmem set");
-            m_use_output_pmem = OMX_TRUE;
-          }
-        }
-
-      }
-      break;
-    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
-      {
-          DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
-          DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
-          drv_ctx.idr_only_decoding = 1;
-          int rc = ioctl(drv_ctx.video_driver_fd,
-                      VDEC_IOCTL_SET_IDR_ONLY_DECODING);
-          if(rc < 0) {
-              DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
-              eRet = OMX_ErrorHardware;
-          }
-#ifdef MAX_RES_720P
-          if (eRet == OMX_ErrorNone)
-          {
-              DEBUG_PRINT_HIGH("set decode order for thumbnail mode");
-              drv_ctx.picture_order = VDEC_ORDER_DECODE;
-              ioctl_msg.in = &drv_ctx.picture_order;
-              ioctl_msg.out = NULL;
-              if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
-                  (void*)&ioctl_msg) < 0)
-              {
-                  DEBUG_PRINT_ERROR("\n Set picture order failed");
-                  eRet = OMX_ErrorUnsupportedSetting;
-              }
-          }
-#endif
-      }
-      break;
-#ifdef MAX_RES_1080P
-    case OMX_QcomIndexParamIndexExtraDataType:
-      {
-        if(!secure_mode) {
-            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
-            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
-                   (extradataIndexType->bEnabled == OMX_TRUE) &&
-                   (extradataIndexType->nPortIndex == 1))
+        case OMX_IndexParamVideoPortFormat:
             {
-              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
-              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
-              // Set smooth streaming parameter
-              int rc = ioctl(drv_ctx.video_driver_fd,
-                            VDEC_IOCTL_SET_CONT_ON_RECONFIG);
-              if(rc < 0) {
-                  DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
-                  eRet = OMX_ErrorHardware;
-              }
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+
+                if (1 == portFmt->nPortIndex) {
+                    enum vdec_output_fromat op_format;
+
+                    if (portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
+                        op_format = VDEC_YUV_FORMAT_NV12;
+                    else if (portFmt->eColorFormat ==
+                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka ||
+                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)
+                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
+                    else
+                        eRet = OMX_ErrorBadParameter;
+
+                    if (eRet == OMX_ErrorNone && drv_ctx.output_format != op_format) {
+                        /*Set the output format*/
+                        drv_ctx.output_format = op_format;
+                        ioctl_msg.in = &drv_ctx.output_format;
+                        ioctl_msg.out = NULL;
+
+                        if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT,
+                                    (void*)&ioctl_msg) < 0) {
+                            DEBUG_PRINT_ERROR("\n Set output format failed");
+                            eRet = OMX_ErrorUnsupportedSetting;
+                        } else {
+                            eRet = get_buffer_req(&drv_ctx.op_buf);
+                        }
+                    }
+
+                    if (eRet == OMX_ErrorNone) {
+                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
+                            DEBUG_PRINT_ERROR("\n Set color format failed");
+                            eRet = OMX_ErrorBadParameter;
+                        }
+                    }
+                }
+
+                DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamVideoPortFormat: "
+                        "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), "
+                        "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex,
+                        (int)portFmt->nIndex, (int)portFmt->eCompressionFormat,
+                        (int)portFmt->eColorFormat, (int)portFmt->xFramerate);
             }
-         }
-       }
-      break;
+            break;
 
-    case OMX_QcomIndexParamEnableSmoothStreaming:
-      {
+        case OMX_QcomIndexPortDefn:
+            {
+                OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
+                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d",
+                        portFmt->nFramePackingFormat);
 
-        int rc = ioctl(drv_ctx.video_driver_fd,
-                      VDEC_IOCTL_SET_CONT_ON_RECONFIG);
-        if(rc < 0) {
-            DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
-            eRet = OMX_ErrorHardware;
-        }
-      }
-     break;
+                /* Input port */
+                if (portFmt->nPortIndex == 0) {
+                    if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
+                        if (secure_mode) {
+                            arbitrary_bytes = false;
+                            DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
+                            eRet = OMX_ErrorUnsupportedSetting;
+                        } else {
+                            arbitrary_bytes = true;
+                            DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled");
+                        }
+                    } else if (portFmt->nFramePackingFormat ==
+                            OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
+                        arbitrary_bytes = false;
+                        DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled");
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
+                                portFmt->nFramePackingFormat);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+                    DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
+
+                    if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
+                                portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
+                            portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
+                        m_out_mem_region_smi = OMX_TRUE;
+
+                        if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+                            DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: set use_output_pmem");
+                            m_use_output_pmem = OMX_TRUE;
+                        }
+                    }
+                }
+            }
+            break;
+
+        case OMX_IndexParamStandardComponentRole:
+            {
+                OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
+                        comp_role->cRole);
+
+                if ((m_state == OMX_StateLoaded)&&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
+                } else {
+                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                    return OMX_ErrorIncorrectStateOperation;
+                }
+
+                if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+
+#ifdef MAX_RES_1080P
+                else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+                        )
+#else
+                else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
+#endif
+                {
+
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+                        ) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
+                    eRet = OMX_ErrorInvalidComponentName;
+                }
+
+                break;
+            }
+
+        case OMX_IndexParamPriorityMgmt:
+            {
+                if (m_state != OMX_StateLoaded) {
+                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                    return OMX_ErrorIncorrectStateOperation;
+                }
+
+                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
+                        priorityMgmtype->nGroupID);
+
+                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
+                        priorityMgmtype->nGroupPriority);
+
+                m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
+                m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
+
+                break;
+            }
+
+        case OMX_IndexParamCompBufferSupplier:
+            {
+                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
+                        bufferSupplierType->eBufferSupplier);
+
+                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
+                    m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
+
+                else
+
+                    eRet = OMX_ErrorBadPortIndex;
+
+                break;
+
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg2:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_QcomIndexParamVideoDecoderPictureOrder:
+            {
+                QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
+                    (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
+                enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
+                        pictureOrder->eOutputPictureOrder);
+
+                if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
+                    pic_order = VDEC_ORDER_DISPLAY;
+                else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
+                    pic_order = VDEC_ORDER_DECODE;
+                    time_stamp_dts.set_timestamp_reorder_mode(false);
+                } else
+                    eRet = OMX_ErrorBadParameter;
+
+#ifdef MAX_RES_720P
+
+                if (drv_ctx.idr_only_decoding) {
+                    if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER) {
+                        DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode");
+                        eRet = OMX_ErrorBadParameter;
+                    }
+                }
+
+#endif
+
+                if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order) {
+                    drv_ctx.picture_order = pic_order;
+                    ioctl_msg.in = &drv_ctx.picture_order;
+                    ioctl_msg.out = NULL;
+
+                    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
+                                (void*)&ioctl_msg) < 0) {
+                        DEBUG_PRINT_ERROR("\n Set picture order failed");
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+
+                break;
+            }
+        case OMX_QcomIndexParamConcealMBMapExtraData:
+            {
+                eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            }
+            break;
+        case OMX_QcomIndexParamFrameInfoExtraData:
+            {
+                eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            }
+            break;
+        case OMX_QcomIndexParamInterlaceExtraData:
+            {
+                eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            }
+            break;
+        case OMX_QcomIndexParamH264TimeInfo:
+            {
+                eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            }
+            break;
+        case OMX_QcomIndexParamVideoDivx:
+            {
+#ifdef MAX_RES_720P
+                QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
+
+                if ((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) {
+                    DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core.");
+                    eRet = OMX_ErrorUnsupportedSetting;
+                }
+
+#endif
+            }
+            break;
+        case OMX_QcomIndexPlatformPvt:
+            {
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
+                OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
+
+                if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+                    DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
+                    eRet = OMX_ErrorUnsupportedSetting;
+                } else {
+                    m_out_pvt_entry_pmem = OMX_TRUE;
+
+                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+                        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: use output pmem set");
+                        m_use_output_pmem = OMX_TRUE;
+                    }
+                }
+
+            }
+            break;
+        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
+            {
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
+                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
+                drv_ctx.idr_only_decoding = 1;
+                int rc = ioctl(drv_ctx.video_driver_fd,
+                        VDEC_IOCTL_SET_IDR_ONLY_DECODING);
+
+                if (rc < 0) {
+                    DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
+                    eRet = OMX_ErrorHardware;
+                }
+
+#ifdef MAX_RES_720P
+
+                if (eRet == OMX_ErrorNone) {
+                    DEBUG_PRINT_HIGH("set decode order for thumbnail mode");
+                    drv_ctx.picture_order = VDEC_ORDER_DECODE;
+                    ioctl_msg.in = &drv_ctx.picture_order;
+                    ioctl_msg.out = NULL;
+
+                    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
+                                (void*)&ioctl_msg) < 0) {
+                        DEBUG_PRINT_ERROR("\n Set picture order failed");
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+
+#endif
+            }
+            break;
+#ifdef MAX_RES_1080P
+        case OMX_QcomIndexParamIndexExtraDataType:
+            {
+                if (!secure_mode) {
+                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
+
+                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
+                            (extradataIndexType->bEnabled == OMX_TRUE) &&
+                            (extradataIndexType->nPortIndex == 1)) {
+                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
+                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
+                        // Set smooth streaming parameter
+                        int rc = ioctl(drv_ctx.video_driver_fd,
+                                VDEC_IOCTL_SET_CONT_ON_RECONFIG);
+
+                        if (rc < 0) {
+                            DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+                            eRet = OMX_ErrorHardware;
+                        }
+                    }
+                }
+            }
+            break;
+
+        case OMX_QcomIndexParamEnableSmoothStreaming:
+            {
+
+                int rc = ioctl(drv_ctx.video_driver_fd,
+                        VDEC_IOCTL_SET_CONT_ON_RECONFIG);
+
+                if (rc < 0) {
+                    DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+                    eRet = OMX_ErrorHardware;
+                }
+            }
+            break;
 #endif
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-      /* Need to allow following two set_parameters even in Idle
-       * state. This is ANDROID architecture which is not in sync
-       * with openmax standard. */
-    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
-      {
-          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
-          if(enableNativeBuffers) {
-              m_enable_android_native_buffers = enableNativeBuffers->enable;
-          }
-      }
-      break;
-    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
-      {
-          eRet = use_android_native_buffer(hComp, paramData);
-      }
-      break;
+            /* Need to allow following two set_parameters even in Idle
+             * state. This is ANDROID architecture which is not in sync
+             * with openmax standard. */
+        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
+            {
+                EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
+
+                if (enableNativeBuffers) {
+                    m_enable_android_native_buffers = enableNativeBuffers->enable;
+                }
+            }
+            break;
+        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
+            {
+                eRet = use_android_native_buffer(hComp, paramData);
+            }
+            break;
 #endif
-    case OMX_QcomIndexParamEnableTimeStampReorder:
-      {
-        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
-        if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
-          if (reorder->bEnable == OMX_TRUE) {
-              frm_int =0;
-              time_stamp_dts.set_timestamp_reorder_mode(true);
-          }
-          else
-            time_stamp_dts.set_timestamp_reorder_mode(false);
-        } else {
-          time_stamp_dts.set_timestamp_reorder_mode(false);
-          if (reorder->bEnable == OMX_TRUE)
-          {
-            eRet = OMX_ErrorUnsupportedSetting;
-          }
-        }
-      }
-      break;
-    case OMX_QcomIndexEnableExtnUserData:
-      {
-          eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      }
-      break;
-    default:
-    {
-      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
-      eRet = OMX_ErrorUnsupportedIndex;
+        case OMX_QcomIndexParamEnableTimeStampReorder:
+            {
+                QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
+
+                if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
+                    if (reorder->bEnable == OMX_TRUE) {
+                        frm_int =0;
+                        time_stamp_dts.set_timestamp_reorder_mode(true);
+                    } else
+                        time_stamp_dts.set_timestamp_reorder_mode(false);
+                } else {
+                    time_stamp_dts.set_timestamp_reorder_mode(false);
+
+                    if (reorder->bEnable == OMX_TRUE) {
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+            }
+            break;
+        case OMX_QcomIndexEnableExtnUserData:
+            {
+                eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            }
+            break;
+        default:
+            {
+                DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
+                eRet = OMX_ErrorUnsupportedIndex;
+            }
     }
-  }
-  return eRet;
+
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetConfig
+   FUNCTION
+   omx_vdec::GetConfig
 
-DESCRIPTION
-  OMX Get Config Method implementation.
+   DESCRIPTION
+   OMX Get Config Method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                        OMX_IN OMX_INDEXTYPE configIndex,
-                                        OMX_INOUT OMX_PTR     configData)
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_INOUT OMX_PTR     configData)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if (m_state == OMX_StateInvalid)
-  {
-     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
-     return OMX_ErrorInvalidState;
-  }
-
-  switch (configIndex)
-  {
-    case OMX_QcomIndexConfigInterlaced:
-    {
-      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
-                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
-      if (configFmt->nPortIndex == 1)
-      {
-        if (configFmt->nIndex == 0)
-        {
-          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
-        }
-        else if (configFmt->nIndex == 1)
-        {
-          configFmt->eInterlaceType =
-                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
-        }
-        else if (configFmt->nIndex == 2)
-        {
-          configFmt->eInterlaceType =
-          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
-                            " NoMore Interlaced formats\n");
-          eRet = OMX_ErrorNoMore;
-        }
-
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
-        (int)configFmt->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-    break;
-    }
-    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
-    {
-        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
-          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
-        ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
-        (void)(ioctl(drv_ctx.video_driver_fd,
-               VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
-    break;
-    }
-  case OMX_QcomIndexConfigVideoFramePackingArrangement:
-    {
-      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-      {
-        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
-          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
-        h264_parser->get_frame_pack_data(configFmt);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
-      }
-      break;
-    }
-    case OMX_QcomIndexParamFrameInfoExtraData:
-    {
-      OMX_QCOM_EXTRADATA_FRAMEINFO *extradata =
-        (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData;
-
-      if(m_extradata == NULL){
-          DEBUG_PRINT_LOW("get_config: m_extradata not set. "
-                            "Aspect Ratio information missing!!");
-      }
-      else {
-        extradata->aspectRatio.aspectRatioX =
-           m_extradata->aspectRatio.aspectRatioX;
-         extradata->aspectRatio.aspectRatioY =
-            m_extradata->aspectRatio.aspectRatioY;
-      }
-      break;
-    }
-
-    default:
-    {
-      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
-      eRet = OMX_ErrorBadParameter;
-    }
-
-  }
-
-  return eRet;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::SetConfig
-
-DESCRIPTION
-  OMX Set Config method implementation
-
-PARAMETERS
-  <TBD>.
-
-RETURN VALUE
-  OMX Error None if successful.
-========================================================================== */
-OMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                        OMX_IN OMX_INDEXTYPE configIndex,
-                                        OMX_IN OMX_PTR        configData)
-{
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
-
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  OMX_VIDEO_CONFIG_NALSIZE *pNal;
-
-  DEBUG_PRINT_LOW("Set Config Called");
-
-  if (m_state == OMX_StateExecuting)
-  {
-     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
-     return ret;
-  }
-
-  if (configIndex == OMX_IndexVendorVideoExtraData)
-  {
-    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
-    DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
-    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
-    {
-      DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC");
-      OMX_U32 extra_size;
-      // Parsing done here for the AVC atom is definitely not generic
-      // Currently this piece of code is working, but certainly
-      // not tested with all .mp4 files.
-      // Incase of failure, we might need to revisit this
-      // for a generic piece of code.
-
-      // Retrieve size of NAL length field
-      // byte #4 contains the size of NAL lenght field
-      nal_length = (config->pData[4] & 0x03) + 1;
-
-      extra_size = 0;
-      if (nal_length > 2)
-      {
-        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
-        extra_size = (nal_length - 2) * 2;
-      }
-
-      // SPS starts from byte #6
-      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
-      OMX_U8 *pDestBuf;
-      m_vendor_config.nPortIndex = config->nPortIndex;
-
-      // minus 6 --> SPS starts from byte #6
-      // minus 1 --> picture param set byte to be ignored from avcatom
-      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
-      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
-      OMX_U32 len;
-      OMX_U8 index = 0;
-      // case where SPS+PPS is sent as part of set_config
-      pDestBuf = m_vendor_config.pData;
-
-      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]",
-           m_vendor_config.nPortIndex,
-           m_vendor_config.nDataSize,
-           m_vendor_config.pData);
-      while (index < 2)
-      {
-        uint8 *psize;
-        len = *pSrcBuf;
-        len = len << 8;
-        len |= *(pSrcBuf + 1);
-        psize = (uint8 *) & len;
-        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
-        for (int i = 0; i < nal_length; i++)
-        {
-          pDestBuf[i] = psize[nal_length - 1 - i];
-        }
-        //memcpy(pDestBuf,pSrcBuf,(len+2));
-        pDestBuf += len + nal_length;
-        pSrcBuf += len + 2;
-        index++;
-        pSrcBuf++;   // skip picture param set
-        len = 0;
-      }
-    }
-    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
-             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
-    {
-      m_vendor_config.nPortIndex = config->nPortIndex;
-      m_vendor_config.nDataSize = config->nDataSize;
-      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
-      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
-    }
-    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
-    {
-        if(m_vendor_config.pData)
-        {
-            free(m_vendor_config.pData);
-            m_vendor_config.pData = NULL;
-            m_vendor_config.nDataSize = 0;
-        }
-
-        if (((*((OMX_U32 *) config->pData)) &
-             VC1_SP_MP_START_CODE_MASK) ==
-             VC1_SP_MP_START_CODE)
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize = config->nDataSize;
-            m_vendor_config.pData =
-                (OMX_U8 *) malloc(config->nDataSize);
-            memcpy(m_vendor_config.pData, config->pData,
-                   config->nDataSize);
-            m_vc1_profile = VC1_SP_MP_RCV;
-        }
-        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize = config->nDataSize;
-            m_vendor_config.pData =
-                (OMX_U8 *) malloc((config->nDataSize));
-            memcpy(m_vendor_config.pData, config->pData,
-                   config->nDataSize);
-            m_vc1_profile = VC1_AP;
-        }
-        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize  = config->nDataSize;
-            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
-            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
-            m_vc1_profile = VC1_SP_MP_RCV;
-        }
-        else
-        {
-            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
-        }
-    }
-    return ret;
-  }
-  else if (configIndex == OMX_IndexConfigVideoNalSize)
-  {
-
-    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
-    nal_length = pNal->nNaluBytes;
-    m_frame_parser.init_nal_length(nal_length);
-    DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
-    return ret;
-  }
-
-  return OMX_ErrorNotImplemented;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::GetExtensionIndex
-
-DESCRIPTION
-  OMX GetExtensionIndex method implementaion.  <TBD>
-
-PARAMETERS
-  <TBD>.
-
-RETURN VALUE
-  OMX Error None if everything successful.
-
-========================================================================== */
-OMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
-                                                OMX_IN OMX_STRING      paramName,
-                                                OMX_OUT OMX_INDEXTYPE* indexType)
-{
-    if(m_state == OMX_StateInvalid)
-    {
-        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
+
+    switch (configIndex) {
+        case OMX_QcomIndexConfigInterlaced:
+            {
+                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
+                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
+
+                if (configFmt->nPortIndex == 1) {
+                    if (configFmt->nIndex == 0) {
+                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
+                    } else if (configFmt->nIndex == 1) {
+                        configFmt->eInterlaceType =
+                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+                    } else if (configFmt->nIndex == 2) {
+                        configFmt->eInterlaceType =
+                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+                    } else {
+                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
+                                " NoMore Interlaced formats\n");
+                        eRet = OMX_ErrorNoMore;
+                    }
+
+                } else {
+                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
+                            (int)configFmt->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
+            {
+                struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+                QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
+                    (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
+                ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
+                (void)(ioctl(drv_ctx.video_driver_fd,
+                            VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
+                break;
+            }
+        case OMX_QcomIndexConfigVideoFramePackingArrangement:
+            {
+                if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
+                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
+                    h264_parser->get_frame_pack_data(configFmt);
+                } else {
+                    DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
+                }
+
+                break;
+            }
+        case OMX_QcomIndexParamFrameInfoExtraData:
+            {
+                OMX_QCOM_EXTRADATA_FRAMEINFO *extradata =
+                    (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData;
+
+                if (m_extradata == NULL) {
+                    DEBUG_PRINT_LOW("get_config: m_extradata not set. "
+                            "Aspect Ratio information missing!!");
+                } else {
+                    extradata->aspectRatio.aspectRatioX =
+                        m_extradata->aspectRatio.aspectRatioX;
+                    extradata->aspectRatio.aspectRatioY =
+                        m_extradata->aspectRatio.aspectRatioY;
+                }
+
+                break;
+            }
+
+        default:
+            {
+                DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
+                eRet = OMX_ErrorBadParameter;
+            }
+
+    }
+
+    return eRet;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::SetConfig
+
+   DESCRIPTION
+   OMX Set Config method implementation
+
+   PARAMETERS
+   <TBD>.
+
+   RETURN VALUE
+   OMX Error None if successful.
+   ========================================================================== */
+OMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_IN OMX_PTR        configData)
+{
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_VIDEO_CONFIG_NALSIZE *pNal;
+
+    DEBUG_PRINT_LOW("Set Config Called");
+
+    if (m_state == OMX_StateExecuting) {
+        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
+        return ret;
+    }
+
+    if (configIndex == OMX_IndexVendorVideoExtraData) {
+        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
+        DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
+
+        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
+            DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC");
+            OMX_U32 extra_size;
+            // Parsing done here for the AVC atom is definitely not generic
+            // Currently this piece of code is working, but certainly
+            // not tested with all .mp4 files.
+            // Incase of failure, we might need to revisit this
+            // for a generic piece of code.
+
+            // Retrieve size of NAL length field
+            // byte #4 contains the size of NAL lenght field
+            nal_length = (config->pData[4] & 0x03) + 1;
+
+            extra_size = 0;
+
+            if (nal_length > 2) {
+                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
+                extra_size = (nal_length - 2) * 2;
+            }
+
+            // SPS starts from byte #6
+            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
+            OMX_U8 *pDestBuf;
+            m_vendor_config.nPortIndex = config->nPortIndex;
+
+            // minus 6 --> SPS starts from byte #6
+            // minus 1 --> picture param set byte to be ignored from avcatom
+            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
+            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
+            OMX_U32 len;
+            OMX_U8 index = 0;
+            // case where SPS+PPS is sent as part of set_config
+            pDestBuf = m_vendor_config.pData;
+
+            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]",
+                    m_vendor_config.nPortIndex,
+                    m_vendor_config.nDataSize,
+                    m_vendor_config.pData);
+
+            while (index < 2) {
+                uint8 *psize;
+                len = *pSrcBuf;
+                len = len << 8;
+                len |= *(pSrcBuf + 1);
+                psize = (uint8 *) & len;
+                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
+
+                for (int i = 0; i < nal_length; i++) {
+                    pDestBuf[i] = psize[nal_length - 1 - i];
+                }
+
+                //memcpy(pDestBuf,pSrcBuf,(len+2));
+                pDestBuf += len + nal_length;
+                pSrcBuf += len + 2;
+                index++;
+                pSrcBuf++;   // skip picture param set
+                len = 0;
+            }
+        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
+                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
+            m_vendor_config.nPortIndex = config->nPortIndex;
+            m_vendor_config.nDataSize = config->nDataSize;
+            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
+            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
+        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
+            if (m_vendor_config.pData) {
+                free(m_vendor_config.pData);
+                m_vendor_config.pData = NULL;
+                m_vendor_config.nDataSize = 0;
+            }
+
+            if (((*((OMX_U32 *) config->pData)) &
+                        VC1_SP_MP_START_CODE_MASK) ==
+                    VC1_SP_MP_START_CODE) {
+                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize = config->nDataSize;
+                m_vendor_config.pData =
+                    (OMX_U8 *) malloc(config->nDataSize);
+                memcpy(m_vendor_config.pData, config->pData,
+                        config->nDataSize);
+                m_vc1_profile = VC1_SP_MP_RCV;
+            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
+                DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize = config->nDataSize;
+                m_vendor_config.pData =
+                    (OMX_U8 *) malloc((config->nDataSize));
+                memcpy(m_vendor_config.pData, config->pData,
+                        config->nDataSize);
+                m_vc1_profile = VC1_AP;
+            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
+                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize  = config->nDataSize;
+                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
+                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
+                m_vc1_profile = VC1_SP_MP_RCV;
+            } else {
+                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
+            }
+        }
+
+        return ret;
+    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
+
+        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
+        nal_length = pNal->nNaluBytes;
+        m_frame_parser.init_nal_length(nal_length);
+        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
+        return ret;
+    }
+
+    return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::GetExtensionIndex
+
+   DESCRIPTION
+   OMX GetExtensionIndex method implementaion.  <TBD>
+
+   PARAMETERS
+   <TBD>.
+
+   RETURN VALUE
+   OMX Error None if everything successful.
+
+   ========================================================================== */
+OMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
+        OMX_IN OMX_STRING      paramName,
+        OMX_OUT OMX_INDEXTYPE* indexType)
+{
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
     }
+
 #ifdef MAX_RES_1080P
-    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
-    {
+    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
     }
+
 #endif
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
+    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
         DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
     }
+
 #endif
     else {
         DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
         return OMX_ErrorNotImplemented;
     }
+
     return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetState
+   FUNCTION
+   omx_vdec::GetState
 
-DESCRIPTION
-  Returns the state information back to the caller.<TBD>
+   DESCRIPTION
+   Returns the state information back to the caller.<TBD>
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
-                                       OMX_OUT OMX_STATETYPE* state)
+        OMX_OUT OMX_STATETYPE* state)
 {
-  *state = m_state;
-  DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
-  return OMX_ErrorNone;
+    *state = m_state;
+    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentTunnelRequest
+   FUNCTION
+   omx_vdec::ComponentTunnelRequest
 
-DESCRIPTION
-  OMX Component Tunnel Request method implementation. <TBD>
+   DESCRIPTION
+   OMX Component Tunnel Request method implementation. <TBD>
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
-                                                     OMX_IN OMX_U32                        port,
-                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
-                                                     OMX_IN OMX_U32                    peerPort,
-                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_HANDLETYPE        peerComponent,
+        OMX_IN OMX_U32                    peerPort,
+        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
 {
-  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
-  return OMX_ErrorNotImplemented;
+    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseOutputBuffer
+   FUNCTION
+   omx_vdec::UseOutputBuffer
 
-DESCRIPTION
-  Helper function for Use buffer in the input pin
+   DESCRIPTION
+   Helper function for Use buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_output_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct vdec_setbuffer_cmd setbuffers;
-  OMX_PTR privateAppData = NULL;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct vdec_setbuffer_cmd setbuffers;
+    OMX_PTR privateAppData = NULL;
 #if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
-  private_handle_t *handle = NULL;
+    private_handle_t *handle = NULL;
 #endif
-  OMX_U8 *buff = buffer;
+    OMX_U8 *buff = buffer;
 
-  if (!m_out_mem_ptr) {
-    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
-    eRet = allocate_output_headers();
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
+        eRet = allocate_output_headers();
 
 #ifdef MAX_RES_1080P
-    if(secure_mode)
-    {
-      eRet = vdec_alloc_meta_buffers();
-      if (eRet) {
-        DEBUG_PRINT_ERROR("ERROR in allocating meta buffers\n");
-        return OMX_ErrorInsufficientResources;
-      }
-    }
 
-    if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-    {
-      //allocate H264_mv_buffer
-      eRet = vdec_alloc_h264_mv();
-      if (eRet) {
-        DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
-        return OMX_ErrorInsufficientResources;
-      }
-    }
+        if (secure_mode) {
+            eRet = vdec_alloc_meta_buffers();
+
+            if (eRet) {
+                DEBUG_PRINT_ERROR("ERROR in allocating meta buffers\n");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+            //allocate H264_mv_buffer
+            eRet = vdec_alloc_h264_mv();
+
+            if (eRet) {
+                DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
 #endif
 
-  }
-
-  if (eRet == OMX_ErrorNone) {
-    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
-      if(BITMASK_ABSENT(&m_out_bm_count,i))
-      {
-        break;
-      }
     }
-  }
 
-  if(i >= drv_ctx.op_buf.actualcount) {
-    eRet = OMX_ErrorInsufficientResources;
-  }
+    if (eRet == OMX_ErrorNone) {
+        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+                break;
+            }
+        }
+    }
 
-  if (eRet == OMX_ErrorNone) {
+    if (i >= drv_ctx.op_buf.actualcount) {
+        eRet = OMX_ErrorInsufficientResources;
+    }
+
+    if (eRet == OMX_ErrorNone) {
 #if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
-    if(m_enable_android_native_buffers) {
-        if (m_use_android_native_buffers) {
-            UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
-            sp<android_native_buffer_t> nBuf = params->nativeBuffer;
-            handle = (private_handle_t *)nBuf->handle;
-            privateAppData = params->pAppPrivate;
-        } else {
-            handle = (private_handle_t *)buff;
-            privateAppData = appData;
-        }
 
-        if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
-            DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
-                              " expected %u, got %lu",
-                              drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
-            return OMX_ErrorBadParameter;
-        }
+        if (m_enable_android_native_buffers) {
+            if (m_use_android_native_buffers) {
+                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
+                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
+                handle = (private_handle_t *)nBuf->handle;
+                privateAppData = params->pAppPrivate;
+            } else {
+                handle = (private_handle_t *)buff;
+                privateAppData = appData;
+            }
 
-        if (!m_use_android_native_buffers) {
-            if (!secure_mode) {
-                buff =  (OMX_U8*)mmap(0, handle->size,
-                                      PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
-                if (buff == MAP_FAILED) {
-                  DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
-                  return OMX_ErrorInsufficientResources;
+            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
+                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
+                        " expected %u, got %lu",
+                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
+                return OMX_ErrorBadParameter;
+            }
+
+            if (!m_use_android_native_buffers) {
+                if (!secure_mode) {
+                    buff =  (OMX_U8*)mmap(0, handle->size,
+                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
+
+                    if (buff == MAP_FAILED) {
+                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+                        return OMX_ErrorInsufficientResources;
+                    }
                 }
             }
-        }
 
 #if defined(_ANDROID_ICS_)
-        native_buffer[i].nativehandle = handle;
-#endif
-        if(!handle) {
-            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
-            return OMX_ErrorBadParameter;
-        }
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
-        drv_ctx.ptr_outputbuffer[i].offset = 0;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
-        drv_ctx.ptr_outputbuffer[i].mmaped_size =
-            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
-#if defined(_ANDROID_ICS_)
-        if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
-            int enable = 1;
-            setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable);
-        }
-#endif
-    } else
+            native_buffer[i].nativehandle = handle;
 #endif
 
-    if (!ouput_egl_buffers && !m_use_output_pmem) {
-#ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
-                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
-                &drv_ctx.op_buf_ion_info[i].fd_ion_data,ION_FLAG_CACHED);
-        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
-          return OMX_ErrorInsufficientResources;
-        }
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#else
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-          open (MEM_DEVICE,O_RDWR);
-
-        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
-          return OMX_ErrorInsufficientResources;
-        }
-
-        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
-        {
-          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-            open (MEM_DEVICE,O_RDWR);
-          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
-            return OMX_ErrorInsufficientResources;
-          }
-        }
-
-        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
-          drv_ctx.op_buf.buffer_size,
-          drv_ctx.op_buf.alignment))
-        {
-          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-#endif
-        if(!secure_mode) {
-            drv_ctx.ptr_outputbuffer[i].bufferaddr =
-              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
-              PROT_READ|PROT_WRITE, MAP_SHARED,
-              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
-            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
-                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-#ifdef USE_ION
-                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
-#endif
-              return OMX_ErrorInsufficientResources;
+            if (!handle) {
+                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+                return OMX_ErrorBadParameter;
             }
-        }
-        drv_ctx.ptr_outputbuffer[i].offset = 0;
-        privateAppData = appData;
-     }
-     else {
 
-       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
+            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
+            drv_ctx.ptr_outputbuffer[i].offset = 0;
+            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+            drv_ctx.ptr_outputbuffer[i].mmaped_size =
+                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+#if defined(_ANDROID_ICS_)
 
-       if (!appData || !bytes )
-       {
-         DEBUG_PRINT_ERROR("\n Invalid appData or bytes");
-         return OMX_ErrorBadParameter;
-       }
+            if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
+                int enable = 1;
+                setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable);
+            }
 
-       if(!secure_mode && !buffer)
-       {
-         DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
-         return OMX_ErrorBadParameter;
-       }
+#endif
+        } else
+#endif
+
+            if (!ouput_egl_buffers && !m_use_output_pmem) {
+#ifdef USE_ION
+                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
+                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
+                        &drv_ctx.op_buf_ion_info[i].fd_ion_data,ION_FLAG_CACHED);
+
+                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+                    return OMX_ErrorInsufficientResources;
+                }
+
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+#else
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                                      open (MEM_DEVICE,O_RDWR);
+
+                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+                    return OMX_ErrorInsufficientResources;
+                }
+
+                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
+                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                                          open (MEM_DEVICE,O_RDWR);
+
+                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+                        return OMX_ErrorInsufficientResources;
+                    }
+                }
+
+                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
+                            drv_ctx.op_buf.buffer_size,
+                            drv_ctx.op_buf.alignment)) {
+                    DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+
+#endif
+
+                if (!secure_mode) {
+                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
+                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
+                                PROT_READ|PROT_WRITE, MAP_SHARED,
+                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
+
+                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
+                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+#ifdef USE_ION
+                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+#endif
+                        return OMX_ErrorInsufficientResources;
+                    }
+                }
+
+                drv_ctx.ptr_outputbuffer[i].offset = 0;
+                privateAppData = appData;
+            } else {
+
+                DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
+
+                if (!appData || !bytes ) {
+                    DEBUG_PRINT_ERROR("\n Invalid appData or bytes");
+                    return OMX_ErrorBadParameter;
+                }
+
+                if (!secure_mode && !buffer) {
+                    DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
+                    return OMX_ErrorBadParameter;
+                }
 
 
-        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
-        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
-        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
-        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
-            !pmem_list->nEntries ||
-            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
-          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
-          return OMX_ErrorBadParameter;
-        }
-        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
+                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
+                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
+
+                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
+                        !pmem_list->nEntries ||
+                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+                    DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
+                    return OMX_ErrorBadParameter;
+                }
+
+                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
                     pmem_list->entryList->entry;
-        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
-                          pmem_info->pmem_fd);
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
-        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
-        drv_ctx.ptr_outputbuffer[i].mmaped_size =
-        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
-        privateAppData = appData;
-     }
-     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
-     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
+                        pmem_info->pmem_fd);
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
+                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
+                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+                drv_ctx.ptr_outputbuffer[i].mmaped_size =
+                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+                privateAppData = appData;
+            }
 
-     *bufferHdr = (m_out_mem_ptr + i );
-     if(secure_mode)
-          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
-     setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
-             sizeof (vdec_bufferpayload));
+        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
 
-     ioctl_msg.in  = &setbuffers;
-     ioctl_msg.out = NULL;
+        *bufferHdr = (m_out_mem_ptr + i );
 
-     DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
-                       drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
-     if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
-          &ioctl_msg) < 0)
-     {
-       DEBUG_PRINT_ERROR("\n Set output buffer failed");
-       return OMX_ErrorInsufficientResources;
-     }
-     // found an empty buffer at i
-     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
-     if (m_enable_android_native_buffers) {
-       DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
-       (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
-     } else {
-       (*bufferHdr)->pBuffer = buff;
-     }
-     (*bufferHdr)->pAppPrivate = privateAppData;
-     BITMASK_SET(&m_out_bm_count,i);
-  }
-  return eRet;
+        if (secure_mode)
+            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+
+        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
+                sizeof (vdec_bufferpayload));
+
+        ioctl_msg.in  = &setbuffers;
+        ioctl_msg.out = NULL;
+
+        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
+                drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
+
+        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+                    &ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\n Set output buffer failed");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        // found an empty buffer at i
+        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+
+        if (m_enable_android_native_buffers) {
+            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
+            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
+        } else {
+            (*bufferHdr)->pBuffer = buff;
+        }
+
+        (*bufferHdr)->pAppPrivate = privateAppData;
+        BITMASK_SET(&m_out_bm_count,i);
+    }
+
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::use_input_heap_buffers
+   FUNCTION
+   omx_vdec::use_input_heap_buffers
 
-DESCRIPTION
-  OMX Use Buffer Heap allocation method implementation.
+   DESCRIPTION
+   OMX Use Buffer Heap allocation method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!m_inp_heap_ptr)
-    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
-               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
-               drv_ctx.ip_buf.actualcount);
-  if(!m_phdr_pmem_ptr)
-    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
-               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
-               drv_ctx.ip_buf.actualcount);
-  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
-  {
-    DEBUG_PRINT_ERROR("Insufficent memory");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
-  {
-    input_use_buffer = true;
-    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
-    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
-    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
-    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
-    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
-    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
-    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
-    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
-    DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
-    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL))
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
-      return OMX_ErrorInsufficientResources;
+    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+    if (!m_inp_heap_ptr)
+        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
+            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+                    drv_ctx.ip_buf.actualcount);
+
+    if (!m_phdr_pmem_ptr)
+        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
+            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+                    drv_ctx.ip_buf.actualcount);
+
+    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
+        DEBUG_PRINT_ERROR("Insufficent memory");
+        eRet = OMX_ErrorInsufficientResources;
+    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
+        input_use_buffer = true;
+        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
+        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
+        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
+        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
+        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
+        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
+        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
+        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
+        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
+
+        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL)) {
+            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        m_in_alloc_cnt++;
+    } else {
+        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
+        eRet = OMX_ErrorInsufficientResources;
     }
-    m_in_alloc_cnt++;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseBuffer
+   FUNCTION
+   omx_vdec::UseBuffer
 
-DESCRIPTION
-  OMX Use Buffer method implementation.
+   DESCRIPTION
+   OMX Use Buffer method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE error = OMX_ErrorNone;
-  struct vdec_setbuffer_cmd setbuffers;
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    OMX_ERRORTYPE error = OMX_ErrorNone;
+    struct vdec_setbuffer_cmd setbuffers;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
 
-  if (bufferHdr == NULL || bytes == 0)
-  {
-      DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes);
-      return OMX_ErrorBadParameter;
-  }
+    if (bufferHdr == NULL || bytes == 0) {
+        DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes);
+        return OMX_ErrorBadParameter;
+    }
 
-  if(!secure_mode && buffer == NULL) {
-      DEBUG_PRINT_ERROR("bad param 0x%p",buffer);
-      return OMX_ErrorBadParameter;
-  }
+    if (!secure_mode && buffer == NULL) {
+        DEBUG_PRINT_ERROR("bad param 0x%p",buffer);
+        return OMX_ErrorBadParameter;
+    }
 
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  if(port == OMX_CORE_INPUT_PORT_INDEX)
-    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
-  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
-  else
-  {
-    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
-    error = OMX_ErrorBadPortIndex;
-  }
-  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
-  if(error == OMX_ErrorNone)
-  {
-    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-    {
-      // Send the callback now
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
-      post_event(OMX_CommandStateSet,OMX_StateIdle,
-                         OMX_COMPONENT_GENERATE_EVENT);
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
     }
-    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
-       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-    {
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-      post_event(OMX_CommandPortEnable,
-          OMX_CORE_INPUT_PORT_INDEX,
-          OMX_COMPONENT_GENERATE_EVENT);
+
+    if (port == OMX_CORE_INPUT_PORT_INDEX)
+        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
+    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
+        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
+    else {
+        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+        error = OMX_ErrorBadPortIndex;
     }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
-            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-    {
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-      post_event(OMX_CommandPortEnable,
-                 OMX_CORE_OUTPUT_PORT_INDEX,
-                 OMX_COMPONENT_GENERATE_EVENT);
+
+    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
+
+    if (error == OMX_ErrorNone) {
+        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+            // Send the callback now
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+            post_event(OMX_CommandStateSet,OMX_StateIdle,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
+
+        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
+                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+            post_event(OMX_CommandPortEnable,
+                    OMX_CORE_INPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
+                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+            post_event(OMX_CommandPortEnable,
+                    OMX_CORE_OUTPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
     }
-  }
-  return error;
+
+    return error;
 }
 
 OMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
-                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
+        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
 {
-  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
-  {
-    if(m_inp_heap_ptr[bufferindex].pBuffer)
-      free(m_inp_heap_ptr[bufferindex].pBuffer);
-    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
-  }
-  if (pmem_bufferHdr)
-    free_input_buffer(pmem_bufferHdr);
-  return OMX_ErrorNone;
+    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
+        if (m_inp_heap_ptr[bufferindex].pBuffer)
+            free(m_inp_heap_ptr[bufferindex].pBuffer);
+
+        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
+    }
+
+    if (pmem_bufferHdr)
+        free_input_buffer(pmem_bufferHdr);
+
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
-  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
+    unsigned int index = 0;
 
-  index = bufferHdr - m_inp_mem_ptr;
-  DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
+    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
+        return OMX_ErrorBadParameter;
+    }
 
-  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
-  {
+    index = bufferHdr - m_inp_mem_ptr;
     DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
-    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
-    {
-       struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-       struct vdec_setbuffer_cmd setbuffers;
-       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
-          sizeof (vdec_bufferpayload));
-       ioctl_msg.in  = &setbuffers;
-       ioctl_msg.out = NULL;
-       int ioctl_r = ioctl (drv_ctx.video_driver_fd,
-                            VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
-       if (ioctl_r < 0)
-       {
-          DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
-       }
-       if (!secure_mode) {
-           DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
+
+    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
+        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
+
+        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
+            struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+            struct vdec_setbuffer_cmd setbuffers;
+            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
+                    sizeof (vdec_bufferpayload));
+            ioctl_msg.in  = &setbuffers;
+            ioctl_msg.out = NULL;
+            int ioctl_r = ioctl (drv_ctx.video_driver_fd,
+                    VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
+
+            if (ioctl_r < 0) {
+                DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
+            }
+
+            if (!secure_mode) {
+                DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
                         drv_ctx.ptr_inputbuffer[index].pmem_fd);
-           DEBUG_PRINT_LOW("unmap the input buffer size=%d  address = %d",
+                DEBUG_PRINT_LOW("unmap the input buffer size=%d  address = %d",
                         drv_ctx.ptr_inputbuffer[index].mmaped_size,
                         drv_ctx.ptr_inputbuffer[index].bufferaddr);
-           munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
-                   drv_ctx.ptr_inputbuffer[index].mmaped_size);
-       }
-       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
-       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
-       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
-       {
-         free(m_desc_buffer_ptr[index].buf_addr);
-         m_desc_buffer_ptr[index].buf_addr = NULL;
-         m_desc_buffer_ptr[index].desc_data_size = 0;
-       }
-#ifdef USE_ION
-       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
-#endif
-    }
-  }
+                munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
+                        drv_ctx.ptr_inputbuffer[index].mmaped_size);
+            }
 
-  return OMX_ErrorNone;
+            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
+            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
+
+            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
+                free(m_desc_buffer_ptr[index].buf_addr);
+                m_desc_buffer_ptr[index].buf_addr = NULL;
+                m_desc_buffer_ptr[index].desc_data_size = 0;
+            }
+
+#ifdef USE_ION
+            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
+#endif
+        }
+    }
+
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
+    unsigned int index = 0;
 
-  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR");
-    return OMX_ErrorBadParameter;
-  }
+    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
+        DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR");
+        return OMX_ErrorBadParameter;
+    }
 
-  index = bufferHdr - m_out_mem_ptr;
-  DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
+    index = bufferHdr - m_out_mem_ptr;
+    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
 
-  if (index < drv_ctx.op_buf.actualcount
-      && drv_ctx.ptr_outputbuffer)
-  {
-    DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index,
-                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
+    if (index < drv_ctx.op_buf.actualcount
+            && drv_ctx.ptr_outputbuffer) {
+        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index,
+                drv_ctx.ptr_outputbuffer[index].bufferaddr);
 
-    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-    struct vdec_setbuffer_cmd setbuffers;
-    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
-        sizeof (vdec_bufferpayload));
-    ioctl_msg.in  = &setbuffers;
-    ioctl_msg.out = NULL;
-    DEBUG_PRINT_LOW("Release the Output Buffer");
-    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
-          &ioctl_msg) < 0)
-      DEBUG_PRINT_ERROR("\n Release output buffer failed in VCD");
+        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+        struct vdec_setbuffer_cmd setbuffers;
+        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
+                sizeof (vdec_bufferpayload));
+        ioctl_msg.in  = &setbuffers;
+        ioctl_msg.out = NULL;
+        DEBUG_PRINT_LOW("Release the Output Buffer");
+
+        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
+                    &ioctl_msg) < 0)
+            DEBUG_PRINT_ERROR("\n Release output buffer failed in VCD");
 
 #ifdef _ANDROID_
-    if(m_enable_android_native_buffers) {
-        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
-            if(!secure_mode) {
-                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
-                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
+
+        if (m_enable_android_native_buffers) {
+            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
+                if (!secure_mode) {
+                    munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
+                            drv_ctx.ptr_outputbuffer[index].mmaped_size);
+                }
             }
-        }
-        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
-    } else {
+
+            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+        } else {
 #endif
-            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
-            {
-               if(!secure_mode) {
+
+            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
+                if (!secure_mode) {
                     DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
                             drv_ctx.ptr_outputbuffer[index].pmem_fd);
                     DEBUG_PRINT_LOW("unmap the ouput buffer size=%d  address = %d",
@@ -4593,1370 +4370,1307 @@
                             drv_ctx.ptr_outputbuffer[index].bufferaddr);
                     munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr,
                             drv_ctx.ptr_outputbuffer[index].mmaped_size);
-               }
-               close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
-               drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+                }
+
+                close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
+                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
 #ifdef USE_ION
                 free_ion_memory(&drv_ctx.op_buf_ion_info[index]);
 #endif
 #ifdef _ANDROID_
                 m_heap_ptr[index].video_heap_ptr = NULL;
                 m_heap_count = m_heap_count - 1;
-                if (m_heap_count == 0)
-                {
+
+                if (m_heap_count == 0) {
                     free(m_heap_ptr);
                     m_heap_ptr = NULL;
                 }
+
 #endif // _ANDROID_
-          }
+            }
+
 #ifdef _ANDROID_
-       }
+        }
+
 #endif
-  }
+    }
+
 #ifdef MAX_RES_1080P
-  if(secure_mode)
-  {
-    vdec_dealloc_meta_buffers();
-  }
-  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-  {
-    vdec_dealloc_h264_mv();
-  }
+
+    if (secure_mode) {
+        vdec_dealloc_meta_buffers();
+    }
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+        vdec_dealloc_h264_mv();
+    }
+
 #endif
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
-                                         OMX_BUFFERHEADERTYPE **bufferHdr,
-                                         OMX_U32              port,
-                                         OMX_PTR              appData,
-                                         OMX_U32              bytes)
+        OMX_BUFFERHEADERTYPE **bufferHdr,
+        OMX_U32              port,
+        OMX_PTR              appData,
+        OMX_U32              bytes)
 {
-  OMX_BUFFERHEADERTYPE *input = NULL;
-  unsigned char *buf_addr = NULL;
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned   i = 0;
+    OMX_BUFFERHEADERTYPE *input = NULL;
+    unsigned char *buf_addr = NULL;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned   i = 0;
 
-  /* Sanity Check*/
-  if (bufferHdr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  if (m_inp_heap_ptr == NULL)
-  {
-    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
-                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
-                     drv_ctx.ip_buf.actualcount);
-    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
-                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
-                     drv_ctx.ip_buf.actualcount);
-
-    if (m_inp_heap_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
-      return OMX_ErrorInsufficientResources;
-    }
-  }
-
-  /*Find a Free index*/
-  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
-      break;
-    }
-  }
-
-  if (i < drv_ctx.ip_buf.actualcount)
-  {
-    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
-
-    if (buf_addr == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
+    /* Sanity Check*/
+    if (bufferHdr == NULL) {
+        return OMX_ErrorBadParameter;
     }
 
-    *bufferHdr = (m_inp_heap_ptr + i);
-    input = *bufferHdr;
-    BITMASK_SET(&m_heap_inp_bm_count,i);
+    if (m_inp_heap_ptr == NULL) {
+        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
+                         calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+                                 drv_ctx.ip_buf.actualcount);
+        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
+                          calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+                                  drv_ctx.ip_buf.actualcount);
 
-    input->pBuffer           = (OMX_U8 *)buf_addr;
-    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    input->nVersion.nVersion = OMX_SPEC_VERSION;
-    input->nAllocLen         = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
-    input->pAppPrivate       = appData;
-    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
-    DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
-    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
-    DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
-    /*Add the Buffers to freeq*/
-    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL))
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
-      return OMX_ErrorInsufficientResources;
+        if (m_inp_heap_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
     }
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
 
-  return eRet;
+    /*Find a Free index*/
+    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
+            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
+            break;
+        }
+    }
+
+    if (i < drv_ctx.ip_buf.actualcount) {
+        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
+
+        if (buf_addr == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        *bufferHdr = (m_inp_heap_ptr + i);
+        input = *bufferHdr;
+        BITMASK_SET(&m_heap_inp_bm_count,i);
+
+        input->pBuffer           = (OMX_U8 *)buf_addr;
+        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        input->nVersion.nVersion = OMX_SPEC_VERSION;
+        input->nAllocLen         = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
+        input->pAppPrivate       = appData;
+        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
+        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
+        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
+        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
+
+        /*Add the Buffers to freeq*/
+        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL)) {
+            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+            return OMX_ErrorInsufficientResources;
+        }
+    } else {
+        return OMX_ErrorBadParameter;
+    }
+
+    return eRet;
 
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateInputBuffer
+   FUNCTION
+   omx_vdec::AllocateInputBuffer
 
-DESCRIPTION
-  Helper function for allocate buffer in the input pin
+   DESCRIPTION
+   Helper function for allocate buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  struct vdec_setbuffer_cmd setbuffers;
-  OMX_BUFFERHEADERTYPE *input = NULL;
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  unsigned   i = 0;
-  unsigned char *buf_addr = NULL;
-  int pmem_fd = -1;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct vdec_setbuffer_cmd setbuffers;
+    OMX_BUFFERHEADERTYPE *input = NULL;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    unsigned   i = 0;
+    unsigned char *buf_addr = NULL;
+    int pmem_fd = -1;
 
-  if((bytes + DEVICE_SCRATCH) != drv_ctx.ip_buf.buffer_size)
-  {
-    DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d",
-      bytes, drv_ctx.ip_buf.buffer_size);
-    //return OMX_ErrorBadParameter;
-  }
-
-  if(!m_inp_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
-      drv_ctx.ip_buf.actualcount,
-      drv_ctx.ip_buf.buffer_size);
-
-    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
-    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
-
-    if (m_inp_mem_ptr == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
+    if ((bytes + DEVICE_SCRATCH) != drv_ctx.ip_buf.buffer_size) {
+        DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d",
+                bytes, drv_ctx.ip_buf.buffer_size);
+        //return OMX_ErrorBadParameter;
     }
 
-    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
-    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+    if (!m_inp_mem_ptr) {
+        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
+                drv_ctx.ip_buf.actualcount,
+                drv_ctx.ip_buf.buffer_size);
 
-    if (drv_ctx.ptr_inputbuffer == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
-    }
-#ifdef USE_ION
-    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
-    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
+        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
+                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
 
-    if (drv_ctx.ip_buf_ion_info == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
-    }
-#endif
+        if (m_inp_mem_ptr == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 
-    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
-    {
-      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
-#ifdef USE_ION
-      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
-#endif
-    }
-  }
+        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
+                                  calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
 
-  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_inp_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
-      break;
-    }
-  }
-
-  if(i < drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_LOW("Allocate input Buffer");
+        if (drv_ctx.ptr_inputbuffer == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 
 #ifdef USE_ION
- drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
-                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
-                    &drv_ctx.ip_buf_ion_info[i].fd_ion_data,ION_FLAG_CACHED);
-    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
-        return OMX_ErrorInsufficientResources;
-     }
-    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
-#else
-    pmem_fd = open (MEM_DEVICE,O_RDWR);
+        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
+                                  calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
 
-    if (pmem_fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
-      return OMX_ErrorInsufficientResources;
-    }
+        if (drv_ctx.ip_buf_ion_info == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 
-    if (pmem_fd == 0)
-    {
-      pmem_fd = open (MEM_DEVICE,O_RDWR);
-
-      if (pmem_fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
-        return OMX_ErrorInsufficientResources;
-      }
-    }
-
-    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
-      drv_ctx.ip_buf.alignment))
-    {
-      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-      close(pmem_fd);
-      return OMX_ErrorInsufficientResources;
-    }
 #endif
-    if (!secure_mode) {
-        buf_addr = (unsigned char *)mmap(NULL,
-          drv_ctx.ip_buf.buffer_size,
-          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
 
-        if (buf_addr == MAP_FAILED)
-        {
-            close(pmem_fd);
+        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
+            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
 #ifdef USE_ION
-            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
+            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
 #endif
-          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
-          return OMX_ErrorInsufficientResources;
         }
     }
-    *bufferHdr = (m_inp_mem_ptr + i);
-    if (secure_mode)
-        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
-    else
-        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
-    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
-    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
-    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
-    drv_ctx.ptr_inputbuffer [i].offset = 0;
 
-    setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-    memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i],
-            sizeof (vdec_bufferpayload));
-    ioctl_msg.in  = &setbuffers;
-    ioctl_msg.out = NULL;
-
-    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
-         &ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\n Set Buffers Failed");
-      return OMX_ErrorInsufficientResources;
+    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
+            break;
+        }
     }
 
-    input = *bufferHdr;
-    BITMASK_SET(&m_inp_bm_count,i);
-    DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
-    if (secure_mode)
-         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
-    else
-         input->pBuffer           = (OMX_U8 *)buf_addr;
-    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    input->nVersion.nVersion = OMX_SPEC_VERSION;
-    input->nAllocLen         = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
-    input->pAppPrivate       = appData;
-    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
-    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
+    if (i < drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_LOW("Allocate input Buffer");
 
-    if (drv_ctx.disable_dmx)
-    {
-      eRet = allocate_desc_buffer(i);
+#ifdef USE_ION
+        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
+                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
+                &drv_ctx.ip_buf_ion_info[i].fd_ion_data,ION_FLAG_CACHED);
+
+        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
+#else
+        pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+        if (pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        if (pmem_fd == 0) {
+            pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+            if (pmem_fd < 0) {
+                DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
+                    drv_ctx.ip_buf.alignment)) {
+            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+            close(pmem_fd);
+            return OMX_ErrorInsufficientResources;
+        }
+
+#endif
+
+        if (!secure_mode) {
+            buf_addr = (unsigned char *)mmap(NULL,
+                    drv_ctx.ip_buf.buffer_size,
+                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
+
+            if (buf_addr == MAP_FAILED) {
+                close(pmem_fd);
+#ifdef USE_ION
+                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
+#endif
+                DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        *bufferHdr = (m_inp_mem_ptr + i);
+
+        if (secure_mode)
+            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
+        else
+            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
+
+        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
+        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
+        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
+        drv_ctx.ptr_inputbuffer [i].offset = 0;
+
+        setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i],
+                sizeof (vdec_bufferpayload));
+        ioctl_msg.in  = &setbuffers;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+                    &ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\n Set Buffers Failed");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        input = *bufferHdr;
+        BITMASK_SET(&m_inp_bm_count,i);
+        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
+
+        if (secure_mode)
+            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
+        else
+            input->pBuffer           = (OMX_U8 *)buf_addr;
+
+        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        input->nVersion.nVersion = OMX_SPEC_VERSION;
+        input->nAllocLen         = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
+        input->pAppPrivate       = appData;
+        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
+        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
+
+        if (drv_ctx.disable_dmx) {
+            eRet = allocate_desc_buffer(i);
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
+        eRet = OMX_ErrorInsufficientResources;
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+
+    return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateOutputBuffer
+   FUNCTION
+   omx_vdec::AllocateOutputBuffer
 
-DESCRIPTION
-  Helper fn for AllocateBuffer in the output pin
+   DESCRIPTION
+   Helper fn for AllocateBuffer in the output pin
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything went well.
+   RETURN VALUE
+   OMX Error None if everything went well.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct vdec_setbuffer_cmd setbuffers;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct vdec_setbuffer_cmd setbuffers;
 #ifdef USE_ION
-  int ion_device_fd =-1;
-  struct ion_allocation_data ion_alloc_data;
-  struct ion_fd_data fd_ion_data;
+    int ion_device_fd =-1;
+    struct ion_allocation_data ion_alloc_data;
+    struct ion_fd_data fd_ion_data;
 #endif
 
-  int nBufHdrSize        = 0;
-  int nPlatformEntrySize = 0;
-  int nPlatformListSize  = 0;
-  int nPMEMInfoSize = 0;
-  int pmem_fd = -1;
-  unsigned char *pmem_baseaddress = NULL;
+    int nBufHdrSize        = 0;
+    int nPlatformEntrySize = 0;
+    int nPlatformListSize  = 0;
+    int nPMEMInfoSize = 0;
+    int pmem_fd = -1;
+    unsigned char *pmem_baseaddress = NULL;
 
-  OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
-  OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
+    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
 
-  if (!m_out_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
-      drv_ctx.op_buf.actualcount,
-      drv_ctx.op_buf.buffer_size);
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
+                drv_ctx.op_buf.actualcount,
+                drv_ctx.op_buf.buffer_size);
 
-    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
-      drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
+                drv_ctx.op_buf.actualcount);
 
-    nBufHdrSize        = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_BUFFERHEADERTYPE);
+        nBufHdrSize        = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_BUFFERHEADERTYPE);
 
-    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
-    nPlatformListSize  = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
-    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+        nPlatformListSize  = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
 
-    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
-                         sizeof(OMX_BUFFERHEADERTYPE),
-                         nPMEMInfoSize,
-                         nPlatformListSize);
-    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
-                         drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
+                sizeof(OMX_BUFFERHEADERTYPE),
+                nPMEMInfoSize,
+                nPlatformListSize);
+        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
+                drv_ctx.op_buf.actualcount);
 
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    // Alloc mem for platform specific info
-    char *pPtr=NULL;
-    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
-                                     nPMEMInfoSize,1);
-    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
-      calloc (sizeof(struct vdec_bufferpayload),
-      drv_ctx.op_buf.actualcount);
-    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
-      calloc (sizeof (struct vdec_output_frameinfo),
-      drv_ctx.op_buf.actualcount);
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        // Alloc mem for platform specific info
+        char *pPtr=NULL;
+        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+                nPMEMInfoSize,1);
+        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
+                                   calloc (sizeof(struct vdec_bufferpayload),
+                                           drv_ctx.op_buf.actualcount);
+        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
+                                 calloc (sizeof (struct vdec_output_frameinfo),
+                                         drv_ctx.op_buf.actualcount);
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
-      calloc (sizeof(struct vdec_ion),
-      drv_ctx.op_buf.actualcount);
+        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
+                                  calloc (sizeof(struct vdec_ion),
+                                          drv_ctx.op_buf.actualcount);
 #endif
 #ifdef _ANDROID_
-    m_heap_ptr = (struct vidc_heap *)\
-       calloc (sizeof(struct vidc_heap),
-      drv_ctx.op_buf.actualcount);
+        m_heap_ptr = (struct vidc_heap *)\
+                     calloc (sizeof(struct vidc_heap),
+                             drv_ctx.op_buf.actualcount);
 #endif
 
-    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
-       && drv_ctx.ptr_respbuffer
+        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+                && drv_ctx.ptr_respbuffer
 #ifdef _ANDROID_
-       && m_heap_ptr
+                && m_heap_ptr
 #endif
-       )
-    {
-      drv_ctx.ptr_outputbuffer[0].mmaped_size =
-        (drv_ctx.op_buf.buffer_size *
-         drv_ctx.op_buf.actualcount);
-      bufHdr          =  m_out_mem_ptr;
-      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
-      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
-                        (((char *) m_platform_list)  + nPlatformListSize);
-      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                        (((char *) m_platform_entry) + nPlatformEntrySize);
-      pPlatformList   = m_platform_list;
-      pPlatformEntry  = m_platform_entry;
-      pPMEMInfo       = m_pmem_info;
+           ) {
+            drv_ctx.ptr_outputbuffer[0].mmaped_size =
+                (drv_ctx.op_buf.buffer_size *
+                 drv_ctx.op_buf.actualcount);
+            bufHdr          =  m_out_mem_ptr;
+            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+                (((char *) m_platform_list)  + nPlatformListSize);
+            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                (((char *) m_platform_entry) + nPlatformEntrySize);
+            pPlatformList   = m_platform_list;
+            pPlatformEntry  = m_platform_entry;
+            pPMEMInfo       = m_pmem_info;
 
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
 
-      // Settting the entire storage nicely
-      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
-      DEBUG_PRINT_LOW("Pmem Info = %p",pPMEMInfo);
-      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = 0;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = NULL;
-        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
-        // Platform specific PMEM Information
-        // Initialize the Platform Entry
-        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
-        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-        pPlatformEntry->entry      = pPMEMInfo;
-        // Initialize the Platform List
-        pPlatformList->nEntries    = 1;
-        pPlatformList->entryList   = pPlatformEntry;
-        // Keep pBuffer NULL till vdec is opened
-        bufHdr->pBuffer            = NULL;
+            // Settting the entire storage nicely
+            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
+            DEBUG_PRINT_LOW("Pmem Info = %p",pPMEMInfo);
 
-        pPMEMInfo->offset          =  0;
-        pPMEMInfo->pmem_fd = 0;
-        bufHdr->pPlatformPrivate = pPlatformList;
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
+            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = 0;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = NULL;
+                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
+                // Platform specific PMEM Information
+                // Initialize the Platform Entry
+                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
+                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+                pPlatformEntry->entry      = pPMEMInfo;
+                // Initialize the Platform List
+                pPlatformList->nEntries    = 1;
+                pPlatformList->entryList   = pPlatformEntry;
+                // Keep pBuffer NULL till vdec is opened
+                bufHdr->pBuffer            = NULL;
+
+                pPMEMInfo->offset          =  0;
+                pPMEMInfo->pmem_fd = 0;
+                bufHdr->pPlatformPrivate = pPlatformList;
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
 #ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
+                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
 #endif
-        /*Create a mapping between buffers*/
-        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
-        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
-                                            &drv_ctx.ptr_outputbuffer[i];
+                /*Create a mapping between buffers*/
+                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
+                                                        &drv_ctx.ptr_outputbuffer[i];
 #ifdef _ANDROID_
-        m_heap_ptr[i].video_heap_ptr = NULL;
+                m_heap_ptr[i].video_heap_ptr = NULL;
 #endif
-        // Move the buffer and buffer header pointers
-        bufHdr++;
-        pPMEMInfo++;
-        pPlatformEntry++;
-        pPlatformList++;
-      }
+                // Move the buffer and buffer header pointers
+                bufHdr++;
+                pPMEMInfo++;
+                pPlatformEntry++;
+                pPlatformList++;
+            }
+
 #ifdef MAX_RES_1080P
-      if(eRet == OMX_ErrorNone && secure_mode)
-      {
-        eRet = vdec_alloc_meta_buffers();
-        if (eRet) {
-          DEBUG_PRINT_ERROR("ERROR in allocating meta buffers\n");
-          return OMX_ErrorInsufficientResources;
-        }
-      }
 
-      if(eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-      {
-        //Allocate the h264_mv_buffer
-        eRet = vdec_alloc_h264_mv();
-        if(eRet) {
-          DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
-          return OMX_ErrorInsufficientResources;
-        }
-      }
+            if (eRet == OMX_ErrorNone && secure_mode) {
+                eRet = vdec_alloc_meta_buffers();
+
+                if (eRet) {
+                    DEBUG_PRINT_ERROR("ERROR in allocating meta buffers\n");
+                    return OMX_ErrorInsufficientResources;
+                }
+            }
+
+            if (eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+                //Allocate the h264_mv_buffer
+                eRet = vdec_alloc_h264_mv();
+
+                if (eRet) {
+                    DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
+                    return OMX_ErrorInsufficientResources;
+                }
+            }
+
 #endif
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
-                                        m_out_mem_ptr, pPtr);
-      if(m_out_mem_ptr)
-      {
-        free(m_out_mem_ptr);
-        m_out_mem_ptr = NULL;
-      }
-      if(pPtr)
-      {
-        free(pPtr);
-        pPtr = NULL;
-      }
-      if(drv_ctx.ptr_outputbuffer)
-      {
-        free(drv_ctx.ptr_outputbuffer);
-        drv_ctx.ptr_outputbuffer = NULL;
-      }
-      if(drv_ctx.ptr_respbuffer)
-      {
-        free(drv_ctx.ptr_respbuffer);
-        drv_ctx.ptr_respbuffer = NULL;
-      }
-#ifdef USE_ION
-    if (drv_ctx.op_buf_ion_info) {
-        DEBUG_PRINT_LOW("Free o/p ion context");
-        free(drv_ctx.op_buf_ion_info);
-        drv_ctx.op_buf_ion_info = NULL;
-    }
-#endif
-      eRet =  OMX_ErrorInsufficientResources;
-    }
-  }
+        } else {
+            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
+                    m_out_mem_ptr, pPtr);
 
-  for (i=0; i< drv_ctx.op_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_out_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("Found a Free Output Buffer Index %d",i);
-      break;
-    }
-  }
+            if (m_out_mem_ptr) {
+                free(m_out_mem_ptr);
+                m_out_mem_ptr = NULL;
+            }
 
-  if (i < drv_ctx.op_buf.actualcount)
-  {
-    DEBUG_PRINT_LOW("Allocate Output Buffer");
+            if (pPtr) {
+                free(pPtr);
+                pPtr = NULL;
+            }
+
+            if (drv_ctx.ptr_outputbuffer) {
+                free(drv_ctx.ptr_outputbuffer);
+                drv_ctx.ptr_outputbuffer = NULL;
+            }
+
+            if (drv_ctx.ptr_respbuffer) {
+                free(drv_ctx.ptr_respbuffer);
+                drv_ctx.ptr_respbuffer = NULL;
+            }
 
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                    drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
-                    &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
-                    &drv_ctx.op_buf_ion_info[i].fd_ion_data, ION_FLAG_CACHED);
-    if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
-        return OMX_ErrorInsufficientResources;
-     }
-    pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+
+            if (drv_ctx.op_buf_ion_info) {
+                DEBUG_PRINT_LOW("Free o/p ion context");
+                free(drv_ctx.op_buf_ion_info);
+                drv_ctx.op_buf_ion_info = NULL;
+            }
+
+#endif
+            eRet =  OMX_ErrorInsufficientResources;
+        }
+    }
+
+    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+            DEBUG_PRINT_LOW("Found a Free Output Buffer Index %d",i);
+            break;
+        }
+    }
+
+    if (i < drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_LOW("Allocate Output Buffer");
+
+#ifdef USE_ION
+        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
+                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
+                &drv_ctx.op_buf_ion_info[i].fd_ion_data, ION_FLAG_CACHED);
+
+        if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
 #else
-    pmem_fd = open (MEM_DEVICE,O_RDWR);
+        pmem_fd = open (MEM_DEVICE,O_RDWR);
 
-    if (pmem_fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
-        drv_ctx.op_buf.buffer_size);
-      return OMX_ErrorInsufficientResources;
-    }
-
-    if (pmem_fd == 0)
-    {
-      pmem_fd = open (MEM_DEVICE,O_RDWR);
-
-      if (pmem_fd < 0)
-      {
-         DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
-           drv_ctx.op_buf.buffer_size);
-         return OMX_ErrorInsufficientResources;
-      }
-    }
-
-    if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size,
-      drv_ctx.op_buf.alignment))
-    {
-      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-      close(pmem_fd);
-      return OMX_ErrorInsufficientResources;
-    }
-#endif
-    if (!secure_mode) {
-        pmem_baseaddress = (unsigned char *)mmap(NULL,
-                           drv_ctx.op_buf.buffer_size,
-                           PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
-
-        if (pmem_baseaddress == MAP_FAILED)
-        {
-          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
-          drv_ctx.op_buf.buffer_size);
-          close(pmem_fd);
-#ifdef USE_ION
-          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
-#endif
-          return OMX_ErrorInsufficientResources;
+        if (pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+                    drv_ctx.op_buf.buffer_size);
+            return OMX_ErrorInsufficientResources;
         }
-    }
 
-    *bufferHdr = (m_out_mem_ptr + i);
-    if (secure_mode)
-        drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr;
-    else
-        drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress;
+        if (pmem_fd == 0) {
+            pmem_fd = open (MEM_DEVICE,O_RDWR);
 
-    drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd;
-    drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size;
-    drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size;
-    drv_ctx.ptr_outputbuffer [i].offset = 0;
+            if (pmem_fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+                        drv_ctx.op_buf.buffer_size);
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size,
+                    drv_ctx.op_buf.alignment)) {
+            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+            close(pmem_fd);
+            return OMX_ErrorInsufficientResources;
+        }
+
+#endif
+
+        if (!secure_mode) {
+            pmem_baseaddress = (unsigned char *)mmap(NULL,
+                    drv_ctx.op_buf.buffer_size,
+                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
+
+            if (pmem_baseaddress == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
+                        drv_ctx.op_buf.buffer_size);
+                close(pmem_fd);
+#ifdef USE_ION
+                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+#endif
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        *bufferHdr = (m_out_mem_ptr + i);
+
+        if (secure_mode)
+            drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr;
+        else
+            drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress;
+
+        drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd;
+        drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size;
+        drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size;
+        drv_ctx.ptr_outputbuffer [i].offset = 0;
 
 #ifdef _ANDROID_
- #ifdef USE_ION
-    m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd,
-                                drv_ctx.op_buf.buffer_size,
-                                pmem_baseaddress,
-                                ion_alloc_data.handle,
-                                pmem_fd);
-    m_heap_count = m_heap_count + 1;
+#ifdef USE_ION
+        m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd,
+                drv_ctx.op_buf.buffer_size,
+                pmem_baseaddress,
+                ion_alloc_data.handle,
+                pmem_fd);
+        m_heap_count = m_heap_count + 1;
 #else
-    m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd,
-                                drv_ctx.op_buf.buffer_size,
-                                pmem_baseaddress);
+        m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd,
+                drv_ctx.op_buf.buffer_size,
+                pmem_baseaddress);
 #endif
 #endif
 
-    m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
 #ifdef _ANDROID_
-    m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get ();
+        m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get ();
 #else
-    m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ;
+        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ;
 #endif
-    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i],
-            sizeof (vdec_bufferpayload));
-    ioctl_msg.in  = &setbuffers;
-    ioctl_msg.out = NULL;
+        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i],
+                sizeof (vdec_bufferpayload));
+        ioctl_msg.in  = &setbuffers;
+        ioctl_msg.out = NULL;
 
-    DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
-    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
-         &ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\n Set output buffer failed");
-      return OMX_ErrorInsufficientResources;
+        DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
+
+        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+                    &ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\n Set output buffer failed");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        // found an empty buffer at i
+        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+        (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
+        (*bufferHdr)->pAppPrivate = appData;
+        BITMASK_SET(&m_out_bm_count,i);
+
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found");
+        eRet = OMX_ErrorInsufficientResources;
     }
 
-    // found an empty buffer at i
-    (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
-    (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
-    (*bufferHdr)->pAppPrivate = appData;
-    BITMASK_SET(&m_out_bm_count,i);
-
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+    return eRet;
 }
 
 
 // AllocateBuffer  -- API Call
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateBuffer
+   FUNCTION
+   omx_vdec::AllocateBuffer
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
-                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                     OMX_IN OMX_U32                        port,
-                                     OMX_IN OMX_PTR                     appData,
-                                     OMX_IN OMX_U32                       bytes)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN OMX_U32                       bytes)
 {
     unsigned i = 0;
     OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
 
     DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
-    if(m_state == OMX_StateInvalid)
-    {
+
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
 
-    if(port == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      if (arbitrary_bytes)
-      {
-          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
-      }
-      else
-      {
-        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
-      }
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        if (arbitrary_bytes) {
+            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
+        } else {
+            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
+        }
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
+        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
+                appData,bytes);
+    } else {
+        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    {
-      eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
-                                                           appData,bytes);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
-      eRet = OMX_ErrorBadPortIndex;
-    }
+
     DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
-    if(eRet == OMX_ErrorNone)
-    {
-        if(allocate_done()){
-            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-            {
+
+    if (eRet == OMX_ErrorNone) {
+        if (allocate_done()) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
                 // Send the callback now
                 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
                 post_event(OMX_CommandStateSet,OMX_StateIdle,
-                                   OMX_COMPONENT_GENERATE_EVENT);
+                        OMX_COMPONENT_GENERATE_EVENT);
             }
         }
-        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
-        {
-          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-          {
-             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-             post_event(OMX_CommandPortEnable,
+
+        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
                         OMX_CORE_INPUT_PORT_INDEX,
                         OMX_COMPONENT_GENERATE_EVENT);
-          }
+            }
         }
-        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
-            {
-          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-          {
-             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+
+        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
                 post_event(OMX_CommandPortEnable,
-                           OMX_CORE_OUTPUT_PORT_INDEX,
-                           OMX_COMPONENT_GENERATE_EVENT);
+                        OMX_CORE_OUTPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
             }
         }
     }
+
     DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
     return eRet;
 }
 
 // Free Buffer - API call
 /* ======================================================================
-FUNCTION
-  omx_vdec::FreeBuffer
+   FUNCTION
+   omx_vdec::FreeBuffer
 
-DESCRIPTION
+   DESCRIPTION
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                      OMX_IN OMX_U32                 port,
-                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_U32                 port,
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     unsigned int nPortIndex;
 
     DEBUG_PRINT_LOW("In for decoder free_buffer");
 
-    if(m_state == OMX_StateIdle &&
-       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-    {
+    if (m_state == OMX_StateIdle &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
         DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
-    }
-    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
-            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
-    {
+    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
+            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
         DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port);
-    }
-    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
-    {
+    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
         DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
         post_event(OMX_EventError,
-                   OMX_ErrorPortUnpopulated,
-                   OMX_COMPONENT_GENERATE_EVENT);
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
 
         return OMX_ErrorIncorrectStateOperation;
-    }
-    else if (m_state != OMX_StateInvalid)
-    {
+    } else if (m_state != OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
         post_event(OMX_EventError,
-                   OMX_ErrorPortUnpopulated,
-                   OMX_COMPONENT_GENERATE_EVENT);
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
     }
 
-    if(port == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      /*Check if arbitrary bytes*/
-      if(!arbitrary_bytes && !input_use_buffer)
-        nPortIndex = buffer - m_inp_mem_ptr;
-      else
-        nPortIndex = buffer - m_inp_heap_ptr;
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        /*Check if arbitrary bytes*/
+        if (!arbitrary_bytes && !input_use_buffer)
+            nPortIndex = buffer - m_inp_mem_ptr;
+        else
+            nPortIndex = buffer - m_inp_heap_ptr;
 
         DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
-        if(nPortIndex < drv_ctx.ip_buf.actualcount)
-        {
-         // Clear the bit associated with it.
-         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
-         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
-         if (input_use_buffer == true)
-         {
 
-            DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
-            if(m_phdr_pmem_ptr)
-              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
-         }
-         else
-         {
-            if (arbitrary_bytes)
-            {
-              if(m_phdr_pmem_ptr)
-                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
-              else
-                free_input_buffer(nPortIndex,NULL);
+        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
+            // Clear the bit associated with it.
+            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
+            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
+
+            if (input_use_buffer == true) {
+
+                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
+
+                if (m_phdr_pmem_ptr)
+                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
+            } else {
+                if (arbitrary_bytes) {
+                    if (m_phdr_pmem_ptr)
+                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
+                    else
+                        free_input_buffer(nPortIndex,NULL);
+                } else
+                    free_input_buffer(buffer);
             }
-            else
-              free_input_buffer(buffer);
-         }
-         m_inp_bPopulated = OMX_FALSE;
-         /*Free the Buffer Header*/
-          if (release_input_done())
-          {
-            DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
-            free_input_buffer_header();
-          }
-        }
-        else
-        {
+
+            m_inp_bPopulated = OMX_FALSE;
+
+            /*Free the Buffer Header*/
+            if (release_input_done()) {
+                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
+                free_input_buffer_header();
+            }
+        } else {
             DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
             eRet = OMX_ErrorBadPortIndex;
         }
 
-        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
-           && release_input_done())
-        {
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
+                && release_input_done()) {
             DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
             post_event(OMX_CommandPortDisable,
-                       OMX_CORE_INPUT_PORT_INDEX,
-                       OMX_COMPONENT_GENERATE_EVENT);
+                    OMX_CORE_INPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
-    }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    {
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
         // check if the buffer is valid
         nPortIndex = buffer - client_buffers.get_il_buf_hdr();
-        if(nPortIndex < drv_ctx.op_buf.actualcount)
-        {
+
+        if (nPortIndex < drv_ctx.op_buf.actualcount) {
             DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
             // Clear the bit associated with it.
             BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
             m_out_bPopulated = OMX_FALSE;
             client_buffers.free_output_buffer (buffer);
 
-            if (release_output_done())
-            {
-              free_output_buffer_header();
+            if (release_output_done()) {
+                free_output_buffer_header();
             }
-        }
-        else
-        {
+        } else {
             DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
             eRet = OMX_ErrorBadPortIndex;
         }
-        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
-           && release_output_done())
-        {
+
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
+                && release_output_done()) {
             DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
 
-                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
-                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
 #ifdef _ANDROID_ICS_
-                if (m_enable_android_native_buffers)
-                {
-                    DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
-                    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
-                }
+
+            if (m_enable_android_native_buffers) {
+                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
+                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+            }
+
 #endif
 
-                post_event(OMX_CommandPortDisable,
-                           OMX_CORE_OUTPUT_PORT_INDEX,
-                           OMX_COMPONENT_GENERATE_EVENT);
+            post_event(OMX_CommandPortDisable,
+                    OMX_CORE_OUTPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
-    }
-    else
-    {
+    } else {
         eRet = OMX_ErrorBadPortIndex;
     }
-    if((eRet == OMX_ErrorNone) &&
-       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-    {
-        if(release_done())
-        {
+
+    if ((eRet == OMX_ErrorNone) &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
+        if (release_done()) {
             // Send the callback now
             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
             post_event(OMX_CommandStateSet, OMX_StateLoaded,
-                                      OMX_COMPONENT_GENERATE_EVENT);
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
     }
+
     return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::EmptyThisBuffer
+   FUNCTION
+   omx_vdec::EmptyThisBuffer
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
-  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
+    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
+    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
 
-  if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
-  {
-    codec_config_flag = true;
-    DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
-  }
-  else
-  {
-    codec_config_flag = false;
-  }
+    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+        codec_config_flag = true;
+        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
+    } else {
+        codec_config_flag = false;
+    }
 
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (buffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
+        return OMX_ErrorBadParameter;
+    }
 
-  if (!m_inp_bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_inp_bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
+        return OMX_ErrorBadPortIndex;
+    }
 
 #ifdef _ANDROID_
-  if(iDivXDrmDecrypt)
-  {
-    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
-    if(drmErr != OMX_ErrorNone) {
-        // this error can be ignored
-        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+
+    if (iDivXDrmDecrypt) {
+        OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
+
+        if (drmErr != OMX_ErrorNone) {
+            // this error can be ignored
+            DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+        }
     }
-  }
-  if (perf_flag)
-  {
-    if (!latency)
-    {
-      dec_time.stop();
-      latency = dec_time.processing_time_us();
-      dec_time.start();
+
+    if (perf_flag) {
+        if (!latency) {
+            dec_time.stop();
+            latency = dec_time.processing_time_us();
+            dec_time.start();
+        }
     }
-  }
+
 #endif //_ANDROID_
 
-  if (arbitrary_bytes)
-  {
-    nBufferIndex = buffer - m_inp_heap_ptr;
-  }
-  else
-  {
-     if (input_use_buffer == true)
-     {
-       nBufferIndex = buffer - m_inp_heap_ptr;
-       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
-       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
-       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
-       buffer = &m_inp_mem_ptr[nBufferIndex];
-       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
-                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
-     }
-     else{
-       nBufferIndex = buffer - m_inp_mem_ptr;
-     }
-  }
+    if (arbitrary_bytes) {
+        nBufferIndex = buffer - m_inp_heap_ptr;
+    } else {
+        if (input_use_buffer == true) {
+            nBufferIndex = buffer - m_inp_heap_ptr;
+            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
+            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
+            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
+            buffer = &m_inp_mem_ptr[nBufferIndex];
+            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
+                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
+        } else {
+            nBufferIndex = buffer - m_inp_mem_ptr;
+        }
+    }
 
-  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
-    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
-  if (arbitrary_bytes)
-  {
-    post_event ((unsigned)hComp,(unsigned)buffer,
+    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
+            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
+
+    if (arbitrary_bytes) {
+        post_event ((unsigned)hComp,(unsigned)buffer,
                 OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
-  }
-  else
-  {
-    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
-      set_frame_rate(buffer->nTimeStamp);
-    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
-  }
-  return OMX_ErrorNone;
+    } else {
+        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
+            set_frame_rate(buffer->nTimeStamp);
+
+        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
+    }
+
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::empty_this_buffer_proxy
+   FUNCTION
+   omx_vdec::empty_this_buffer_proxy
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
-                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  int push_cnt = 0,i=0;
-  unsigned nPortIndex = 0;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  struct vdec_input_frameinfo frameinfo;
-  struct vdec_bufferpayload *temp_buffer;
-  struct vdec_ioctl_msg ioctl_msg;
-  struct vdec_seqheader seq_header;
-  bool port_setting_changed = true;
+    int push_cnt = 0,i=0;
+    unsigned nPortIndex = 0;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    struct vdec_input_frameinfo frameinfo;
+    struct vdec_bufferpayload *temp_buffer;
+    struct vdec_ioctl_msg ioctl_msg;
+    struct vdec_seqheader seq_header;
+    bool port_setting_changed = true;
 #ifdef MAX_RES_1080P
-  bool not_coded_vop = false;
+    bool not_coded_vop = false;
 #endif
 
-  /*Should we generate a Aync error event*/
-  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    /*Should we generate a Aync error event*/
+    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
 
-  if (nPortIndex > drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
-        nPortIndex);
-    return OMX_ErrorBadParameter;
-  }
+    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
+                nPortIndex);
+        return OMX_ErrorBadParameter;
+    }
 
-  pending_input_buffers++;
+    pending_input_buffers++;
 
-  /* return zero length and not an EOS buffer */
-  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
-     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
-  {
-    DEBUG_PRINT_HIGH("return zero legth buffer");
-    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                     OMX_COMPONENT_GENERATE_EBD);
-    return OMX_ErrorNone;
-  }
+    /* return zero length and not an EOS buffer */
+    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
+            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
+        DEBUG_PRINT_HIGH("return zero legth buffer");
+        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                OMX_COMPONENT_GENERATE_EBD);
+        return OMX_ErrorNone;
+    }
 
 #ifdef MAX_RES_1080P
-  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
-    mp4StreamType psBits;
-    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
-    psBits.numBytes = buffer->nFilledLen;
-    mp4_headerparser.parseHeader(&psBits);
-    not_coded_vop = mp4_headerparser.is_notcodec_vop(
-            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
-    if(not_coded_vop) {
-        DEBUG_PRINT_HIGH("Found Not coded vop len %d frame number %d",
-             buffer->nFilledLen,frame_count);
-        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
-          DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero");
-          not_coded_vop = false;
-          buffer->nFilledLen = 0;
+
+    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
+        mp4StreamType psBits;
+        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
+        psBits.numBytes = buffer->nFilledLen;
+        mp4_headerparser.parseHeader(&psBits);
+        not_coded_vop = mp4_headerparser.is_notcodec_vop(
+                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+
+        if (not_coded_vop) {
+            DEBUG_PRINT_HIGH("Found Not coded vop len %d frame number %d",
+                    buffer->nFilledLen,frame_count);
+
+            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+                DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero");
+                not_coded_vop = false;
+                buffer->nFilledLen = 0;
+            }
         }
     }
-  }
+
 #endif
-  if(input_flush_progress == true
+
+    if (input_flush_progress == true
 #ifdef MAX_RES_1080P
-     || not_coded_vop
+            || not_coded_vop
 #endif
-     )
-  {
-    DEBUG_PRINT_LOW("Flush in progress return buffer ");
-    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                     OMX_COMPONENT_GENERATE_EBD);
-    return OMX_ErrorNone;
-  }
-
-  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
-
-  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  /*for use buffer we need to memcpy the data*/
-  temp_buffer->buffer_len = buffer->nFilledLen;
-
-  if (input_use_buffer)
-  {
-    if (buffer->nFilledLen <= temp_buffer->buffer_len)
-    {
-      if(arbitrary_bytes)
-      {
-        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
-      }
-      else
-      {
-        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
-                buffer->nFilledLen);
-      }
-    }
-    else
-    {
-      return OMX_ErrorBadParameter;
+       ) {
+        DEBUG_PRINT_LOW("Flush in progress return buffer ");
+        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                OMX_COMPONENT_GENERATE_EBD);
+        return OMX_ErrorNone;
     }
 
-  }
+    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
 
-  frameinfo.bufferaddr = temp_buffer->bufferaddr;
-  frameinfo.client_data = (void *) buffer;
-  frameinfo.datalen = temp_buffer->buffer_len;
-  frameinfo.flags = 0;
-  frameinfo.offset = buffer->nOffset;
-  frameinfo.pmem_fd = temp_buffer->pmem_fd;
-  frameinfo.pmem_offset = temp_buffer->offset;
-  frameinfo.timestamp = buffer->nTimeStamp;
-  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
-  {
-    DEBUG_PRINT_LOW("ETB: dmx enabled");
-    if (m_demux_entries == 0)
-    {
-      extract_demux_addr_offsets(buffer);
+    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
+        return OMX_ErrorBadParameter;
     }
 
-    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
-    handle_demux_data(buffer);
-    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
-    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
-  }
-  else
-  {
-    frameinfo.desc_addr = NULL;
-    frameinfo.desc_size = 0;
-  }
-  if(!arbitrary_bytes)
-  {
-      frameinfo.flags |= buffer->nFlags;
-  }
+    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    /*for use buffer we need to memcpy the data*/
+    temp_buffer->buffer_len = buffer->nFilledLen;
+
+    if (input_use_buffer) {
+        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
+            if (arbitrary_bytes) {
+                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+            } else {
+                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
+                        buffer->nFilledLen);
+            }
+        } else {
+            return OMX_ErrorBadParameter;
+        }
+
+    }
+
+    frameinfo.bufferaddr = temp_buffer->bufferaddr;
+    frameinfo.client_data = (void *) buffer;
+    frameinfo.datalen = temp_buffer->buffer_len;
+    frameinfo.flags = 0;
+    frameinfo.offset = buffer->nOffset;
+    frameinfo.pmem_fd = temp_buffer->pmem_fd;
+    frameinfo.pmem_offset = temp_buffer->offset;
+    frameinfo.timestamp = buffer->nTimeStamp;
+
+    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
+        DEBUG_PRINT_LOW("ETB: dmx enabled");
+
+        if (m_demux_entries == 0) {
+            extract_demux_addr_offsets(buffer);
+        }
+
+        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
+        handle_demux_data(buffer);
+        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
+        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
+    } else {
+        frameinfo.desc_addr = NULL;
+        frameinfo.desc_size = 0;
+    }
+
+    if (!arbitrary_bytes) {
+        frameinfo.flags |= buffer->nFlags;
+    }
 
 
 #ifdef _ANDROID_
-  if (m_debug_timestamp)
-  {
-    if(arbitrary_bytes)
-    {
-      DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
-      m_timestamp_list.insert_ts(buffer->nTimeStamp);
+
+    if (m_debug_timestamp) {
+        if (arbitrary_bytes) {
+            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+            m_timestamp_list.insert_ts(buffer->nTimeStamp);
+        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
+            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+            m_timestamp_list.insert_ts(buffer->nTimeStamp);
+        }
     }
-    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
-    {
-      DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
-      m_timestamp_list.insert_ts(buffer->nTimeStamp);
-    }
-  }
+
 #endif
 
 #ifdef INPUT_BUFFER_LOG
-  if (inputBufferFile1)
-  {
-    fwrite((const char *)temp_buffer->bufferaddr,
-      temp_buffer->buffer_len,1,inputBufferFile1);
-  }
+
+    if (inputBufferFile1) {
+        fwrite((const char *)temp_buffer->bufferaddr,
+                temp_buffer->buffer_len,1,inputBufferFile1);
+    }
 
 #endif
-  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
-  {
-    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-  }
 
-  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
-  {
-    DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
-    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
-    h264_scratch.nFilledLen = 0;
-    nal_count = 0;
-    look_ahead_nal = false;
-    frame_count = 0;
-    if (m_frame_parser.mutils)
-      m_frame_parser.mutils->initialize_frame_checking_environment();
-    m_frame_parser.flush();
-    h264_last_au_ts = LLONG_MAX;
-    h264_last_au_flags = 0;
-    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-    m_demux_entries = 0;
-  }
-  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
-    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
-  ioctl_msg.in = &frameinfo;
-  ioctl_msg.out = NULL;
-  if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
-            &ioctl_msg) < 0)
-  {
-    /*Generate an async error and move to invalid state*/
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed");
-    if (!arbitrary_bytes)
-    {
-      DEBUG_PRINT_LOW("Return failed buffer");
-      post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                       OMX_COMPONENT_GENERATE_EBD);
+    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
     }
-    return OMX_ErrorBadParameter;
-  } else
-      time_stamp_dts.insert_timestamp(buffer);
 
-  return ret;
+    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
+        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
+        h264_scratch.nFilledLen = 0;
+        nal_count = 0;
+        look_ahead_nal = false;
+        frame_count = 0;
+
+        if (m_frame_parser.mutils)
+            m_frame_parser.mutils->initialize_frame_checking_environment();
+
+        m_frame_parser.flush();
+        h264_last_au_ts = LLONG_MAX;
+        h264_last_au_flags = 0;
+        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+        m_demux_entries = 0;
+    }
+
+    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
+            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
+    ioctl_msg.in = &frameinfo;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
+                &ioctl_msg) < 0) {
+        /*Generate an async error and move to invalid state*/
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed");
+
+        if (!arbitrary_bytes) {
+            DEBUG_PRINT_LOW("Return failed buffer");
+            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                    OMX_COMPONENT_GENERATE_EBD);
+        }
+
+        return OMX_ErrorBadParameter;
+    } else
+        time_stamp_dts.insert_timestamp(buffer);
+
+    return ret;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::FillThisBuffer
+   FUNCTION
+   omx_vdec::FillThisBuffer
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
-                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
 
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("FTB in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (!m_out_bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_out_bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  if (buffer == NULL ||
-     ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
-  {
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL ||
+            ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) {
+        return OMX_ErrorBadParameter;
+    }
 
-  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
+        return OMX_ErrorBadPortIndex;
+    }
 
-  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  post_event((unsigned) hComp, (unsigned)buffer,m_fill_output_msg);
-  return OMX_ErrorNone;
+    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    post_event((unsigned) hComp, (unsigned)buffer,m_fill_output_msg);
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::fill_this_buffer_proxy
+   FUNCTION
+   omx_vdec::fill_this_buffer_proxy
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
-                         OMX_IN OMX_HANDLETYPE        hComp,
-                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
+        OMX_IN OMX_HANDLETYPE        hComp,
+        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
 {
-  OMX_ERRORTYPE nRet = OMX_ErrorNone;
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
-  struct vdec_fillbuffer_cmd fillbuffer;
-  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
-  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
+    OMX_ERRORTYPE nRet = OMX_ErrorNone;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
+    struct vdec_fillbuffer_cmd fillbuffer;
+    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
+    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
 
 
-  if (bufferAdd == NULL || ((buffer - client_buffers.get_il_buf_hdr()) >
-      drv_ctx.op_buf.actualcount) )
-    return OMX_ErrorBadParameter;
+    if (bufferAdd == NULL || ((buffer - client_buffers.get_il_buf_hdr()) >
+                drv_ctx.op_buf.actualcount) )
+        return OMX_ErrorBadParameter;
 
-  DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
-      bufferAdd, bufferAdd->pBuffer);
-  /*Return back the output buffer to client*/
-  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
-  {
-    DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
-    buffer->nFilledLen = 0;
-    m_cb.FillBufferDone (hComp,m_app_data,buffer);
-    return OMX_ErrorNone;
-  }
-  pending_output_buffers++;
-  buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
-  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
-  if (ptr_respbuffer)
-  {
-    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
-  }
+    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
+            bufferAdd, bufferAdd->pBuffer);
 
-  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
-  {
-      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
-      buffer->nFilledLen = 0;
-      m_cb.FillBufferDone (hComp,m_app_data,buffer);
-      pending_output_buffers--;
-      return OMX_ErrorBadParameter;
-  }
+    /*Return back the output buffer to client*/
+    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
+        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
+        buffer->nFilledLen = 0;
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
 
-  memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
-          sizeof(struct vdec_bufferpayload));
-  fillbuffer.client_data = buffer;
+    pending_output_buffers++;
+    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
+    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
+
+    if (ptr_respbuffer) {
+        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
+    }
+
+    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
+        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
+        buffer->nFilledLen = 0;
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        pending_output_buffers--;
+        return OMX_ErrorBadParameter;
+    }
+
+    memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
+            sizeof(struct vdec_bufferpayload));
+    fillbuffer.client_data = buffer;
 
 #ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
+
+    if (m_enable_android_native_buffers) {
         // Acquire a write lock on this buffer.
         if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
-                                                  GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
+                    GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
             DEBUG_PRINT_ERROR("Failed to acquire genlock");
             buffer->nFilledLen = 0;
             m_cb.FillBufferDone (hComp,m_app_data,buffer);
@@ -5964,171 +5678,176 @@
             return OMX_ErrorInsufficientResources;
         } else {
             native_buffer[buffer - m_out_mem_ptr].inuse = true;
-      }
-    }
-#endif
-
-  ioctl_msg.in = &fillbuffer;
-  ioctl_msg.out = NULL;
-  if (ioctl (drv_ctx.video_driver_fd,
-         VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Decoder frame failed");
-#ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
-        // Unlock the buffer
-        if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
-            DEBUG_PRINT_ERROR("Releasing genlock failed");
-            return OMX_ErrorInsufficientResources;
-        } else {
-            native_buffer[buffer - m_out_mem_ptr].inuse = false;
         }
     }
-#endif
-    m_cb.FillBufferDone (hComp,m_app_data,buffer);
-    pending_output_buffers--;
-    return OMX_ErrorBadParameter;
-  }
 
-  return OMX_ErrorNone;
+#endif
+
+    ioctl_msg.in = &fillbuffer;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (drv_ctx.video_driver_fd,
+                VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\n Decoder frame failed");
+#ifdef _ANDROID_ICS_
+
+        if (m_enable_android_native_buffers) {
+            // Unlock the buffer
+            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+                DEBUG_PRINT_ERROR("Releasing genlock failed");
+                return OMX_ErrorInsufficientResources;
+            } else {
+                native_buffer[buffer - m_out_mem_ptr].inuse = false;
+            }
+        }
+
+#endif
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        pending_output_buffers--;
+        return OMX_ErrorBadParameter;
+    }
+
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SetCallbacks
+   FUNCTION
+   omx_vdec::SetCallbacks
 
-DESCRIPTION
-  Set the callbacks.
+   DESCRIPTION
+   Set the callbacks.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
-                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
-                                           OMX_IN OMX_PTR             appData)
+        OMX_IN OMX_CALLBACKTYPE* callbacks,
+        OMX_IN OMX_PTR             appData)
 {
 
-  m_cb       = *callbacks;
-  DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
-               m_cb.EventHandler,m_cb.FillBufferDone);
-  m_app_data =    appData;
-  return OMX_ErrorNotImplemented;
+    m_cb       = *callbacks;
+    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
+            m_cb.EventHandler,m_cb.FillBufferDone);
+    m_app_data =    appData;
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentDeInit
+   FUNCTION
+   omx_vdec::ComponentDeInit
 
-DESCRIPTION
-  Destroys the component and release memory allocated to the heap.
+   DESCRIPTION
+   Destroys the component and release memory allocated to the heap.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
 {
 #ifndef JB_MR1
-  sp<IServiceManager> sm;
-  sp<hwcService::IHWComposer> hwcBinder = NULL;
+    sp<IServiceManager> sm;
+    sp<hwcService::IHWComposer> hwcBinder = NULL;
 #endif
 #ifdef _ANDROID_
-    if(iDivXDrmDecrypt)
-    {
+
+    if (iDivXDrmDecrypt) {
         delete iDivXDrmDecrypt;
         iDivXDrmDecrypt=NULL;
     }
+
 #endif //_ANDROID_
     int i = 0;
-    if (OMX_StateLoaded != m_state)
-    {
+
+    if (OMX_StateLoaded != m_state) {
         DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
-                          m_state);
+                m_state);
         DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
+    } else {
+        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
     }
-    else
-    {
-      DEBUG_PRINT_HIGH("Playback Ended - PASSED");
-    }
+
 #ifndef JB_MR1
+
     if (secure_mode) {
-      sm = defaultServiceManager();
-      hwcBinder =
-        interface_cast<hwcService::IHWComposer>(sm->getService(String16("display.hwcservice")));
-      if (hwcBinder != NULL) {
-          hwcBinder->setCloseSecureStart();
-      } else {
-        DEBUG_PRINT_HIGH("Failed to get hwcbinder, "
-                         "failed to call close secure start");
-      }
+        sm = defaultServiceManager();
+        hwcBinder =
+            interface_cast<hwcService::IHWComposer>(sm->getService(String16("display.hwcservice")));
+
+        if (hwcBinder != NULL) {
+            hwcBinder->setCloseSecureStart();
+        } else {
+            DEBUG_PRINT_HIGH("Failed to get hwcbinder, "
+                    "failed to call close secure start");
+        }
     }
+
 #endif
+
     /*Check if the output buffers have to be cleaned up*/
-    if(m_out_mem_ptr)
-    {
+    if (m_out_mem_ptr) {
         DEBUG_PRINT_LOW("Freeing the Output Memory");
-        for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
-        {
-          free_output_buffer (&m_out_mem_ptr[i]);
+
+        for (i=0; i < drv_ctx.op_buf.actualcount; i++ ) {
+            free_output_buffer (&m_out_mem_ptr[i]);
 #ifdef _ANDROID_ICS_
-        if (m_enable_android_native_buffers)
-        {
-          if (native_buffer[i].inuse)
-          {
-            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
-                DEBUG_PRINT_ERROR("Unlocking genlock failed");
+
+            if (m_enable_android_native_buffers) {
+                if (native_buffer[i].inuse) {
+                    if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
+                        DEBUG_PRINT_ERROR("Unlocking genlock failed");
+                    }
+
+                    native_buffer[i].inuse = false;
+                }
             }
-            native_buffer[i].inuse = false;
-          }
-        }
+
 #endif
         }
+
 #ifdef _ANDROID_ICS_
         memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
 #endif
     }
 
     /*Check if the input buffers have to be cleaned up*/
-    if(m_inp_mem_ptr || m_inp_heap_ptr)
-    {
+    if (m_inp_mem_ptr || m_inp_heap_ptr) {
         DEBUG_PRINT_LOW("Freeing the Input Memory");
-        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
-        {
-          if (m_inp_mem_ptr)
-            free_input_buffer (i,&m_inp_mem_ptr[i]);
-          else
-            free_input_buffer (i,NULL);
+
+        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ ) {
+            if (m_inp_mem_ptr)
+                free_input_buffer (i,&m_inp_mem_ptr[i]);
+            else
+                free_input_buffer (i,NULL);
         }
     }
+
     free_input_buffer_header();
     free_output_buffer_header();
-    if(h264_scratch.pBuffer)
-    {
+
+    if (h264_scratch.pBuffer) {
         free(h264_scratch.pBuffer);
         h264_scratch.pBuffer = NULL;
     }
 
-    if (h264_parser)
-    {
+    if (h264_parser) {
         delete h264_parser;
         h264_parser = NULL;
     }
 
-    if(m_platform_list)
-    {
+    if (m_platform_list) {
         free(m_platform_list);
         m_platform_list = NULL;
     }
-    if(m_vendor_config.pData)
-    {
+
+    if (m_vendor_config.pData) {
         free(m_vendor_config.pData);
         m_vendor_config.pData = NULL;
     }
@@ -6141,30 +5860,33 @@
     m_cmd_q.m_read = m_cmd_q.m_write =0;
     m_etb_q.m_read = m_etb_q.m_write =0;
 #ifdef _ANDROID_
-    if (m_debug_timestamp)
-    {
-      m_timestamp_list.reset_ts_list();
+
+    if (m_debug_timestamp) {
+        m_timestamp_list.reset_ts_list();
     }
+
 #endif
 
     DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
     (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
-        NULL);
+            NULL);
 #ifdef _ANDROID_
-   /* get strong count gets the refernce count of the pmem, the count will
-    * be incremented by our kernal driver and surface flinger, by the time
-    * we close the pmem, this cound needs to be zero, but there is no way
-    * for us to know when surface flinger reduces its cound, so we wait
-    * here in a infinite loop till the count is zero
-    */
-     if (m_heap_ptr)
-     {
-         for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++)
-              m_heap_ptr[indx].video_heap_ptr = NULL;
-         free(m_heap_ptr);
-         m_heap_ptr = NULL;
-         m_heap_count = 0;
-     }
+
+    /* get strong count gets the refernce count of the pmem, the count will
+     * be incremented by our kernal driver and surface flinger, by the time
+     * we close the pmem, this cound needs to be zero, but there is no way
+     * for us to know when surface flinger reduces its cound, so we wait
+     * here in a infinite loop till the count is zero
+     */
+    if (m_heap_ptr) {
+        for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++)
+            m_heap_ptr[indx].video_heap_ptr = NULL;
+
+        free(m_heap_ptr);
+        m_heap_ptr = NULL;
+        m_heap_count = 0;
+    }
+
 #endif // _ANDROID_
 #ifdef INPUT_BUFFER_LOG
     fclose (inputBufferFile1);
@@ -6175,65 +5897,71 @@
 #ifdef OUTPUT_EXTRADATA_LOG
     fclose (outputExtradataFile);
 #endif
-  power_module_deregister();
-  DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
+    power_module_deregister();
+    DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
 #ifndef JB_MR1
-  if (secure_mode) {
-      if (hwcBinder != NULL) {
-          hwcBinder->setCloseSecureEnd();
-      } else {
-        DEBUG_PRINT_HIGH("Failed to get hwcbinder, "
-                         "failed to call close secure start");
-      }
-  }
+
+    if (secure_mode) {
+        if (hwcBinder != NULL) {
+            hwcBinder->setCloseSecureEnd();
+        } else {
+            DEBUG_PRINT_HIGH("Failed to get hwcbinder, "
+                    "failed to call close secure start");
+        }
+    }
+
 #endif
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseEGLImage
+   FUNCTION
+   omx_vdec::UseEGLImage
 
-DESCRIPTION
-  OMX Use EGL Image method implementation <TBD>.
+   DESCRIPTION
+   OMX Use EGL Image method implementation <TBD>.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Not Implemented error.
+   RETURN VALUE
+   Not Implemented error.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
-                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                          OMX_IN OMX_U32                        port,
-                                          OMX_IN OMX_PTR                     appData,
-                                          OMX_IN void*                      eglImage)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN void*                      eglImage)
 {
-  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
-  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
+    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
+    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
 
 #ifdef USE_EGL_IMAGE_GPU
-   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
-   EGLint fd = -1, offset = 0,pmemPtr = 0;
+    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
+    EGLint fd = -1, offset = 0,pmemPtr = 0;
 #else
-   int fd = -1, offset = 0;
+    int fd = -1, offset = 0;
 #endif
-   DEBUG_PRINT_HIGH("use EGL image support for decoder");
-   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
-     DEBUG_PRINT_ERROR("\n ");
-   }
+    DEBUG_PRINT_HIGH("use EGL image support for decoder");
+
+    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\n ");
+    }
+
 #ifdef USE_EGL_IMAGE_GPU
-   if(m_display_id == NULL) {
+
+    if (m_display_id == NULL) {
         DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
         return OMX_ErrorInsufficientResources;
-   }
-   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
-                    eglGetProcAddress("eglQueryImageKHR");
-   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
-   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
-   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
+    }
+
+    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
+        eglGetProcAddress("eglQueryImageKHR");
+    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
+    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
+    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
 #else //with OMX test app
     struct temp_egl {
         int pmem_fd;
@@ -6242,1312 +5970,1237 @@
     struct temp_egl *temp_egl_id = NULL;
     void * pmemPtr = (void *) eglImage;
     temp_egl_id = (struct temp_egl *)eglImage;
-    if (temp_egl_id != NULL)
-    {
+
+    if (temp_egl_id != NULL) {
         fd = temp_egl_id->pmem_fd;
         offset = temp_egl_id->offset;
     }
+
 #endif
+
     if (fd < 0) {
         DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
         return OMX_ErrorInsufficientResources;
-   }
-   pmem_info.pmem_fd = (OMX_U32) fd;
-   pmem_info.offset = (OMX_U32) offset;
-   pmem_entry.entry = (void *) &pmem_info;
-   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-   pmem_list.entryList = &pmem_entry;
-   pmem_list.nEntries = 1;
-   ouput_egl_buffers = true;
-   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
-       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
-        (OMX_U8 *)pmemPtr)) {
-     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
-     return OMX_ErrorInsufficientResources;
-   }
-   return OMX_ErrorNone;
+    }
+
+    pmem_info.pmem_fd = (OMX_U32) fd;
+    pmem_info.offset = (OMX_U32) offset;
+    pmem_entry.entry = (void *) &pmem_info;
+    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+    pmem_list.entryList = &pmem_entry;
+    pmem_list.nEntries = 1;
+    ouput_egl_buffers = true;
+
+    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
+                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
+                (OMX_U8 *)pmemPtr)) {
+        DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
+        return OMX_ErrorInsufficientResources;
+    }
+
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentRoleEnum
+   FUNCTION
+   omx_vdec::ComponentRoleEnum
 
-DESCRIPTION
-  OMX Component Role Enum method implementation.
+   DESCRIPTION
+   OMX Component Role Enum method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   OMX Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
-                                                OMX_OUT OMX_U8*        role,
-                                                OMX_IN OMX_U32        index)
+        OMX_OUT OMX_U8*        role,
+        OMX_IN OMX_U32        index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
     }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
+
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+        } else {
+            DEBUG_PRINT_LOW("No more roles");
+            eRet = OMX_ErrorNoMore;
+        }
     }
-  }
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s",role);
-    }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("No more roles");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
+
 #ifdef MAX_RES_1080P
-  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
-          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
-          )
+    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+            )
 #else
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
+    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
 #endif
-  {
-    if((0 == index) && role)
     {
-      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+        } else {
+            DEBUG_PRINT_LOW("No more roles");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+        } else {
+            DEBUG_PRINT_LOW("No more roles");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+            ) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
+        } else {
+            DEBUG_PRINT_LOW("No more roles");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component");
+        eRet = OMX_ErrorInvalidComponentName;
     }
-    else
-    {
-      DEBUG_PRINT_LOW("No more roles");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("No more roles");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
-           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
-           )
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("No more roles");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component");
-    eRet = OMX_ErrorInvalidComponentName;
-  }
-  return eRet;
+
+    return eRet;
 }
 
 
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateDone
+   FUNCTION
+   omx_vdec::AllocateDone
 
-DESCRIPTION
-  Checks if entire buffer pool is allocated by IL Client or not.
-  Need this to move to IDLE state.
+   DESCRIPTION
+   Checks if entire buffer pool is allocated by IL Client or not.
+   Need this to move to IDLE state.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false.
+   RETURN VALUE
+   true/false.
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::allocate_done(void)
 {
-  bool bRet = false;
-  bool bRet_In = false;
-  bool bRet_Out = false;
+    bool bRet = false;
+    bool bRet_In = false;
+    bool bRet_Out = false;
 
-  bRet_In = allocate_input_done();
-  bRet_Out = allocate_output_done();
+    bRet_In = allocate_input_done();
+    bRet_Out = allocate_output_done();
 
-  if(bRet_In && bRet_Out)
-  {
-      bRet = true;
-  }
-
-  return bRet;
-}
-/* ======================================================================
-FUNCTION
-  omx_vdec::AllocateInputDone
-
-DESCRIPTION
-  Checks if I/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_input_done(void)
-{
-  bool bRet = false;
-  unsigned i=0;
-
-  if (m_inp_mem_ptr == NULL)
-  {
-      return bRet;
-  }
-  if(m_inp_mem_ptr )
-  {
-    for(;i<drv_ctx.ip_buf.actualcount;i++)
-    {
-      if(BITMASK_ABSENT(&m_inp_bm_count,i))
-      {
-        break;
-      }
-    }
-  }
-  if(i == drv_ctx.ip_buf.actualcount)
-  {
-    bRet = true;
-    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
-  }
-  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
-  {
-     m_inp_bPopulated = OMX_TRUE;
-  }
-  return bRet;
-}
-/* ======================================================================
-FUNCTION
-  omx_vdec::AllocateOutputDone
-
-DESCRIPTION
-  Checks if entire O/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_output_done(void)
-{
-  bool bRet = false;
-  unsigned j=0;
-
-  if (m_out_mem_ptr == NULL)
-  {
-      return bRet;
-  }
-
-  if (m_out_mem_ptr)
-  {
-    for(;j < drv_ctx.op_buf.actualcount;j++)
-    {
-      if(BITMASK_ABSENT(&m_out_bm_count,j))
-      {
-        break;
-      }
-    }
-  }
-
-  if(j == drv_ctx.op_buf.actualcount)
-  {
-    bRet = true;
-    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
-    if(m_out_bEnabled)
-       m_out_bPopulated = OMX_TRUE;
-  }
-
-  return bRet;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseDone
-
-DESCRIPTION
-  Checks if IL client has released all the buffers.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false
-
-========================================================================== */
-bool omx_vdec::release_done(void)
-{
-  bool bRet = false;
-
-  if(release_input_done())
-  {
-    if(release_output_done())
-    {
+    if (bRet_In && bRet_Out) {
         bRet = true;
     }
-  }
-  return bRet;
+
+    return bRet;
+}
+/* ======================================================================
+   FUNCTION
+   omx_vdec::AllocateInputDone
+
+   DESCRIPTION
+   Checks if I/P buffer pool is allocated by IL Client or not.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false.
+
+   ========================================================================== */
+bool omx_vdec::allocate_input_done(void)
+{
+    bool bRet = false;
+    unsigned i=0;
+
+    if (m_inp_mem_ptr == NULL) {
+        return bRet;
+    }
+
+    if (m_inp_mem_ptr ) {
+        for (; i<drv_ctx.ip_buf.actualcount; i++) {
+            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+                break;
+            }
+        }
+    }
+
+    if (i == drv_ctx.ip_buf.actualcount) {
+        bRet = true;
+        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
+    }
+
+    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
+        m_inp_bPopulated = OMX_TRUE;
+    }
+
+    return bRet;
+}
+/* ======================================================================
+   FUNCTION
+   omx_vdec::AllocateOutputDone
+
+   DESCRIPTION
+   Checks if entire O/P buffer pool is allocated by IL Client or not.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false.
+
+   ========================================================================== */
+bool omx_vdec::allocate_output_done(void)
+{
+    bool bRet = false;
+    unsigned j=0;
+
+    if (m_out_mem_ptr == NULL) {
+        return bRet;
+    }
+
+    if (m_out_mem_ptr) {
+        for (; j < drv_ctx.op_buf.actualcount; j++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
+                break;
+            }
+        }
+    }
+
+    if (j == drv_ctx.op_buf.actualcount) {
+        bRet = true;
+        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
+
+        if (m_out_bEnabled)
+            m_out_bPopulated = OMX_TRUE;
+    }
+
+    return bRet;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::ReleaseDone
+
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false
+
+   ========================================================================== */
+bool omx_vdec::release_done(void)
+{
+    bool bRet = false;
+
+    if (release_input_done()) {
+        if (release_output_done()) {
+            bRet = true;
+        }
+    }
+
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseOutputDone
+   FUNCTION
+   omx_vdec::ReleaseOutputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::release_output_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr);
-  if(m_out_mem_ptr)
-  {
-      for(;j < drv_ctx.op_buf.actualcount ; j++)
-      {
-        if(BITMASK_PRESENT(&m_out_bm_count,j))
-        {
-          break;
+    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr);
+
+    if (m_out_mem_ptr) {
+        for (; j < drv_ctx.op_buf.actualcount ; j++) {
+            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
+                break;
+            }
         }
-      }
-    if(j == drv_ctx.op_buf.actualcount)
-    {
-      m_out_bm_count = 0;
-      bRet = true;
+
+        if (j == drv_ctx.op_buf.actualcount) {
+            m_out_bm_count = 0;
+            bRet = true;
+        }
+    } else {
+        m_out_bm_count = 0;
+        bRet = true;
     }
-  }
-  else
-  {
-    m_out_bm_count = 0;
-    bRet = true;
-  }
-  return bRet;
+
+    return bRet;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseInputDone
+   FUNCTION
+   omx_vdec::ReleaseInputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::release_input_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
-  if(m_inp_mem_ptr)
-  {
-      for(;j<drv_ctx.ip_buf.actualcount;j++)
-      {
-        if( BITMASK_PRESENT(&m_inp_bm_count,j))
-        {
-          break;
+    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
+
+    if (m_inp_mem_ptr) {
+        for (; j<drv_ctx.ip_buf.actualcount; j++) {
+            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
+                break;
+            }
         }
-      }
-    if(j==drv_ctx.ip_buf.actualcount)
-    {
-      bRet = true;
+
+        if (j==drv_ctx.ip_buf.actualcount) {
+            bRet = true;
+        }
+    } else {
+        bRet = true;
     }
-  }
-  else
-  {
-    bRet = true;
-  }
-  return bRet;
+
+    return bRet;
 }
 
 OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
-                               OMX_BUFFERHEADERTYPE * buffer)
+        OMX_BUFFERHEADERTYPE * buffer)
 {
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
 
-  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
-    return OMX_ErrorBadParameter;
-  }
-  else if (output_flush_progress)
-  {
-    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
-    buffer->nFilledLen = 0;
-    buffer->nTimeStamp = 0;
-    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
-  }
+    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
+        return OMX_ErrorBadParameter;
+    } else if (output_flush_progress) {
+        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
+        buffer->nFilledLen = 0;
+        buffer->nTimeStamp = 0;
+        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
+    }
 
 #ifdef _ANDROID_
-  char value[PROPERTY_VALUE_MAX];
-  property_get("vidc.dec.debug.panframedata", value, NULL);
+    char value[PROPERTY_VALUE_MAX];
+    property_get("vidc.dec.debug.panframedata", value, NULL);
 
-  if (atoi(value))
-  {
-    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
-    {
-      DEBUG_PRINT_HIGH("\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
-      DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
-    }
-
-    if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
-    {
-      DEBUG_PRINT_HIGH("\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
-      DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
-    }
-  }
-#endif
-
-  DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
-      buffer, buffer->pBuffer);
-  pending_output_buffers --;
-
-  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-  {
-    DEBUG_PRINT_HIGH("Output EOS has been reached");
-    if (!output_flush_progress)
-      post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
-
-    if (psource_frame)
-    {
-      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
-      psource_frame = NULL;
-    }
-    if (pdest_frame)
-    {
-      pdest_frame->nFilledLen = 0;
-      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
-      pdest_frame = NULL;
-    }
-  }
-
-  DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer);
-#ifdef OUTPUT_BUFFER_LOG
-  if (outputBufferFile1)
-  {
-    OMX_U32 index = buffer - m_out_mem_ptr;
-    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
-
-    fwrite (pBuffer,1,buffer->nFilledLen,
-                  outputBufferFile1);
-  }
-#endif
-
-  /* For use buffer we need to copy the data */
-  if (!output_flush_progress)
-  {
-    time_stamp_dts.get_next_timestamp(buffer,
-    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-     ?true:false);
-  }
-  if (m_cb.FillBufferDone)
-  {
-    if (buffer->nFilledLen > 0)
-    {
-      if (client_extradata)
-      {
-        if(secure_mode)
-          handle_extradata_secure(buffer);
-        else
-          handle_extradata(buffer);
-      }
-      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-        // Keep min timestamp interval to handle corrupted bit stream scenario
-        set_frame_rate(buffer->nTimeStamp);
-      else if (arbitrary_bytes)
-        adjust_timestamp(buffer->nTimeStamp);
-#ifdef _ANDROID_
-      if (perf_flag)
-      {
-        if (!proc_frms)
-        {
-          dec_time.stop();
-          latency = dec_time.processing_time_us() - latency;
-          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
-          dec_time.start();
-          fps_metrics.start();
+    if (atoi(value)) {
+        if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+            DEBUG_PRINT_HIGH("\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+            DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
         }
-        proc_frms++;
-        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-        {
-          OMX_U64 proc_time = 0;
-          fps_metrics.stop();
-          proc_time = fps_metrics.processing_time_us();
-          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
+
+        if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
+            DEBUG_PRINT_HIGH("\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+            DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+        }
+    }
+
+#endif
+
+    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
+            buffer, buffer->pBuffer);
+    pending_output_buffers --;
+
+    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+        DEBUG_PRINT_HIGH("Output EOS has been reached");
+
+        if (!output_flush_progress)
+            post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
+
+        if (psource_frame) {
+            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
+            psource_frame = NULL;
+        }
+
+        if (pdest_frame) {
+            pdest_frame->nFilledLen = 0;
+            m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
+            pdest_frame = NULL;
+        }
+    }
+
+    DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer);
+#ifdef OUTPUT_BUFFER_LOG
+
+    if (outputBufferFile1) {
+        OMX_U32 index = buffer - m_out_mem_ptr;
+        OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
+
+        fwrite (pBuffer,1,buffer->nFilledLen,
+                outputBufferFile1);
+    }
+
+#endif
+
+    /* For use buffer we need to copy the data */
+    if (!output_flush_progress) {
+        time_stamp_dts.get_next_timestamp(buffer,
+                (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                ?true:false);
+    }
+
+    if (m_cb.FillBufferDone) {
+        if (buffer->nFilledLen > 0) {
+            if (client_extradata) {
+                if (secure_mode)
+                    handle_extradata_secure(buffer);
+                else
+                    handle_extradata(buffer);
+            }
+
+            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+                // Keep min timestamp interval to handle corrupted bit stream scenario
+                set_frame_rate(buffer->nTimeStamp);
+            else if (arbitrary_bytes)
+                adjust_timestamp(buffer->nTimeStamp);
+
+#ifdef _ANDROID_
+
+            if (perf_flag) {
+                if (!proc_frms) {
+                    dec_time.stop();
+                    latency = dec_time.processing_time_us() - latency;
+                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
+                    dec_time.start();
+                    fps_metrics.start();
+                }
+
+                proc_frms++;
+
+                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+                    OMX_U64 proc_time = 0;
+                    fps_metrics.stop();
+                    proc_time = fps_metrics.processing_time_us();
+                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
                             proc_frms, (float)proc_time / 1e6,
                             (float)(1e6 * proc_frms) / proc_time);
-          proc_frms = 0;
-        }
-      }
+                    proc_frms = 0;
+                }
+            }
+
 #endif //_ANDROID_
 
 #ifdef OUTPUT_EXTRADATA_LOG
-  if (outputExtradataFile)
-  {
 
-    OMX_U32 index = buffer - m_out_mem_ptr;
-    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
+            if (outputExtradataFile) {
 
-    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
-    p_extra = (OMX_OTHER_EXTRADATATYPE *)
-           ((unsigned)(pBuffer + buffer->nOffset +
-            buffer->nFilledLen + 3)&(~3));
-    while(p_extra &&
-          (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) )
-    {
-      DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
-      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
-      if (p_extra->eType == OMX_ExtraDataNone)
-      {
-        break;
-      }
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-    }
-  }
+                OMX_U32 index = buffer - m_out_mem_ptr;
+                OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
+
+                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
+                p_extra = (OMX_OTHER_EXTRADATATYPE *)
+                    ((unsigned)(pBuffer + buffer->nOffset +
+                        buffer->nFilledLen + 3)&(~3));
+
+                while (p_extra &&
+                        (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) {
+                    DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
+                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
+
+                    if (p_extra->eType == OMX_ExtraDataNone) {
+                        break;
+                    }
+
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                }
+            }
+
 #endif
-    }
-    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
-      prev_ts = LLONG_MAX;
-      rst_prev_ts = true;
-      }
+        }
 
-    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
-                buffer->pPlatformPrivate)->entryList->entry;
-    DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
+        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+            prev_ts = LLONG_MAX;
+            rst_prev_ts = true;
+        }
+
+        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+             buffer->pPlatformPrivate)->entryList->entry;
+        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
 #ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
-     if (native_buffer[buffer - m_out_mem_ptr].inuse) {
-      if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
-        DEBUG_PRINT_ERROR("Unlocking genlock failed");
-        return OMX_ErrorInsufficientResources;
-      }
-      else {
-        native_buffer[buffer - m_out_mem_ptr].inuse = false;
-      }
-     }
-    }
+
+        if (m_enable_android_native_buffers) {
+            if (native_buffer[buffer - m_out_mem_ptr].inuse) {
+                if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+                    DEBUG_PRINT_ERROR("Unlocking genlock failed");
+                    return OMX_ErrorInsufficientResources;
+                } else {
+                    native_buffer[buffer - m_out_mem_ptr].inuse = false;
+                }
+            }
+        }
+
 #endif
-    OMX_BUFFERHEADERTYPE *il_buffer;
-    il_buffer = client_buffers.get_il_buf_hdr(buffer);
-    if (il_buffer)
-      m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
-    else {
-      DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
-      return OMX_ErrorBadParameter;
+        OMX_BUFFERHEADERTYPE *il_buffer;
+        il_buffer = client_buffers.get_il_buf_hdr(buffer);
+
+        if (il_buffer)
+            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
+        else {
+            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
+            return OMX_ErrorBadParameter;
+        }
+
+        DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
+    } else {
+        return OMX_ErrorBadParameter;
     }
 
-    DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
-                                          OMX_BUFFERHEADERTYPE* buffer)
+        OMX_BUFFERHEADERTYPE* buffer)
 {
 
-    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
-    {
+    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
         DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
-       return OMX_ErrorBadParameter;
+        return OMX_ErrorBadParameter;
     }
 
     DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
-        buffer, buffer->pBuffer);
+            buffer, buffer->pBuffer);
     pending_input_buffers--;
 
-    if (arbitrary_bytes)
-    {
-      if (pdest_frame == NULL && input_flush_progress == false)
-      {
-        DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
-        pdest_frame = buffer;
-        buffer->nFilledLen = 0;
-        buffer->nTimeStamp = LLONG_MAX;
-        push_input_buffer (hComp);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
-        buffer->nFilledLen = 0;
-        if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL))
-        {
-          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+    if (arbitrary_bytes) {
+        if (pdest_frame == NULL && input_flush_progress == false) {
+            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
+            pdest_frame = buffer;
+            buffer->nFilledLen = 0;
+            buffer->nTimeStamp = LLONG_MAX;
+            push_input_buffer (hComp);
+        } else {
+            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
+            buffer->nFilledLen = 0;
+
+            if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL)) {
+                DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+            }
         }
-      }
-    }
-    else if(m_cb.EmptyBufferDone)
-    {
+    } else if (m_cb.EmptyBufferDone) {
         buffer->nFilledLen = 0;
-        if (input_use_buffer == true){
+
+        if (input_use_buffer == true) {
             buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
         }
+
         m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
     }
+
     return OMX_ErrorNone;
 }
 
 
 int omx_vdec::async_message_process (void *context, void* message)
 {
-  omx_vdec* omx = NULL;
-  struct vdec_msginfo *vdec_msg = NULL;
-  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
-  struct vdec_output_frameinfo *output_respbuf = NULL;
+    omx_vdec* omx = NULL;
+    struct vdec_msginfo *vdec_msg = NULL;
+    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+    struct vdec_output_frameinfo *output_respbuf = NULL;
 
-  if (context == NULL || message == NULL)
-  {
-    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
-    return -1;
-  }
-  vdec_msg = (struct vdec_msginfo *)message;
+    if (context == NULL || message == NULL) {
+        DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
+        return -1;
+    }
 
-  omx = reinterpret_cast<omx_vdec*>(context);
+    vdec_msg = (struct vdec_msginfo *)message;
+
+    omx = reinterpret_cast<omx_vdec*>(context);
 
 #ifdef _ANDROID_
-  if (omx->m_debug_timestamp)
-  {
-    if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
-         !(omx->output_flush_progress) )
-    {
-      OMX_TICKS expected_ts = 0;
-      omx->m_timestamp_list.pop_min_ts(expected_ts);
-      DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
-                       vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
 
-      if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
-      {
-        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
-      }
+    if (omx->m_debug_timestamp) {
+        if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
+                !(omx->output_flush_progress) ) {
+            OMX_TICKS expected_ts = 0;
+            omx->m_timestamp_list.pop_min_ts(expected_ts);
+            DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
+                    vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
+
+            if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts) {
+                DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+            }
+        }
     }
-  }
+
 #endif
 
-  switch (vdec_msg->msgcode)
-  {
+    switch (vdec_msg->msgcode) {
 
-  case VDEC_MSG_EVT_HW_ERROR:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
-  break;
+        case VDEC_MSG_EVT_HW_ERROR:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+            break;
 
-  case VDEC_MSG_RESP_START_DONE:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_START_DONE);
-  break;
+        case VDEC_MSG_RESP_START_DONE:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_START_DONE);
+            break;
 
-  case VDEC_MSG_RESP_STOP_DONE:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_STOP_DONE);
-  break;
+        case VDEC_MSG_RESP_STOP_DONE:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_STOP_DONE);
+            break;
 
-  case VDEC_MSG_RESP_RESUME_DONE:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_RESUME_DONE);
-  break;
+        case VDEC_MSG_RESP_RESUME_DONE:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_RESUME_DONE);
+            break;
 
-  case VDEC_MSG_RESP_PAUSE_DONE:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
-  break;
+        case VDEC_MSG_RESP_PAUSE_DONE:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
+            break;
 
-  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
-    break;
-  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
-    omx->post_event (NULL,vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
-    break;
-  case VDEC_MSG_RESP_INPUT_FLUSHED:
-  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
+        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
+            break;
+        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+            omx->post_event (NULL,vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
+            break;
+        case VDEC_MSG_RESP_INPUT_FLUSHED:
+        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
 
-    omxhdr = (OMX_BUFFERHEADERTYPE* )\
-              vdec_msg->msgdata.input_frame_clientdata;
+            omxhdr = (OMX_BUFFERHEADERTYPE* )\
+                     vdec_msg->msgdata.input_frame_clientdata;
 
 
-    if (omxhdr == NULL ||
-       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
-    {
-       omxhdr = NULL;
-       vdec_msg->status_code = VDEC_S_EFATAL;
+            if (omxhdr == NULL ||
+                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
+                omxhdr = NULL;
+                vdec_msg->status_code = VDEC_S_EFATAL;
+            }
+
+            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+                    OMX_COMPONENT_GENERATE_EBD);
+            break;
+        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
+            int64_t *timestamp;
+            timestamp = (int64_t *) malloc(sizeof(int64_t));
+
+            if (timestamp) {
+                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
+                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
+                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
+                        vdec_msg->msgdata.output_frame.time_stamp);
+            }
+
+            break;
+        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
+        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+            omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data;
+            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
+                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
+                    vdec_msg->msgdata.output_frame.pic_type);
+
+            /* update SYNCFRAME flag */
+            if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC) {
+                /* set SYNCFRAME flag if picture type is IDR for h264 */
+                if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR)
+                    vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
+                else
+                    vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
+            } else {
+                /* set SYNCFRAME flag if picture type is I_TYPE */
+                if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I)
+                    vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
+                else
+                    vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
+            }
+
+            if (omxhdr && omxhdr->pOutputPortPrivate &&
+                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
+                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
+                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
+                if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
+                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
+                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
+                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
+                    omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags);
+
+                    output_respbuf = (struct vdec_output_frameinfo *)\
+                                     omxhdr->pOutputPortPrivate;
+                    output_respbuf->framesize.bottom =
+                        vdec_msg->msgdata.output_frame.framesize.bottom;
+                    output_respbuf->framesize.left =
+                        vdec_msg->msgdata.output_frame.framesize.left;
+                    output_respbuf->framesize.right =
+                        vdec_msg->msgdata.output_frame.framesize.right;
+                    output_respbuf->framesize.top =
+                        vdec_msg->msgdata.output_frame.framesize.top;
+                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
+                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
+                    output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
+                    output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
+                    output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
+                    output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
+                    output_respbuf->aspect_ratio_info =
+                        vdec_msg->msgdata.output_frame.aspect_ratio_info;
+
+                    if (omx->output_use_buffer)
+                        memcpy ( omxhdr->pBuffer,
+                                (vdec_msg->msgdata.output_frame.bufferaddr +
+                                 vdec_msg->msgdata.output_frame.offset),
+                                vdec_msg->msgdata.output_frame.len );
+                } else
+                    omxhdr->nFilledLen = 0;
+
+                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_FBD);
+            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
+                omx->post_event (NULL, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_EOS_DONE);
+            else
+                omx->post_event (NULL, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+
+            break;
+        case VDEC_MSG_EVT_CONFIG_CHANGED:
+            DEBUG_PRINT_HIGH("Port settings changed");
+            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+            break;
+        case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
+            {
+                DEBUG_PRINT_HIGH("Port settings changed info");
+                // get_buffer_req and populate port defn structure
+                OMX_ERRORTYPE eRet = OMX_ErrorNone;
+                omx->m_port_def.nPortIndex = 1;
+                eRet = omx->update_portdef(&(omx->m_port_def));
+                omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
+                break;
+            }
+        default:
+            break;
     }
 
-    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
-                     OMX_COMPONENT_GENERATE_EBD);
-    break;
-    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
-      int64_t *timestamp;
-      timestamp = (int64_t *) malloc(sizeof(int64_t));
-      if (timestamp) {
-        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
-        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
-                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
-        DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
-             vdec_msg->msgdata.output_frame.time_stamp);
-      }
-      break;
-  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
-    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
-    omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data;
-    DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
-      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
-      vdec_msg->msgdata.output_frame.pic_type);
-
-    /* update SYNCFRAME flag */
-    if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC)
-    {
-      /* set SYNCFRAME flag if picture type is IDR for h264 */
-      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR)
-        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
-      else
-        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
-    }
-    else
-    {
-      /* set SYNCFRAME flag if picture type is I_TYPE */
-      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I)
-        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
-      else
-        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
-    }
-
-    if (omxhdr && omxhdr->pOutputPortPrivate &&
-        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
-         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
-            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
-    {
-      if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
-      {
-        omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
-        omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
-        omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
-        omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags);
-
-        output_respbuf = (struct vdec_output_frameinfo *)\
-                          omxhdr->pOutputPortPrivate;
-        output_respbuf->framesize.bottom =
-          vdec_msg->msgdata.output_frame.framesize.bottom;
-        output_respbuf->framesize.left =
-          vdec_msg->msgdata.output_frame.framesize.left;
-        output_respbuf->framesize.right =
-          vdec_msg->msgdata.output_frame.framesize.right;
-        output_respbuf->framesize.top =
-          vdec_msg->msgdata.output_frame.framesize.top;
-        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
-        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
-        output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
-        output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
-        output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
-        output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
-        output_respbuf->aspect_ratio_info =
-           vdec_msg->msgdata.output_frame.aspect_ratio_info;
-
-        if (omx->output_use_buffer)
-          memcpy ( omxhdr->pBuffer,
-                   (vdec_msg->msgdata.output_frame.bufferaddr +
-                    vdec_msg->msgdata.output_frame.offset),
-                    vdec_msg->msgdata.output_frame.len );
-      }
-      else
-        omxhdr->nFilledLen = 0;
-      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_FBD);
-    }
-    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
-      omx->post_event (NULL, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_EOS_DONE);
-    else
-      omx->post_event (NULL, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
-    break;
-  case VDEC_MSG_EVT_CONFIG_CHANGED:
-    DEBUG_PRINT_HIGH("Port settings changed");
-    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
-                     OMX_COMPONENT_GENERATE_PORT_RECONFIG);
-    break;
-  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
-  {
-    DEBUG_PRINT_HIGH("Port settings changed info");
-    // get_buffer_req and populate port defn structure
-    OMX_ERRORTYPE eRet = OMX_ErrorNone;
-    omx->m_port_def.nPortIndex = 1;
-    eRet = omx->update_portdef(&(omx->m_port_def));
-    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
-                     OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
-    break;
-  }
-  default:
-    break;
-  }
-  return 1;
+    return 1;
 }
 
 OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
-                                                   OMX_HANDLETYPE hComp,
-                                                   OMX_BUFFERHEADERTYPE *buffer
-                                                           )
+        OMX_HANDLETYPE hComp,
+        OMX_BUFFERHEADERTYPE *buffer
+        )
 {
-  unsigned address,p2,id;
-  DEBUG_PRINT_LOW("Empty this arbitrary");
+    unsigned address,p2,id;
+    DEBUG_PRINT_LOW("Empty this arbitrary");
 
-  if (buffer == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
-        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
-
-  /* return zero length and not an EOS buffer */
-  /* return buffer if input flush in progress */
-  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
-     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
-  {
-    DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
-    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
-    return OMX_ErrorNone;
-  }
-
-  if (psource_frame == NULL)
-  {
-    DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
-    psource_frame = buffer;
-    DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
-    push_input_buffer (hComp);
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
-    if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL))
-    {
-      return OMX_ErrorBadParameter;
+    if (buffer == NULL) {
+        return OMX_ErrorBadParameter;
     }
-  }
+
+    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
+            buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
+
+    /* return zero length and not an EOS buffer */
+
+    /* return buffer if input flush in progress */
+    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
+                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
+        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
+        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
+
+    if (psource_frame == NULL) {
+        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
+        psource_frame = buffer;
+        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
+        push_input_buffer (hComp);
+    } else {
+        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
+
+        if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL)) {
+            return OMX_ErrorBadParameter;
+        }
+    }
 
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
 {
-  unsigned address,p2,id;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
+    unsigned address,p2,id;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
 
-  if (pdest_frame == NULL || psource_frame == NULL)
-  {
-    /*Check if we have a destination buffer*/
-    if (pdest_frame == NULL)
-    {
-      DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
-      if (m_input_free_q.m_size)
-      {
-        m_input_free_q.pop_entry(&address,&p2,&id);
-        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
-        pdest_frame->nFilledLen = 0;
-        pdest_frame->nTimeStamp = LLONG_MAX;
-        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
-      }
+    if (pdest_frame == NULL || psource_frame == NULL) {
+        /*Check if we have a destination buffer*/
+        if (pdest_frame == NULL) {
+            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
+
+            if (m_input_free_q.m_size) {
+                m_input_free_q.pop_entry(&address,&p2,&id);
+                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
+                pdest_frame->nFilledLen = 0;
+                pdest_frame->nTimeStamp = LLONG_MAX;
+                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
+            }
+        }
+
+        /*Check if we have a destination buffer*/
+        if (psource_frame == NULL) {
+            DEBUG_PRINT_LOW("Get a source buffer from the queue");
+
+            if (m_input_pending_q.m_size) {
+                m_input_pending_q.pop_entry(&address,&p2,&id);
+                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
+                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
+                        psource_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
+                        psource_frame->nFlags,psource_frame->nFilledLen);
+
+            }
+        }
+
     }
 
-    /*Check if we have a destination buffer*/
-    if (psource_frame == NULL)
-    {
-      DEBUG_PRINT_LOW("Get a source buffer from the queue");
-      if (m_input_pending_q.m_size)
-      {
-        m_input_pending_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
-        DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
-                psource_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
-        psource_frame->nFlags,psource_frame->nFilledLen);
+    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
+        switch (codec_type_parse) {
+            case CODEC_TYPE_MPEG4:
+            case CODEC_TYPE_H263:
+            case CODEC_TYPE_MPEG2:
+                ret =  push_input_sc_codec(hComp);
+                break;
+            case CODEC_TYPE_H264:
+                ret = push_input_h264(hComp);
+                break;
+            case CODEC_TYPE_VC1:
+                ret = push_input_vc1(hComp);
+                break;
+        }
 
-      }
+        if (ret != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
+            omx_report_error ();
+            break;
+        }
     }
 
-  }
-
-  while ((pdest_frame != NULL) && (psource_frame != NULL))
-  {
-    switch (codec_type_parse)
-    {
-      case CODEC_TYPE_MPEG4:
-      case CODEC_TYPE_H263:
-      case CODEC_TYPE_MPEG2:
-        ret =  push_input_sc_codec(hComp);
-      break;
-      case CODEC_TYPE_H264:
-        ret = push_input_h264(hComp);
-      break;
-      case CODEC_TYPE_VC1:
-        ret = push_input_vc1(hComp);
-      break;
-    }
-    if (ret != OMX_ErrorNone)
-    {
-      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
-      omx_report_error ();
-      break;
-    }
-  }
-
-  return ret;
+    return ret;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  OMX_BOOL generate_ebd = OMX_TRUE;
-  unsigned address,p2,id;
+    OMX_U32 partial_frame = 1;
+    OMX_BOOL generate_ebd = OMX_TRUE;
+    unsigned address,p2,id;
 
-  DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d",
-        psource_frame,psource_frame->nTimeStamp);
-  if (m_frame_parser.parse_sc_frame(psource_frame,
-                                       pdest_frame,&partial_frame) == -1)
-  {
-    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-    return OMX_ErrorBadParameter;
-  }
+    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d",
+            psource_frame,psource_frame->nTimeStamp);
 
-  if (partial_frame == 0)
-  {
-    DEBUG_PRINT_LOW("Frame size %d source %p frame count %d",
-          pdest_frame->nFilledLen,psource_frame,frame_count);
+    if (m_frame_parser.parse_sc_frame(psource_frame,
+                pdest_frame,&partial_frame) == -1) {
+        DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
+        return OMX_ErrorBadParameter;
+    }
+
+    if (partial_frame == 0) {
+        DEBUG_PRINT_LOW("Frame size %d source %p frame count %d",
+                pdest_frame->nFilledLen,psource_frame,frame_count);
 
 
-    DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp);
-    /*First Parsed buffer will have only header Hence skip*/
-    if (frame_count == 0)
-    {
-      DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
+        DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp);
+
+        /*First Parsed buffer will have only header Hence skip*/
+        if (frame_count == 0) {
+            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
 #ifdef MAX_RES_1080P
-      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
-         codec_type_parse == CODEC_TYPE_DIVX) {
-        mp4StreamType psBits;
-        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
-        psBits.numBytes = pdest_frame->nFilledLen;
-        mp4_headerparser.parseHeader(&psBits);
-      }
+
+            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
+                    codec_type_parse == CODEC_TYPE_DIVX) {
+                mp4StreamType psBits;
+                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
+                psBits.numBytes = pdest_frame->nFilledLen;
+                mp4_headerparser.parseHeader(&psBits);
+            }
+
 #endif
-      frame_count++;
-    }
-    else
-    {
-      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-      if(pdest_frame->nFilledLen)
-      {
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
-        }
-        frame_count++;
-        pdest_frame = NULL;
+            frame_count++;
+        } else {
+            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
 
-        if (m_input_free_q.m_size)
-        {
-          m_input_free_q.pop_entry(&address,&p2,&id);
-          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-          pdest_frame->nFilledLen = 0;
-        }
-      }
-      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
-      {
-        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
-        m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
-        pdest_frame = NULL;
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen);
-    /*Check if Destination Buffer is full*/
-    if (pdest_frame->nAllocLen ==
-        pdest_frame->nFilledLen + pdest_frame->nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
+            if (pdest_frame->nFilledLen) {
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
 
-  if (psource_frame->nFilledLen == 0)
-  {
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        pdest_frame->nFlags |= psource_frame->nFlags;
-        DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
-                     pdest_frame->nFilledLen,frame_count++);
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
-        }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("Last frame in else dest addr") ;
-        generate_ebd = OMX_FALSE;
-      }
-   }
-    if(generate_ebd)
-    {
-      DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
-      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-      psource_frame = NULL;
+                frame_count++;
+                pdest_frame = NULL;
 
-      if (m_input_pending_q.m_size)
-      {
-        DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
-        m_input_pending_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-        DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
-                psource_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
-        psource_frame->nFlags,psource_frame->nFilledLen);
-      }
+                if (m_input_free_q.m_size) {
+                    m_input_free_q.pop_entry(&address,&p2,&id);
+                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                    pdest_frame->nFilledLen = 0;
+                }
+            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
+                DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
+                m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
+                pdest_frame = NULL;
+            }
+        }
+    } else {
+        DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen);
+
+        /*Check if Destination Buffer is full*/
+        if (pdest_frame->nAllocLen ==
+                pdest_frame->nFilledLen + pdest_frame->nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
+        }
     }
-   }
-  return OMX_ErrorNone;
+
+    if (psource_frame->nFilledLen == 0) {
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                pdest_frame->nFlags |= psource_frame->nFlags;
+                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
+                        pdest_frame->nFilledLen,frame_count++);
+
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
+                generate_ebd = OMX_FALSE;
+            }
+        }
+
+        if (generate_ebd) {
+            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
+            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+            psource_frame = NULL;
+
+            if (m_input_pending_q.m_size) {
+                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
+                m_input_pending_q.pop_entry(&address,&p2,&id);
+                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
+                        psource_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
+                        psource_frame->nFlags,psource_frame->nFilledLen);
+            }
+        }
+    }
+
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  unsigned address,p2,id;
-  OMX_BOOL isNewFrame = OMX_FALSE;
-  OMX_BOOL generate_ebd = OMX_TRUE;
+    OMX_U32 partial_frame = 1;
+    unsigned address,p2,id;
+    OMX_BOOL isNewFrame = OMX_FALSE;
+    OMX_BOOL generate_ebd = OMX_TRUE;
 
-  if (h264_scratch.pBuffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d "
-      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
-  DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
-  if (h264_scratch.nFilledLen && look_ahead_nal)
-  {
-    look_ahead_nal = false;
-    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-         h264_scratch.nFilledLen)
-    {
-      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-              h264_scratch.pBuffer,h264_scratch.nFilledLen);
-      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-      DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
-      h264_scratch.nFilledLen = 0;
+    if (h264_scratch.pBuffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
+        return OMX_ErrorBadParameter;
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  if (nal_length == 0)
-  {
-    DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
-    if (m_frame_parser.parse_sc_frame(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
-    if (m_frame_parser.parse_h264_nallength(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
 
-  if (partial_frame == 0)
-  {
-    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
-    {
-      DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
-      nal_count++;
-      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
-      h264_scratch.nFlags = psource_frame->nFlags;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
-      if(h264_scratch.nFilledLen)
-      {
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
-                                 NALU_TYPE_SPS);
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
-                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
-        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-          // If timeinfo is present frame info from SEI is already processed
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
-                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
-#endif
-        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
-        nal_count++;
-        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
-          pdest_frame->nTimeStamp = h264_last_au_ts;
-          pdest_frame->nFlags = h264_last_au_flags;
-#ifdef PANSCAN_HDLR
-          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-            h264_parser->update_panscan_data(h264_last_au_ts);
-#endif
-        }
-        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
-           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
-          h264_last_au_ts = h264_scratch.nTimeStamp;
-          h264_last_au_flags = h264_scratch.nFlags;
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-          {
-            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
-            if (!VALID_TS(h264_last_au_ts))
-              h264_last_au_ts = ts_in_sei;
-          }
-#endif
-        } else
-          h264_last_au_ts = LLONG_MAX;
-      }
+    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d "
+            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
+    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
 
-      if (!isNewFrame)
-      {
-        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-            h264_scratch.nFilledLen)
-        {
-          DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d",
-              h264_scratch.nFilledLen);
-          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-              h264_scratch.pBuffer,h264_scratch.nFilledLen);
-          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
-            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-          h264_scratch.nFilledLen = 0;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("\n Error:2: Destination buffer overflow for H264");
-          return OMX_ErrorBadParameter;
-        }
-      }
-      else
-      {
-        look_ahead_nal = true;
-        DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
-                     pdest_frame->nFilledLen,frame_count++);
+    if (h264_scratch.nFilledLen && look_ahead_nal) {
+        look_ahead_nal = false;
 
-        if (pdest_frame->nFilledLen == 0)
-        {
-          DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
-          look_ahead_nal = false;
-          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-               h264_scratch.nFilledLen)
-          {
+        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                h264_scratch.nFilledLen) {
             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
             h264_scratch.nFilledLen = 0;
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+        } else {
+            DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
             return OMX_ErrorBadParameter;
-          }
         }
-        else
-        {
-          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
-          {
-            DEBUG_PRINT_LOW("Reset the EOS Flag");
-            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-          }
-          /*Push the frame to the Decoder*/
-          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-          {
+    }
+
+    if (nal_length == 0) {
+        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
+
+        if (m_frame_parser.parse_sc_frame(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
             return OMX_ErrorBadParameter;
-          }
-          //frame_count++;
-          pdest_frame = NULL;
-          if (m_input_free_q.m_size)
-          {
-            m_input_free_q.pop_entry(&address,&p2,&id);
-            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-            DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
-            pdest_frame->nFilledLen = 0;
-            pdest_frame->nFlags = 0;
-            pdest_frame->nTimeStamp = LLONG_MAX;
-          }
         }
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
-    /*Check if Destination Buffer is full*/
-    if (h264_scratch.nAllocLen ==
-        h264_scratch.nFilledLen + h264_scratch.nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
+    } else {
+        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
 
-  if (!psource_frame->nFilledLen)
-  {
-    DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
+        if (m_frame_parser.parse_h264_nallength(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
+            return OMX_ErrorBadParameter;
+        }
+    }
 
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
-        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-             h264_scratch.nFilledLen)
-        {
-          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
-          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-          h264_scratch.nFilledLen = 0;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
-          return OMX_ErrorBadParameter;
-        }
-        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
-        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
-#ifdef MAX_RES_720P
-        if (frame_count == 0)
-        {
-           DEBUG_PRINT_HIGH("No frames sent to driver yet, "
-              "So send zero length EOS buffer");
-           pdest_frame->nFilledLen = 0;
-        }
-#endif
-        DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x",
-                     pdest_frame->nFilledLen, pdest_frame->nFlags, pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
+    if (partial_frame == 0) {
+        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
+            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
+            nal_count++;
+            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
+            h264_scratch.nFlags = psource_frame->nFlags;
+        } else {
+            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
+
+            if (h264_scratch.nFilledLen) {
+                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
+                        NALU_TYPE_SPS);
 #ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-        {
-          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
-          if (!VALID_TS(pdest_frame->nTimeStamp))
-            pdest_frame->nTimeStamp = ts_in_sei;
-        }
+
+                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
+                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                    // If timeinfo is present frame info from SEI is already processed
+                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
+
 #endif
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
+                nal_count++;
+
+                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
+                    pdest_frame->nTimeStamp = h264_last_au_ts;
+                    pdest_frame->nFlags = h264_last_au_flags;
+#ifdef PANSCAN_HDLR
+
+                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                        h264_parser->update_panscan_data(h264_last_au_ts);
+
+#endif
+                }
+
+                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
+                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
+                    h264_last_au_ts = h264_scratch.nTimeStamp;
+                    h264_last_au_flags = h264_scratch.nFlags;
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+
+                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
+
+                        if (!VALID_TS(h264_last_au_ts))
+                            h264_last_au_ts = ts_in_sei;
+                    }
+
+#endif
+                } else
+                    h264_last_au_ts = LLONG_MAX;
+            }
+
+            if (!isNewFrame) {
+                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                        h264_scratch.nFilledLen) {
+                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d",
+                            h264_scratch.nFilledLen);
+                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+
+                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
+                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+
+                    h264_scratch.nFilledLen = 0;
+                } else {
+                    DEBUG_PRINT_ERROR("\n Error:2: Destination buffer overflow for H264");
+                    return OMX_ErrorBadParameter;
+                }
+            } else {
+                look_ahead_nal = true;
+                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
+                        pdest_frame->nFilledLen,frame_count++);
+
+                if (pdest_frame->nFilledLen == 0) {
+                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
+                    look_ahead_nal = false;
+
+                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                            h264_scratch.nFilledLen) {
+                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                        h264_scratch.nFilledLen = 0;
+                    } else {
+                        DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+                        return OMX_ErrorBadParameter;
+                    }
+                } else {
+                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
+                        DEBUG_PRINT_LOW("Reset the EOS Flag");
+                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+                    }
+
+                    /*Push the frame to the Decoder*/
+                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                        return OMX_ErrorBadParameter;
+                    }
+
+                    //frame_count++;
+                    pdest_frame = NULL;
+
+                    if (m_input_free_q.m_size) {
+                        m_input_free_q.pop_entry(&address,&p2,&id);
+                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
+                        pdest_frame->nFilledLen = 0;
+                        pdest_frame->nFlags = 0;
+                        pdest_frame->nTimeStamp = LLONG_MAX;
+                    }
+                }
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
-                     pdest_frame,h264_scratch.nFilledLen);
-        generate_ebd = OMX_FALSE;
-      }
+    } else {
+        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
+
+        /*Check if Destination Buffer is full*/
+        if (h264_scratch.nAllocLen ==
+                h264_scratch.nFilledLen + h264_scratch.nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
+        }
     }
-  }
-  if(generate_ebd && !psource_frame->nFilledLen)
-  {
-    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-    psource_frame = NULL;
-    if (m_input_pending_q.m_size)
-    {
-      DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
-      m_input_pending_q.pop_entry(&address,&p2,&id);
-      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-      DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d",
-      psource_frame->nFlags,psource_frame->nFilledLen);
+
+    if (!psource_frame->nFilledLen) {
+        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
+
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
+
+                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                        h264_scratch.nFilledLen) {
+                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                    h264_scratch.nFilledLen = 0;
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
+                    return OMX_ErrorBadParameter;
+                }
+
+                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
+                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+#ifdef MAX_RES_720P
+
+                if (frame_count == 0) {
+                    DEBUG_PRINT_HIGH("No frames sent to driver yet, "
+                            "So send zero length EOS buffer");
+                    pdest_frame->nFilledLen = 0;
+                }
+
+#endif
+                DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x",
+                        pdest_frame->nFilledLen, pdest_frame->nFlags, pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+
+                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
+
+                    if (!VALID_TS(pdest_frame->nTimeStamp))
+                        pdest_frame->nTimeStamp = ts_in_sei;
+                }
+
+#endif
+
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
+                        pdest_frame,h264_scratch.nFilledLen);
+                generate_ebd = OMX_FALSE;
+            }
+        }
     }
-  }
-  return OMX_ErrorNone;
+
+    if (generate_ebd && !psource_frame->nFilledLen) {
+        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+        psource_frame = NULL;
+
+        if (m_input_pending_q.m_size) {
+            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
+            m_input_pending_q.pop_entry(&address,&p2,&id);
+            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+            DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d",
+                    psource_frame->nFlags,psource_frame->nFilledLen);
+        }
+    }
+
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
@@ -7556,2003 +7209,2001 @@
     OMX_U32 partial_frame = 1;
     OMX_U32 buf_len, dest_len;
 
-    if(first_frame == 0)
-    {
+    if (first_frame == 0) {
         first_frame = 1;
         DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
-        if(!m_vendor_config.pData)
-        {
+
+        if (!m_vendor_config.pData) {
             DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
             buf = psource_frame->pBuffer;
             buf_len = psource_frame->nFilledLen;
 
             if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
-                VC1_SP_MP_START_CODE)
-            {
+                    VC1_SP_MP_START_CODE) {
                 m_vc1_profile = VC1_SP_MP_RCV;
-            }
-            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
-            {
+            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
                 m_vc1_profile = VC1_AP;
-            }
-            else
-            {
+            } else {
                 DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer");
                 return OMX_ErrorStreamCorrupt;
             }
-        }
-        else
-        {
+        } else {
             pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
                 pdest_frame->nOffset;
             dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
-                pdest_frame->nOffset);
+                    pdest_frame->nOffset);
 
-            if(dest_len < m_vendor_config.nDataSize)
-            {
+            if (dest_len < m_vendor_config.nDataSize) {
                 DEBUG_PRINT_ERROR("\nDestination buffer full");
                 return OMX_ErrorBadParameter;
-            }
-            else
-            {
+            } else {
                 memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
                 pdest_frame->nFilledLen += m_vendor_config.nDataSize;
             }
         }
     }
 
-    switch(m_vc1_profile)
-    {
+    switch (m_vc1_profile) {
         case VC1_AP:
             DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
-            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
-            {
+
+            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
                 DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
                 return OMX_ErrorBadParameter;
             }
-        break;
+
+            break;
 
         case VC1_SP_MP_RCV:
         default:
             DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode");
             return OMX_ErrorBadParameter;
     }
+
     return OMX_ErrorNone;
 }
 
 #ifndef USE_ION
 bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                                  OMX_U32 alignment)
+        OMX_U32 alignment)
 {
-  struct pmem_allocation allocation;
-  allocation.size = buffer_size;
-  allocation.align = clip2(alignment);
-  if (allocation.align < 4096)
-  {
-    allocation.align = 4096;
-  }
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
-      allocation.align, allocation.size);
-    return false;
-  }
-  return true;
+    struct pmem_allocation allocation;
+    allocation.size = buffer_size;
+    allocation.align = clip2(alignment);
+
+    if (allocation.align < 4096) {
+        allocation.align = 4096;
+    }
+
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+                allocation.align, allocation.size);
+        return false;
+    }
+
+    return true;
 }
 #endif
 
 #ifdef USE_ION
 int omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
-              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
-              struct ion_fd_data *fd_data,int flag)
+        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
+        struct ion_fd_data *fd_data,int flag)
 {
-  int fd = -EINVAL;
-  int rc = -EINVAL;
-  int ion_dev_flag;
-  struct vdec_ion ion_buf_info;
-  if (!alloc_data || buffer_size <= 0 || !fd_data) {
-     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
-     return -EINVAL;
-  }
+    int fd = -EINVAL;
+    int rc = -EINVAL;
+    int ion_dev_flag;
+    struct vdec_ion ion_buf_info;
 
-  ion_dev_flag = O_RDONLY;
-  fd = open (MEM_DEVICE, ion_dev_flag);
-  if (fd < 0) {
-     DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
-     return fd;
-  }
-  alloc_data->flags = 0;
-  if(!secure_mode && (flag & ION_FLAG_CACHED))
-  {
-     alloc_data->flags |= ION_FLAG_CACHED;
-  }
-
-  alloc_data->len = buffer_size;
-  alloc_data->align = clip2(alignment);
-  if (alloc_data->align < 4096)
-  {
-    alloc_data->align = 4096;
-  }
-  if(secure_mode) {
-    if(external_meta_buffer) {
-      alloc_data->heap_mask = ION_HEAP(ION_CP_MFC_HEAP_ID);
-      alloc_data->flags |= ION_SECURE;
-    } else if (external_meta_buffer_iommu) {
-      alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
-    } else {
-      alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
-      alloc_data->flags |= ION_SECURE;
+    if (!alloc_data || buffer_size <= 0 || !fd_data) {
+        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
+        return -EINVAL;
     }
-  } else {
-#ifdef MAX_RES_720P
-    alloc_data->len = (buffer_size + (alloc_data->align - 1)) & ~(alloc_data->align - 1);
-    alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
-#else
-    alloc_data->heap_mask = (ION_HEAP(MEM_HEAP_ID) | ION_HEAP(ION_IOMMU_HEAP_ID));
-#endif
-  }
 
-  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
-  if (rc || !alloc_data->handle) {
-    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
-    alloc_data->handle = NULL;
-    close(fd);
-    fd = -ENOMEM;
+    ion_dev_flag = O_RDONLY;
+    fd = open (MEM_DEVICE, ion_dev_flag);
+
+    if (fd < 0) {
+        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
+        return fd;
+    }
+
+    alloc_data->flags = 0;
+
+    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
+        alloc_data->flags |= ION_FLAG_CACHED;
+    }
+
+    alloc_data->len = buffer_size;
+    alloc_data->align = clip2(alignment);
+
+    if (alloc_data->align < 4096) {
+        alloc_data->align = 4096;
+    }
+
+    if (secure_mode) {
+        if (external_meta_buffer) {
+            alloc_data->heap_mask = ION_HEAP(ION_CP_MFC_HEAP_ID);
+            alloc_data->flags |= ION_SECURE;
+        } else if (external_meta_buffer_iommu) {
+            alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
+        } else {
+            alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
+            alloc_data->flags |= ION_SECURE;
+        }
+    } else {
+#ifdef MAX_RES_720P
+        alloc_data->len = (buffer_size + (alloc_data->align - 1)) & ~(alloc_data->align - 1);
+        alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
+#else
+        alloc_data->heap_mask = (ION_HEAP(MEM_HEAP_ID) | ION_HEAP(ION_IOMMU_HEAP_ID));
+#endif
+    }
+
+    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
+
+    if (rc || !alloc_data->handle) {
+        DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+        alloc_data->handle = NULL;
+        close(fd);
+        fd = -ENOMEM;
+        return fd;
+    }
+
+    fd_data->handle = alloc_data->handle;
+    rc = ioctl(fd,ION_IOC_MAP,fd_data);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("\n ION MAP failed ");
+        ion_buf_info.ion_alloc_data = *alloc_data;
+        ion_buf_info.ion_device_fd = fd;
+        ion_buf_info.fd_ion_data = *fd_data;
+        free_ion_memory(&ion_buf_info);
+        fd_data->fd =-1;
+        close(fd);
+        fd = -ENOMEM;
+    }
+
+    DEBUG_PRINT_HIGH("ION: alloc_data: handle(0x%X), len(%u), align(%u), "
+            "flags(0x%x), fd_data: handle(0x%x), fd(0x%x)",
+            alloc_data->handle, alloc_data->len, alloc_data->align,
+            alloc_data->flags, fd_data->handle, fd_data->fd);
     return fd;
-  }
-  fd_data->handle = alloc_data->handle;
-  rc = ioctl(fd,ION_IOC_MAP,fd_data);
-  if (rc) {
-    DEBUG_PRINT_ERROR("\n ION MAP failed ");
-    ion_buf_info.ion_alloc_data = *alloc_data;
-    ion_buf_info.ion_device_fd = fd;
-    ion_buf_info.fd_ion_data = *fd_data;
-    free_ion_memory(&ion_buf_info);
-    fd_data->fd =-1;
-    close(fd);
-    fd = -ENOMEM;
-  }
-  DEBUG_PRINT_HIGH("ION: alloc_data: handle(0x%X), len(%u), align(%u), "
-     "flags(0x%x), fd_data: handle(0x%x), fd(0x%x)",
-     alloc_data->handle, alloc_data->len, alloc_data->align,
-     alloc_data->flags, fd_data->handle, fd_data->fd);
-  return fd;
 }
 
-void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
+void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
+{
 
-     if(!buf_ion_info) {
-       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
-       return;
-     }
-     DEBUG_PRINT_HIGH("ION: free: handle(0x%X), len(%u), fd(0x%x)",
-       buf_ion_info->ion_alloc_data.handle,
-       buf_ion_info->ion_alloc_data.len,
-       buf_ion_info->fd_ion_data.fd);
-     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
-             &buf_ion_info->ion_alloc_data.handle)) {
-       DEBUG_PRINT_ERROR("\n ION: free failed" );
-     }
-     close(buf_ion_info->ion_device_fd);
-     buf_ion_info->ion_device_fd = -1;
-     buf_ion_info->ion_alloc_data.handle = NULL;
-     buf_ion_info->fd_ion_data.fd = -1;
+    if (!buf_ion_info) {
+        DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
+        return;
+    }
+
+    DEBUG_PRINT_HIGH("ION: free: handle(0x%X), len(%u), fd(0x%x)",
+            buf_ion_info->ion_alloc_data.handle,
+            buf_ion_info->ion_alloc_data.len,
+            buf_ion_info->fd_ion_data.fd);
+
+    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
+                &buf_ion_info->ion_alloc_data.handle)) {
+        DEBUG_PRINT_ERROR("\n ION: free failed" );
+    }
+
+    close(buf_ion_info->ion_device_fd);
+    buf_ion_info->ion_device_fd = -1;
+    buf_ion_info->ion_alloc_data.handle = NULL;
+    buf_ion_info->fd_ion_data.fd = -1;
 }
 #endif
 void omx_vdec::free_output_buffer_header()
 {
-  DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
-  output_use_buffer = false;
-  ouput_egl_buffers = false;
+    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
+    output_use_buffer = false;
+    ouput_egl_buffers = false;
 
-  if (m_out_mem_ptr)
-  {
-    free (m_out_mem_ptr);
-    m_out_mem_ptr = NULL;
-  }
+    if (m_out_mem_ptr) {
+        free (m_out_mem_ptr);
+        m_out_mem_ptr = NULL;
+    }
 
-  if(m_platform_list)
-  {
-    free(m_platform_list);
-    m_platform_list = NULL;
-  }
+    if (m_platform_list) {
+        free(m_platform_list);
+        m_platform_list = NULL;
+    }
 
-  if (drv_ctx.ptr_respbuffer)
-  {
-    free (drv_ctx.ptr_respbuffer);
-    drv_ctx.ptr_respbuffer = NULL;
-  }
-  if (drv_ctx.ptr_outputbuffer)
-  {
-    free (drv_ctx.ptr_outputbuffer);
-    drv_ctx.ptr_outputbuffer = NULL;
-  }
+    if (drv_ctx.ptr_respbuffer) {
+        free (drv_ctx.ptr_respbuffer);
+        drv_ctx.ptr_respbuffer = NULL;
+    }
+
+    if (drv_ctx.ptr_outputbuffer) {
+        free (drv_ctx.ptr_outputbuffer);
+        drv_ctx.ptr_outputbuffer = NULL;
+    }
+
 #ifdef USE_ION
+
     if (drv_ctx.op_buf_ion_info) {
         DEBUG_PRINT_LOW("Free o/p ion context");
         free(drv_ctx.op_buf_ion_info);
         drv_ctx.op_buf_ion_info = NULL;
     }
+
 #endif
 }
 
 void omx_vdec::free_input_buffer_header()
 {
     input_use_buffer = false;
-    if (arbitrary_bytes)
-    {
-      if (m_frame_parser.mutils)
-      {
-        DEBUG_PRINT_LOW("Free utils parser");
-        delete (m_frame_parser.mutils);
-        m_frame_parser.mutils = NULL;
-      }
 
-      if (m_inp_heap_ptr)
-      {
-        DEBUG_PRINT_LOW("Free input Heap Pointer");
-        free (m_inp_heap_ptr);
-        m_inp_heap_ptr = NULL;
-      }
+    if (arbitrary_bytes) {
+        if (m_frame_parser.mutils) {
+            DEBUG_PRINT_LOW("Free utils parser");
+            delete (m_frame_parser.mutils);
+            m_frame_parser.mutils = NULL;
+        }
 
-      if (m_phdr_pmem_ptr)
-      {
-        DEBUG_PRINT_LOW("Free input pmem header Pointer");
-        free (m_phdr_pmem_ptr);
-        m_phdr_pmem_ptr = NULL;
-      }
+        if (m_inp_heap_ptr) {
+            DEBUG_PRINT_LOW("Free input Heap Pointer");
+            free (m_inp_heap_ptr);
+            m_inp_heap_ptr = NULL;
+        }
+
+        if (m_phdr_pmem_ptr) {
+            DEBUG_PRINT_LOW("Free input pmem header Pointer");
+            free (m_phdr_pmem_ptr);
+            m_phdr_pmem_ptr = NULL;
+        }
     }
-    if (m_inp_mem_ptr)
-    {
-      DEBUG_PRINT_LOW("Free input pmem Pointer area");
-      free (m_inp_mem_ptr);
-      m_inp_mem_ptr = NULL;
+
+    if (m_inp_mem_ptr) {
+        DEBUG_PRINT_LOW("Free input pmem Pointer area");
+        free (m_inp_mem_ptr);
+        m_inp_mem_ptr = NULL;
     }
-    if (drv_ctx.ptr_inputbuffer)
-    {
-      DEBUG_PRINT_LOW("Free Driver Context pointer");
-      free (drv_ctx.ptr_inputbuffer);
-      drv_ctx.ptr_inputbuffer = NULL;
+
+    if (drv_ctx.ptr_inputbuffer) {
+        DEBUG_PRINT_LOW("Free Driver Context pointer");
+        free (drv_ctx.ptr_inputbuffer);
+        drv_ctx.ptr_inputbuffer = NULL;
     }
+
 #ifdef USE_ION
+
     if (drv_ctx.ip_buf_ion_info) {
         DEBUG_PRINT_LOW("Free ion context");
         free(drv_ctx.ip_buf_ion_info);
         drv_ctx.ip_buf_ion_info = NULL;
     }
+
 #endif
 }
 
 OMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
 {
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned int buf_size = 0, extra_data_size = 0;
-  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = buffer_prop;
-  if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ,
-      (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  else
-  {
-    buf_size = buffer_prop->buffer_size;
-    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-    {
-      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
-      extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned int buf_size = 0, extra_data_size = 0;
+    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = buffer_prop;
+
+    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+        eRet = OMX_ErrorInsufficientResources;
+    } else {
+        buf_size = buffer_prop->buffer_size;
+
+        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
+            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+            extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+        }
+
+        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
+            DEBUG_PRINT_HIGH("Interlace extra data enabled!");
+            extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+        }
+
+        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
+            extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
+                    extra_data_size);
+        }
+
+        if (extra_data_size) {
+            extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
+        }
+
+        buf_size += extra_data_size;
+        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+        DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
+                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
+
+        if (in_reconfig) // BufReq will be set to driver when port is disabled
+            buffer_prop->buffer_size = buf_size;
+        else if (buf_size != buffer_prop->buffer_size) {
+            buffer_prop->buffer_size = buf_size;
+            eRet = set_buffer_req(buffer_prop);
+        }
     }
-    if (client_extradata & OMX_INTERLACE_EXTRADATA)
-    {
-      DEBUG_PRINT_HIGH("Interlace extra data enabled!");
-      extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
-    }
-    if (client_extradata & OMX_PORTDEF_EXTRADATA)
-    {
-       extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
-       DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
-         extra_data_size);
-    }
-    if (extra_data_size)
-    {
-      extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
-      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
-    }
-    buf_size += extra_data_size;
-    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
-    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
-      buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
-    if (in_reconfig) // BufReq will be set to driver when port is disabled
-      buffer_prop->buffer_size = buf_size;
-    else if (buf_size != buffer_prop->buffer_size)
-    {
-      buffer_prop->buffer_size = buf_size;
-      eRet = set_buffer_req(buffer_prop);
-    }
-  }
-  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-  return eRet;
+
+    DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
 {
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned buf_size = 0;
-  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
-  if (buf_size != buffer_prop->buffer_size)
-  {
-    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
-      buffer_prop->buffer_size, buf_size);
-    eRet = OMX_ErrorBadParameter;
-  }
-  else
-  {
-    ioctl_msg.in = buffer_prop;
-    ioctl_msg.out = NULL;
-    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ,
-           (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("Setting buffer requirements failed");
-      eRet = OMX_ErrorInsufficientResources;
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned buf_size = 0;
+    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+
+    if (buf_size != buffer_prop->buffer_size) {
+        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
+                buffer_prop->buffer_size, buf_size);
+        eRet = OMX_ErrorBadParameter;
     } else {
-      if (!client_buffers.update_buffer_req()) {
-        DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
-        eRet = OMX_ErrorInsufficientResources;
-      }
+        ioctl_msg.in = buffer_prop;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ,
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("Setting buffer requirements failed");
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            if (!client_buffers.update_buffer_req()) {
+                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
     }
-  }
-  return eRet;
+
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::start_port_reconfig()
 {
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  eRet = update_picture_resolution();
-  if (eRet == OMX_ErrorNone)
-  {
-    ioctl_msg.out = &drv_ctx.interlace;
-    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg))
-    {
-      DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT");
-      eRet = OMX_ErrorHardware;
-    }
-    else
-    {
-      if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-      {
-        DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace);
-        client_extradata |= OMX_INTERLACE_EXTRADATA;
-      }
-      in_reconfig = true;
-      op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-      eRet = get_buffer_req(&op_buf_rcnfg);
-    }
-  }
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    eRet = update_picture_resolution();
 
-  if (eRet == OMX_ErrorNone) {
-      //update power HAL with new width, height and bitrate
-      power_module_deregister();
-      power_module_register();
-  }
+    if (eRet == OMX_ErrorNone) {
+        ioctl_msg.out = &drv_ctx.interlace;
 
-  return eRet;
+        if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg)) {
+            DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT");
+            eRet = OMX_ErrorHardware;
+        } else {
+            if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
+                DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace);
+                client_extradata |= OMX_INTERLACE_EXTRADATA;
+            }
+
+            in_reconfig = true;
+            op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+            eRet = get_buffer_req(&op_buf_rcnfg);
+        }
+    }
+
+    if (eRet == OMX_ErrorNone) {
+        //update power HAL with new width, height and bitrate
+        power_module_deregister();
+        power_module_register();
+    }
+
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::update_picture_resolution()
 {
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = &drv_ctx.video_resolution;
-  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg))
-  {
-    DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
-    eRet = OMX_ErrorHardware;
-  }
-  return eRet;
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = &drv_ctx.video_resolution;
+
+    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg)) {
+        DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
+        eRet = OMX_ErrorHardware;
+    }
+
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (!portDefn)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("omx_vdec::update_portdef");
-  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
-  portDefn->nSize = sizeof(portDefn);
-  portDefn->eDomain    = OMX_PortDomainVideo;
-  if (drv_ctx.frame_rate.fps_denominator > 0)
-    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
-                                        drv_ctx.frame_rate.fps_denominator;
-  else {
-    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
-    return OMX_ErrorBadParameter;
-  }
-  if (0 == portDefn->nPortIndex)
-  {
-    portDefn->eDir =  OMX_DirInput;
-    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
-    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
-    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
-    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
-    portDefn->format.video.eCompressionFormat = eCompressionFormat;
-    portDefn->bEnabled   = m_inp_bEnabled;
-    portDefn->bPopulated = m_inp_bPopulated;
-  }
-  else if (1 == portDefn->nPortIndex)
-  {
-    portDefn->eDir =  OMX_DirOutput;
-    if (update_picture_resolution() != OMX_ErrorNone)
-    {
-      DEBUG_PRINT_ERROR("update_picture_resolution failed \n");
-      return OMX_ErrorHardware;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+    if (!portDefn) {
+        return OMX_ErrorBadParameter;
     }
-    if (!client_buffers.update_buffer_req()) {
-      DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
-      return OMX_ErrorHardware;
+
+    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
+    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
+    portDefn->nSize = sizeof(portDefn);
+    portDefn->eDomain    = OMX_PortDomainVideo;
+
+    if (drv_ctx.frame_rate.fps_denominator > 0)
+        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
+            drv_ctx.frame_rate.fps_denominator;
+    else {
+        DEBUG_PRINT_ERROR("Error: Divide by zero \n");
+        return OMX_ErrorBadParameter;
     }
-    if (in_reconfig)
-    {
-      portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
-      portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
-      portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
+
+    if (0 == portDefn->nPortIndex) {
+        portDefn->eDir =  OMX_DirInput;
+        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
+        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
+        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size - DEVICE_SCRATCH;
+        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
+        portDefn->format.video.eCompressionFormat = eCompressionFormat;
+        portDefn->bEnabled   = m_inp_bEnabled;
+        portDefn->bPopulated = m_inp_bPopulated;
+    } else if (1 == portDefn->nPortIndex) {
+        portDefn->eDir =  OMX_DirOutput;
+
+        if (update_picture_resolution() != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("update_picture_resolution failed \n");
+            return OMX_ErrorHardware;
+        }
+
+        if (!client_buffers.update_buffer_req()) {
+            DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
+            return OMX_ErrorHardware;
+        }
+
+        if (in_reconfig) {
+            portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
+            portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
+            portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
+        } else {
+            portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
+            portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
+            portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
+        }
+
+        unsigned int buf_size = 0;
+
+        if (!client_buffers.get_buffer_req(buf_size)) {
+            DEBUG_PRINT_ERROR("\n update buffer requirements");
+            return OMX_ErrorHardware;
+        }
+
+        portDefn->nBufferSize = buf_size;
+        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+        portDefn->bEnabled   = m_out_bEnabled;
+        portDefn->bPopulated = m_out_bPopulated;
+
+        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
+            DEBUG_PRINT_ERROR("\n Error in getting color format");
+            return OMX_ErrorHardware;
+        }
+    } else {
+        portDefn->eDir = OMX_DirMax;
+        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
+                (int)portDefn->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else
-    {
-      portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
-      portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
-      portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
-    }
-    unsigned int buf_size = 0;
-    if (!client_buffers.get_buffer_req(buf_size)) {
-      DEBUG_PRINT_ERROR("\n update buffer requirements");
-      return OMX_ErrorHardware;
-    }
-    portDefn->nBufferSize = buf_size;
-    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
-    portDefn->bEnabled   = m_out_bEnabled;
-    portDefn->bPopulated = m_out_bPopulated;
-    if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
-      DEBUG_PRINT_ERROR("\n Error in getting color format");
-      return OMX_ErrorHardware;
-    }
-  }
-  else
-  {
-    portDefn->eDir = OMX_DirMax;
-    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
-             (int)portDefn->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
-  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
-  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
-  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
-  DEBUG_PRINT_LOW("update_portdef: PortIndex = %u, Width = %d Height = %d "
-    "Stride = %u SliceHeight = %u output format = 0x%x, eColorFormat = 0x%x",
-    portDefn->nPortIndex,
-    portDefn->format.video.nFrameHeight,
-    portDefn->format.video.nFrameWidth,
-    portDefn->format.video.nStride,
-    portDefn->format.video.nSliceHeight,
-    drv_ctx.output_format,
-    portDefn->format.video.eColorFormat);
-  return eRet;
+
+    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
+    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
+    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
+    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
+    DEBUG_PRINT_LOW("update_portdef: PortIndex = %u, Width = %d Height = %d "
+            "Stride = %u SliceHeight = %u output format = 0x%x, eColorFormat = 0x%x",
+            portDefn->nPortIndex,
+            portDefn->format.video.nFrameHeight,
+            portDefn->format.video.nFrameWidth,
+            portDefn->format.video.nStride,
+            portDefn->format.video.nSliceHeight,
+            drv_ctx.output_format,
+            portDefn->format.video.eColorFormat);
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_output_headers()
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
-  unsigned i= 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
+    unsigned i= 0;
 
-  if(!m_out_mem_ptr) {
-    DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
-    int nBufHdrSize        = 0;
-    int nPlatformEntrySize = 0;
-    int nPlatformListSize  = 0;
-    int nPMEMInfoSize = 0;
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
+        int nBufHdrSize        = 0;
+        int nPlatformEntrySize = 0;
+        int nPlatformListSize  = 0;
+        int nPMEMInfoSize = 0;
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
 
-    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
-      drv_ctx.op_buf.actualcount);
-    nBufHdrSize        = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_BUFFERHEADERTYPE);
+        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
+                drv_ctx.op_buf.actualcount);
+        nBufHdrSize        = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_BUFFERHEADERTYPE);
 
-    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
-    nPlatformListSize  = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
-    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+        nPlatformListSize  = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
 
-    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
-                         sizeof(OMX_BUFFERHEADERTYPE),
-                         nPMEMInfoSize,
-                         nPlatformListSize);
-    DEBUG_PRINT_LOW("PE %d bmSize %d ",nPlatformEntrySize,
-                         m_out_bm_count);
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    // Alloc mem for platform specific info
-    char *pPtr=NULL;
-    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
-                                     nPMEMInfoSize,1);
-    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
-      calloc (sizeof(struct vdec_bufferpayload),
-      drv_ctx.op_buf.actualcount);
-    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
-      calloc (sizeof (struct vdec_output_frameinfo),
-      drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
+                sizeof(OMX_BUFFERHEADERTYPE),
+                nPMEMInfoSize,
+                nPlatformListSize);
+        DEBUG_PRINT_LOW("PE %d bmSize %d ",nPlatformEntrySize,
+                m_out_bm_count);
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        // Alloc mem for platform specific info
+        char *pPtr=NULL;
+        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+                nPMEMInfoSize,1);
+        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
+                                   calloc (sizeof(struct vdec_bufferpayload),
+                                           drv_ctx.op_buf.actualcount);
+        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
+                                 calloc (sizeof (struct vdec_output_frameinfo),
+                                         drv_ctx.op_buf.actualcount);
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
-      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
+        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
+                                  calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
 #endif
 
-    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
-       && drv_ctx.ptr_respbuffer)
-    {
-      bufHdr          =  m_out_mem_ptr;
-      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
-      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
-                        (((char *) m_platform_list)  + nPlatformListSize);
-      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                        (((char *) m_platform_entry) + nPlatformEntrySize);
-      pPlatformList   = m_platform_list;
-      pPlatformEntry  = m_platform_entry;
-      pPMEMInfo       = m_pmem_info;
+        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+                && drv_ctx.ptr_respbuffer) {
+            bufHdr          =  m_out_mem_ptr;
+            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+                (((char *) m_platform_list)  + nPlatformListSize);
+            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                (((char *) m_platform_entry) + nPlatformEntrySize);
+            pPlatformList   = m_platform_list;
+            pPlatformEntry  = m_platform_entry;
+            pPMEMInfo       = m_pmem_info;
 
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
 
-      // Settting the entire storage nicely
-      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
-                      m_out_mem_ptr,pPlatformEntry);
-      DEBUG_PRINT_LOW(" Pmem Info = %p ",pPMEMInfo);
-      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = 0;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = NULL;
-        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
-        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-        pPlatformEntry->entry      = pPMEMInfo;
-        // Initialize the Platform List
-        pPlatformList->nEntries    = 1;
-        pPlatformList->entryList   = pPlatformEntry;
-        // Keep pBuffer NULL till vdec is opened
-        bufHdr->pBuffer            = NULL;
-        pPMEMInfo->offset          =  0;
-        pPMEMInfo->pmem_fd = 0;
-        bufHdr->pPlatformPrivate = pPlatformList;
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
+            // Settting the entire storage nicely
+            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
+                    m_out_mem_ptr,pPlatformEntry);
+            DEBUG_PRINT_LOW(" Pmem Info = %p ",pPMEMInfo);
+
+            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = 0;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = NULL;
+                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
+                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+                pPlatformEntry->entry      = pPMEMInfo;
+                // Initialize the Platform List
+                pPlatformList->nEntries    = 1;
+                pPlatformList->entryList   = pPlatformEntry;
+                // Keep pBuffer NULL till vdec is opened
+                bufHdr->pBuffer            = NULL;
+                pPMEMInfo->offset          =  0;
+                pPMEMInfo->pmem_fd = 0;
+                bufHdr->pPlatformPrivate = pPlatformList;
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
 #ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
+                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
 #endif
-        /*Create a mapping between buffers*/
-        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
-        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
-                                            &drv_ctx.ptr_outputbuffer[i];
-        // Move the buffer and buffer header pointers
-        bufHdr++;
-        pPMEMInfo++;
-        pPlatformEntry++;
-        pPlatformList++;
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
-                                        m_out_mem_ptr, pPtr);
-      if(m_out_mem_ptr)
-      {
-        free(m_out_mem_ptr);
-        m_out_mem_ptr = NULL;
-      }
-      if(pPtr)
-      {
-        free(pPtr);
-        pPtr = NULL;
-      }
-      if(drv_ctx.ptr_outputbuffer)
-      {
-        free(drv_ctx.ptr_outputbuffer);
-        drv_ctx.ptr_outputbuffer = NULL;
-      }
-      if(drv_ctx.ptr_respbuffer)
-      {
-        free(drv_ctx.ptr_respbuffer);
-        drv_ctx.ptr_respbuffer = NULL;
-      }
+                /*Create a mapping between buffers*/
+                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
+                                                        &drv_ctx.ptr_outputbuffer[i];
+                // Move the buffer and buffer header pointers
+                bufHdr++;
+                pPMEMInfo++;
+                pPlatformEntry++;
+                pPlatformList++;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
+                    m_out_mem_ptr, pPtr);
+
+            if (m_out_mem_ptr) {
+                free(m_out_mem_ptr);
+                m_out_mem_ptr = NULL;
+            }
+
+            if (pPtr) {
+                free(pPtr);
+                pPtr = NULL;
+            }
+
+            if (drv_ctx.ptr_outputbuffer) {
+                free(drv_ctx.ptr_outputbuffer);
+                drv_ctx.ptr_outputbuffer = NULL;
+            }
+
+            if (drv_ctx.ptr_respbuffer) {
+                free(drv_ctx.ptr_respbuffer);
+                drv_ctx.ptr_respbuffer = NULL;
+            }
+
 #ifdef USE_ION
-    if (drv_ctx.op_buf_ion_info) {
-        DEBUG_PRINT_LOW("Free o/p ion context");
-        free(drv_ctx.op_buf_ion_info);
-        drv_ctx.op_buf_ion_info = NULL;
-    }
+
+            if (drv_ctx.op_buf_ion_info) {
+                DEBUG_PRINT_LOW("Free o/p ion context");
+                free(drv_ctx.op_buf_ion_info);
+                drv_ctx.op_buf_ion_info = NULL;
+            }
+
 #endif
-      eRet =  OMX_ErrorInsufficientResources;
+            eRet =  OMX_ErrorInsufficientResources;
+        }
+    } else {
+        eRet =  OMX_ErrorInsufficientResources;
     }
-  } else {
-    eRet =  OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+
+    return eRet;
 }
 
 void omx_vdec::complete_pending_buffer_done_cbs()
 {
-  unsigned p1;
-  unsigned p2;
-  unsigned ident;
-  omx_cmd_queue tmp_q, pending_bd_q;
-  pthread_mutex_lock(&m_lock);
-  // pop all pending GENERATE FDB from ftb queue
-  while (m_ftb_q.m_size)
-  {
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to ftb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_ftb_q.insert_entry(p1,p2,ident);
-  }
-  // pop all pending GENERATE EDB from etb queue
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to etb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_etb_q.insert_entry(p1,p2,ident);
-  }
-  pthread_mutex_unlock(&m_lock);
-  // process all pending buffer dones
-  while(pending_bd_q.m_size)
-  {
-    pending_bd_q.pop_entry(&p1,&p2,&ident);
-    switch(ident)
-    {
-      case OMX_COMPONENT_GENERATE_EBD:
-        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
-          omx_report_error ();
-        }
-        break;
+    unsigned p1;
+    unsigned p2;
+    unsigned ident;
+    omx_cmd_queue tmp_q, pending_bd_q;
+    pthread_mutex_lock(&m_lock);
 
-      case OMX_COMPONENT_GENERATE_FBD:
-        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
-          omx_report_error ();
+    // pop all pending GENERATE FDB from ftb queue
+    while (m_ftb_q.m_size) {
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+
+        if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
         }
-        break;
     }
-  }
+
+    //return all non GENERATE FDB to ftb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_ftb_q.insert_entry(p1,p2,ident);
+    }
+
+    // pop all pending GENERATE EDB from etb queue
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+
+        if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
+        }
+    }
+
+    //return all non GENERATE FDB to etb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_etb_q.insert_entry(p1,p2,ident);
+    }
+
+    pthread_mutex_unlock(&m_lock);
+
+    // process all pending buffer dones
+    while (pending_bd_q.m_size) {
+        pending_bd_q.pop_entry(&p1,&p2,&ident);
+
+        switch (ident) {
+            case OMX_COMPONENT_GENERATE_EBD:
+
+                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                    DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+
+                break;
+
+            case OMX_COMPONENT_GENERATE_FBD:
+
+                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                    DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+
+                break;
+        }
+    }
 }
 
 void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
 {
-  OMX_U32 new_frame_interval = 0;
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
-     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
-  {
-    new_frame_interval = (act_timestamp > prev_ts)?
-                          act_timestamp - prev_ts :
-                          prev_ts - act_timestamp;
-    if (new_frame_interval < frm_int || frm_int == 0)
-    {
-      frm_int = new_frame_interval;
-      if(frm_int)
-      {
-        drv_ctx.frame_rate.fps_numerator = 1e6;
-        drv_ctx.frame_rate.fps_denominator = frm_int;
-        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
-                         frm_int, drv_ctx.frame_rate.fps_numerator /
-                         (float)drv_ctx.frame_rate.fps_denominator);
-        ioctl_msg.in = &drv_ctx.frame_rate;
-        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
-                  (void*)&ioctl_msg) < 0)
-        {
-          DEBUG_PRINT_ERROR("Setting frame rate failed");
+    OMX_U32 new_frame_interval = 0;
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+
+    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
+            && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) {
+        new_frame_interval = (act_timestamp > prev_ts)?
+            act_timestamp - prev_ts :
+            prev_ts - act_timestamp;
+
+        if (new_frame_interval < frm_int || frm_int == 0) {
+            frm_int = new_frame_interval;
+
+            if (frm_int) {
+                drv_ctx.frame_rate.fps_numerator = 1e6;
+                drv_ctx.frame_rate.fps_denominator = frm_int;
+                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
+                        frm_int, drv_ctx.frame_rate.fps_numerator /
+                        (float)drv_ctx.frame_rate.fps_denominator);
+                ioctl_msg.in = &drv_ctx.frame_rate;
+
+                if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
+                            (void*)&ioctl_msg) < 0) {
+                    DEBUG_PRINT_ERROR("Setting frame rate failed");
+                }
+            }
         }
-      }
     }
-  }
-  prev_ts = act_timestamp;
+
+    prev_ts = act_timestamp;
 }
 
 void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
 {
-  if (rst_prev_ts && VALID_TS(act_timestamp))
-  {
-    prev_ts = act_timestamp;
-    rst_prev_ts = false;
-  }
-  else if (VALID_TS(prev_ts))
-  {
-    bool codec_cond = (drv_ctx.timestamp_adjust)?
-                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
-                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
-                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
-    if(frm_int > 0 && codec_cond)
-    {
-      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
-      act_timestamp = prev_ts + frm_int;
-      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
-      prev_ts = act_timestamp;
+    if (rst_prev_ts && VALID_TS(act_timestamp)) {
+        prev_ts = act_timestamp;
+        rst_prev_ts = false;
+    } else if (VALID_TS(prev_ts)) {
+        bool codec_cond = (drv_ctx.timestamp_adjust)?
+            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
+                                           (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
+            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
+
+        if (frm_int > 0 && codec_cond) {
+            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
+            act_timestamp = prev_ts + frm_int;
+            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
+            prev_ts = act_timestamp;
+        } else
+            set_frame_rate(act_timestamp);
+    } else if (frm_int > 0)          // In this case the frame rate was set along
+    {                               // with the port definition, start ts with 0
+        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
+        rst_prev_ts = true;
     }
-    else
-      set_frame_rate(act_timestamp);
-  }
-  else if (frm_int > 0)           // In this case the frame rate was set along
-  {                               // with the port definition, start ts with 0
-    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
-    rst_prev_ts = true;
-  }
 }
 
 void omx_vdec::handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_extn_user[32];
-  struct vdec_output_frameinfo *output_respbuf;
-  OMX_U32 num_conceal_MB = 0;
-  OMX_S64 ts_in_sei = 0;
-  OMX_U32 frame_rate = 0;
-  OMX_U32 extn_user_data_cnt = 0;
+    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_extn_user[32];
+    struct vdec_output_frameinfo *output_respbuf;
+    OMX_U32 num_conceal_MB = 0;
+    OMX_S64 ts_in_sei = 0;
+    OMX_U32 frame_rate = 0;
+    OMX_U32 extn_user_data_cnt = 0;
 
-  OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
-  OMX_U8 *meta_buffer_virtual = (OMX_U8 *)meta_buff.buffer;
+    OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
+    OMX_U8 *meta_buffer_virtual = (OMX_U8 *)meta_buff.buffer;
 
 
-  p_extra = (OMX_OTHER_EXTRADATATYPE *)
-           ((unsigned)(meta_buffer_virtual +
-           index * drv_ctx.op_buf.meta_buffer_size + 3)&(~3));
+    p_extra = (OMX_OTHER_EXTRADATATYPE *)
+        ((unsigned)(meta_buffer_virtual +
+            index * drv_ctx.op_buf.meta_buffer_size + 3)&(~3));
 
-  //mapping of ouput buffer to the corresponding meta buffer
-  output_respbuf = (struct vdec_output_frameinfo *)\
-                             p_buf_hdr->pOutputPortPrivate;
-  output_respbuf->metadata_info.metabufaddr = (OMX_U8 *)p_extra;
-  output_respbuf->metadata_info.size =
-                     drv_ctx.op_buf.meta_buffer_size;
+    //mapping of ouput buffer to the corresponding meta buffer
+    output_respbuf = (struct vdec_output_frameinfo *)\
+                     p_buf_hdr->pOutputPortPrivate;
+    output_respbuf->metadata_info.metabufaddr = (OMX_U8 *)p_extra;
+    output_respbuf->metadata_info.size =
+        drv_ctx.op_buf.meta_buffer_size;
 
-  meta_buffer_virtual = (OMX_U8 *)p_extra;
+    meta_buffer_virtual = (OMX_U8 *)p_extra;
 
-  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
-    {
-      // Process driver extradata
-      while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
-      {
-        DEBUG_PRINT_LOW("handle_extradata_secure : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
-             p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
-        if (p_extra->nSize < p_extra->nDataSize)
-        {
-          DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
-                             p_extra->nSize, p_extra->nDataSize);
-          p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-          if((OMX_U8*)p_extra > (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size) ||
+    if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)) {
+        // Process driver extradata
+        while (p_extra && p_extra->eType != VDEC_EXTRADATA_NONE) {
+            DEBUG_PRINT_LOW("handle_extradata_secure : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
+                    p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
+
+            if (p_extra->nSize < p_extra->nDataSize) {
+                DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
+                        p_extra->nSize, p_extra->nDataSize);
+                p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+
+                if ((OMX_U8*)p_extra > (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size) ||
                         p_extra->nDataSize == 0 || p_extra->nSize == 0)
-            p_extra = NULL;
-          continue;
-        }
-        if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
-        {
-          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-            num_conceal_MB = count_MB_in_extradata(p_extra);
-          if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
-            // Map driver extradata to corresponding OMX type
-            p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
-          else
-            p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+                    p_extra = NULL;
+
+                continue;
+            }
+
+            if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP) {
+                if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                    num_conceal_MB = count_MB_in_extradata(p_extra);
+
+                if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
+                    // Map driver extradata to corresponding OMX type
+                    p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
+                else
+                    p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+
 #ifdef _ANDROID_
-          if (m_debug_concealedmb) {
-              DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
-          }
+
+                if (m_debug_concealedmb) {
+                    DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
+                }
+
 #endif /* _ANDROID_ */
-        }
-        else if (p_extra->eType == VDEC_EXTRADATA_SEI)
-        {
-          p_sei = p_extra;
+            } else if (p_extra->eType == VDEC_EXTRADATA_SEI) {
+                p_sei = p_extra;
 #ifdef MAX_RES_1080P
-          h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+                h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
 #endif
-          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
-        }
-        else if (p_extra->eType == VDEC_EXTRADATA_VUI)
-        {
-          p_vui = p_extra;
+                p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+            } else if (p_extra->eType == VDEC_EXTRADATA_VUI) {
+                p_vui = p_extra;
 #ifdef MAX_RES_1080P
-          h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+                h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
 #endif
-          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
-        }
-        else if (p_extra->eType == VDEC_EXTRADATA_EXT_DATA)
-        {
-          OMX_U8 *data_ptr = (OMX_U8*)p_extra->data;
-          OMX_U32 value = 0;
-          p_extn_user[extn_user_data_cnt] = p_extra;
-          extn_user_data_cnt++;
-          if((*data_ptr & 0xf0) == 0x20)
-          {
-            value = ((*data_ptr) & 0x01);
-            data_ptr++;
-            if (value)
-              data_ptr += 3;
-            value = *((OMX_U32*)data_ptr);
-            value = ((value << 24) | (((value >> 8)<<24)>>8) |
-                        (((value >> 16)<<24)>>16) | (value >> 24));
-            m_disp_hor_size = (value & 0xfffc0000)>>18;
-            m_disp_vert_size = (value & 0x0001fff8)>>3;
-            DEBUG_PRINT_LOW("Display Vertical Size = %d Display Horizontal Size = %d",
-                                     m_disp_vert_size, m_disp_hor_size);
-          }
-        }
-        else if (p_extra->eType == VDEC_EXTRADATA_USER_DATA)
-        {
-          p_extn_user[extn_user_data_cnt] = p_extra;
-          extn_user_data_cnt++;
-        }
-        print_debug_extradata(p_extra);
-        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+            } else if (p_extra->eType == VDEC_EXTRADATA_EXT_DATA) {
+                OMX_U8 *data_ptr = (OMX_U8*)p_extra->data;
+                OMX_U32 value = 0;
+                p_extn_user[extn_user_data_cnt] = p_extra;
+                extn_user_data_cnt++;
 
-        if((OMX_U8*)p_extra > (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size) ||
-            p_extra->nDataSize == 0 || p_extra->nSize == 0)
-          p_extra = NULL;
-      }
-      if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
-      {
-        //moving p_extra to the starting location of the metadata buffer
-        p_extra = (OMX_OTHER_EXTRADATATYPE *)meta_buffer_virtual;
-        // Driver extradata is only exposed if MB map is requested by client,
-        // otherwise can be overwritten by omx extradata.
-        p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-      }
-    }
+                if ((*data_ptr & 0xf0) == 0x20) {
+                    value = ((*data_ptr) & 0x01);
+                    data_ptr++;
 
-    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-    {
-      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-      {
-        if (p_vui)
-          h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
-        if (p_sei)
-          h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
-        ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
-        if (!VALID_TS(p_buf_hdr->nTimeStamp))
-          p_buf_hdr->nTimeStamp = ts_in_sei;
-      }
-      else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
-        // If timeinfo is present frame info from SEI is already processed
-        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
-    }
+                    if (value)
+                        data_ptr += 3;
 
-    if (client_extradata & OMX_EXTNUSER_EXTRADATA && p_extra)
-    {
-      p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-      for(int i = 0; i < extn_user_data_cnt; i++)
-      {
-        if (((OMX_U8*)p_extra + p_extn_user[i]->nSize) <
-                          (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size))
-        {
-          if (p_extn_user[i]->eType == VDEC_EXTRADATA_EXT_DATA)
-          {
-            append_extn_extradata(p_extra, p_extn_user[i]);
+                    value = *((OMX_U32*)data_ptr);
+                    value = ((value << 24) | (((value >> 8)<<24)>>8) |
+                            (((value >> 16)<<24)>>16) | (value >> 24));
+                    m_disp_hor_size = (value & 0xfffc0000)>>18;
+                    m_disp_vert_size = (value & 0x0001fff8)>>3;
+                    DEBUG_PRINT_LOW("Display Vertical Size = %d Display Horizontal Size = %d",
+                            m_disp_vert_size, m_disp_hor_size);
+                }
+            } else if (p_extra->eType == VDEC_EXTRADATA_USER_DATA) {
+                p_extn_user[extn_user_data_cnt] = p_extra;
+                extn_user_data_cnt++;
+            }
+
+            print_debug_extradata(p_extra);
             p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-          }
-          else if (p_extn_user[i]->eType == VDEC_EXTRADATA_USER_DATA)
-          {
-            append_user_extradata(p_extra, p_extn_user[i]);
-            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-          }
+
+            if ((OMX_U8*)p_extra > (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size) ||
+                    p_extra->nDataSize == 0 || p_extra->nSize == 0)
+                p_extra = NULL;
         }
-      }
+
+        if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)) {
+            //moving p_extra to the starting location of the metadata buffer
+            p_extra = (OMX_OTHER_EXTRADATATYPE *)meta_buffer_virtual;
+            // Driver extradata is only exposed if MB map is requested by client,
+            // otherwise can be overwritten by omx extradata.
+            p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+        }
     }
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+        if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+            if (p_vui)
+                h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+
+            if (p_sei)
+                h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+
+            ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
+
+            if (!VALID_TS(p_buf_hdr->nTimeStamp))
+                p_buf_hdr->nTimeStamp = ts_in_sei;
+        } else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
+            // If timeinfo is present frame info from SEI is already processed
+            h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+    }
+
+    if (client_extradata & OMX_EXTNUSER_EXTRADATA && p_extra) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+
+        for (int i = 0; i < extn_user_data_cnt; i++) {
+            if (((OMX_U8*)p_extra + p_extn_user[i]->nSize) <
+                    (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size)) {
+                if (p_extn_user[i]->eType == VDEC_EXTRADATA_EXT_DATA) {
+                    append_extn_extradata(p_extra, p_extn_user[i]);
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                } else if (p_extn_user[i]->eType == VDEC_EXTRADATA_USER_DATA) {
+                    append_user_extradata(p_extra, p_extn_user[i]);
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                }
+            }
+        }
+    }
+
     if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
-        ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
-         (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size))
-    {
-      p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-      append_interlace_extradata(p_extra,
-             ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format, index);
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+            ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
+            (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size)) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+        append_interlace_extradata(p_extra,
+                ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format, index);
+        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
     }
+
     if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
-         ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
-         (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size))
-    {
-      p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-      /* vui extra data (frame_rate) information */
-      if (h264_parser)
-        h264_parser->get_frame_rate(&frame_rate);
-      append_frame_info_extradata(p_extra, num_conceal_MB,
-          ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
-          p_buf_hdr->nTimeStamp, frame_rate,
-          &((struct vdec_output_frameinfo *)
-            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+            ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+            (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size)) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+
+        /* vui extra data (frame_rate) information */
+        if (h264_parser)
+            h264_parser->get_frame_rate(&frame_rate);
+
+        append_frame_info_extradata(p_extra, num_conceal_MB,
+                ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
+                p_buf_hdr->nTimeStamp, frame_rate,
+                &((struct vdec_output_frameinfo *)
+                    p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
     }
+
     if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
-         p_extra != NULL &&
-        ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
-         (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size))
-    {
-      p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-      append_portdef_extradata(p_extra);
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+            p_extra != NULL &&
+            ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
+            (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size)) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+        append_portdef_extradata(p_extra);
+        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
     }
+
     if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
-      if (p_extra &&
-        ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
-          (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size))
-        append_terminator_extradata(p_extra);
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
-        p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-      }
+        if (p_extra &&
+                ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+                (meta_buffer_virtual + drv_ctx.op_buf.meta_buffer_size))
+            append_terminator_extradata(p_extra);
+        else {
+            DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
+            p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+        }
 }
 
 void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_extn_user[32];
-  OMX_U32 num_conceal_MB = 0;
-  OMX_S64 ts_in_sei = 0;
-  OMX_U32 frame_rate = 0;
-  OMX_U32 extn_user_data_cnt = 0;
+    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_extn_user[32];
+    OMX_U32 num_conceal_MB = 0;
+    OMX_S64 ts_in_sei = 0;
+    OMX_U32 frame_rate = 0;
+    OMX_U32 extn_user_data_cnt = 0;
 
-  OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
-  OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
-  p_extra = (OMX_OTHER_EXTRADATATYPE *)
-           ((unsigned)(pBuffer + p_buf_hdr->nOffset +
+    OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
+    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
+    p_extra = (OMX_OTHER_EXTRADATATYPE *)
+        ((unsigned)(pBuffer + p_buf_hdr->nOffset +
             p_buf_hdr->nFilledLen + 3)&(~3));
-  if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
-    p_extra = NULL;
-  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
-  {
-    // Process driver extradata
-    while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
-    {
-      DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
-           p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
-      if (p_extra->nSize < p_extra->nDataSize)
-      {
-        DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
-                          p_extra->nSize, p_extra->nDataSize);
-        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-        if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
-            p_extra->nDataSize == 0 || p_extra->nSize == 0)
-          p_extra = NULL;
-          continue;
-      }
-      if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
-      {
-        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-          num_conceal_MB = count_MB_in_extradata(p_extra);
-        if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
-          // Map driver extradata to corresponding OMX type
-          p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
-        else
-          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
-#ifdef _ANDROID_
-        if (m_debug_concealedmb) {
-            DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
-        }
-#endif /* _ANDROID_ */
-      }
-      else if (p_extra->eType == VDEC_EXTRADATA_SEI)
-      {
-        p_sei = p_extra;
-#ifdef MAX_RES_1080P
-        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
-#endif
-        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
-      }
-      else if (p_extra->eType == VDEC_EXTRADATA_VUI)
-      {
-        p_vui = p_extra;
-#ifdef MAX_RES_1080P
-        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
-#endif
-        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
-      }
-      else if (p_extra->eType == VDEC_EXTRADATA_EXT_DATA)
-      {
-        OMX_U8 *data_ptr = (OMX_U8*)p_extra->data;
-        OMX_U32 value = 0;
-        p_extn_user[extn_user_data_cnt] = p_extra;
-        extn_user_data_cnt++;
-        if((*data_ptr & 0xf0) == 0x20)
-        {
-          value = ((*data_ptr) & 0x01);
-          data_ptr++;
-          if (value)
-            data_ptr += 3;
-          value = *((OMX_U32*)data_ptr);
-          value = ((value << 24) | (((value >> 8)<<24)>>8) |
-                        (((value >> 16)<<24)>>16) | (value >> 24));
-          m_disp_hor_size = (value & 0xfffc0000)>>18;
-          m_disp_vert_size = (value & 0x0001fff8)>>3;
-          DEBUG_PRINT_LOW("Display Vertical Size = %d Display Horizontal Size = %d",
-                                     m_disp_vert_size, m_disp_hor_size);
-        }
-      }
-      else if (p_extra->eType == VDEC_EXTRADATA_USER_DATA)
-      {
-        p_extn_user[extn_user_data_cnt] = p_extra;
-        extn_user_data_cnt++;
-      }
-      print_debug_extradata(p_extra);
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-      if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
-          p_extra->nDataSize == 0 || p_extra->nSize == 0)
+
+    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
         p_extra = NULL;
+
+    if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)) {
+        // Process driver extradata
+        while (p_extra && p_extra->eType != VDEC_EXTRADATA_NONE) {
+            DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
+                    p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
+
+            if (p_extra->nSize < p_extra->nDataSize) {
+                DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
+                        p_extra->nSize, p_extra->nDataSize);
+                p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+
+                if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
+                        p_extra->nDataSize == 0 || p_extra->nSize == 0)
+                    p_extra = NULL;
+
+                continue;
+            }
+
+            if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP) {
+                if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                    num_conceal_MB = count_MB_in_extradata(p_extra);
+
+                if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
+                    // Map driver extradata to corresponding OMX type
+                    p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
+                else
+                    p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+
+#ifdef _ANDROID_
+
+                if (m_debug_concealedmb) {
+                    DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
+                }
+
+#endif /* _ANDROID_ */
+            } else if (p_extra->eType == VDEC_EXTRADATA_SEI) {
+                p_sei = p_extra;
+#ifdef MAX_RES_1080P
+                h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+#endif
+                p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+            } else if (p_extra->eType == VDEC_EXTRADATA_VUI) {
+                p_vui = p_extra;
+#ifdef MAX_RES_1080P
+                h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+#endif
+                p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+            } else if (p_extra->eType == VDEC_EXTRADATA_EXT_DATA) {
+                OMX_U8 *data_ptr = (OMX_U8*)p_extra->data;
+                OMX_U32 value = 0;
+                p_extn_user[extn_user_data_cnt] = p_extra;
+                extn_user_data_cnt++;
+
+                if ((*data_ptr & 0xf0) == 0x20) {
+                    value = ((*data_ptr) & 0x01);
+                    data_ptr++;
+
+                    if (value)
+                        data_ptr += 3;
+
+                    value = *((OMX_U32*)data_ptr);
+                    value = ((value << 24) | (((value >> 8)<<24)>>8) |
+                            (((value >> 16)<<24)>>16) | (value >> 24));
+                    m_disp_hor_size = (value & 0xfffc0000)>>18;
+                    m_disp_vert_size = (value & 0x0001fff8)>>3;
+                    DEBUG_PRINT_LOW("Display Vertical Size = %d Display Horizontal Size = %d",
+                            m_disp_vert_size, m_disp_hor_size);
+                }
+            } else if (p_extra->eType == VDEC_EXTRADATA_USER_DATA) {
+                p_extn_user[extn_user_data_cnt] = p_extra;
+                extn_user_data_cnt++;
+            }
+
+            print_debug_extradata(p_extra);
+            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+
+            if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
+                    p_extra->nDataSize == 0 || p_extra->nSize == 0)
+                p_extra = NULL;
+        }
+
+        if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)) {
+            // Driver extradata is only exposed if MB map is requested by client,
+            // otherwise can be overwritten by omx extradata.
+            p_extra = (OMX_OTHER_EXTRADATATYPE *)
+                ((unsigned)(pBuffer + p_buf_hdr->nOffset +
+                    p_buf_hdr->nFilledLen + 3)&(~3));
+            p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+        }
     }
-    if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
-    {
-      // Driver extradata is only exposed if MB map is requested by client,
-      // otherwise can be overwritten by omx extradata.
-      p_extra = (OMX_OTHER_EXTRADATATYPE *)
-               ((unsigned)(pBuffer + p_buf_hdr->nOffset +
-                p_buf_hdr->nFilledLen + 3)&(~3));
-      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-    }
-  }
 
 #ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-  {
-    if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-    {
-      if (p_vui)
-        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
-      if (p_sei)
-        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
-      ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
-      if (!VALID_TS(p_buf_hdr->nTimeStamp))
-        p_buf_hdr->nTimeStamp = ts_in_sei;
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+        if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+            if (p_vui)
+                h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+
+            if (p_sei)
+                h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+
+            ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
+
+            if (!VALID_TS(p_buf_hdr->nTimeStamp))
+                p_buf_hdr->nTimeStamp = ts_in_sei;
+        } else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
+            // If timeinfo is present frame info from SEI is already processed
+            h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
     }
-    else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
-      // If timeinfo is present frame info from SEI is already processed
-      h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
-  }
+
 #endif
-  if (client_extradata & OMX_EXTNUSER_EXTRADATA && p_extra)
-  {
-    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-    for(int i = 0; i < extn_user_data_cnt; i++)
-    {
-      if (((OMX_U8*)p_extra + p_extn_user[i]->nSize) <
-                        (pBuffer + p_buf_hdr->nAllocLen))
-      {
-        if (p_extn_user[i]->eType == VDEC_EXTRADATA_EXT_DATA)
-        {
-          append_extn_extradata(p_extra, p_extn_user[i]);
-          p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+
+    if (client_extradata & OMX_EXTNUSER_EXTRADATA && p_extra) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+
+        for (int i = 0; i < extn_user_data_cnt; i++) {
+            if (((OMX_U8*)p_extra + p_extn_user[i]->nSize) <
+                    (pBuffer + p_buf_hdr->nAllocLen)) {
+                if (p_extn_user[i]->eType == VDEC_EXTRADATA_EXT_DATA) {
+                    append_extn_extradata(p_extra, p_extn_user[i]);
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                } else if (p_extn_user[i]->eType == VDEC_EXTRADATA_USER_DATA) {
+                    append_user_extradata(p_extra, p_extn_user[i]);
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                }
+            }
         }
-        else if (p_extn_user[i]->eType == VDEC_EXTRADATA_USER_DATA)
-        {
-          append_user_extradata(p_extra, p_extn_user[i]);
-          p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+    }
+
+    if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
+            ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
+            (pBuffer + p_buf_hdr->nAllocLen)) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+        append_interlace_extradata(p_extra,
+                ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format, index);
+        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+    }
+
+    if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
+            ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+            (pBuffer + p_buf_hdr->nAllocLen)) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+
+        /* vui extra data (frame_rate) information */
+        if (h264_parser)
+            h264_parser->get_frame_rate(&frame_rate);
+
+        append_frame_info_extradata(p_extra, num_conceal_MB,
+                ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
+                p_buf_hdr->nTimeStamp, frame_rate,
+                &((struct vdec_output_frameinfo *)
+                    p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+    }
+
+    if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
+            p_extra != NULL &&
+            ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
+            (pBuffer + p_buf_hdr->nAllocLen)) {
+        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+        append_portdef_extradata(p_extra);
+        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+    }
+
+    if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
+        if (p_extra &&
+                ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+                (pBuffer + p_buf_hdr->nAllocLen))
+            append_terminator_extradata(p_extra);
+        else {
+            DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
+            p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
         }
-      }
-    }
-  }
-  if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
-      ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
-       (pBuffer + p_buf_hdr->nAllocLen))
-  {
-    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-    append_interlace_extradata(p_extra,
-         ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format, index);
-    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-  }
-  if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
-      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
-       (pBuffer + p_buf_hdr->nAllocLen))
-  {
-    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-    /* vui extra data (frame_rate) information */
-    if (h264_parser)
-        h264_parser->get_frame_rate(&frame_rate);
-    append_frame_info_extradata(p_extra, num_conceal_MB,
-        ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
-        p_buf_hdr->nTimeStamp, frame_rate,
-        &((struct vdec_output_frameinfo *)
-          p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
-    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-  }
-  if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
-       p_extra != NULL &&
-      ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
-       (pBuffer + p_buf_hdr->nAllocLen))
-  {
-    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-    append_portdef_extradata(p_extra);
-    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-  }
-  if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
-    if (p_extra &&
-      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
-        (pBuffer + p_buf_hdr->nAllocLen))
-      append_terminator_extradata(p_extra);
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
-      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-    }
 }
 
 OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
 {
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  OMX_U32 driver_extradata = 0, extradata_size = 0;
-  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
-  if(m_state != OMX_StateLoaded)
-  {
-     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
-     return OMX_ErrorIncorrectStateOperation;
-  }
-  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
-    extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
-  if (requested_extradata & OMX_INTERLACE_EXTRADATA)
-    extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
-  if (requested_extradata & OMX_PORTDEF_EXTRADATA)
-  {
-    extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
-  }
-  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
-    client_extradata, requested_extradata, enable);
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_U32 driver_extradata = 0, extradata_size = 0;
+    struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
 
-  if (enable)
-    requested_extradata |= client_extradata;
-  else
-  {
-    requested_extradata = client_extradata & ~requested_extradata;
-    extradata_size *= -1;
-  }
+    if (m_state != OMX_StateLoaded) {
+        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
+    if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
+        extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
 
-  if(secure_mode)
-    driver_extradata = driver_extradata | VDEC_EXTRADATA_EXT_BUFFER;
+    if (requested_extradata & OMX_INTERLACE_EXTRADATA)
+        extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
 
-  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
-    driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
-  if (drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2)
-  {
-    driver_extradata |= ((requested_extradata & OMX_EXTNUSER_EXTRADATA)?
-                          VDEC_EXTRADATA_EXT_DATA | VDEC_EXTRADATA_USER_DATA : 0);
-  }
+    if (requested_extradata & OMX_PORTDEF_EXTRADATA) {
+        extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
+    }
+
+    DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
+            client_extradata, requested_extradata, enable);
+
+    if (enable)
+        requested_extradata |= client_extradata;
+    else {
+        requested_extradata = client_extradata & ~requested_extradata;
+        extradata_size *= -1;
+    }
+
+    driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
+
+    if (secure_mode)
+        driver_extradata = driver_extradata | VDEC_EXTRADATA_EXT_BUFFER;
+
+    if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
+        driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2) {
+        driver_extradata |= ((requested_extradata & OMX_EXTNUSER_EXTRADATA)?
+                VDEC_EXTRADATA_EXT_DATA | VDEC_EXTRADATA_USER_DATA : 0);
+    }
+
 #ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-  {
-    driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
-                          VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
-    driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
-                          VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
-  }
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+        driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
+                VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
+        driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
+                VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
+    }
 
 #endif
-  if (driver_extradata != drv_ctx.extradata)
-  {
-    client_extradata = requested_extradata;
-    drv_ctx.extradata = driver_extradata;
-    ioctl_msg.in = &drv_ctx.extradata;
-    ioctl_msg.out = NULL;
-    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
-        (void*)&ioctl_msg) < 0)
-    {
-        DEBUG_PRINT_ERROR("\nSet extradata failed");
-        ret = OMX_ErrorUnsupportedSetting;
+
+    if (driver_extradata != drv_ctx.extradata) {
+        client_extradata = requested_extradata;
+        drv_ctx.extradata = driver_extradata;
+        ioctl_msg.in = &drv_ctx.extradata;
+        ioctl_msg.out = NULL;
+
+        if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nSet extradata failed");
+            ret = OMX_ErrorUnsupportedSetting;
+        } else
+            ret = get_buffer_req(&drv_ctx.op_buf);
+    } else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK)) {
+        client_extradata = requested_extradata;
+        drv_ctx.op_buf.buffer_size += extradata_size;
+        // align the buffer size
+        drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
+        DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d", drv_ctx.op_buf.buffer_size);
+
+        if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
+            drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
+
+        ret = set_buffer_req(&drv_ctx.op_buf);
     }
-    else
-      ret = get_buffer_req(&drv_ctx.op_buf);
-  }
-  else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
-  {
-    client_extradata = requested_extradata;
-    drv_ctx.op_buf.buffer_size += extradata_size;
-    // align the buffer size
-    drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
-    DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d", drv_ctx.op_buf.buffer_size);
-    if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
-      drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
-    ret = set_buffer_req(&drv_ctx.op_buf);
-  }
-  return ret;
+
+    return ret;
 }
 
 OMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
-  OMX_U8 *data_ptr = extra->data, data = 0;
-  while (byte_count < extra->nDataSize)
-  {
-    data = *data_ptr;
-    while (data)
-    {
-      num_MB += (data&0x01);
-      data >>= 1;
+    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
+    OMX_U8 *data_ptr = extra->data, data = 0;
+
+    while (byte_count < extra->nDataSize) {
+        data = *data_ptr;
+
+        while (data) {
+            num_MB += (data&0x01);
+            data >>= 1;
+        }
+
+        data_ptr++;
+        byte_count++;
     }
-    data_ptr++;
-    byte_count++;
-  }
-  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
-                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
-  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
+
+    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
 }
 
 void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
 #ifdef _ANDROID_
-  if (!m_debug_extradata)
-     return;
 
-  DEBUG_PRINT_HIGH(
-    "============== Extra Data ==============\n"
-    "           Size: %u \n"
-    "        Version: %u \n"
-    "      PortIndex: %u \n"
-    "           Type: %x \n"
-    "       DataSize: %u \n",
-    extra->nSize, extra->nVersion.nVersion,
-    extra->nPortIndex, extra->eType, extra->nDataSize);
-
-  if (extra->eType == OMX_ExtraDataInterlaceFormat)
-  {
-    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
-    DEBUG_PRINT_HIGH(
-      "------ Interlace Format ------\n"
-      "                Size: %u \n"
-      "             Version: %u \n"
-      "           PortIndex: %u \n"
-      " Is Interlace Format: %u \n"
-      "   Interlace Formats: %u \n"
-      "=========== End of Interlace ===========\n",
-      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
-      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
-  }
-  else if (extra->eType == OMX_ExtraDataFrameInfo)
-  {
-    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+    if (!m_debug_extradata)
+        return;
 
     DEBUG_PRINT_HIGH(
-      "-------- Frame Format --------\n"
-      "             Picture Type: %u \n"
-      "           Interlace Type: %u \n"
-      " Pan Scan Total Frame Num: %u \n"
-      "   Concealed Macro Blocks: %u \n"
-      "               frame rate: %u \n"
-      "           Aspect Ratio X: %u \n"
-      "           Aspect Ratio Y: %u \n",
-      fminfo->ePicType,
-      fminfo->interlaceType,
-      fminfo->panScan.numWindows,
-      fminfo->nConcealedMacroblocks,
-      fminfo->nFrameRate,
-      fminfo->aspectRatio.aspectRatioX,
-      fminfo->aspectRatio.aspectRatioY);
+            "============== Extra Data ==============\n"
+            "           Size: %u \n"
+            "        Version: %u \n"
+            "      PortIndex: %u \n"
+            "           Type: %x \n"
+            "       DataSize: %u \n",
+            extra->nSize, extra->nVersion.nVersion,
+            extra->nPortIndex, extra->eType, extra->nDataSize);
 
-    for (int i = 0; i < fminfo->panScan.numWindows; i++)
-    {
-      DEBUG_PRINT_HIGH(
-        "------------------------------\n"
-        "     Pan Scan Frame Num: %d \n"
-        "            Rectangle x: %d \n"
-        "            Rectangle y: %d \n"
-        "           Rectangle dx: %d \n"
-        "           Rectangle dy: %d \n",
-        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
-        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+    if (extra->eType == OMX_ExtraDataInterlaceFormat) {
+        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+        DEBUG_PRINT_HIGH(
+                "------ Interlace Format ------\n"
+                "                Size: %u \n"
+                "             Version: %u \n"
+                "           PortIndex: %u \n"
+                " Is Interlace Format: %u \n"
+                "   Interlace Formats: %u \n"
+                "=========== End of Interlace ===========\n",
+                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
+                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
+    } else if (extra->eType == OMX_ExtraDataFrameInfo) {
+        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+
+        DEBUG_PRINT_HIGH(
+                "-------- Frame Format --------\n"
+                "             Picture Type: %u \n"
+                "           Interlace Type: %u \n"
+                " Pan Scan Total Frame Num: %u \n"
+                "   Concealed Macro Blocks: %u \n"
+                "               frame rate: %u \n"
+                "           Aspect Ratio X: %u \n"
+                "           Aspect Ratio Y: %u \n",
+                fminfo->ePicType,
+                fminfo->interlaceType,
+                fminfo->panScan.numWindows,
+                fminfo->nConcealedMacroblocks,
+                fminfo->nFrameRate,
+                fminfo->aspectRatio.aspectRatioX,
+                fminfo->aspectRatio.aspectRatioY);
+
+        for (int i = 0; i < fminfo->panScan.numWindows; i++) {
+            DEBUG_PRINT_HIGH(
+                    "------------------------------\n"
+                    "     Pan Scan Frame Num: %d \n"
+                    "            Rectangle x: %d \n"
+                    "            Rectangle y: %d \n"
+                    "           Rectangle dx: %d \n"
+                    "           Rectangle dy: %d \n",
+                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
+                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+        }
+
+        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
+    } else if (extra->eType == OMX_ExtraDataNone) {
+        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
+    } else {
+        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
     }
 
-    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
-  }
-  else if (extra->eType == OMX_ExtraDataNone)
-  {
-    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
-  }
-  else
-  {
-    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
-  }
 #endif /* _ANDROID_ */
 }
 
 void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                          OMX_U32 interlaced_format_type, OMX_U32 buf_index)
+        OMX_U32 interlaced_format_type, OMX_U32 buf_index)
 {
-  OMX_STREAMINTERLACEFORMAT *interlace_format;
-  OMX_U32 mbaff = 0;
+    OMX_STREAMINTERLACEFORMAT *interlace_format;
+    OMX_U32 mbaff = 0;
 #if defined(_ANDROID_ICS_)
-  OMX_U32 enable = 0;
-  private_handle_t *handle = NULL;
-  handle = (private_handle_t *)native_buffer[buf_index].nativehandle;
-  if(!handle)
-    DEBUG_PRINT_LOW("%s: Native Buffer handle is NULL",__func__);
+    OMX_U32 enable = 0;
+    private_handle_t *handle = NULL;
+    handle = (private_handle_t *)native_buffer[buf_index].nativehandle;
+
+    if (!handle)
+        DEBUG_PRINT_LOW("%s: Native Buffer handle is NULL",__func__);
+
 #endif
-  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
-  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
-  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
-  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
-  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
-  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
-  if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff)
-  {
-    interlace_format->bInterlaceFormat = OMX_FALSE;
-    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
-    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
+    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
+    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+
+    if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff) {
+        interlace_format->bInterlaceFormat = OMX_FALSE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
 #if defined(_ANDROID_ICS_)
-    if(handle)
-    {
-      setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable);
+
+        if (handle) {
+            setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable);
+        }
+
+#endif
+    } else {
+        interlace_format->bInterlaceFormat = OMX_TRUE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
+        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+#if defined(_ANDROID_ICS_)
+        enable = 1;
+
+        if (handle) {
+            setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable);
+        }
+
+#endif
     }
-#endif
-  }
-  else
-  {
-    interlace_format->bInterlaceFormat = OMX_TRUE;
-    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
-    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
-#if defined(_ANDROID_ICS_)
-    enable = 1;
-    if(handle)
-    {
-      setMetaData(handle, PP_PARAM_INTERLACED, (void*)&enable);
-    }
-#endif
-  }
-  print_debug_extradata(extra);
+
+    print_debug_extradata(extra);
 }
 
 void omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp,
-    OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info)
+        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp,
+        OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info)
 {
-  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
-  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
-  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
-  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
+    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
+    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
+    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
 
-  switch (picture_type)
-  {
-    case PICTURE_TYPE_I:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
-    break;
-    case PICTURE_TYPE_P:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
-    break;
-    case PICTURE_TYPE_B:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
-    break;
-    default:
-       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
-  }
-  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
-    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
-  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
-    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
-  else
-    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
-  memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
-  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
-  memset(&frame_info->displayAspectRatio, 0, sizeof(frame_info->displayAspectRatio));
-  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-  {
-    h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
-  }
-
-  fill_aspect_ratio_info(aspect_ratio_info, frame_info);
-  if (drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2)
-  {
-    if (m_disp_hor_size && m_disp_vert_size)
-    {
-      frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
-      frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
+    switch (picture_type) {
+        case PICTURE_TYPE_I:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
+            break;
+        case PICTURE_TYPE_P:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
+            break;
+        case PICTURE_TYPE_B:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
+            break;
+        default:
+            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
     }
-  }
-  frame_info->nConcealedMacroblocks = num_conceal_mb;
-  frame_info->nFrameRate = frame_rate;
-  print_debug_extradata(extra);
+
+    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+    else
+        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
+
+    memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
+    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
+    memset(&frame_info->displayAspectRatio, 0, sizeof(frame_info->displayAspectRatio));
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+        h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
+    }
+
+    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2) {
+        if (m_disp_hor_size && m_disp_vert_size) {
+            frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
+            frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
+        }
+    }
+
+    frame_info->nConcealedMacroblocks = num_conceal_mb;
+    frame_info->nFrameRate = frame_rate;
+    print_debug_extradata(extra);
 }
 
 void omx_vdec::fill_aspect_ratio_info(
-                       struct vdec_aspectratioinfo *aspect_ratio_info,
-                       OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
+        struct vdec_aspectratioinfo *aspect_ratio_info,
+        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
 {
-  m_extradata = frame_info;
-  if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2)
-  {
-    switch(aspect_ratio_info->aspect_ratio)
-    {
-      case 1:
-        m_extradata->aspectRatio.aspectRatioX = 1;
-        m_extradata->aspectRatio.aspectRatioY = 1;
-      break;
-      case 2:
-        if (m_disp_hor_size && m_disp_vert_size)
-        {
-          m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
-                                                  m_disp_vert_size;
-          m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
-                                                  m_disp_hor_size;
+    m_extradata = frame_info;
+
+    if (drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2) {
+        switch (aspect_ratio_info->aspect_ratio) {
+            case 1:
+                m_extradata->aspectRatio.aspectRatioX = 1;
+                m_extradata->aspectRatio.aspectRatioY = 1;
+                break;
+            case 2:
+
+                if (m_disp_hor_size && m_disp_vert_size) {
+                    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+                        m_disp_vert_size;
+                    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+                        m_disp_hor_size;
+                } else {
+                    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+                        drv_ctx.video_resolution.frame_height;
+                    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+                        drv_ctx.video_resolution.frame_width;
+                }
+
+                break;
+            case 3:
+
+                if (m_disp_hor_size && m_disp_vert_size) {
+                    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+                        m_disp_vert_size;
+                    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+                        m_disp_hor_size;
+                } else {
+                    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+                        drv_ctx.video_resolution.frame_height;
+                    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+                        drv_ctx.video_resolution.frame_width;
+                }
+
+                break;
+            case 4:
+
+                if (m_disp_hor_size && m_disp_vert_size) {
+                    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+                        m_disp_vert_size;
+                    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+                        m_disp_hor_size;
+                } else {
+                    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+                        drv_ctx.video_resolution.frame_height;
+                    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+                        drv_ctx.video_resolution.frame_width;
+                }
+
+                break;
+            default:
+                m_extradata->aspectRatio.aspectRatioX = 1;
+                m_extradata->aspectRatio.aspectRatioY = 1;
         }
-        else
-        {
-          m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
-                                                   drv_ctx.video_resolution.frame_height;
-          m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
-                                                  drv_ctx.video_resolution.frame_width;
-        }
-      break;
-      case 3:
-        if (m_disp_hor_size && m_disp_vert_size)
-        {
-          m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
-                                                  m_disp_vert_size;
-          m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
-                                                  m_disp_hor_size;
-        }
-        else
-        {
-          m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
-                                                   drv_ctx.video_resolution.frame_height;
-          m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
-                                                  drv_ctx.video_resolution.frame_width;
-        }
-      break;
-      case 4:
-        if (m_disp_hor_size && m_disp_vert_size)
-        {
-          m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
-                                                  m_disp_vert_size;
-          m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
-                                                  m_disp_hor_size;
-        }
-        else
-        {
-          m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
-                                                   drv_ctx.video_resolution.frame_height;
-          m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
-                                                  drv_ctx.video_resolution.frame_width;
-        }
-      break;
-      default:
-        m_extradata->aspectRatio.aspectRatioX = 1;
-        m_extradata->aspectRatio.aspectRatioY = 1;
+    } else {
+        m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
+        m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
     }
-  }
-  else
-  {
-    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
-    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
-  }
-  DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
-                                                     m_extradata->aspectRatio.aspectRatioY);
+
+    DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
+            m_extradata->aspectRatio.aspectRatioY);
 }
 
 void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
-  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
-  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
-  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
-  *portDefn = m_port_def;
-  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
-     "sliceheight = %u",portDefn->format.video.nFrameHeight,
-     portDefn->format.video.nFrameWidth,
-     portDefn->format.video.nStride,
-     portDefn->format.video.nSliceHeight);
+    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
+    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
+    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
+    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
+    *portDefn = m_port_def;
+    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
+            "sliceheight = %u",portDefn->format.video.nFrameHeight,
+            portDefn->format.video.nFrameWidth,
+            portDefn->format.video.nStride,
+            portDefn->format.video.nSliceHeight);
 }
 
 void omx_vdec::append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                      OMX_OTHER_EXTRADATATYPE *p_extn)
+        OMX_OTHER_EXTRADATATYPE *p_extn)
 {
-  extra->nDataSize = p_extn->nDataSize;
-  extra->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + extra->nDataSize);
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2ExtnData;
-  if (extra->data && p_extn->data && extra->nDataSize)
-    memcpy(extra->data, p_extn->data, extra->nDataSize);
+    extra->nDataSize = p_extn->nDataSize;
+    extra->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + extra->nDataSize);
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2ExtnData;
+
+    if (extra->data && p_extn->data && extra->nDataSize)
+        memcpy(extra->data, p_extn->data, extra->nDataSize);
 }
 
 void omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                      OMX_OTHER_EXTRADATATYPE *p_user)
+        OMX_OTHER_EXTRADATATYPE *p_user)
 {
-  extra->nDataSize = p_user->nDataSize;
-  extra->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + extra->nDataSize);
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
-  if (extra->data && p_user->data && extra->nDataSize)
-    memcpy(extra->data, p_user->data, extra->nDataSize);
+    extra->nDataSize = p_user->nDataSize;
+    extra->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + extra->nDataSize);
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
+
+    if (extra->data && p_user->data && extra->nDataSize)
+        memcpy(extra->data, p_user->data, extra->nDataSize);
 }
 
 void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->eType = OMX_ExtraDataNone;
-  extra->nDataSize = 0;
-  extra->data[0] = 0;
+    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->eType = OMX_ExtraDataNone;
+    extra->nDataSize = 0;
+    extra->data[0] = 0;
 
-  print_debug_extradata(extra);
+    print_debug_extradata(extra);
 }
 
 OMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (index >= drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
-    return OMX_ErrorInsufficientResources;
-  }
-  if (m_desc_buffer_ptr == NULL)
-  {
-    m_desc_buffer_ptr = (desc_buffer_hdr*) \
-                     calloc( (sizeof(desc_buffer_hdr)),
-                     drv_ctx.ip_buf.actualcount);
-    if (m_desc_buffer_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
-      return OMX_ErrorInsufficientResources;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+    if (index >= drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
+        return OMX_ErrorInsufficientResources;
     }
-  }
 
-  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
-  if (m_desc_buffer_ptr[index].buf_addr == NULL)
-  {
-    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
-    return OMX_ErrorInsufficientResources;
-  }
+    if (m_desc_buffer_ptr == NULL) {
+        m_desc_buffer_ptr = (desc_buffer_hdr*) \
+                            calloc( (sizeof(desc_buffer_hdr)),
+                                    drv_ctx.ip_buf.actualcount);
 
-  return eRet;
+        if (m_desc_buffer_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
+    }
+
+    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
+
+    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
+        DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
+        return OMX_ErrorInsufficientResources;
+    }
+
+    return eRet;
 }
 
 void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
 {
-  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
-  if (m_demux_entries < 8192)
-  {
-    m_demux_offsets[m_demux_entries++] = address_offset;
-  }
-  return;
+    DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
+
+    if (m_demux_entries < 8192) {
+        m_demux_offsets[m_demux_entries++] = address_offset;
+    }
+
+    return;
 }
 
 void omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
 {
-  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
-  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
-  OMX_U32 index = 0;
-  OMX_U32 prev_sc_index = 0;
+    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
+    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
+    OMX_U32 index = 0;
+    OMX_U32 prev_sc_index = 0;
 
-  m_demux_entries = 0;
+    m_demux_entries = 0;
 
-  while (index < bytes_to_parse)
-  {
-    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
-          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
-         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
-          (buf[index+2] == 0x01)) )
-    {
-      if ((((index+3) - prev_sc_index) <= 4) && m_demux_entries)
-      {
-         DEBUG_PRINT_ERROR("FOUND Consecutive start Code, Hence skip one");
-         m_demux_entries--;
-      }
-      //Found start code, insert address offset
-      insert_demux_addr_offset(index);
-      if (buf[index+2] == 0x01) // 3 byte start code
-        index += 3;
-      else                      //4 byte start code
-        index += 4;
-      prev_sc_index = index;
+    while (index < bytes_to_parse) {
+        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
+                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+                 (buf[index+2] == 0x01)) ) {
+            if ((((index+3) - prev_sc_index) <= 4) && m_demux_entries) {
+                DEBUG_PRINT_ERROR("FOUND Consecutive start Code, Hence skip one");
+                m_demux_entries--;
+            }
+
+            //Found start code, insert address offset
+            insert_demux_addr_offset(index);
+
+            if (buf[index+2] == 0x01) // 3 byte start code
+                index += 3;
+            else                      //4 byte start code
+                index += 4;
+
+            prev_sc_index = index;
+        } else
+            index++;
     }
-    else
-      index++;
-  }
-  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
-  return;
+
+    DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
+    return;
 }
 
 OMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  //fix this, handle 3 byte start code, vc1 terminator entry
-  OMX_U8 *p_demux_data = NULL;
-  OMX_U32 desc_data = 0;
-  OMX_U32 start_addr = 0;
-  OMX_U32 nal_size = 0;
-  OMX_U32 suffix_byte = 0;
-  OMX_U32 demux_index = 0;
-  OMX_U32 buffer_index = 0;
+    //fix this, handle 3 byte start code, vc1 terminator entry
+    OMX_U8 *p_demux_data = NULL;
+    OMX_U32 desc_data = 0;
+    OMX_U32 start_addr = 0;
+    OMX_U32 nal_size = 0;
+    OMX_U32 suffix_byte = 0;
+    OMX_U32 demux_index = 0;
+    OMX_U32 buffer_index = 0;
 
-  if (m_desc_buffer_ptr == NULL)
-  {
-    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
-    return OMX_ErrorBadParameter;
-  }
-
-  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
-  if (buffer_index > drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
-    return OMX_ErrorBadParameter;
-  }
-
-  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
-
-  if ( ((OMX_U8*)p_demux_data == NULL) ||
-      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
-  {
-    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
-    return OMX_ErrorBadParameter;
-  }
-  else
-  {
-    for (; demux_index < m_demux_entries; demux_index++)
-    {
-      desc_data = 0;
-      start_addr = m_demux_offsets[demux_index];
-      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
-      {
-        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
-      }
-      else
-      {
-        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
-      }
-      if (demux_index < (m_demux_entries - 1))
-      {
-        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
-      }
-      else
-      {
-        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
-      }
-      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
-                        start_addr,
-                        suffix_byte,
-                        nal_size,
-                        demux_index);
-      desc_data = (start_addr >> 3) << 1;
-      desc_data |= (start_addr & 7) << 21;
-      desc_data |= suffix_byte << 24;
-
-      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
-      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
-      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-
-      p_demux_data += 16;
+    if (m_desc_buffer_ptr == NULL) {
+        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
+        return OMX_ErrorBadParameter;
     }
-    if (codec_type_parse == CODEC_TYPE_VC1)
-    {
-      DEBUG_PRINT_LOW("VC1 terminator entry");
-      desc_data = 0;
-      desc_data = 0x82 << 24;
-      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
-      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-      p_demux_data += 16;
-      m_demux_entries++;
-    }
-    //Add zero word to indicate end of descriptors
-    memset(p_demux_data, 0, sizeof(OMX_U32));
 
-    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
-    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
-  }
-  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-  m_demux_entries = 0;
-  DEBUG_PRINT_LOW("Demux table complete!");
-  return OMX_ErrorNone;
+    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+
+    if (buffer_index > drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
+        return OMX_ErrorBadParameter;
+    }
+
+    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
+
+    if ( ((OMX_U8*)p_demux_data == NULL) ||
+            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
+        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
+        return OMX_ErrorBadParameter;
+    } else {
+        for (; demux_index < m_demux_entries; demux_index++) {
+            desc_data = 0;
+            start_addr = m_demux_offsets[demux_index];
+
+            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
+                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
+            } else {
+                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
+            }
+
+            if (demux_index < (m_demux_entries - 1)) {
+                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
+            } else {
+                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
+            }
+
+            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
+                    start_addr,
+                    suffix_byte,
+                    nal_size,
+                    demux_index);
+            desc_data = (start_addr >> 3) << 1;
+            desc_data |= (start_addr & 7) << 21;
+            desc_data |= suffix_byte << 24;
+
+            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
+            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+
+            p_demux_data += 16;
+        }
+
+        if (codec_type_parse == CODEC_TYPE_VC1) {
+            DEBUG_PRINT_LOW("VC1 terminator entry");
+            desc_data = 0;
+            desc_data = 0x82 << 24;
+            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+            p_demux_data += 16;
+            m_demux_entries++;
+        }
+
+        //Add zero word to indicate end of descriptors
+        memset(p_demux_data, 0, sizeof(OMX_U32));
+
+        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
+        DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
+    }
+
+    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+    m_demux_entries = 0;
+    DEBUG_PRINT_LOW("Demux table complete!");
+    return OMX_ErrorNone;
 }
 
 #ifdef MAX_RES_1080P
 
 OMX_ERRORTYPE omx_vdec::vdec_alloc_meta_buffers()
 {
-  OMX_U32 pmem_fd = -1, pmem_fd_iommu = -1;
-  OMX_U32 size, alignment;
-  void *buf_addr = NULL;
-  struct vdec_ioctl_msg ioctl_msg;
+    OMX_U32 pmem_fd = -1, pmem_fd_iommu = -1;
+    OMX_U32 size, alignment;
+    void *buf_addr = NULL;
+    struct vdec_ioctl_msg ioctl_msg;
 #ifndef USE_ION
-  struct pmem_allocation allocation;
+    struct pmem_allocation allocation;
 #endif
-  struct vdec_meta_buffers meta_buffer;
+    struct vdec_meta_buffers meta_buffer;
 
-  memset ((unsigned char*)&meta_buffer,0,sizeof (struct vdec_meta_buffers));
+    memset ((unsigned char*)&meta_buffer,0,sizeof (struct vdec_meta_buffers));
 
-  //we already have meta buffer size.
-  size = drv_ctx.op_buf.meta_buffer_size * drv_ctx.op_buf.actualcount;
-  alignment = 8192;
+    //we already have meta buffer size.
+    size = drv_ctx.op_buf.meta_buffer_size * drv_ctx.op_buf.actualcount;
+    alignment = 8192;
 
 
 #ifdef USE_ION
- external_meta_buffer = true;
- drv_ctx.meta_buffer.ion_device_fd = alloc_map_ion_memory(
-                    size, 8192,
-                    &drv_ctx.meta_buffer.ion_alloc_data,
-                    &drv_ctx.meta_buffer.fd_ion_data, 0);
-  if (drv_ctx.meta_buffer.ion_device_fd < 0) {
+    external_meta_buffer = true;
+    drv_ctx.meta_buffer.ion_device_fd = alloc_map_ion_memory(
+            size, 8192,
+            &drv_ctx.meta_buffer.ion_alloc_data,
+            &drv_ctx.meta_buffer.fd_ion_data, 0);
+
+    if (drv_ctx.meta_buffer.ion_device_fd < 0) {
         external_meta_buffer = false;
         return OMX_ErrorInsufficientResources;
-  }
-  external_meta_buffer = false;
-  pmem_fd = drv_ctx.meta_buffer.fd_ion_data.fd;
+    }
 
- external_meta_buffer_iommu = true;
- drv_ctx.meta_buffer_iommu.ion_device_fd = alloc_map_ion_memory(
-                    size, 8192,
-                    &drv_ctx.meta_buffer_iommu.ion_alloc_data,
-                    &drv_ctx.meta_buffer_iommu.fd_ion_data, 0);
-  if (drv_ctx.meta_buffer_iommu.ion_device_fd < 0) {
+    external_meta_buffer = false;
+    pmem_fd = drv_ctx.meta_buffer.fd_ion_data.fd;
+
+    external_meta_buffer_iommu = true;
+    drv_ctx.meta_buffer_iommu.ion_device_fd = alloc_map_ion_memory(
+            size, 8192,
+            &drv_ctx.meta_buffer_iommu.ion_alloc_data,
+            &drv_ctx.meta_buffer_iommu.fd_ion_data, 0);
+
+    if (drv_ctx.meta_buffer_iommu.ion_device_fd < 0) {
         external_meta_buffer_iommu = false;
         return OMX_ErrorInsufficientResources;
-  }
-  external_meta_buffer_iommu = false;
-  pmem_fd_iommu = drv_ctx.meta_buffer_iommu.fd_ion_data.fd;
+    }
+
+    external_meta_buffer_iommu = false;
+    pmem_fd_iommu = drv_ctx.meta_buffer_iommu.fd_ion_data.fd;
 #else
-  allocation.size = size;
-  allocation.align = clip2(alignment);
-  if (allocation.align != 8192)
-    allocation.align = 8192;
+    allocation.size = size;
+    allocation.align = clip2(alignment);
 
-  pmem_fd = open(MEM_DEVICE, O_RDWR);
+    if (allocation.align != 8192)
+        allocation.align = 8192;
 
-  if ((int)(pmem_fd) < 0)
-      return OMX_ErrorInsufficientResources;
+    pmem_fd = open(MEM_DEVICE, O_RDWR);
 
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
-      allocation.align, allocation.size);
-    return OMX_ErrorInsufficientResources;
-  }
+    if ((int)(pmem_fd) < 0)
+        return OMX_ErrorInsufficientResources;
+
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+                allocation.align, allocation.size);
+        return OMX_ErrorInsufficientResources;
+    }
+
 #endif
 
     buf_addr = mmap(NULL, size,
-                 PROT_READ | PROT_WRITE,
-                 MAP_SHARED, pmem_fd_iommu, 0);
+            PROT_READ | PROT_WRITE,
+            MAP_SHARED, pmem_fd_iommu, 0);
 
-    if (buf_addr == (void*) MAP_FAILED)
-    {
-      close(pmem_fd);
-      close(pmem_fd_iommu);
+    if (buf_addr == (void*) MAP_FAILED) {
+        close(pmem_fd);
+        close(pmem_fd_iommu);
 #ifdef USE_ION
-      free_ion_memory(&drv_ctx.meta_buffer);
-      free_ion_memory(&drv_ctx.meta_buffer_iommu);
+        free_ion_memory(&drv_ctx.meta_buffer);
+        free_ion_memory(&drv_ctx.meta_buffer_iommu);
 #endif
-      pmem_fd = -1;
-      pmem_fd_iommu = -1;
-      DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
-      return OMX_ErrorInsufficientResources;
+        pmem_fd = -1;
+        pmem_fd_iommu = -1;
+        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+        return OMX_ErrorInsufficientResources;
     }
 
-  meta_buffer.size = size;
-  meta_buffer.count = drv_ctx.op_buf.actualcount;
-  meta_buffer.pmem_fd = pmem_fd;
-  meta_buffer.pmem_fd_iommu = pmem_fd_iommu;
-  meta_buffer.offset = 0;
+    meta_buffer.size = size;
+    meta_buffer.count = drv_ctx.op_buf.actualcount;
+    meta_buffer.pmem_fd = pmem_fd;
+    meta_buffer.pmem_fd_iommu = pmem_fd_iommu;
+    meta_buffer.offset = 0;
 
-  ioctl_msg.in = (void*)&meta_buffer;
-  ioctl_msg.out = NULL;
+    ioctl_msg.in = (void*)&meta_buffer;
+    ioctl_msg.out = NULL;
 
-  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_META_BUFFERS, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("Failed to set the meta_buffers\n");
-    return OMX_ErrorInsufficientResources;
-  }
+    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_META_BUFFERS, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("Failed to set the meta_buffers\n");
+        return OMX_ErrorInsufficientResources;
+    }
 
-  meta_buff.buffer = (unsigned char *) buf_addr;
-  meta_buff.size = size;
-  meta_buff.count = drv_ctx.op_buf.actualcount;
-  meta_buff.offset = 0;
-  meta_buff.pmem_fd = pmem_fd;
-  meta_buff.pmem_fd_iommu = pmem_fd_iommu;
-  DEBUG_PRINT_HIGH("Saving virt:%p, FD: %d and FD_IOMMU %d of size %d count: %d", meta_buff.buffer,
-                   meta_buff.pmem_fd, meta_buff.pmem_fd_iommu, meta_buff.size, drv_ctx.op_buf.actualcount);
-  return OMX_ErrorNone;
+    meta_buff.buffer = (unsigned char *) buf_addr;
+    meta_buff.size = size;
+    meta_buff.count = drv_ctx.op_buf.actualcount;
+    meta_buff.offset = 0;
+    meta_buff.pmem_fd = pmem_fd;
+    meta_buff.pmem_fd_iommu = pmem_fd_iommu;
+    DEBUG_PRINT_HIGH("Saving virt:%p, FD: %d and FD_IOMMU %d of size %d count: %d", meta_buff.buffer,
+            meta_buff.pmem_fd, meta_buff.pmem_fd_iommu, meta_buff.size, drv_ctx.op_buf.actualcount);
+    return OMX_ErrorNone;
 }
 
 void omx_vdec::vdec_dealloc_meta_buffers()
 {
-    if(meta_buff.pmem_fd > 0)
-    {
-      if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_META_BUFFERS,NULL) < 0)
-        DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_META_BUFFERS failed");
-      close(meta_buff.pmem_fd);
+    if (meta_buff.pmem_fd > 0) {
+        if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_META_BUFFERS,NULL) < 0)
+            DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_META_BUFFERS failed");
+
+        close(meta_buff.pmem_fd);
 #ifdef USE_ION
-      free_ion_memory(&drv_ctx.meta_buffer);
+        free_ion_memory(&drv_ctx.meta_buffer);
 #endif
     }
-    if(meta_buff.pmem_fd_iommu > 0)
-    {
-      munmap(meta_buff.buffer, meta_buff.size);
-      close(meta_buff.pmem_fd_iommu);
+
+    if (meta_buff.pmem_fd_iommu > 0) {
+        munmap(meta_buff.buffer, meta_buff.size);
+        close(meta_buff.pmem_fd_iommu);
 #ifdef USE_ION
-      free_ion_memory(&drv_ctx.meta_buffer_iommu);
+        free_ion_memory(&drv_ctx.meta_buffer_iommu);
 #endif
-      DEBUG_PRINT_LOW("Cleaning Meta buffer of size %d",meta_buff.size);
-      meta_buff.pmem_fd = -1;
-      meta_buff.pmem_fd_iommu = -1;
-      meta_buff.offset = 0;
-      meta_buff.size = 0;
-      meta_buff.count = 0;
-      meta_buff.buffer = NULL;
+        DEBUG_PRINT_LOW("Cleaning Meta buffer of size %d",meta_buff.size);
+        meta_buff.pmem_fd = -1;
+        meta_buff.pmem_fd_iommu = -1;
+        meta_buff.offset = 0;
+        meta_buff.size = 0;
+        meta_buff.count = 0;
+        meta_buff.buffer = NULL;
     }
 }
 
 OMX_ERRORTYPE omx_vdec::vdec_alloc_h264_mv()
 {
-  OMX_U32 pmem_fd = -1;
-  OMX_U32 width, height, size, alignment;
-  void *buf_addr = NULL;
-  struct vdec_ioctl_msg ioctl_msg;
+    OMX_U32 pmem_fd = -1;
+    OMX_U32 width, height, size, alignment;
+    void *buf_addr = NULL;
+    struct vdec_ioctl_msg ioctl_msg;
 #ifndef USE_ION
-  struct pmem_allocation allocation;
+    struct pmem_allocation allocation;
 #endif
-  struct vdec_h264_mv h264_mv;
-  struct vdec_mv_buff_size mv_buff_size;
+    struct vdec_h264_mv h264_mv;
+    struct vdec_mv_buff_size mv_buff_size;
 
-  mv_buff_size.width = drv_ctx.video_resolution.stride;
-  mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2;
+    mv_buff_size.width = drv_ctx.video_resolution.stride;
+    mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2;
 
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = (void*)&mv_buff_size;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = (void*)&mv_buff_size;
 
-  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" ,
-      mv_buff_size.width, mv_buff_size.height);
-    return OMX_ErrorInsufficientResources;
-  }
+    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" ,
+                mv_buff_size.width, mv_buff_size.height);
+        return OMX_ErrorInsufficientResources;
+    }
 
-  DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d",
-                    mv_buff_size.size, mv_buff_size.alignment);
+    DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d",
+            mv_buff_size.size, mv_buff_size.alignment);
 
-  size = mv_buff_size.size * drv_ctx.op_buf.actualcount;
-  alignment = mv_buff_size.alignment;
+    size = mv_buff_size.size * drv_ctx.op_buf.actualcount;
+    alignment = mv_buff_size.alignment;
 
-  DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d",
-                   drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment);
+    DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d",
+            drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment);
 
 
 #ifdef USE_ION
- drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory(
-                    size, 8192,
-                    &drv_ctx.h264_mv.ion_alloc_data,
-                    &drv_ctx.h264_mv.fd_ion_data,ION_FLAG_CACHED);
-  if (drv_ctx.h264_mv.ion_device_fd < 0) {
+    drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory(
+            size, 8192,
+            &drv_ctx.h264_mv.ion_alloc_data,
+            &drv_ctx.h264_mv.fd_ion_data,ION_FLAG_CACHED);
+
+    if (drv_ctx.h264_mv.ion_device_fd < 0) {
         return OMX_ErrorInsufficientResources;
-  }
-  pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd;
+    }
+
+    pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd;
 #else
-  allocation.size = size;
-  allocation.align = clip2(alignment);
-  if (allocation.align != 8192)
-    allocation.align = 8192;
+    allocation.size = size;
+    allocation.align = clip2(alignment);
 
-  pmem_fd = open(MEM_DEVICE, O_RDWR);
+    if (allocation.align != 8192)
+        allocation.align = 8192;
 
-  if ((int)(pmem_fd) < 0)
-      return OMX_ErrorInsufficientResources;
+    pmem_fd = open(MEM_DEVICE, O_RDWR);
 
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
-      allocation.align, allocation.size);
-    return OMX_ErrorInsufficientResources;
-  }
-#endif
-  if(!secure_mode) {
-      buf_addr = mmap(NULL, size,
-                   PROT_READ | PROT_WRITE,
-                   MAP_SHARED, pmem_fd, 0);
-
-      if (buf_addr == (void*) MAP_FAILED)
-      {
-        close(pmem_fd);
-#ifdef USE_ION
-        free_ion_memory(&drv_ctx.h264_mv);
-#endif
-        pmem_fd = -1;
-        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+    if ((int)(pmem_fd) < 0)
         return OMX_ErrorInsufficientResources;
-      }
-   } else
-      buf_addr =(unsigned char *) (pmem_fd + 1234);
-  DEBUG_PRINT_LOW("Allocated virt:%p, FD: %d of size %d count: %d", buf_addr,
-                   pmem_fd, size, drv_ctx.op_buf.actualcount);
 
-  h264_mv.size = size;
-  h264_mv.count = drv_ctx.op_buf.actualcount;
-  h264_mv.pmem_fd = pmem_fd;
-  h264_mv.offset = 0;
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+                allocation.align, allocation.size);
+        return OMX_ErrorInsufficientResources;
+    }
 
-  ioctl_msg.in = (void*)&h264_mv;
-  ioctl_msg.out = NULL;
+#endif
 
-  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n");
-    return OMX_ErrorInsufficientResources;
-  }
+    if (!secure_mode) {
+        buf_addr = mmap(NULL, size,
+                PROT_READ | PROT_WRITE,
+                MAP_SHARED, pmem_fd, 0);
 
-  h264_mv_buff.buffer = (unsigned char *) buf_addr;
-  h264_mv_buff.size = size;
-  h264_mv_buff.count = drv_ctx.op_buf.actualcount;
-  h264_mv_buff.offset = 0;
-  h264_mv_buff.pmem_fd = pmem_fd;
-  DEBUG_PRINT_LOW("Saving virt:%p, FD: %d of size %d count: %d", h264_mv_buff.buffer,
-                   h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount);
-  return OMX_ErrorNone;
+        if (buf_addr == (void*) MAP_FAILED) {
+            close(pmem_fd);
+#ifdef USE_ION
+            free_ion_memory(&drv_ctx.h264_mv);
+#endif
+            pmem_fd = -1;
+            DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+            return OMX_ErrorInsufficientResources;
+        }
+    } else
+        buf_addr =(unsigned char *) (pmem_fd + 1234);
+
+    DEBUG_PRINT_LOW("Allocated virt:%p, FD: %d of size %d count: %d", buf_addr,
+            pmem_fd, size, drv_ctx.op_buf.actualcount);
+
+    h264_mv.size = size;
+    h264_mv.count = drv_ctx.op_buf.actualcount;
+    h264_mv.pmem_fd = pmem_fd;
+    h264_mv.offset = 0;
+
+    ioctl_msg.in = (void*)&h264_mv;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n");
+        return OMX_ErrorInsufficientResources;
+    }
+
+    h264_mv_buff.buffer = (unsigned char *) buf_addr;
+    h264_mv_buff.size = size;
+    h264_mv_buff.count = drv_ctx.op_buf.actualcount;
+    h264_mv_buff.offset = 0;
+    h264_mv_buff.pmem_fd = pmem_fd;
+    DEBUG_PRINT_LOW("Saving virt:%p, FD: %d of size %d count: %d", h264_mv_buff.buffer,
+            h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount);
+    return OMX_ErrorNone;
 }
 
 void omx_vdec::vdec_dealloc_h264_mv()
 {
-    if(h264_mv_buff.pmem_fd > 0)
-    {
-      if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0)
-        DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed");
-      if(!secure_mode)
-          munmap(h264_mv_buff.buffer, h264_mv_buff.size);
-      close(h264_mv_buff.pmem_fd);
+    if (h264_mv_buff.pmem_fd > 0) {
+        if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0)
+            DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed");
+
+        if (!secure_mode)
+            munmap(h264_mv_buff.buffer, h264_mv_buff.size);
+
+        close(h264_mv_buff.pmem_fd);
 #ifdef USE_ION
-      free_ion_memory(&drv_ctx.h264_mv);
+        free_ion_memory(&drv_ctx.h264_mv);
 #endif
-      DEBUG_PRINT_LOW("Cleaning H264_MV buffer of size %d",h264_mv_buff.size);
-      h264_mv_buff.pmem_fd = -1;
-      h264_mv_buff.offset = 0;
-      h264_mv_buff.size = 0;
-      h264_mv_buff.count = 0;
-      h264_mv_buff.buffer = NULL;
+        DEBUG_PRINT_LOW("Cleaning H264_MV buffer of size %d",h264_mv_buff.size);
+        h264_mv_buff.pmem_fd = -1;
+        h264_mv_buff.offset = 0;
+        h264_mv_buff.size = 0;
+        h264_mv_buff.count = 0;
+        h264_mv_buff.buffer = NULL;
     }
 }
 
@@ -9561,21 +9212,23 @@
 #ifdef _ANDROID_
 OMX_ERRORTYPE omx_vdec::createDivxDrmContext()
 {
-     OMX_ERRORTYPE err = OMX_ErrorNone;
-     iDivXDrmDecrypt = DivXDrmDecrypt::Create();
-     if (iDivXDrmDecrypt) {
-          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
-          if(err!=OMX_ErrorNone) {
+    OMX_ERRORTYPE err = OMX_ErrorNone;
+    iDivXDrmDecrypt = DivXDrmDecrypt::Create();
+
+    if (iDivXDrmDecrypt) {
+        OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
+
+        if (err!=OMX_ErrorNone) {
             DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
             delete iDivXDrmDecrypt;
             iDivXDrmDecrypt = NULL;
-          }
-     }
-     else {
-          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
-          err = OMX_ErrorUndefined;
-     }
-     return err;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
+        err = OMX_ErrorUndefined;
+    }
+
+    return err;
 }
 #endif //_ANDROID_
 
@@ -9603,9 +9256,9 @@
 
     if (ph->powerHint) {
         snprintf(powerHintMetadata, sizeof(powerHintMetadata) - 1,
-                 "state=1;framewidth=%u;frameheight=%u;bitrate=%u",
-                 m_port_def.format.video.nFrameWidth, m_port_def.format.video.nFrameHeight,
-                 m_port_def.format.video.nBitrate);
+                "state=1;framewidth=%u;frameheight=%u;bitrate=%u",
+                m_port_def.format.video.nFrameWidth, m_port_def.format.video.nFrameHeight,
+                m_port_def.format.video.nBitrate);
         powerHintMetadata[sizeof(powerHintMetadata) - 1] = '\0';
 
         ph->powerHint(ph, POWER_HINT_VIDEO_DECODE, (void *)powerHintMetadata);
@@ -9613,6 +9266,7 @@
     } else {
         DEBUG_PRINT_ERROR("No hint called for register");
     }
+
     return OMX_ErrorNone;
 }
 
@@ -9642,337 +9296,398 @@
     } else {
         DEBUG_PRINT_ERROR("No hint called for deregister");
     }
+
     return OMX_ErrorNone;
 }
 omx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
 {
-  enabled = false;
-  omx = NULL;
-  init_members();
-  ColorFormat = OMX_COLOR_FormatMax;
+    enabled = false;
+    omx = NULL;
+    init_members();
+    ColorFormat = OMX_COLOR_FormatMax;
 }
 
 void omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
 {
-  omx = reinterpret_cast<omx_vdec*>(client);
+    omx = reinterpret_cast<omx_vdec*>(client);
 }
 
-void omx_vdec::allocate_color_convert_buf::init_members() {
-  allocated_count = 0;
-  buffer_size_req = 0;
-  buffer_alignment_req = 0;
-  memset(m_platform_list_client,0,sizeof(m_platform_list_client));
-  memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
-  memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
-  memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
-  memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
-  for (int i = 0; i < MAX_COUNT;i++)
-    pmem_fd[i] = -1;
+void omx_vdec::allocate_color_convert_buf::init_members()
+{
+    allocated_count = 0;
+    buffer_size_req = 0;
+    buffer_alignment_req = 0;
+    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
+    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
+    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
+    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
+    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
+
+    for (int i = 0; i < MAX_COUNT; i++)
+        pmem_fd[i] = -1;
 }
 
-omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
-  c2d.destroy();
+omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
+{
+    c2d.destroy();
 }
 
 bool omx_vdec::allocate_color_convert_buf::update_buffer_req()
 {
-  bool status = true;
-  unsigned int src_size = 0, destination_size = 0;
-  OMX_COLOR_FORMATTYPE drv_color_format;
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
-    return false;
-  }
-  if (!enabled){
-    DEBUG_PRINT_ERROR("\n No color conversion required");
-    return status;
-  }
-  if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_TILE_4x2 &&
-      ColorFormat != OMX_COLOR_FormatYUV420Planar) {
-    DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
-    return false;
-  }
-  c2d.close();
-  status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
-                    omx->drv_ctx.video_resolution.frame_width,
-                    YCbCr420Tile,YCbCr420P);
-  if (status) {
-    status = c2d.get_buffer_size(C2D_INPUT,src_size);
-    if (status)
-      status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
-  }
-  if (status) {
-    if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
-        !destination_size) {
-      DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
-            "driver size %d destination size %d",
-             src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
-      status = false;
-      c2d.close();
-      buffer_size_req = 0;
-    } else {
-      buffer_size_req = destination_size;
-      if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
-	     buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
-      if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
-            buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+    bool status = true;
+    unsigned int src_size = 0, destination_size = 0;
+    OMX_COLOR_FORMATTYPE drv_color_format;
+
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+        return false;
     }
-  }
-  return status;
+
+    if (!enabled) {
+        DEBUG_PRINT_ERROR("\n No color conversion required");
+        return status;
+    }
+
+    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_TILE_4x2 &&
+            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+        DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
+        return false;
+    }
+
+    c2d.close();
+    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
+            omx->drv_ctx.video_resolution.frame_width,
+            YCbCr420Tile,YCbCr420P);
+
+    if (status) {
+        status = c2d.get_buffer_size(C2D_INPUT,src_size);
+
+        if (status)
+            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
+    }
+
+    if (status) {
+        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
+                !destination_size) {
+            DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
+                    "driver size %d destination size %d",
+                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
+            status = false;
+            c2d.close();
+            buffer_size_req = 0;
+        } else {
+            buffer_size_req = destination_size;
+
+            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
+                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
+
+            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+        }
+    }
+
+    return status;
 }
 
 bool omx_vdec::allocate_color_convert_buf::set_color_format(
-  OMX_COLOR_FORMATTYPE dest_color_format)
+        OMX_COLOR_FORMATTYPE dest_color_format)
 {
-  bool status = true;
-  OMX_COLOR_FORMATTYPE drv_color_format;
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
-    return false;
-  }
-  if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
-    drv_color_format = (OMX_COLOR_FORMATTYPE)
-    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
-  else {
-    DEBUG_PRINT_ERROR("\n Incorrect color format");
-    status = false;
-  }
-  if (status && (drv_color_format != dest_color_format)) {
-    DEBUG_PRINT_ERROR("");
-    if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
-      DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
-      status = false;
-    } else {
-      ColorFormat = OMX_COLOR_FormatYUV420Planar;
-      if (enabled)
-        c2d.destroy();
-      enabled = false;
-      if (!c2d.init()) {
-        DEBUG_PRINT_ERROR("\n open failed for c2d");
-        status = false;
-      } else
-        enabled = true;
+    bool status = true;
+    OMX_COLOR_FORMATTYPE drv_color_format;
+
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+        return false;
     }
-  } else {
-    if (enabled)
-      c2d.destroy();
-    enabled = false;
-  }
-  return status;
+
+    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
+        drv_color_format = (OMX_COLOR_FORMATTYPE)
+            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+    else {
+        DEBUG_PRINT_ERROR("\n Incorrect color format");
+        status = false;
+    }
+
+    if (status && (drv_color_format != dest_color_format)) {
+        DEBUG_PRINT_ERROR("");
+
+        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
+            DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
+            status = false;
+        } else {
+            ColorFormat = OMX_COLOR_FormatYUV420Planar;
+
+            if (enabled)
+                c2d.destroy();
+
+            enabled = false;
+
+            if (!c2d.init()) {
+                DEBUG_PRINT_ERROR("\n open failed for c2d");
+                status = false;
+            } else
+                enabled = true;
+        }
+    } else {
+        if (enabled)
+            c2d.destroy();
+
+        enabled = false;
+    }
+
+    return status;
 }
 
 OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
 {
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return omx->m_out_mem_ptr;
-  return m_out_mem_ptr_client;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
-       (OMX_BUFFERHEADERTYPE *bufadd)
-{
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return bufadd;
-  unsigned index = 0;
-  index = bufadd - omx->m_out_mem_ptr;
-  if (index < omx->drv_ctx.op_buf.actualcount) {
-    m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
-    m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
-    bool status;
-    if (!omx->in_reconfig && !omx->output_flush_progress) {
-      status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
-                  bufadd->pBuffer,pmem_fd[index],pmem_baseaddress[index]);
-      m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
-      if (!status){
-        DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
         return NULL;
-      }
-    } else
-      m_out_mem_ptr_client[index].nFilledLen = 0;
-    return &m_out_mem_ptr_client[index];
-  }
-  DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
-  return NULL;
+    }
+
+    if (!enabled)
+        return omx->m_out_mem_ptr;
+
+    return m_out_mem_ptr_client;
 }
 
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
-                                              (OMX_BUFFERHEADERTYPE *bufadd)
+    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
 {
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
+    }
+
+    if (!enabled)
+        return bufadd;
+
+    unsigned index = 0;
+    index = bufadd - omx->m_out_mem_ptr;
+
+    if (index < omx->drv_ctx.op_buf.actualcount) {
+        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
+        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
+        bool status;
+
+        if (!omx->in_reconfig && !omx->output_flush_progress) {
+            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
+                    bufadd->pBuffer,pmem_fd[index],pmem_baseaddress[index]);
+            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
+
+            if (!status) {
+                DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
+                return NULL;
+            }
+        } else
+            m_out_mem_ptr_client[index].nFilledLen = 0;
+
+        return &m_out_mem_ptr_client[index];
+    }
+
+    DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
     return NULL;
-  }
-  if (!enabled)
-    return bufadd;
-  unsigned index = 0;
-  index = bufadd - m_out_mem_ptr_client;
-  if (index < omx->drv_ctx.op_buf.actualcount) {
-    return &omx->m_out_mem_ptr[index];
-  }
-  DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
-  return NULL;
 }
-bool omx_vdec::allocate_color_convert_buf::get_buffer_req
-          (unsigned int &buffer_size)
+
+    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
 {
-  if (!enabled)
-    buffer_size = omx->drv_ctx.op_buf.buffer_size;
-  else
-    if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
-      DEBUG_PRINT_ERROR("\n Get buffer size failed");
-      return false;
-  }
-  if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
+    }
+
+    if (!enabled)
+        return bufadd;
+
+    unsigned index = 0;
+    index = bufadd - m_out_mem_ptr_client;
+
+    if (index < omx->drv_ctx.op_buf.actualcount) {
+        return &omx->m_out_mem_ptr[index];
+    }
+
+    DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
+    return NULL;
+}
+    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
+(unsigned int &buffer_size)
+{
+    if (!enabled)
         buffer_size = omx->drv_ctx.op_buf.buffer_size;
-  if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
-	  buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+    else if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
+        DEBUG_PRINT_ERROR("\n Get buffer size failed");
+        return false;
+    }
+
+    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+        buffer_size = omx->drv_ctx.op_buf.buffer_size;
+
+    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+
     return true;
 }
 OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
-  OMX_BUFFERHEADERTYPE *bufhdr) {
-  unsigned int index = 0;
+        OMX_BUFFERHEADERTYPE *bufhdr)
+{
+    unsigned int index = 0;
 
-  if (!enabled)
-    return omx->free_output_buffer(bufhdr);
-  if (enabled && omx->is_component_secure())
-    return OMX_ErrorNone;
-  if (!allocated_count || !bufhdr) {
-    DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
-    return OMX_ErrorBadParameter;
-  }
-  index = bufhdr - m_out_mem_ptr_client;
-  if (index >= omx->drv_ctx.op_buf.actualcount){
-    DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
-    return OMX_ErrorBadParameter;
-  }
-  if (pmem_fd[index] > 0) {
-    munmap(pmem_baseaddress[index], buffer_size_req);
-    close(pmem_fd[index]);
-  }
-  pmem_fd[index] = -1;
-  omx->free_ion_memory(&op_buf_ion_info[index]);
-  m_heap_ptr[index].video_heap_ptr = NULL;
-  if (allocated_count > 0)
-    allocated_count--;
-  else
-    allocated_count = 0;
-  if (!allocated_count) {
-    c2d.close();
-    init_members();
-  }
-  return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
+    if (!enabled)
+        return omx->free_output_buffer(bufhdr);
+
+    if (enabled && omx->is_component_secure())
+        return OMX_ErrorNone;
+
+    if (!allocated_count || !bufhdr) {
+        DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
+        return OMX_ErrorBadParameter;
+    }
+
+    index = bufhdr - m_out_mem_ptr_client;
+
+    if (index >= omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
+        return OMX_ErrorBadParameter;
+    }
+
+    if (pmem_fd[index] > 0) {
+        munmap(pmem_baseaddress[index], buffer_size_req);
+        close(pmem_fd[index]);
+    }
+
+    pmem_fd[index] = -1;
+    omx->free_ion_memory(&op_buf_ion_info[index]);
+    m_heap_ptr[index].video_heap_ptr = NULL;
+
+    if (allocated_count > 0)
+        allocated_count--;
+    else
+        allocated_count = 0;
+
+    if (!allocated_count) {
+        c2d.close();
+        init_members();
+    }
+
+    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
-  OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
+        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (!enabled){
-    eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
-    return eRet;
-  }
-  if (enabled && omx->is_component_secure()) {
-    DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
-                      omx->is_component_secure());
-    return OMX_ErrorUnsupportedSetting;
-  }
-  if (!bufferHdr || bytes > buffer_size_req) {
-    DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
-    DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %d",
-                      buffer_size_req,bytes);
-    return OMX_ErrorBadParameter;
-  }
-  if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
-    return OMX_ErrorInsufficientResources;
-  }
-  OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
-  eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
-         port,appData,omx->drv_ctx.op_buf.buffer_size);
-  if (eRet != OMX_ErrorNone || !temp_bufferHdr){
-    DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
-    return eRet;
-  }
-  if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
-      omx->drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("\n Invalid header index %d",
-             (temp_bufferHdr - omx->m_out_mem_ptr));
-    return OMX_ErrorUndefined;
-  }
-  unsigned int i = allocated_count;
-  op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
-    buffer_size_req,buffer_alignment_req,
-    &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
-    ION_FLAG_CACHED);
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
-  if (op_buf_ion_info[i].ion_device_fd < 0) {
-    DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
-    return OMX_ErrorInsufficientResources;
-  }
-  pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
-                     PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
+    if (!enabled) {
+        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+        return eRet;
+    }
 
-  if (pmem_baseaddress[i] == MAP_FAILED) {
-    DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
-    close(pmem_fd[i]);
-    omx->free_ion_memory(&op_buf_ion_info[i]);
-    return OMX_ErrorInsufficientResources;
-  }
-  m_heap_ptr[i].video_heap_ptr = new VideoHeap (
-    op_buf_ion_info[i].ion_device_fd,buffer_size_req,
-    pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
-  m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
-  m_pmem_info_client[i].offset = 0;
-  m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
-  m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-  m_platform_list_client[i].nEntries = 1;
-  m_platform_list_client[i].entryList = &m_platform_entry_client[i];
-  m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
-  m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
-  m_out_mem_ptr_client[i].nFilledLen = 0;
-  m_out_mem_ptr_client[i].nFlags = 0;
-  m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
-  m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
-  m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
-  m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
-  m_out_mem_ptr_client[i].pAppPrivate = appData;
-  *bufferHdr = &m_out_mem_ptr_client[i];
-  DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
-  allocated_count++;
-  return eRet;
+    if (enabled && omx->is_component_secure()) {
+        DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
+                omx->is_component_secure());
+        return OMX_ErrorUnsupportedSetting;
+    }
+
+    if (!bufferHdr || bytes > buffer_size_req) {
+        DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
+        DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %d",
+                buffer_size_req,bytes);
+        return OMX_ErrorBadParameter;
+    }
+
+    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
+        return OMX_ErrorInsufficientResources;
+    }
+
+    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
+    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
+            port,appData,omx->drv_ctx.op_buf.buffer_size);
+
+    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
+        DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
+        return eRet;
+    }
+
+    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
+            omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Invalid header index %d",
+                (temp_bufferHdr - omx->m_out_mem_ptr));
+        return OMX_ErrorUndefined;
+    }
+
+    unsigned int i = allocated_count;
+    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
+            buffer_size_req,buffer_alignment_req,
+            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
+            ION_FLAG_CACHED);
+
+    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
+
+    if (op_buf_ion_info[i].ion_device_fd < 0) {
+        DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
+        return OMX_ErrorInsufficientResources;
+    }
+
+    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
+            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
+
+    if (pmem_baseaddress[i] == MAP_FAILED) {
+        DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
+        close(pmem_fd[i]);
+        omx->free_ion_memory(&op_buf_ion_info[i]);
+        return OMX_ErrorInsufficientResources;
+    }
+
+    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
+            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
+            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
+    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
+    m_pmem_info_client[i].offset = 0;
+    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
+    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+    m_platform_list_client[i].nEntries = 1;
+    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
+    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
+    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
+    m_out_mem_ptr_client[i].nFilledLen = 0;
+    m_out_mem_ptr_client[i].nFlags = 0;
+    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
+    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
+    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
+    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
+    m_out_mem_ptr_client[i].pAppPrivate = appData;
+    *bufferHdr = &m_out_mem_ptr_client[i];
+    DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
+    allocated_count++;
+    return eRet;
 }
 
 bool omx_vdec::is_component_secure()
 {
-  return secure_mode;
+    return secure_mode;
 }
 
 bool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
 {
-  bool status = true;
-  if (!enabled) {
-    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
-     dest_color_format =  (OMX_COLOR_FORMATTYPE)
-            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
-    else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
-      dest_color_format = OMX_COLOR_FormatYUV420SemiPlanar;
-    else
-      status = false;
-  } else {
-    if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
-      status = false;
-    } else
-      dest_color_format = OMX_COLOR_FormatYUV420Planar;
-  }
-  return status;
+    bool status = true;
+
+    if (!enabled) {
+        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
+            dest_color_format =  (OMX_COLOR_FORMATTYPE)
+                QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+        else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+            dest_color_format = OMX_COLOR_FormatYUV420SemiPlanar;
+        else
+            status = false;
+    } else {
+        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+            status = false;
+        } else
+            dest_color_format = OMX_COLOR_FormatYUV420Planar;
+    }
+
+    return status;
 }
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp
index b2e6408..e9ed0be 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp
@@ -120,9 +120,9 @@
 #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
 
 #ifdef _ANDROID_
-    extern "C"{
-        #include<utils/Log.h>
-    }
+extern "C" {
+#include<utils/Log.h>
+}
 #endif//_ANDROID_
 
 #define SZ_4K 0x1000
@@ -135,183 +135,176 @@
 #define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
 void* async_message_thread (void *input)
 {
-  OMX_BUFFERHEADERTYPE *buffer;
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  struct pollfd pfd;
-  struct v4l2_buffer v4l2_buf;
-  memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
-  struct v4l2_event dqevent;
-  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
-  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
-  pfd.fd = omx->drv_ctx.video_driver_fd;
-  int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
-  DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
-  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
-  while (1)
-  {
-    rc = poll(&pfd, 1, POLL_TIMEOUT);
-    if (!rc) {
-      DEBUG_PRINT_ERROR("Poll timedout\n");
-      break;
-    } else if (rc < 0) {
-      DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
-      break;
+    OMX_BUFFERHEADERTYPE *buffer;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    struct pollfd pfd;
+    struct v4l2_buffer v4l2_buf;
+    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
+    struct v4l2_event dqevent;
+    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
+    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
+    pfd.fd = omx->drv_ctx.video_driver_fd;
+    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
+    DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
+    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
+    while (1) {
+        rc = poll(&pfd, 1, POLL_TIMEOUT);
+        if (!rc) {
+            DEBUG_PRINT_ERROR("Poll timedout\n");
+            break;
+        } else if (rc < 0) {
+            DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
+            break;
+        }
+        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
+            struct vdec_msginfo vdec_msg;
+            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+            v4l2_buf.length = omx->drv_ctx.num_planes;
+            v4l2_buf.m.planes = plane;
+            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
+                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
+                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
+                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
+                    (uint64_t)v4l2_buf.timestamp.tv_usec;
+                if (vdec_msg.msgdata.output_frame.len) {
+                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
+                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
+                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
+                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
+                }
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            }
+        }
+        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
+            struct vdec_msginfo vdec_msg;
+            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+            v4l2_buf.length = 1;
+            v4l2_buf.m.planes = plane;
+            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            }
+        }
+        if (pfd.revents & POLLPRI) {
+            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
+                DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
+                break;
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else {
+                DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
+                continue;
+            }
+        }
     }
-    if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
-      struct vdec_msginfo vdec_msg;
-      v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-      v4l2_buf.memory = V4L2_MEMORY_USERPTR;
-      v4l2_buf.length = omx->drv_ctx.num_planes;
-      v4l2_buf.m.planes = plane;
-      while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
-        vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
-        vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
-        vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
-        vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
-          (uint64_t)v4l2_buf.timestamp.tv_usec;
-        if (vdec_msg.msgdata.output_frame.len) {
-            vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
-            vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
-            vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
-            vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
-        }
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      }
-    }
-    if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
-      struct vdec_msginfo vdec_msg;
-      v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-      v4l2_buf.memory = V4L2_MEMORY_USERPTR;
-      v4l2_buf.length = 1;
-      v4l2_buf.m.planes = plane;
-      while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
-        vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      }
-    }
-    if (pfd.revents & POLLPRI){
-      rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
-      if(dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else if(dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-        vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
-        DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
-        break;
-      } else if(dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else {
-        DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
-        continue;
-      }
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
-  return NULL;
+    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
+    return NULL;
 }
 
 void* message_thread(void *input)
 {
-  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
-  unsigned char id;
-  int n;
-  if (omx == NULL)
-  {
-    DEBUG_PRINT_ERROR("message thread null pointer rxd\n");
+    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
+    unsigned char id;
+    int n;
+    if (omx == NULL) {
+        DEBUG_PRINT_ERROR("message thread null pointer rxd\n");
+        return NULL;
+    }
+
+    DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
+    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
+    while (1) {
+
+        n = read(omx->m_pipe_in, &id, 1);
+
+        if (0 == n) {
+            break;
+        }
+
+        if (1 == n) {
+            omx->process_event_cb(omx, id);
+        }
+        if ((n < 0) && (errno != EINTR)) {
+            DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
+            break;
+        }
+    }
+    DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
     return NULL;
-  }
-
-  DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
-  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
-  while (1)
-  {
-
-    n = read(omx->m_pipe_in, &id, 1);
-
-    if(0 == n)
-    {
-      break;
-    }
-
-    if (1 == n)
-    {
-        omx->process_event_cb(omx, id);
-    }
-    if ((n < 0) && (errno != EINTR))
-    {
-      DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
-      break;
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
-  return NULL;
 }
 
 void post_message(omx_vdec *omx, unsigned char id)
 {
-  int ret_value;
+    int ret_value;
 
-  if (omx == NULL)
-  {
-    DEBUG_PRINT_ERROR("message thread null pointer rxd\n");
-    return;
-  }
-  DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
-  ret_value = write(omx->m_pipe_out, &id, 1);
-  DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
+    if (omx == NULL) {
+        DEBUG_PRINT_ERROR("message thread null pointer rxd\n");
+        return;
+    }
+    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
+    ret_value = write(omx->m_pipe_out, &id, 1);
+    DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
 }
 
 // omx_cmd_queue destructor
 omx_vdec::omx_cmd_queue::~omx_cmd_queue()
 {
-  // Nothing to do
+    // Nothing to do
 }
 
 // omx cmd queue constructor
@@ -323,49 +316,41 @@
 // omx cmd queue insert
 bool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
 {
-  bool ret = true;
-  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
-  {
-    m_q[m_write].id       = id;
-    m_q[m_write].param1   = p1;
-    m_q[m_write].param2   = p2;
-    m_write++;
-    m_size ++;
-    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_write = 0;
+    bool ret = true;
+    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
+        m_q[m_write].id       = id;
+        m_q[m_write].param1   = p1;
+        m_q[m_write].param2   = p2;
+        m_write++;
+        m_size ++;
+        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_write = 0;
+        }
+    } else {
+        ret = false;
+        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
     }
-  }
-  else
-  {
-    ret = false;
-    DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
-  }
-  return ret;
+    return ret;
 }
 
 // omx cmd queue pop
 bool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
 {
-  bool ret = true;
-  if (m_size > 0)
-  {
-    *id = m_q[m_read].id;
-    *p1 = m_q[m_read].param1;
-    *p2 = m_q[m_read].param2;
-    // Move the read pointer ahead
-    ++m_read;
-    --m_size;
-    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_read = 0;
+    bool ret = true;
+    if (m_size > 0) {
+        *id = m_q[m_read].id;
+        *p1 = m_q[m_read].param1;
+        *p2 = m_q[m_read].param2;
+        // Move the read pointer ahead
+        ++m_read;
+        --m_size;
+        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_read = 0;
+        }
+    } else {
+        ret = false;
     }
-  }
-  else
-  {
-    ret = false;
-  }
-  return ret;
+    return ret;
 }
 
 // Retrieve the first mesg type in the queue
@@ -377,116 +362,104 @@
 #ifdef _ANDROID_
 omx_vdec::ts_arr_list::ts_arr_list()
 {
-  //initialize timestamps array
-  memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
+    //initialize timestamps array
+    memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
 }
 omx_vdec::ts_arr_list::~ts_arr_list()
 {
-  //free m_ts_arr_list?
+    //free m_ts_arr_list?
 }
 
 bool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
 {
-  bool ret = true;
-  bool duplicate_ts = false;
-  int idx = 0;
+    bool ret = true;
+    bool duplicate_ts = false;
+    int idx = 0;
 
-  //insert at the first available empty location
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
-    if (!m_ts_arr_list[idx].valid)
-    {
-      //found invalid or empty entry, save timestamp
-      m_ts_arr_list[idx].valid = true;
-      m_ts_arr_list[idx].timestamp = ts;
-      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
-                       ts, idx);
-      break;
+    //insert at the first available empty location
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+        if (!m_ts_arr_list[idx].valid) {
+            //found invalid or empty entry, save timestamp
+            m_ts_arr_list[idx].valid = true;
+            m_ts_arr_list[idx].timestamp = ts;
+            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
+                    ts, idx);
+            break;
+        }
     }
-  }
 
-  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
-  {
-    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
-    ret = false;
-  }
-  return ret;
+    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
+        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
+        ret = false;
+    }
+    return ret;
 }
 
 bool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
 {
-  bool ret = true;
-  int min_idx = -1;
-  OMX_TICKS min_ts = 0;
-  int idx = 0;
+    bool ret = true;
+    int min_idx = -1;
+    OMX_TICKS min_ts = 0;
+    int idx = 0;
 
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
 
-    if (m_ts_arr_list[idx].valid)
-    {
-      //found valid entry, save index
-      if (min_idx < 0)
-      {
-        //first valid entry
-        min_ts = m_ts_arr_list[idx].timestamp;
-        min_idx = idx;
-      }
-      else if (m_ts_arr_list[idx].timestamp < min_ts)
-      {
-        min_ts = m_ts_arr_list[idx].timestamp;
-        min_idx = idx;
-      }
+        if (m_ts_arr_list[idx].valid) {
+            //found valid entry, save index
+            if (min_idx < 0) {
+                //first valid entry
+                min_ts = m_ts_arr_list[idx].timestamp;
+                min_idx = idx;
+            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
+                min_ts = m_ts_arr_list[idx].timestamp;
+                min_idx = idx;
+            }
+        }
+
     }
 
-  }
+    if (min_idx < 0) {
+        //no valid entries found
+        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
+        ts = 0;
+        ret = false;
+    } else {
+        ts = m_ts_arr_list[min_idx].timestamp;
+        m_ts_arr_list[min_idx].valid = false;
+        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
+                ts, min_idx);
+    }
 
-  if (min_idx < 0)
-  {
-    //no valid entries found
-    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
-    ts = 0;
-    ret = false;
-  }
-  else
-  {
-    ts = m_ts_arr_list[min_idx].timestamp;
-    m_ts_arr_list[min_idx].valid = false;
-    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
-                     ts, min_idx);
-  }
-
-  return ret;
+    return ret;
 
 }
 
 
 bool omx_vdec::ts_arr_list::reset_ts_list()
 {
-  bool ret = true;
-  int idx = 0;
+    bool ret = true;
+    int idx = 0;
 
-  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
-    m_ts_arr_list[idx].valid = false;
-  }
-  return ret;
+    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+        m_ts_arr_list[idx].valid = false;
+    }
+    return ret;
 }
 #endif
 
 // factory function executed by the core to create instances
 void *get_omx_component_factory_fn(void)
 {
-  return (new omx_vdec);
+    return (new omx_vdec);
 }
 
 #ifdef _ANDROID_
 #ifdef USE_ION
 VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
-                     struct ion_handle *handle, int ionMapfd)
+        struct ion_handle *handle, int ionMapfd)
 {
-//    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
+    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
 }
 #else
 VideoHeap::VideoHeap(int fd, size_t size, void* base)
@@ -497,823 +470,725 @@
 #endif
 #endif // _ANDROID_
 /* ======================================================================
-FUNCTION
-  omx_vdec::omx_vdec
+   FUNCTION
+   omx_vdec::omx_vdec
 
-DESCRIPTION
-  Constructor
+   DESCRIPTION
+   Constructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_vdec::omx_vdec(): m_error_propogated(false),
-	m_state(OMX_StateInvalid),
-	m_app_data(NULL),
-	m_inp_mem_ptr(NULL),
-	m_out_mem_ptr(NULL),
-	m_inp_err_count(0),
-	input_flush_progress (false),
-	output_flush_progress (false),
-	input_use_buffer (false),
-	output_use_buffer (false),
-	ouput_egl_buffers(false),
-	m_use_output_pmem(OMX_FALSE),
-	m_out_mem_region_smi(OMX_FALSE),
-	m_out_pvt_entry_pmem(OMX_FALSE),
-	pending_input_buffers(0),
-	pending_output_buffers(0),
-	m_out_bm_count(0),
-	m_inp_bm_count(0),
-	m_inp_bPopulated(OMX_FALSE),
-	m_out_bPopulated(OMX_FALSE),
-	m_flags(0),
+    m_state(OMX_StateInvalid),
+    m_app_data(NULL),
+    m_inp_mem_ptr(NULL),
+    m_out_mem_ptr(NULL),
+    m_inp_err_count(0),
+    input_flush_progress (false),
+    output_flush_progress (false),
+    input_use_buffer (false),
+    output_use_buffer (false),
+    ouput_egl_buffers(false),
+    m_use_output_pmem(OMX_FALSE),
+    m_out_mem_region_smi(OMX_FALSE),
+    m_out_pvt_entry_pmem(OMX_FALSE),
+    pending_input_buffers(0),
+    pending_output_buffers(0),
+    m_out_bm_count(0),
+    m_inp_bm_count(0),
+    m_inp_bPopulated(OMX_FALSE),
+    m_out_bPopulated(OMX_FALSE),
+    m_flags(0),
 #ifdef _ANDROID_
-	m_heap_ptr(NULL),
+    m_heap_ptr(NULL),
 #endif
-	m_inp_bEnabled(OMX_TRUE),
-	m_out_bEnabled(OMX_TRUE),
-	m_in_alloc_cnt(0),
-	m_platform_list(NULL),
-	m_platform_entry(NULL),
-	m_pmem_info(NULL),
-	arbitrary_bytes (true),
-	psource_frame (NULL),
-	pdest_frame (NULL),
-	m_inp_heap_ptr (NULL),
-	m_phdr_pmem_ptr(NULL),
-	m_heap_inp_bm_count (0),
-	codec_type_parse ((codec_type)0),
-	first_frame_meta (true),
-	frame_count (0),
-	nal_count (0),
-	nal_length(0),
-	look_ahead_nal (false),
-	first_frame(0),
-	first_buffer(NULL),
-	first_frame_size (0),
-	m_device_file_ptr(NULL),
-	m_vc1_profile((vc1_profile_type)0),
-	h264_last_au_ts(LLONG_MAX),
-	h264_last_au_flags(0),
-	prev_ts(LLONG_MAX),
-	rst_prev_ts(true),
-	frm_int(0),
-	in_reconfig(false),
-	m_display_id(NULL),
-	h264_parser(NULL),
-	client_extradata(0),
+    m_inp_bEnabled(OMX_TRUE),
+    m_out_bEnabled(OMX_TRUE),
+    m_in_alloc_cnt(0),
+    m_platform_list(NULL),
+    m_platform_entry(NULL),
+    m_pmem_info(NULL),
+    arbitrary_bytes (true),
+    psource_frame (NULL),
+    pdest_frame (NULL),
+    m_inp_heap_ptr (NULL),
+    m_phdr_pmem_ptr(NULL),
+    m_heap_inp_bm_count (0),
+    codec_type_parse ((codec_type)0),
+    first_frame_meta (true),
+    frame_count (0),
+    nal_count (0),
+    nal_length(0),
+    look_ahead_nal (false),
+    first_frame(0),
+    first_buffer(NULL),
+    first_frame_size (0),
+    m_device_file_ptr(NULL),
+    m_vc1_profile((vc1_profile_type)0),
+    h264_last_au_ts(LLONG_MAX),
+    h264_last_au_flags(0),
+    prev_ts(LLONG_MAX),
+    rst_prev_ts(true),
+    frm_int(0),
+    in_reconfig(false),
+    m_display_id(NULL),
+    h264_parser(NULL),
+    client_extradata(0),
 #ifdef _ANDROID_
-	m_enable_android_native_buffers(OMX_FALSE),
-	m_use_android_native_buffers(OMX_FALSE),
-	iDivXDrmDecrypt(NULL),
+    m_enable_android_native_buffers(OMX_FALSE),
+    m_use_android_native_buffers(OMX_FALSE),
+    iDivXDrmDecrypt(NULL),
 #endif
-	m_desc_buffer_ptr(NULL),
-	secure_mode(false)
+    m_desc_buffer_ptr(NULL),
+    secure_mode(false)
 {
-  /* Assumption is that , to begin with , we have all the frames with decoder */
-  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
+    /* Assumption is that , to begin with , we have all the frames with decoder */
+    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
 #ifdef _ANDROID_
-  char property_value[PROPERTY_VALUE_MAX] = {0};
-  property_get("vidc.dec.debug.perf", property_value, "0");
-  perf_flag = atoi(property_value);
-  if (perf_flag)
-  {
-    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
-    dec_time.start();
-    proc_frms = latency = 0;
-  }
-  property_value[0] = '\0';
-  property_get("vidc.dec.debug.ts", property_value, "0");
-  m_debug_timestamp = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
-  if (m_debug_timestamp)
-  {
-    time_stamp_dts.set_timestamp_reorder_mode(true);
-    time_stamp_dts.enable_debug_print(true);
-  }
+    char property_value[PROPERTY_VALUE_MAX] = {0};
+    property_get("vidc.dec.debug.perf", property_value, "0");
+    perf_flag = atoi(property_value);
+    if (perf_flag) {
+        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
+        dec_time.start();
+        proc_frms = latency = 0;
+    }
+    property_value[0] = '\0';
+    property_get("vidc.dec.debug.ts", property_value, "0");
+    m_debug_timestamp = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
+    if (m_debug_timestamp) {
+        time_stamp_dts.set_timestamp_reorder_mode(true);
+        time_stamp_dts.enable_debug_print(true);
+    }
 
-  property_value[0] = '\0';
-  property_get("vidc.dec.debug.concealedmb", property_value, "0");
-  m_debug_concealedmb = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
+    property_value[0] = '\0';
+    property_get("vidc.dec.debug.concealedmb", property_value, "0");
+    m_debug_concealedmb = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
 
 #endif
-  memset(&m_cmp,0,sizeof(m_cmp));
-  memset(&m_cb,0,sizeof(m_cb));
-  memset (&drv_ctx,0,sizeof(drv_ctx));
-  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
-  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
-  memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
-  m_demux_entries = 0;
+    memset(&m_cmp,0,sizeof(m_cmp));
+    memset(&m_cb,0,sizeof(m_cb));
+    memset (&drv_ctx,0,sizeof(drv_ctx));
+    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
+    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
+    memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
+    m_demux_entries = 0;
 #ifdef _ANDROID_ICS_
-  memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
 #endif
-  memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
-  drv_ctx.timestamp_adjust = false;
-  drv_ctx.video_driver_fd = -1;
-  m_vendor_config.pData = NULL;
-  pthread_mutex_init(&m_lock, NULL);
-  pthread_mutex_init(&c_lock, NULL);
-  sem_init(&m_cmd_lock,0,0);
-  streaming[CAPTURE_PORT] =
-      streaming[OUTPUT_PORT] = false;
+    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
+    drv_ctx.timestamp_adjust = false;
+    drv_ctx.video_driver_fd = -1;
+    m_vendor_config.pData = NULL;
+    pthread_mutex_init(&m_lock, NULL);
+    pthread_mutex_init(&c_lock, NULL);
+    sem_init(&m_cmd_lock,0,0);
+    streaming[CAPTURE_PORT] =
+        streaming[OUTPUT_PORT] = false;
 #ifdef _ANDROID_
-  char extradata_value[PROPERTY_VALUE_MAX] = {0};
-  property_get("vidc.dec.debug.extradata", extradata_value, "0");
-  m_debug_extradata = atoi(extradata_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
+    char extradata_value[PROPERTY_VALUE_MAX] = {0};
+    property_get("vidc.dec.debug.extradata", extradata_value, "0");
+    m_debug_extradata = atoi(extradata_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
 #endif
-  m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
-  client_buffers.set_vdec_client(this);
+    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
+    client_buffers.set_vdec_client(this);
 }
 
 static const int event_type[] = {
-	V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
-	V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
-	V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
-	V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
-	V4L2_EVENT_MSM_VIDC_SYS_ERROR
+    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
+    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
+    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
+    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
+    V4L2_EVENT_MSM_VIDC_SYS_ERROR
 };
 
 static OMX_ERRORTYPE subscribe_to_events(int fd)
 {
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_event_subscription sub;
-	int array_sz = sizeof(event_type)/sizeof(int);
-	int i,rc;
-	if (fd < 0) {
-		printf("Invalid input: %d\n", fd);
-		return OMX_ErrorBadParameter;
-	}
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_event_subscription sub;
+    int array_sz = sizeof(event_type)/sizeof(int);
+    int i,rc;
+    if (fd < 0) {
+        printf("Invalid input: %d\n", fd);
+        return OMX_ErrorBadParameter;
+    }
 
-	for (i = 0; i < array_sz; ++i) {
-		memset(&sub, 0, sizeof(sub));
-		sub.type = event_type[i];
-		rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
-		if (rc) {
-			printf("Failed to subscribe event: 0x%x\n", sub.type);
-			break;
-		}
-	}
-	if (i < array_sz) {
-		for (--i; i >=0 ; i--) {
-			memset(&sub, 0, sizeof(sub));
-			sub.type = event_type[i];
-			rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
-			if (rc)
-				printf("Failed to unsubscribe event: 0x%x\n", sub.type);
-		}
-		eRet = OMX_ErrorNotImplemented;
-	}
-	return eRet;
+    for (i = 0; i < array_sz; ++i) {
+        memset(&sub, 0, sizeof(sub));
+        sub.type = event_type[i];
+        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+        if (rc) {
+            printf("Failed to subscribe event: 0x%x\n", sub.type);
+            break;
+        }
+    }
+    if (i < array_sz) {
+        for (--i; i >=0 ; i--) {
+            memset(&sub, 0, sizeof(sub));
+            sub.type = event_type[i];
+            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+            if (rc)
+                printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+        }
+        eRet = OMX_ErrorNotImplemented;
+    }
+    return eRet;
 }
 
 
 static OMX_ERRORTYPE unsubscribe_to_events(int fd)
 {
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_event_subscription sub;
-	int array_sz = sizeof(event_type)/sizeof(int);
-	int i,rc;
-	if (fd < 0) {
-		printf("Invalid input: %d\n", fd);
-		return OMX_ErrorBadParameter;
-	}
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_event_subscription sub;
+    int array_sz = sizeof(event_type)/sizeof(int);
+    int i,rc;
+    if (fd < 0) {
+        printf("Invalid input: %d\n", fd);
+        return OMX_ErrorBadParameter;
+    }
 
-	for (i = 0; i < array_sz; ++i) {
-		memset(&sub, 0, sizeof(sub));
-		sub.type = event_type[i];
-		rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
-		if (rc) {
-			printf("Failed to unsubscribe event: 0x%x\n", sub.type);
-			break;
-		}
-	}
-	return eRet;
+    for (i = 0; i < array_sz; ++i) {
+        memset(&sub, 0, sizeof(sub));
+        sub.type = event_type[i];
+        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+        if (rc) {
+            printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+            break;
+        }
+    }
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::~omx_vdec
+   FUNCTION
+   omx_vdec::~omx_vdec
 
-DESCRIPTION
-  Destructor
+   DESCRIPTION
+   Destructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_vdec::~omx_vdec()
 {
-  m_pmem_info = NULL;
-  struct v4l2_decoder_cmd dec;
-  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
-  if(m_pipe_in) close(m_pipe_in);
-  if(m_pipe_out) close(m_pipe_out);
-  m_pipe_in = -1;
-  m_pipe_out = -1;
-  DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
-  pthread_join(msg_thread_id,NULL);
-  DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
-  dec.cmd = V4L2_DEC_CMD_STOP;
-  if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
-  {
-    DEBUG_PRINT_ERROR("\n STOP Command failed\n");
-  }
-  pthread_join(async_thread_id,NULL);
-  unsubscribe_to_events(drv_ctx.video_driver_fd);
-  close(drv_ctx.video_driver_fd);
-  pthread_mutex_destroy(&m_lock);
-  pthread_mutex_destroy(&c_lock);
-  sem_destroy(&m_cmd_lock);
-  if (perf_flag)
-  {
-    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
-    dec_time.end();
-  }
-  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
+    m_pmem_info = NULL;
+    struct v4l2_decoder_cmd dec;
+    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
+    if (m_pipe_in) close(m_pipe_in);
+    if (m_pipe_out) close(m_pipe_out);
+    m_pipe_in = -1;
+    m_pipe_out = -1;
+    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
+    pthread_join(msg_thread_id,NULL);
+    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
+    dec.cmd = V4L2_DEC_CMD_STOP;
+    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
+        DEBUG_PRINT_ERROR("\n STOP Command failed\n");
+    }
+    pthread_join(async_thread_id,NULL);
+    unsubscribe_to_events(drv_ctx.video_driver_fd);
+    close(drv_ctx.video_driver_fd);
+    pthread_mutex_destroy(&m_lock);
+    pthread_mutex_destroy(&c_lock);
+    sem_destroy(&m_cmd_lock);
+    if (perf_flag) {
+        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
+        dec_time.end();
+    }
+    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
 }
 
-int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) {
-	struct v4l2_requestbuffers bufreq;
-	int rc = 0;
-	if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
-		bufreq.memory = V4L2_MEMORY_USERPTR;
-		bufreq.count = 0;
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
-	}
-	return rc;
+int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
+{
+    struct v4l2_requestbuffers bufreq;
+    int rc = 0;
+    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+        bufreq.memory = V4L2_MEMORY_USERPTR;
+        bufreq.count = 0;
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+    }
+    return rc;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::OMXCntrlProcessMsgCb
+   FUNCTION
+   omx_vdec::OMXCntrlProcessMsgCb
 
-DESCRIPTION
-  IL Client callbacks are generated through this routine. The decoder
-  provides the thread context for this routine.
+   DESCRIPTION
+   IL Client callbacks are generated through this routine. The decoder
+   provides the thread context for this routine.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
 {
-  signed int p1; // Parameter - 1
-  signed int p2; // Parameter - 2
-  unsigned int ident;
-  unsigned int qsize=0; // qsize
-  omx_vdec *pThis = (omx_vdec *) ctxt;
+    signed int p1; // Parameter - 1
+    signed int p2; // Parameter - 2
+    unsigned int ident;
+    unsigned int qsize=0; // qsize
+    omx_vdec *pThis = (omx_vdec *) ctxt;
 
-  if(!pThis)
-  {
-    DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
-        __func__);
-    return;
-  }
-
-  // Protect the shared queue data structure
-  do
-  {
-    /*Read the message id's from the queue*/
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if(qsize)
-    {
-      pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+    if (!pThis) {
+        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
+                __func__);
+        return;
     }
 
-    if (qsize == 0 && pThis->m_state != OMX_StatePause)
-    {
-      qsize = pThis->m_ftb_q.m_size;
-      if (qsize)
-      {
-        pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
-      }
-    }
-
-    if (qsize == 0 && pThis->m_state != OMX_StatePause)
-    {
-      qsize = pThis->m_etb_q.m_size;
-      if (qsize)
-      {
-        pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
-      }
-    }
-    pthread_mutex_unlock(&pThis->m_lock);
-
-    /*process message if we have one*/
-    if(qsize > 0)
-    {
-      id = ident;
-      switch (id)
-      {
-        case OMX_COMPONENT_GENERATE_EVENT:
-          if (pThis->m_cb.EventHandler)
-          {
-            switch (p1)
-            {
-              case OMX_CommandStateSet:
-                pThis->m_state = (OMX_STATETYPE) p2;
-                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
-                    pThis->m_state);
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventCmdComplete, p1, p2, NULL);
-                break;
-
-              case OMX_EventError:
-                if(p2 == OMX_StateInvalid)
-                {
-                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
-                    pThis->m_state = (OMX_STATETYPE) p2;
-                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
-                }
-                else if (p2 == OMX_ErrorHardware)
-                {
-                   pThis->omx_report_error();
-                }
-                else
-		  {
-                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventError, p2, (OMX_U32)NULL, NULL );
-                }
-                break;
-
-              case OMX_CommandPortDisable:
-                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
-                if (BITMASK_PRESENT(&pThis->m_flags,
-                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
-                {
-                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
-                  break;
-                }
-                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
-                {
-				  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-				  pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
-				  if(release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
-					  DEBUG_PRINT_HIGH("Failed to release output buffers\n");
-				  OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
-				  pThis->in_reconfig = false;
-                  if(eRet !=  OMX_ErrorNone)
-                  {
-                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
-                      pThis->omx_report_error();
-                      break;
-                  }
-                }
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-              case OMX_CommandPortEnable:
-                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
-                                      OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-
-              default:
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                         OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
-          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
-              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
-            pThis->omx_report_error ();
-          }
-        break;
-        case OMX_COMPONENT_GENERATE_ETB:
-          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
-            pThis->omx_report_error ();
-          }
-        break;
-
-        case OMX_COMPONENT_GENERATE_FTB:
-          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
-             pThis->omx_report_error ();
-          }
-        break;
-
-        case OMX_COMPONENT_GENERATE_COMMAND:
-          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
-                                    (OMX_U32)p2,(OMX_PTR)NULL);
-        break;
-
-        case OMX_COMPONENT_GENERATE_EBD:
-
-          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
-          {
-            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
-            pThis->omx_report_error ();
-          }
-          else
-          {
-            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
-            {
-              pThis->m_inp_err_count++;
-              pThis->time_stamp_dts.remove_time_stamp(
-              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
-              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-                ?true:false);
-            }
-            else
-            {
-              pThis->m_inp_err_count = 0;
-            }
-            if ( pThis->empty_buffer_done(&pThis->m_cmp,
-                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-            {
-               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
-               pThis->omx_report_error ();
-            }
-            if(pThis->m_inp_err_count >= MAX_INPUT_ERROR)
-            {
-               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
-               pThis->omx_report_error ();
-            }
-          }
-        break;
-        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
-          {
-            int64_t *timestamp = (int64_t *)p1;
-            if (p1)
-            {
-              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
-              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-              ?true:false);
-              free(timestamp);
-            }
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_FBD:
-          if (p2 != VDEC_S_SUCCESS)
-          {
-            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
-            pThis->omx_report_error ();
-          }
-          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
-                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-          {
-            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
-            pThis->omx_report_error ();
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
-          DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
-          if (!pThis->input_flush_progress)
-          {
-            DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
-          }
-          else
-          {
-            pThis->execute_input_flush();
-            if (pThis->m_cb.EventHandler)
-            {
-              if (p2 != VDEC_S_SUCCESS)
-              {
-                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
-                pThis->omx_report_error ();
-              }
-              else
-              {
-                /*Check if we need generate event for Flush done*/
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
-                {
-                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
-                  DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
-                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                           OMX_EventCmdComplete,OMX_CommandFlush,
-                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
-                }
-                if (BITMASK_PRESENT(&pThis->m_flags,
-                                         OMX_COMPONENT_IDLE_PENDING))
-                {
-                   if(pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
-                           DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
-						   pThis->omx_report_error ();
-				   } else {
-					   pThis->streaming[OUTPUT_PORT] = false;
-				   }
-                  if (!pThis->output_flush_progress)
-                  {
-                     DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
-					 pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
-							 OMX_COMPONENT_GENERATE_STOP_DONE);
-                  }
-                }
-              }
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
-          DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
-          if (!pThis->output_flush_progress)
-          {
-            DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
-          }
-          else
-          {
-            pThis->execute_output_flush();
-            if (pThis->m_cb.EventHandler)
-            {
-              if (p2 != VDEC_S_SUCCESS)
-              {
-                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
-                pThis->omx_report_error ();
-              }
-              else
-              {
-                /*Check if we need generate event for Flush done*/
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
-                {
-                  DEBUG_PRINT_LOW("\n Notify Output Flush done");
-                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                           OMX_EventCmdComplete,OMX_CommandFlush,
-                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
-                }
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
-                {
-                  DEBUG_PRINT_LOW("\n Internal flush complete");
-                  BITMASK_CLEAR (&pThis->m_flags,
-                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
-                  if (BITMASK_PRESENT(&pThis->m_flags,
-                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
-                  {
-                    pThis->post_event(OMX_CommandPortDisable,
-                               OMX_CORE_OUTPUT_PORT_INDEX,
-                               OMX_COMPONENT_GENERATE_EVENT);
-                    BITMASK_CLEAR (&pThis->m_flags,
-                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
-
-                  }
-                }
-
-                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
-                {
-                   if(pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
-                           DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
-						   pThis->omx_report_error ();
-						   break;
-                   }
-				   pThis->streaming[CAPTURE_PORT] = false;
-                  if (!pThis->input_flush_progress)
-                  {
-                    DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
-					 pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
-							 OMX_COMPONENT_GENERATE_STOP_DONE);
-                  }
-                }
-              }
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_START_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
-
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n Move to executing");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-                pThis->m_state = OMX_StateExecuting;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StateExecuting, NULL);
-              }
-              else if (BITMASK_PRESENT(&pThis->m_flags,
-                                       OMX_COMPONENT_PAUSE_PENDING))
-              {
-                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
-                           VDEC_IOCTL_CMD_PAUSE,NULL ) < */0)
-                {
-                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
-                  pThis->omx_report_error ();
-                }
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              pThis->complete_pending_buffer_done_cbs();
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
-                //Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
-                pThis->m_state = OMX_StatePause;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StatePause, NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_RESUME_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-                pThis->m_state = OMX_StateExecuting;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StateExecuting,NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_STOP_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              pThis->complete_pending_buffer_done_cbs();
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
-                pThis->m_state = OMX_StateIdle;
-                DEBUG_PRINT_LOW("\n Move to Idle State");
-                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
-                                         OMX_EventCmdComplete,OMX_CommandStateSet,
-                                         OMX_StateIdle,NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
-
-          if (p2 == OMX_IndexParamPortDefinition) {
-            pThis->in_reconfig = true;
-          }
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                OMX_EventPortSettingsChanged, p1, p2, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-          {
-            OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
-            OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
-            if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
-                format = OMX_InterlaceInterleaveFrameTopFieldFirst;
-            else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
-                format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
-            else //unsupported interlace format; raise a error
-                event = OMX_EventError;
-            if (pThis->m_cb.EventHandler) {
-              pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                  event, format, 0, NULL );
-            } else {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-        break;
-
-        case OMX_COMPONENT_GENERATE_EOS_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
-                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-          pThis->prev_ts = LLONG_MAX;
-          pThis->rst_prev_ts = true;
-          break;
-
-        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
-          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
-          pThis->omx_report_error ();
-          break;
-        case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
-        {
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
+    // Protect the shared queue data structure
+    do {
+        /*Read the message id's from the queue*/
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
+        if (qsize) {
+            pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
         }
-        default:
-          break;
+
+        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+            qsize = pThis->m_ftb_q.m_size;
+            if (qsize) {
+                pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+            }
         }
-      }
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if (pThis->m_state != OMX_StatePause)
-        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
-    pthread_mutex_unlock(&pThis->m_lock);
-  }
-  while(qsize>0);
+
+        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+            qsize = pThis->m_etb_q.m_size;
+            if (qsize) {
+                pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+            }
+        }
+        pthread_mutex_unlock(&pThis->m_lock);
+
+        /*process message if we have one*/
+        if (qsize > 0) {
+            id = ident;
+            switch (id) {
+                case OMX_COMPONENT_GENERATE_EVENT:
+                    if (pThis->m_cb.EventHandler) {
+                        switch (p1) {
+                            case OMX_CommandStateSet:
+                                pThis->m_state = (OMX_STATETYPE) p2;
+                                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
+                                        pThis->m_state);
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL);
+                                break;
+
+                            case OMX_EventError:
+                                if (p2 == OMX_StateInvalid) {
+                                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
+                                    pThis->m_state = (OMX_STATETYPE) p2;
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
+                                } else if (p2 == OMX_ErrorHardware) {
+                                    pThis->omx_report_error();
+                                } else {
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
+                                }
+                                break;
+
+                            case OMX_CommandPortDisable:
+                                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+                                    break;
+                                }
+                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) {
+                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
+                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
+                                        DEBUG_PRINT_HIGH("Failed to release output buffers\n");
+                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
+                                    pThis->in_reconfig = false;
+                                    if (eRet !=  OMX_ErrorNone) {
+                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
+                                        pThis->omx_report_error();
+                                        break;
+                                    }
+                                }
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+                            case OMX_CommandPortEnable:
+                                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+
+                            default:
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
+                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB:
+                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_FTB:
+                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_COMMAND:
+                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
+                            (OMX_U32)p2,(OMX_PTR)NULL);
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EBD:
+
+                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
+                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
+                        pThis->omx_report_error ();
+                    } else {
+                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
+                            pThis->m_inp_err_count++;
+                            pThis->time_stamp_dts.remove_time_stamp(
+                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
+                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                                    ?true:false);
+                        } else {
+                            pThis->m_inp_err_count = 0;
+                        }
+                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
+                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                            DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
+                            pThis->omx_report_error ();
+                        }
+                        if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
+                            DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
+                            pThis->omx_report_error ();
+                        }
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
+                    {
+                        int64_t *timestamp = (int64_t *)p1;
+                        if (p1) {
+                            pThis->time_stamp_dts.remove_time_stamp(*timestamp,
+                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                                    ?true:false);
+                            free(timestamp);
+                        }
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_FBD:
+                    if (p2 != VDEC_S_SUCCESS) {
+                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
+                        pThis->omx_report_error ();
+                    } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
+                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                        DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
+                    DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
+                    if (!pThis->input_flush_progress) {
+                        DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
+                    } else {
+                        pThis->execute_input_flush();
+                        if (pThis->m_cb.EventHandler) {
+                            if (p2 != VDEC_S_SUCCESS) {
+                                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
+                                pThis->omx_report_error ();
+                            } else {
+                                /*Check if we need generate event for Flush done*/
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
+                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
+                                    DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventCmdComplete,OMX_CommandFlush,
+                                            OMX_CORE_INPUT_PORT_INDEX,NULL );
+                                }
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_IDLE_PENDING)) {
+                                    if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
+                                        DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
+                                        pThis->omx_report_error ();
+                                    } else {
+                                        pThis->streaming[OUTPUT_PORT] = false;
+                                    }
+                                    if (!pThis->output_flush_progress) {
+                                        DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
+                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
+                                                OMX_COMPONENT_GENERATE_STOP_DONE);
+                                    }
+                                }
+                            }
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
+                    DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
+                    if (!pThis->output_flush_progress) {
+                        DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
+                    } else {
+                        pThis->execute_output_flush();
+                        if (pThis->m_cb.EventHandler) {
+                            if (p2 != VDEC_S_SUCCESS) {
+                                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
+                                pThis->omx_report_error ();
+                            } else {
+                                /*Check if we need generate event for Flush done*/
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
+                                    DEBUG_PRINT_LOW("\n Notify Output Flush done");
+                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventCmdComplete,OMX_CommandFlush,
+                                            OMX_CORE_OUTPUT_PORT_INDEX,NULL );
+                                }
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+                                    DEBUG_PRINT_LOW("\n Internal flush complete");
+                                    BITMASK_CLEAR (&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+                                    if (BITMASK_PRESENT(&pThis->m_flags,
+                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
+                                        pThis->post_event(OMX_CommandPortDisable,
+                                                OMX_CORE_OUTPUT_PORT_INDEX,
+                                                OMX_COMPONENT_GENERATE_EVENT);
+                                        BITMASK_CLEAR (&pThis->m_flags,
+                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+
+                                    }
+                                }
+
+                                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
+                                    if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
+                                        DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
+                                        pThis->omx_report_error ();
+                                        break;
+                                    }
+                                    pThis->streaming[CAPTURE_PORT] = false;
+                                    if (!pThis->input_flush_progress) {
+                                        DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
+                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
+                                                OMX_COMPONENT_GENERATE_STOP_DONE);
+                                    }
+                                }
+                            }
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_START_DONE:
+                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
+
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
+                            pThis->omx_report_error ();
+                        } else {
+                            DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                                DEBUG_PRINT_LOW("\n Move to executing");
+                                // Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                                pThis->m_state = OMX_StateExecuting;
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StateExecuting, NULL);
+                            } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                        OMX_COMPONENT_PAUSE_PENDING)) {
+                                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
+                                      VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
+                                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
+                                    pThis->omx_report_error ();
+                                }
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
+                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
+                            pThis->omx_report_error ();
+                        } else {
+                            pThis->complete_pending_buffer_done_cbs();
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
+                                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
+                                //Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
+                                pThis->m_state = OMX_StatePause;
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StatePause, NULL);
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_RESUME_DONE:
+                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
+                            pThis->omx_report_error ();
+                        } else {
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
+                                // Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                                pThis->m_state = OMX_StateExecuting;
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StateExecuting,NULL);
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_STOP_DONE:
+                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
+                    if (pThis->m_cb.EventHandler) {
+                        if (p2 != VDEC_S_SUCCESS) {
+                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
+                            pThis->omx_report_error ();
+                        } else {
+                            pThis->complete_pending_buffer_done_cbs();
+                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
+                                // Send the callback now
+                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
+                                pThis->m_state = OMX_StateIdle;
+                                DEBUG_PRINT_LOW("\n Move to Idle State");
+                                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
+                                        OMX_EventCmdComplete,OMX_CommandStateSet,
+                                        OMX_StateIdle,NULL);
+                            }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
+                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
+
+                    if (p2 == OMX_IndexParamPortDefinition) {
+                        pThis->in_reconfig = true;
+                    }
+                    if (pThis->m_cb.EventHandler) {
+                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                OMX_EventPortSettingsChanged, p1, p2, NULL );
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+
+                    if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
+                        OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
+                        OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
+                        if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+                            format = OMX_InterlaceInterleaveFrameTopFieldFirst;
+                        else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+                            format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
+                        else //unsupported interlace format; raise a error
+                            event = OMX_EventError;
+                        if (pThis->m_cb.EventHandler) {
+                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    event, format, 0, NULL );
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EOS_DONE:
+                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
+                    if (pThis->m_cb.EventHandler) {
+                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
+                                OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                    }
+                    pThis->prev_ts = LLONG_MAX;
+                    pThis->rst_prev_ts = true;
+                    break;
+
+                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
+                    DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
+                    pThis->omx_report_error ();
+                    break;
+                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
+                    {
+                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
+                        if (pThis->m_cb.EventHandler) {
+                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                        }
+                    }
+                default:
+                    break;
+            }
+        }
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
+        if (pThis->m_state != OMX_StatePause)
+            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
+        pthread_mutex_unlock(&pThis->m_lock);
+    } while (qsize>0);
 
 }
 
@@ -1330,247 +1205,222 @@
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentInit
+   FUNCTION
+   omx_vdec::ComponentInit
 
-DESCRIPTION
-  Initialize the component.
+   DESCRIPTION
+   Initialize the component.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
 {
 
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_fmtdesc fdesc;
-	struct v4l2_format fmt;
-	struct v4l2_requestbuffers bufreq;
-	struct v4l2_control control;
-	unsigned int   alignment = 0,buffer_size = 0;
-	int fds[2];
-	int r,ret=0;
-	bool codec_ambiguous = false;
-	OMX_STRING device_name = (OMX_STRING)"/dev/video/q6_dec";
-	drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_fmtdesc fdesc;
+    struct v4l2_format fmt;
+    struct v4l2_requestbuffers bufreq;
+    struct v4l2_control control;
+    unsigned int   alignment = 0,buffer_size = 0;
+    int fds[2];
+    int r,ret=0;
+    bool codec_ambiguous = false;
+    OMX_STRING device_name = (OMX_STRING)"/dev/video/q6_dec";
+    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
 
-	DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open device %s returned fd %d, errno %d",
-			device_name, drv_ctx.video_driver_fd, errno);
+    DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open device %s returned fd %d, errno %d",
+            device_name, drv_ctx.video_driver_fd, errno);
 
-	if(drv_ctx.video_driver_fd == 0){
-		drv_ctx.video_driver_fd = open(device_name, O_RDWR);
-	}
+    if (drv_ctx.video_driver_fd == 0) {
+        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+    }
 
-	if(drv_ctx.video_driver_fd < 0)
-	{
-		DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
-		return OMX_ErrorInsufficientResources;
-	}
-	drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
-	drv_ctx.frame_rate.fps_denominator = 1;
+    if (drv_ctx.video_driver_fd < 0) {
+        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
+        return OMX_ErrorInsufficientResources;
+    }
+    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
+    drv_ctx.frame_rate.fps_denominator = 1;
 
     ret = pthread_create(&async_thread_id,0,async_message_thread,this);
-    if(ret < 0) {
-	  close(drv_ctx.video_driver_fd);
-	  DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
-	  return OMX_ErrorInsufficientResources;
-   }
+    if (ret < 0) {
+        close(drv_ctx.video_driver_fd);
+        DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
+        return OMX_ErrorInsufficientResources;
+    }
 
 #ifdef INPUT_BUFFER_LOG
-	strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
+    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-	outputBufferFile1 = fopen (outputfilename, "ab");
+    outputBufferFile1 = fopen (outputfilename, "ab");
 #endif
 #ifdef OUTPUT_EXTRADATA_LOG
-	outputExtradataFile = fopen (ouputextradatafilename, "ab");
+    outputExtradataFile = fopen (ouputextradatafilename, "ab");
 #endif
 
-	// Copy the role information which provides the decoder kind
-	strlcpy(drv_ctx.kind,role,128);
+    // Copy the role information which provides the decoder kind
+    strlcpy(drv_ctx.kind,role,128);
 
-	if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
-				OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.timestamp_adjust = true;
-		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
-		eCompressionFormat = OMX_VIDEO_CodingMPEG4;
-		output_capability=V4L2_PIX_FMT_MPEG4;
-		/*Initialize Start Code for MPEG4*/
-		codec_type_parse = CODEC_TYPE_MPEG4;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.timestamp_adjust = true;
+        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
+        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+        output_capability=V4L2_PIX_FMT_MPEG4;
+        /*Initialize Start Code for MPEG4*/
+        codec_type_parse = CODEC_TYPE_MPEG4;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "m4v");
+        strcat(inputfilename, "m4v");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
-				OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
-		output_capability = V4L2_PIX_FMT_MPEG2;
-		eCompressionFormat = OMX_VIDEO_CodingMPEG2;
-		/*Initialize Start Code for MPEG2*/
-		codec_type_parse = CODEC_TYPE_MPEG2;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
+                OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
+        output_capability = V4L2_PIX_FMT_MPEG2;
+        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
+        /*Initialize Start Code for MPEG2*/
+        codec_type_parse = CODEC_TYPE_MPEG2;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "mpg");
+        strcat(inputfilename, "mpg");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_LOW("\n H263 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
-		eCompressionFormat = OMX_VIDEO_CodingH263;
-		output_capability = V4L2_PIX_FMT_H263;
-		codec_type_parse = CODEC_TYPE_H263;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_LOW("\n H263 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
+        eCompressionFormat = OMX_VIDEO_CodingH263;
+        output_capability = V4L2_PIX_FMT_H263;
+        codec_type_parse = CODEC_TYPE_H263;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "263");
+        strcat(inputfilename, "263");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
-		output_capability = V4L2_PIX_FMT_DIVX_311;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-		codec_type_parse = CODEC_TYPE_DIVX;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
+        output_capability = V4L2_PIX_FMT_DIVX_311;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
-		eRet = createDivxDrmContext();
-		if (eRet != OMX_ErrorNone) {
-			DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-			return eRet;
-		}
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
-		output_capability = V4L2_PIX_FMT_DIVX;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-		codec_type_parse = CODEC_TYPE_DIVX;
-		codec_ambiguous = true;
-		m_frame_parser.init_start_codes (codec_type_parse);
+        eRet = createDivxDrmContext();
+        if (eRet != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            return eRet;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
+        output_capability = V4L2_PIX_FMT_DIVX;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        codec_ambiguous = true;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
-		eRet = createDivxDrmContext();
-		if (eRet != OMX_ErrorNone) {
-			DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-			return eRet;
-		}
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
-		output_capability = V4L2_PIX_FMT_DIVX;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-		codec_type_parse = CODEC_TYPE_DIVX;
-		codec_ambiguous = true;
-		m_frame_parser.init_start_codes (codec_type_parse);
+        eRet = createDivxDrmContext();
+        if (eRet != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            return eRet;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
+        output_capability = V4L2_PIX_FMT_DIVX;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        codec_ambiguous = true;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
-		eRet = createDivxDrmContext();
-		if (eRet != OMX_ErrorNone) {
-			DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-			return eRet;
-		}
+        eRet = createDivxDrmContext();
+        if (eRet != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            return eRet;
+        }
 
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
-		output_capability=V4L2_PIX_FMT_H264;
-		eCompressionFormat = OMX_VIDEO_CodingAVC;
-		codec_type_parse = CODEC_TYPE_H264;
-		m_frame_parser.init_start_codes (codec_type_parse);
-		m_frame_parser.init_nal_length(nal_length);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
+        output_capability=V4L2_PIX_FMT_H264;
+        eCompressionFormat = OMX_VIDEO_CodingAVC;
+        codec_type_parse = CODEC_TYPE_H264;
+        m_frame_parser.init_start_codes (codec_type_parse);
+        m_frame_parser.init_nal_length(nal_length);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "264");
+        strcat(inputfilename, "264");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
-                drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
-                output_capability=V4L2_PIX_FMT_HEVC;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
-                codec_type_parse = CODEC_TYPE_HEVC;
-		m_frame_parser.init_start_codes (codec_type_parse);
-		m_frame_parser.init_nal_length(nal_length);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
+        output_capability=V4L2_PIX_FMT_HEVC;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
+        codec_type_parse = CODEC_TYPE_HEVC;
+        m_frame_parser.init_start_codes (codec_type_parse);
+        m_frame_parser.init_nal_length(nal_length);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "265");
+        strcat(inputfilename, "265");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
-		eCompressionFormat = OMX_VIDEO_CodingWMV;
-		codec_type_parse = CODEC_TYPE_VC1;
-		output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
+        eCompressionFormat = OMX_VIDEO_CodingWMV;
+        codec_type_parse = CODEC_TYPE_VC1;
+        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "vc1");
+        strcat(inputfilename, "vc1");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
-		eCompressionFormat = OMX_VIDEO_CodingWMV;
-		codec_type_parse = CODEC_TYPE_VC1;
-		output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
+        eCompressionFormat = OMX_VIDEO_CodingWMV;
+        codec_type_parse = CODEC_TYPE_VC1;
+        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "vc1");
+        strcat(inputfilename, "vc1");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",	\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-		output_capability=V4L2_PIX_FMT_VP8;
-		eCompressionFormat = OMX_VIDEO_CodingVPX;
-		codec_type_parse = CODEC_TYPE_VP8;
-		arbitrary_bytes = false;
-	}
-	else
-	{
-		DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
-		eRet = OMX_ErrorInvalidComponentName;
-	}
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+        output_capability=V4L2_PIX_FMT_VP8;
+        eCompressionFormat = OMX_VIDEO_CodingVPX;
+        codec_type_parse = CODEC_TYPE_VP8;
+        arbitrary_bytes = false;
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
+    }
 #ifdef INPUT_BUFFER_LOG
-	inputBufferFile1 = fopen (inputfilename, "ab");
+    inputBufferFile1 = fopen (inputfilename, "ab");
 #endif
-	if (eRet == OMX_ErrorNone)
-	{
+    if (eRet == OMX_ErrorNone) {
 
-		drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
+        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
         OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
             QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
         if (!client_buffers.set_color_format(dest_color_format)) {
@@ -1578,111 +1428,111 @@
             eRet = OMX_ErrorInsufficientResources;
         }
 
-		capture_capability= V4L2_PIX_FMT_NV12;
-		ret = subscribe_to_events(drv_ctx.video_driver_fd);
-		if (ret) {
-			DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
-			return OMX_ErrorInsufficientResources;
-		}
+        capture_capability= V4L2_PIX_FMT_NV12;
+        ret = subscribe_to_events(drv_ctx.video_driver_fd);
+        if (ret) {
+            DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
+            return OMX_ErrorInsufficientResources;
+        }
 
-		struct v4l2_capability cap;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
-		if (ret) {
-		  DEBUG_PRINT_ERROR("Failed to query capabilities\n");
-		  /*TODO: How to handle this case */
-		} else {
-		  DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
-				" version = %d, capabilities = %x\n", cap.driver, cap.card,
-				cap.bus_info, cap.version, cap.capabilities);
-		}
-		ret=0;
-		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fdesc.index=0;
-		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
-			DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
-					fdesc.pixelformat, fdesc.flags);
-			fdesc.index++;
-		}
-		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fdesc.index=0;
-		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+        struct v4l2_capability cap;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
+        if (ret) {
+            DEBUG_PRINT_ERROR("Failed to query capabilities\n");
+            /*TODO: How to handle this case */
+        } else {
+            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
+                    " version = %d, capabilities = %x\n", cap.driver, cap.card,
+                    cap.bus_info, cap.version, cap.capabilities);
+        }
+        ret=0;
+        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fdesc.index=0;
+        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+                    fdesc.pixelformat, fdesc.flags);
+            fdesc.index++;
+        }
+        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fdesc.index=0;
+        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
 
-			DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
-					fdesc.pixelformat, fdesc.flags);
-			fdesc.index++;
-		}
+            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+                    fdesc.pixelformat, fdesc.flags);
+            fdesc.index++;
+        }
         update_resolution(320, 240);
-		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-		fmt.fmt.pix_mp.pixelformat = output_capability;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-		if (ret) {
-			/*TODO: How to handle this case */
-			DEBUG_PRINT_ERROR("Failed to set format on output port\n");
-				}
-		DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
-		if (codec_ambiguous) {
-			if (output_capability == V4L2_PIX_FMT_DIVX) {
-				struct v4l2_control divx_ctrl;
+        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+        fmt.fmt.pix_mp.pixelformat = output_capability;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+        if (ret) {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR("Failed to set format on output port\n");
+        }
+        DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
+        if (codec_ambiguous) {
+            if (output_capability == V4L2_PIX_FMT_DIVX) {
+                struct v4l2_control divx_ctrl;
 
-				if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
-					divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
-				} else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
-					divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
-				} else {
-					divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
-				}
+                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
+                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
+                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
+                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
+                } else {
+                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
+                }
 
-				divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
-				ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
-				if (ret) {
-					DEBUG_PRINT_ERROR("Failed to set divx version\n");
-				}
-			} else {
-				DEBUG_PRINT_ERROR("Codec should not be ambiguous");
-			}
-		}
+                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
+                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
+                if (ret) {
+                    DEBUG_PRINT_ERROR("Failed to set divx version\n");
+                }
+            } else {
+                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
+            }
+        }
 
-		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-		fmt.fmt.pix_mp.pixelformat = capture_capability;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-		if (ret) {
-			/*TODO: How to handle this case */
-			DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
-				}
-		DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
-		if(secure_mode){
-			control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
-			control.value = 1;
-			DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
-			ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
-			if (ret) {
-				DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
-				close(drv_ctx.video_driver_fd);
-				return OMX_ErrorInsufficientResources;
-			}
-		}
+        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+        fmt.fmt.pix_mp.pixelformat = capture_capability;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+        if (ret) {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
+        }
+        DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
+        if (secure_mode) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
+            control.value = 1;
+            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
+            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
+            if (ret) {
+                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
+                close(drv_ctx.video_driver_fd);
+                return OMX_ErrorInsufficientResources;
+            }
+        }
 
-		/*Get the Buffer requirements for input and output ports*/
-		drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-		drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-		if (secure_mode) {
-			drv_ctx.op_buf.alignment=SZ_1M;
-			drv_ctx.ip_buf.alignment=SZ_1M;
-		} else {
-			drv_ctx.op_buf.alignment=SZ_4K;
-			drv_ctx.ip_buf.alignment=SZ_4K;
-		}
-		drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-		drv_ctx.extradata = 0;
-		drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
-		control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
-		control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-		drv_ctx.idr_only_decoding = 0;
+        /*Get the Buffer requirements for input and output ports*/
+        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        if (secure_mode) {
+            drv_ctx.op_buf.alignment=SZ_1M;
+            drv_ctx.ip_buf.alignment=SZ_1M;
+        } else {
+            drv_ctx.op_buf.alignment=SZ_4K;
+            drv_ctx.ip_buf.alignment=SZ_4K;
+        }
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+        drv_ctx.extradata = 0;
+        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
+        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+        drv_ctx.idr_only_decoding = 0;
 
         m_state = OMX_StateLoaded;
 #ifdef DEFAULT_EXTRADATA
@@ -1692,164 +1542,143 @@
         eRet=get_buffer_req(&drv_ctx.ip_buf);
         DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
         get_buffer_req(&drv_ctx.op_buf);
-		if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
-		    drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC)
-		{
-                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
-  	            h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
-	   	    h264_scratch.nFilledLen = 0;
- 		    h264_scratch.nOffset = 0;
+        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
+                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) {
+            h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
+            h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
+            h264_scratch.nFilledLen = 0;
+            h264_scratch.nOffset = 0;
 
-		    if (h264_scratch.pBuffer == NULL)
-		    {
-			DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
-			return OMX_ErrorInsufficientResources;
- 		    }
+            if (h264_scratch.pBuffer == NULL) {
+                DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+            if (m_frame_parser.mutils == NULL) {
+                m_frame_parser.mutils = new H264_Utils();
+
+                if (m_frame_parser.mutils == NULL) {
+                    DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
+                    eRet = OMX_ErrorInsufficientResources;
+                } else {
+                    m_frame_parser.mutils->initialize_frame_checking_environment();
+                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
                 }
+            }
 
-		if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-		{
-			if (m_frame_parser.mutils == NULL)
-			{
-				m_frame_parser.mutils = new H264_Utils();
+            h264_parser = new h264_stream_parser();
+            if (!h264_parser) {
+                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
 
-				if (m_frame_parser.mutils == NULL)
-				{
-					DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
-					eRet = OMX_ErrorInsufficientResources;
-				}
-				else
-				{
-					m_frame_parser.mutils->initialize_frame_checking_environment();
-					m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
-				}
-			}
+        if (pipe(fds)) {
+            DEBUG_PRINT_ERROR("pipe creation failed\n");
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            int temp1[2];
+            if (fds[0] == 0 || fds[1] == 0) {
+                if (pipe (temp1)) {
+                    DEBUG_PRINT_ERROR("pipe creation failed\n");
+                    return OMX_ErrorInsufficientResources;
+                }
+                //close (fds[0]);
+                //close (fds[1]);
+                fds[0] = temp1 [0];
+                fds[1] = temp1 [1];
+            }
+            m_pipe_in = fds[0];
+            m_pipe_out = fds[1];
+            r = pthread_create(&msg_thread_id,0,message_thread,this);
 
-			h264_parser = new h264_stream_parser();
-			if (!h264_parser)
-			{
-				DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
-				eRet = OMX_ErrorInsufficientResources;
-			}
-		}
+            if (r < 0) {
+                DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
+    }
 
-		if(pipe(fds))
-		{
-			DEBUG_PRINT_ERROR("pipe creation failed\n");
-			eRet = OMX_ErrorInsufficientResources;
-		}
-		else
-		{
-			int temp1[2];
-			if(fds[0] == 0 || fds[1] == 0)
-			{
-				if (pipe (temp1))
-				{
-					DEBUG_PRINT_ERROR("pipe creation failed\n");
-					return OMX_ErrorInsufficientResources;
-				}
-				//close (fds[0]);
-				//close (fds[1]);
-				fds[0] = temp1 [0];
-				fds[1] = temp1 [1];
-			}
-			m_pipe_in = fds[0];
-			m_pipe_out = fds[1];
-			r = pthread_create(&msg_thread_id,0,message_thread,this);
-
-			if(r < 0)
-			{
-				DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
-				eRet = OMX_ErrorInsufficientResources;
-			}
-		}
-	}
-
-	if (eRet != OMX_ErrorNone)
-	{
-		DEBUG_PRINT_ERROR("\n Component Init Failed");
-		DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
-		(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
-				NULL);
-		DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
-		close (drv_ctx.video_driver_fd);
-		drv_ctx.video_driver_fd = -1;
-	}
-	else
-	{
-		DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
-	}
-	//memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
-	return eRet;
+    if (eRet != OMX_ErrorNone) {
+        DEBUG_PRINT_ERROR("\n Component Init Failed");
+        DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
+        (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
+                NULL);
+        DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
+        close (drv_ctx.video_driver_fd);
+        drv_ctx.video_driver_fd = -1;
+    } else {
+        DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
+    }
+    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetComponentVersion
+   FUNCTION
+   omx_vdec::GetComponentVersion
 
-DESCRIPTION
-  Returns the component version.
+   DESCRIPTION
+   Returns the component version.
 
-PARAMETERS
-  TBD.
+   PARAMETERS
+   TBD.
 
-RETURN VALUE
-  OMX_ErrorNone.
+   RETURN VALUE
+   OMX_ErrorNone.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_component_version
-                                     (
-                                      OMX_IN OMX_HANDLETYPE hComp,
-                                      OMX_OUT OMX_STRING componentName,
-                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
-                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
-                                      OMX_OUT OMX_UUIDTYPE* componentUUID
-                                      )
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID
+ )
 {
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-  /* TBD -- Return the proper version */
-  if (specVersion)
-  {
-    specVersion->nVersion = OMX_SPEC_VERSION;
-  }
-  return OMX_ErrorNone;
+    /* TBD -- Return the proper version */
+    if (specVersion) {
+        specVersion->nVersion = OMX_SPEC_VERSION;
+    }
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommand
+   FUNCTION
+   omx_vdec::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
-                                      OMX_IN OMX_COMMANDTYPE cmd,
-                                      OMX_IN OMX_U32 param1,
-                                      OMX_IN OMX_PTR cmdData
-                                      )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
     DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
     if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
-      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
-    {
-      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
-        "to invalid port: %lu", param1);
-      return OMX_ErrorBadPortIndex;
+            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
+        DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
+                "to invalid port: %lu", param1);
+        return OMX_ErrorBadPortIndex;
     }
     post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
     sem_wait(&m_cmd_lock);
@@ -1858,1132 +1687,972 @@
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommand
+   FUNCTION
+   omx_vdec::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
-                                            OMX_IN OMX_COMMANDTYPE cmd,
-                                            OMX_IN OMX_U32 param1,
-                                            OMX_IN OMX_PTR cmdData
-                                            )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
-  int bFlag = 1,sem_posted = 0,ret=0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
+    int bFlag = 1,sem_posted = 0,ret=0;
 
-  DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
-  DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
-    m_state, eState);
+    DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
+    DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
+            m_state, eState);
 
-  if(cmd == OMX_CommandStateSet)
-  {
-    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
-    DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
-    /***************************/
-    /* Current State is Loaded */
-    /***************************/
-    if(m_state == OMX_StateLoaded)
-    {
-      if(eState == OMX_StateIdle)
-      {
-        //if all buffers are allocated or all ports disabled
-        if(allocate_done() ||
-          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Loaded to Loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Loaded to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        /* Since error is None , we will post an event
-           at the end of this function definition */
-        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
-      }
-      /* Requesting transition from Loaded to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
-                          eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-
-    /***************************/
-    /* Current State is IDLE */
-    /***************************/
-    else if(m_state == OMX_StateIdle)
-    {
-      if(eState == OMX_StateLoaded)
-      {
-        if(release_done())
-        {
-          /*
-             Since error is None , we will post an event at the end
-             of this function definition
-          */
-          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Idle to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-        //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
-        bFlag = 1;
-	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-	    m_state=OMX_StateExecuting;
-	    DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
-      }
-      /* Requesting transition from Idle to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Idle to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-       /* Requesting transition from Idle to Pause */
-       else if(eState == OMX_StatePause)
-      {
-         /*To pause the Video core we need to start the driver*/
-         if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
-                    NULL) < */0)
-         {
-           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
-           omx_report_error ();
-           eRet = OMX_ErrorHardware;
-         }
-         else
-         {
-           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
-           DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
-           bFlag = 0;
-         }
-      }
-      /* Requesting transition from Idle to Invalid */
-       else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-
-    /******************************/
-    /* Current State is Executing */
-    /******************************/
-    else if(m_state == OMX_StateExecuting)
-    {
-       DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
-       /* Requesting transition from Executing to Idle */
-       if(eState == OMX_StateIdle)
-	   {
-		   /* Since error is None , we will post an event
-			  at the end of this function definition
-			*/
-		   DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
-		   BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-		   if(!sem_posted)
-		   {
-			   sem_posted = 1;
-			   sem_post (&m_cmd_lock);
-			   execute_omx_flush(OMX_ALL);
-		   }
-		   bFlag = 0;
-	   }
-       /* Requesting transition from Executing to Paused */
-       else if(eState == OMX_StatePause)
-       {
-         DEBUG_PRINT_LOW("\n PAUSE Command Issued");
-         m_state = OMX_StatePause;
-         bFlag = 1;
-       }
-       /* Requesting transition from Executing to Loaded */
-       else if(eState == OMX_StateLoaded)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
-         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorIncorrectStateTransition;
-       }
-       /* Requesting transition from Executing to WaitForResources */
-       else if(eState == OMX_StateWaitForResources)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
-         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorIncorrectStateTransition;
-       }
-       /* Requesting transition from Executing to Executing */
-       else if(eState == OMX_StateExecuting)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
-         post_event(OMX_EventError,OMX_ErrorSameState,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorSameState;
-       }
-       /* Requesting transition from Executing to Invalid */
-       else if(eState == OMX_StateInvalid)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
-         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorInvalidState;
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
-         eRet = OMX_ErrorBadParameter;
-       }
-    }
-    /***************************/
-    /* Current State is Pause  */
-    /***************************/
-    else if(m_state == OMX_StatePause)
-    {
-      /* Requesting transition from Pause to Executing */
-      if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
-        m_state = OMX_StateExecuting;
-        bFlag = 1;
-      }
-      /* Requesting transition from Pause to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
-         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-         if(!sem_posted)
-         {
-           sem_posted = 1;
-           sem_post (&m_cmd_lock);
-           execute_omx_flush(OMX_ALL);
-         }
-         bFlag = 0;
-      }
-      /* Requesting transition from Pause to loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-       /* Requesting transition from Pause to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-     /***************************/
-    /* Current State is WaitForResources  */
-    /***************************/
-    else if(m_state == OMX_StateWaitForResources)
-    {
-      /* Requesting transition from WaitForResources to Loaded */
-      if(eState == OMX_StateLoaded)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
-      }
-      /* Requesting transition from WaitForResources to WaitForResources */
-      else if (eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from WaitForResources to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      /* Requesting transition from WaitForResources to Loaded -
-      is NOT tested by Khronos TS */
-
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
-      eRet = OMX_ErrorBadParameter;
-    }
-  }
-  /********************************/
-  /* Current State is Invalid */
-  /*******************************/
-  else if(m_state == OMX_StateInvalid)
-  {
-    /* State Transition from Inavlid to any state */
-    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
-                  || OMX_StateIdle || OMX_StateExecuting
-                  || OMX_StatePause || OMX_StateInvalid))
-    {
-      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
-      post_event(OMX_EventError,OMX_ErrorInvalidState,\
-                 OMX_COMPONENT_GENERATE_EVENT);
-      eRet = OMX_ErrorInvalidState;
-    }
-  }
-  else if (cmd == OMX_CommandFlush)
-  {
-    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
-        "with param1: %lu", param1);
-    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
-    }
-    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-    }
-    if (!sem_posted){
-      sem_posted = 1;
-      DEBUG_PRINT_LOW("\n Set the Semaphore");
-      sem_post (&m_cmd_lock);
-      execute_omx_flush(param1);
-    }
-    bFlag = 0;
-  }
-  else if ( cmd == OMX_CommandPortEnable)
-  {
-    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
-        "with param1: %lu", param1);
-    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-        m_inp_bEnabled = OMX_TRUE;
-
-        if( (m_state == OMX_StateLoaded &&
-             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-            || allocate_input_done())
-        {
-          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
-                     OMX_COMPONENT_GENERATE_EVENT);
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          DEBUG_PRINT_LOW("\n Enable output Port command recieved");
-          m_out_bEnabled = OMX_TRUE;
-
-          if( (m_state == OMX_StateLoaded &&
-              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-              || (allocate_output_done()))
-          {
-             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
-                        OMX_COMPONENT_GENERATE_EVENT);
-
-          }
-          else
-          {
-              DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
-              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-              // Skip the event notification
-              bFlag = 0;
-          }
-      }
-  }
-  else if (cmd == OMX_CommandPortDisable)
-  {
-      DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
-          "with param1: %lu", param1);
-      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          m_inp_bEnabled = OMX_FALSE;
-          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-              && release_input_done())
-          {
-             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
-                        OMX_COMPONENT_GENERATE_EVENT);
-          }
-          else
-          {
-             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
-             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-             {
-               if(!sem_posted)
-               {
-                 sem_posted = 1;
-                 sem_post (&m_cmd_lock);
-               }
-               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
-             }
-
-             // Skip the event notification
-             bFlag = 0;
-          }
-      }
-      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          m_out_bEnabled = OMX_FALSE;
-          DEBUG_PRINT_LOW("\n Disable output Port command recieved");
-          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-              && release_output_done())
-          {
-             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
-                        OMX_COMPONENT_GENERATE_EVENT);
-          }
-          else
-         {
-            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
-            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-            {
-              if (!sem_posted)
-              {
-                sem_posted = 1;
-                sem_post (&m_cmd_lock);
-              }
-                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
-                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+    if (cmd == OMX_CommandStateSet) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
+        DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
+        /***************************/
+        /* Current State is Loaded */
+        /***************************/
+        if (m_state == OMX_StateLoaded) {
+            if (eState == OMX_StateIdle) {
+                //if all buffers are allocated or all ports disabled
+                if (allocate_done() ||
+                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
+                } else {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
             }
-            // Skip the event notification
-            bFlag = 0;
+            /* Requesting transition from Loaded to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Loaded to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
+            }
+            /* Requesting transition from Loaded to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
+                        eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
 
-         }
-      }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
-    eRet = OMX_ErrorNotImplemented;
-  }
-  if(eRet == OMX_ErrorNone && bFlag)
-  {
-    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
-  }
-  if(!sem_posted)
-  {
-    sem_post(&m_cmd_lock);
-  }
+        /***************************/
+        /* Current State is IDLE */
+        /***************************/
+        else if (m_state == OMX_StateIdle) {
+            if (eState == OMX_StateLoaded) {
+                if (release_done()) {
+                    /*
+                       Since error is None , we will post an event at the end
+                       of this function definition
+                     */
+                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
+                } else {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
+                bFlag = 1;
+                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+                m_state=OMX_StateExecuting;
+                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
+            }
+            /* Requesting transition from Idle to Idle */
+            else if (eState == OMX_StateIdle) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Idle to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Idle to Pause */
+            else if (eState == OMX_StatePause) {
+                /*To pause the Video core we need to start the driver*/
+                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
+                      NULL) < */0) {
+                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
+                    omx_report_error ();
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
 
-  return eRet;
+        /******************************/
+        /* Current State is Executing */
+        /******************************/
+        else if (m_state == OMX_StateExecuting) {
+            DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
+            /* Requesting transition from Executing to Idle */
+            if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition
+                 */
+                DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+                if (!sem_posted) {
+                    sem_posted = 1;
+                    sem_post (&m_cmd_lock);
+                    execute_omx_flush(OMX_ALL);
+                }
+                bFlag = 0;
+            }
+            /* Requesting transition from Executing to Paused */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_LOW("\n PAUSE Command Issued");
+                m_state = OMX_StatePause;
+                bFlag = 1;
+            }
+            /* Requesting transition from Executing to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Executing to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is Pause  */
+        /***************************/
+        else if (m_state == OMX_StatePause) {
+            /* Requesting transition from Pause to Executing */
+            if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_LOW("\n Pause --> Executing \n");
+                m_state = OMX_StateExecuting;
+                bFlag = 1;
+            }
+            /* Requesting transition from Pause to Idle */
+            else if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("\n Pause --> Idle \n");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+                if (!sem_posted) {
+                    sem_posted = 1;
+                    sem_post (&m_cmd_lock);
+                    execute_omx_flush(OMX_ALL);
+                }
+                bFlag = 0;
+            }
+            /* Requesting transition from Pause to loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Pause to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is WaitForResources  */
+        /***************************/
+        else if (m_state == OMX_StateWaitForResources) {
+            /* Requesting transition from WaitForResources to Loaded */
+            if (eState == OMX_StateLoaded) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
+            }
+            /* Requesting transition from WaitForResources to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from WaitForResources to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            }
+            /* Requesting transition from WaitForResources to Loaded -
+               is NOT tested by Khronos TS */
+
+        } else {
+            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
+            eRet = OMX_ErrorBadParameter;
+        }
+    }
+    /********************************/
+    /* Current State is Invalid */
+    /*******************************/
+    else if (m_state == OMX_StateInvalid) {
+        /* State Transition from Inavlid to any state */
+        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
+                    || OMX_StateIdle || OMX_StateExecuting
+                    || OMX_StatePause || OMX_StateInvalid)) {
+            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
+            post_event(OMX_EventError,OMX_ErrorInvalidState,\
+                    OMX_COMPONENT_GENERATE_EVENT);
+            eRet = OMX_ErrorInvalidState;
+        }
+    } else if (cmd == OMX_CommandFlush) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
+                "with param1: %lu", param1);
+        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
+        }
+        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+        }
+        if (!sem_posted) {
+            sem_posted = 1;
+            DEBUG_PRINT_LOW("\n Set the Semaphore");
+            sem_post (&m_cmd_lock);
+            execute_omx_flush(param1);
+        }
+        bFlag = 0;
+    } else if ( cmd == OMX_CommandPortEnable) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
+                "with param1: %lu", param1);
+        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_inp_bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || allocate_input_done()) {
+                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+            DEBUG_PRINT_LOW("\n Enable output Port command recieved");
+            m_out_bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || (allocate_output_done())) {
+                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+
+            } else {
+                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+    } else if (cmd == OMX_CommandPortDisable) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
+                "with param1: %lu", param1);
+        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_inp_bEnabled = OMX_FALSE;
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_input_done()) {
+                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    if (!sem_posted) {
+                        sem_posted = 1;
+                        sem_post (&m_cmd_lock);
+                    }
+                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
+                }
+
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_out_bEnabled = OMX_FALSE;
+            DEBUG_PRINT_LOW("\n Disable output Port command recieved");
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_output_done()) {
+                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    if (!sem_posted) {
+                        sem_posted = 1;
+                        sem_post (&m_cmd_lock);
+                    }
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+                }
+                // Skip the event notification
+                bFlag = 0;
+
+            }
+        }
+    } else {
+        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
+        eRet = OMX_ErrorNotImplemented;
+    }
+    if (eRet == OMX_ErrorNone && bFlag) {
+        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
+    }
+    if (!sem_posted) {
+        sem_post(&m_cmd_lock);
+    }
+
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ExecuteOmxFlush
+   FUNCTION
+   omx_vdec::ExecuteOmxFlush
 
-DESCRIPTION
-  Executes the OMX flush.
+   DESCRIPTION
+   Executes the OMX flush.
 
-PARAMETERS
-  flushtype - input flush(1)/output flush(0)/ both.
+   PARAMETERS
+   flushtype - input flush(1)/output flush(0)/ both.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
 {
-  bool bRet = false;
-  struct v4l2_plane plane;
-  struct v4l2_buffer v4l2_buf;
-  struct v4l2_decoder_cmd dec;
-  DEBUG_PRINT_LOW("in %s", __func__);
-  memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
-  dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
-  switch (flushType)
-  {
-    case OMX_CORE_INPUT_PORT_INDEX:
-      input_flush_progress = true;
-      dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
-    break;
-    case OMX_CORE_OUTPUT_PORT_INDEX:
-      output_flush_progress = true;
-      dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
-    break;
-    default:
-      input_flush_progress = true;
-      output_flush_progress = true;
-      dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
-		  V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
-  }
+    bool bRet = false;
+    struct v4l2_plane plane;
+    struct v4l2_buffer v4l2_buf;
+    struct v4l2_decoder_cmd dec;
+    DEBUG_PRINT_LOW("in %s", __func__);
+    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
+    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
+    switch (flushType) {
+        case OMX_CORE_INPUT_PORT_INDEX:
+            input_flush_progress = true;
+            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
+            break;
+        case OMX_CORE_OUTPUT_PORT_INDEX:
+            output_flush_progress = true;
+            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
+            break;
+        default:
+            input_flush_progress = true;
+            output_flush_progress = true;
+            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
+                V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
+    }
 
-  if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
-  {
-    DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
-    bRet = false;
-  }
+    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
+        DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
+        bRet = false;
+    }
 
-  return bRet;
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_output_flush
 
 DESCRIPTION
-  Executes the OMX flush at OUTPUT PORT.
+Executes the OMX flush at OUTPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_vdec::execute_output_flush()
 {
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate FBD for all Buffers in the FTBq*/
-  pthread_mutex_lock(&m_lock);
-  DEBUG_PRINT_LOW("\n Initiate Output Flush");
-  while (m_ftb_q.m_size)
-  {
-    DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
-                       m_ftb_q.m_size,pending_output_buffers);
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
-    if(ident == m_fill_output_msg )
-    {
-      m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+    /*Generate FBD for all Buffers in the FTBq*/
+    pthread_mutex_lock(&m_lock);
+    DEBUG_PRINT_LOW("\n Initiate Output Flush");
+    while (m_ftb_q.m_size) {
+        DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
+                m_ftb_q.m_size,pending_output_buffers);
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+        DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
+        if (ident == m_fill_output_msg ) {
+            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-    else if (ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-  pthread_mutex_unlock(&m_lock);
-  output_flush_progress = false;
+    pthread_mutex_unlock(&m_lock);
+    output_flush_progress = false;
 
-  if (arbitrary_bytes)
-  {
-    prev_ts = LLONG_MAX;
-    rst_prev_ts = true;
-  }
-  DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
-  return bRet;
+    if (arbitrary_bytes) {
+        prev_ts = LLONG_MAX;
+        rst_prev_ts = true;
+    }
+    DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_input_flush
 
 DESCRIPTION
-  Executes the OMX flush at INPUT PORT.
+Executes the OMX flush at INPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_vdec::execute_input_flush()
 {
-  unsigned       i =0;
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned       i =0;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate EBD for all Buffers in the ETBq*/
-  DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
+    /*Generate EBD for all Buffers in the ETBq*/
+    DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
 
-  pthread_mutex_lock(&m_lock);
-  DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
+    pthread_mutex_lock(&m_lock);
+    DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
 
-    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
-    {
-      DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+            DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
+            pending_input_buffers++;
+            DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
+                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
+                    (OMX_BUFFERHEADERTYPE *)p1);
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-    else if(ident == OMX_COMPONENT_GENERATE_ETB)
-    {
-      pending_input_buffers++;
-      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
-        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
-    }
-    else if (ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
-        (OMX_BUFFERHEADERTYPE *)p1);
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-  time_stamp_dts.flush_timestamp();
-  /*Check if Heap Buffers are to be flushed*/
-  if (arbitrary_bytes)
-  {
-    DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
-    h264_scratch.nFilledLen = 0;
-    nal_count = 0;
-    look_ahead_nal = false;
-    frame_count = 0;
-    h264_last_au_ts = LLONG_MAX;
-    h264_last_au_flags = 0;
-    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-    m_demux_entries = 0;
-    DEBUG_PRINT_LOW("\n Initialize parser");
-    if (m_frame_parser.mutils)
-    {
-      m_frame_parser.mutils->initialize_frame_checking_environment();
-    }
+    time_stamp_dts.flush_timestamp();
+    /*Check if Heap Buffers are to be flushed*/
+    if (arbitrary_bytes) {
+        DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
+        h264_scratch.nFilledLen = 0;
+        nal_count = 0;
+        look_ahead_nal = false;
+        frame_count = 0;
+        h264_last_au_ts = LLONG_MAX;
+        h264_last_au_flags = 0;
+        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+        m_demux_entries = 0;
+        DEBUG_PRINT_LOW("\n Initialize parser");
+        if (m_frame_parser.mutils) {
+            m_frame_parser.mutils->initialize_frame_checking_environment();
+        }
 
-    while (m_input_pending_q.m_size)
-    {
-      m_input_pending_q.pop_entry(&p1,&p2,&ident);
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
-    }
+        while (m_input_pending_q.m_size) {
+            m_input_pending_q.pop_entry(&p1,&p2,&ident);
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
+        }
 
-    if (psource_frame)
-    {
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
-      psource_frame = NULL;
-    }
+        if (psource_frame) {
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
+            psource_frame = NULL;
+        }
 
-    if (pdest_frame)
-    {
-      pdest_frame->nFilledLen = 0;
-      m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
-              (unsigned int)NULL);
-      pdest_frame = NULL;
+        if (pdest_frame) {
+            pdest_frame->nFilledLen = 0;
+            m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
+                    (unsigned int)NULL);
+            pdest_frame = NULL;
+        }
+        m_frame_parser.flush();
     }
-    m_frame_parser.flush();
-  }
-  pthread_mutex_unlock(&m_lock);
-  input_flush_progress = false;
-  if (!arbitrary_bytes)
-  {
-    prev_ts = LLONG_MAX;
-    rst_prev_ts = true;
-  }
+    pthread_mutex_unlock(&m_lock);
+    input_flush_progress = false;
+    if (!arbitrary_bytes) {
+        prev_ts = LLONG_MAX;
+        rst_prev_ts = true;
+    }
 #ifdef _ANDROID_
-  if (m_debug_timestamp)
-  {
-    m_timestamp_list.reset_ts_list();
-  }
+    if (m_debug_timestamp) {
+        m_timestamp_list.reset_ts_list();
+    }
 #endif
-  DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
-  return bRet;
+    DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommandEvent
+   FUNCTION
+   omx_vdec::SendCommandEvent
 
-DESCRIPTION
-  Send the event to decoder pipe.  This is needed to generate the callbacks
-  in decoder thread context.
+   DESCRIPTION
+   Send the event to decoder pipe.  This is needed to generate the callbacks
+   in decoder thread context.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::post_event(unsigned int p1,
-                          unsigned int p2,
-                          unsigned int id)
+        unsigned int p2,
+        unsigned int id)
 {
-  bool bRet      =                      false;
+    bool bRet      =                      false;
 
 
-  pthread_mutex_lock(&m_lock);
+    pthread_mutex_lock(&m_lock);
 
-  if (id == m_fill_output_msg ||
-      id == OMX_COMPONENT_GENERATE_FBD)
-  {
-    m_ftb_q.insert_entry(p1,p2,id);
-  }
-  else if (id == OMX_COMPONENT_GENERATE_ETB ||
-           id == OMX_COMPONENT_GENERATE_EBD ||
-           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
-  {
-	  m_etb_q.insert_entry(p1,p2,id);
-  }
-  else
-  {
-    m_cmd_q.insert_entry(p1,p2,id);
-  }
+    if (id == m_fill_output_msg ||
+            id == OMX_COMPONENT_GENERATE_FBD) {
+        m_ftb_q.insert_entry(p1,p2,id);
+    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
+            id == OMX_COMPONENT_GENERATE_EBD ||
+            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+        m_etb_q.insert_entry(p1,p2,id);
+    } else {
+        m_cmd_q.insert_entry(p1,p2,id);
+    }
 
-  bRet = true;
-  DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
-  post_message(this, id);
+    bRet = true;
+    DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
+    post_message(this, id);
 
-  pthread_mutex_unlock(&m_lock);
+    pthread_mutex_unlock(&m_lock);
 
-  return bRet;
+    return bRet;
 }
 
 OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
-  if(!profileLevelType)
-    return OMX_ErrorBadParameter;
+    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
+    if (!profileLevelType)
+        return OMX_ErrorBadParameter;
 
-  if(profileLevelType->nPortIndex == 0) {
-    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+    if (profileLevelType->nPortIndex == 0) {
+        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
 
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
+            // TODO
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+            eRet = OMX_ErrorNoMore;
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        }
+    } else {
+        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
-    {
-      // TODO
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-    {
-        eRet = OMX_ErrorNoMore;
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetParameter
+   FUNCTION
+   omx_vdec::GetParameter
 
-DESCRIPTION
-  OMX Get Parameter method implementation
+   DESCRIPTION
+   OMX Get Parameter method implementation
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if successful.
+   RETURN VALUE
+   Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                           OMX_IN OMX_INDEXTYPE paramIndex,
-                                           OMX_INOUT OMX_PTR     paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_INOUT OMX_PTR     paramData)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
     DEBUG_PRINT_LOW("get_parameter: \n");
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    if(paramData == NULL)
-    {
+    if (paramData == NULL) {
         DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
         return OMX_ErrorBadParameter;
     }
-  switch((unsigned long)paramIndex)
-  {
-    case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
-                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
-      eRet = update_portdef(portDefn);
-      if (eRet == OMX_ErrorNone)
-          m_port_def = *portDefn;
-      break;
-    }
-    case OMX_IndexParamVideoInit:
-    {
-      OMX_PORT_PARAM_TYPE *portParamType =
-                              (OMX_PORT_PARAM_TYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
-
-      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-      portParamType->nSize = sizeof(portParamType);
-      portParamType->nPorts           = 2;
-      portParamType->nStartPortNumber = 0;
-      break;
-    }
-    case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
-
-      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
-      portFmt->nSize             = sizeof(portFmt);
-
-      if (0 == portFmt->nPortIndex)
-      {
-        if (0 == portFmt->nIndex)
-        {
-              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
-              portFmt->eCompressionFormat = eCompressionFormat;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
-              " NoMore compression formats\n");
-          eRet =  OMX_ErrorNoMore;
-        }
-      }
-      else if (1 == portFmt->nPortIndex)
-      {
-        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
-
-        if(0 == portFmt->nIndex)
-            portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
-                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
-        else if (1 == portFmt->nIndex)
-          portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
-        else
-        {
-           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
-                  " NoMore Color formats\n");
-           eRet =  OMX_ErrorNoMore;
-        }
-	DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
-                          (int)portFmt->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamAudioInit:
-    {
-        OMX_PORT_PARAM_TYPE *audioPortParamType =
-                                              (OMX_PORT_PARAM_TYPE *) paramData;
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
-        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-        audioPortParamType->nSize = sizeof(audioPortParamType);
-        audioPortParamType->nPorts           = 0;
-        audioPortParamType->nStartPortNumber = 0;
-        break;
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamImageInit:
-    {
-        OMX_PORT_PARAM_TYPE *imagePortParamType =
-                                              (OMX_PORT_PARAM_TYPE *) paramData;
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
-        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-        imagePortParamType->nSize = sizeof(imagePortParamType);
-        imagePortParamType->nPorts           = 0;
-        imagePortParamType->nStartPortNumber = 0;
-        break;
-
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamOtherInit:
-    {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
-                          paramIndex);
-        eRet =OMX_ErrorUnsupportedIndex;
-        break;
-    }
-    case OMX_IndexParamStandardComponentRole:
-    {
-        OMX_PARAM_COMPONENTROLETYPE *comp_role;
-        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
-        comp_role->nSize = sizeof(*comp_role);
-
-        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
-                    paramIndex);
-        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
-                    OMX_MAX_STRINGNAME_SIZE);
-        break;
-    }
-    /* Added for parameter test */
-    case OMX_IndexParamPriorityMgmt:
-        {
-
-            OMX_PRIORITYMGMTTYPE *priorityMgmType =
-                                             (OMX_PRIORITYMGMTTYPE *) paramData;
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
-            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
-            priorityMgmType->nSize = sizeof(priorityMgmType);
-
-            break;
-        }
-    /* Added for parameter test */
-    case OMX_IndexParamCompBufferSupplier:
-        {
-            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
-                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
-
-            bufferSupplierType->nSize = sizeof(bufferSupplierType);
-            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
-            if(0 == bufferSupplierType->nPortIndex)
-                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
-            else if (1 == bufferSupplierType->nPortIndex)
-                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
-            else
-                eRet = OMX_ErrorBadPortIndex;
-
-
-            break;
-        }
-    case OMX_IndexParamVideoAvc:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
-                        paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoH263:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
-                        paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoMpeg4:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
-                        paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoMpeg2:
-        {
-          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
-              paramIndex);
-          break;
-        }
-    case OMX_IndexParamVideoProfileLevelQuerySupported:
-        {
-          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
-          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
-            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
-    eRet = get_supported_profile_level_for_1080p(profileLevelType);
-          break;
-        }
-#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
-        {
-            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
-            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
-            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
-
-                if(secure_mode) {
-                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
-                                                      GRALLOC_USAGE_PRIVATE_UNCACHED);
-                } else {
-#ifdef _HEVC_USE_ADSP_HEAP_
-                    nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
-#else
-                    nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
-#endif
-                    DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x\n", (unsigned int)nativeBuffersUsage->nUsage);
-                }
-            } else {
-                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
-                eRet = OMX_ErrorBadParameter;
+    switch ((unsigned long)paramIndex) {
+        case OMX_IndexParamPortDefinition:
+            {
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
+                    (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
+                eRet = update_portdef(portDefn);
+                if (eRet == OMX_ErrorNone)
+                    m_port_def = *portDefn;
+                break;
             }
-        }
-        break;
+        case OMX_IndexParamVideoInit:
+            {
+                OMX_PORT_PARAM_TYPE *portParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
+
+                portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                portParamType->nSize = sizeof(portParamType);
+                portParamType->nPorts           = 2;
+                portParamType->nStartPortNumber = 0;
+                break;
+            }
+        case OMX_IndexParamVideoPortFormat:
+            {
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
+
+                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
+                portFmt->nSize             = sizeof(portFmt);
+
+                if (0 == portFmt->nPortIndex) {
+                    if (0 == portFmt->nIndex) {
+                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
+                        portFmt->eCompressionFormat = eCompressionFormat;
+                    } else {
+                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
+                                " NoMore compression formats\n");
+                        eRet =  OMX_ErrorNoMore;
+                    }
+                } else if (1 == portFmt->nPortIndex) {
+                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
+
+                    if (0 == portFmt->nIndex)
+                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+                    else if (1 == portFmt->nIndex)
+                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+                    else {
+                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
+                                " NoMore Color formats\n");
+                        eRet =  OMX_ErrorNoMore;
+                    }
+                    DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
+                } else {
+                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
+                            (int)portFmt->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamAudioInit:
+            {
+                OMX_PORT_PARAM_TYPE *audioPortParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
+                audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                audioPortParamType->nSize = sizeof(audioPortParamType);
+                audioPortParamType->nPorts           = 0;
+                audioPortParamType->nStartPortNumber = 0;
+                break;
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamImageInit:
+            {
+                OMX_PORT_PARAM_TYPE *imagePortParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
+                imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                imagePortParamType->nSize = sizeof(imagePortParamType);
+                imagePortParamType->nPorts           = 0;
+                imagePortParamType->nStartPortNumber = 0;
+                break;
+
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamOtherInit:
+            {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
+                        paramIndex);
+                eRet =OMX_ErrorUnsupportedIndex;
+                break;
+            }
+        case OMX_IndexParamStandardComponentRole:
+            {
+                OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
+                comp_role->nSize = sizeof(*comp_role);
+
+                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
+                        paramIndex);
+                strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
+                        OMX_MAX_STRINGNAME_SIZE);
+                break;
+            }
+            /* Added for parameter test */
+        case OMX_IndexParamPriorityMgmt:
+            {
+
+                OMX_PRIORITYMGMTTYPE *priorityMgmType =
+                    (OMX_PRIORITYMGMTTYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
+                priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
+                priorityMgmType->nSize = sizeof(priorityMgmType);
+
+                break;
+            }
+            /* Added for parameter test */
+        case OMX_IndexParamCompBufferSupplier:
+            {
+                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
+                    (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
+
+                bufferSupplierType->nSize = sizeof(bufferSupplierType);
+                bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
+                if (0 == bufferSupplierType->nPortIndex)
+                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+                else if (1 == bufferSupplierType->nPortIndex)
+                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+                else
+                    eRet = OMX_ErrorBadPortIndex;
+
+
+                break;
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg2:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelQuerySupported:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
+                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+                eRet = get_supported_profile_level_for_1080p(profileLevelType);
+                break;
+            }
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
+            {
+                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
+                GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
+                if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+
+                    if (secure_mode) {
+                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
+                                GRALLOC_USAGE_PRIVATE_UNCACHED);
+                    } else {
+#ifdef _HEVC_USE_ADSP_HEAP_
+                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+#else
+                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+#endif
+                        DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x\n", (unsigned int)nativeBuffersUsage->nUsage);
+                    }
+                } else {
+                    DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
+                    eRet = OMX_ErrorBadParameter;
+                }
+            }
+            break;
 #endif
 
-    default:
-    {
-      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
-      eRet =OMX_ErrorUnsupportedIndex;
+        default:
+            {
+                DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
+                eRet =OMX_ErrorUnsupportedIndex;
+            }
+
     }
 
-  }
+    DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
+            drv_ctx.video_resolution.frame_width,
+            drv_ctx.video_resolution.frame_height,
+            drv_ctx.video_resolution.stride,
+            drv_ctx.video_resolution.scan_lines);
 
-  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
-      drv_ctx.video_resolution.frame_width,
-      drv_ctx.video_resolution.frame_height,
-      drv_ctx.video_resolution.stride,
-      drv_ctx.video_resolution.scan_lines);
-
-  return eRet;
+    return eRet;
 }
 
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
@@ -2993,22 +2662,22 @@
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
 
-    if((params == NULL) ||
-      (params->nativeBuffer == NULL) ||
-      (params->nativeBuffer->handle == NULL) ||
-      !m_enable_android_native_buffers)
+    if ((params == NULL) ||
+            (params->nativeBuffer == NULL) ||
+            (params->nativeBuffer->handle == NULL) ||
+            !m_enable_android_native_buffers)
         return OMX_ErrorBadParameter;
     m_use_android_native_buffers = OMX_TRUE;
     sp<android_native_buffer_t> nBuf = params->nativeBuffer;
     private_handle_t *handle = (private_handle_t *)nBuf->handle;
-    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
+    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
         OMX_U8 *buffer = NULL;
-        if(!secure_mode) {
-                buffer = (OMX_U8*)mmap(0, handle->size,
+        if (!secure_mode) {
+            buffer = (OMX_U8*)mmap(0, handle->size,
                     PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
-                if(buffer == MAP_FAILED) {
-                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
-                    return OMX_ErrorInsufficientResources;
+            if (buffer == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+                return OMX_ErrorInsufficientResources;
             }
         }
         eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
@@ -3019,962 +2688,825 @@
 }
 #endif
 /* ======================================================================
-FUNCTION
-  omx_vdec::Setparameter
+   FUNCTION
+   omx_vdec::Setparameter
 
-DESCRIPTION
-  OMX Set Parameter method implementation.
+   DESCRIPTION
+   OMX Set Parameter method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                           OMX_IN OMX_INDEXTYPE paramIndex,
-                                           OMX_IN OMX_PTR        paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_IN OMX_PTR        paramData)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     int ret=0;
     struct v4l2_format fmt;
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    if(paramData == NULL)
-    {
-         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
-         return OMX_ErrorBadParameter;
+    if (paramData == NULL) {
+        DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
+        return OMX_ErrorBadParameter;
     }
-    if((m_state != OMX_StateLoaded) &&
-          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
-          (m_out_bEnabled == OMX_TRUE) &&
-          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
-          (m_inp_bEnabled == OMX_TRUE)) {
+    if ((m_state != OMX_StateLoaded) &&
+            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
+            (m_out_bEnabled == OMX_TRUE) &&
+            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
+            (m_inp_bEnabled == OMX_TRUE)) {
         DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
         return OMX_ErrorIncorrectStateOperation;
     }
-  switch((unsigned long)paramIndex)
-  {
-    case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
-      //been called.
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
-             (int)portDefn->format.video.nFrameHeight,
-             (int)portDefn->format.video.nFrameWidth);
-      if(OMX_DirOutput == portDefn->eDir)
-      {
-          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
-          m_display_id = portDefn->format.video.pNativeWindow;
-          unsigned int buffer_size;
-          if (!client_buffers.get_buffer_req(buffer_size)) {
-              DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
-              eRet = OMX_ErrorBadParameter;
-          } else {
-              if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
-                      portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size )
-              {
-                  drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
-                  drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
-                  eRet = set_buffer_req(&drv_ctx.op_buf);
-                  if (eRet == OMX_ErrorNone)
-                      m_port_def = *portDefn;
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
-                          drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
-                          portDefn->nBufferCountActual, portDefn->nBufferSize);
-                  eRet = OMX_ErrorBadParameter;
-              }
-          }
-      }
-      else if(OMX_DirInput == portDefn->eDir)
-      {
-        if((portDefn->format.video.xFramerate >> 16) > 0 &&
-           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
-        {
-            // Frame rate only should be set if this is a "known value" or to
-            // activate ts prediction logic (arbitrary mode only) sending input
-            // timestamps with max value (LLONG_MAX).
-            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
-                             portDefn->format.video.xFramerate >> 16);
-            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
-                          drv_ctx.frame_rate.fps_denominator);
-            if(!drv_ctx.frame_rate.fps_numerator)
+    switch ((unsigned long)paramIndex) {
+        case OMX_IndexParamPortDefinition:
             {
-              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
-              drv_ctx.frame_rate.fps_numerator = 30;
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
+                //been called.
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
+                        (int)portDefn->format.video.nFrameHeight,
+                        (int)portDefn->format.video.nFrameWidth);
+                if (OMX_DirOutput == portDefn->eDir) {
+                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
+                    m_display_id = portDefn->format.video.pNativeWindow;
+                    unsigned int buffer_size;
+                    if (!client_buffers.get_buffer_req(buffer_size)) {
+                        DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
+                        eRet = OMX_ErrorBadParameter;
+                    } else {
+                        if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
+                                portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
+                            drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
+                            drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
+                            eRet = set_buffer_req(&drv_ctx.op_buf);
+                            if (eRet == OMX_ErrorNone)
+                                m_port_def = *portDefn;
+                        } else {
+                            DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
+                                    drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
+                                    portDefn->nBufferCountActual, portDefn->nBufferSize);
+                            eRet = OMX_ErrorBadParameter;
+                        }
+                    }
+                } else if (OMX_DirInput == portDefn->eDir) {
+                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
+                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
+                        // Frame rate only should be set if this is a "known value" or to
+                        // activate ts prediction logic (arbitrary mode only) sending input
+                        // timestamps with max value (LLONG_MAX).
+                        DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
+                                portDefn->format.video.xFramerate >> 16);
+                        Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
+                                drv_ctx.frame_rate.fps_denominator);
+                        if (!drv_ctx.frame_rate.fps_numerator) {
+                            DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
+                            drv_ctx.frame_rate.fps_numerator = 30;
+                        }
+                        if (drv_ctx.frame_rate.fps_denominator)
+                            drv_ctx.frame_rate.fps_numerator = (int)
+                                drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
+                        drv_ctx.frame_rate.fps_denominator = 1;
+                        frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
+                            drv_ctx.frame_rate.fps_numerator;
+                        DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
+                                frm_int, drv_ctx.frame_rate.fps_numerator /
+                                (float)drv_ctx.frame_rate.fps_denominator);
+                    }
+                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
+                    if (drv_ctx.video_resolution.frame_height !=
+                            portDefn->format.video.nFrameHeight ||
+                            drv_ctx.video_resolution.frame_width  !=
+                            portDefn->format.video.nFrameWidth) {
+                        DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
+                                portDefn->format.video.nFrameWidth,
+                                portDefn->format.video.nFrameHeight);
+                        if (portDefn->format.video.nFrameHeight != 0x0 &&
+                                portDefn->format.video.nFrameWidth != 0x0) {
+                            update_resolution(portDefn->format.video.nFrameWidth,
+                                    portDefn->format.video.nFrameHeight);
+                            fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+                            fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+                            fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+                            fmt.fmt.pix_mp.pixelformat = output_capability;
+                            DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
+                            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                            if (ret) {
+                                DEBUG_PRINT_ERROR("\n Set Resolution failed");
+                                eRet = OMX_ErrorUnsupportedSetting;
+                            } else
+                                eRet = get_buffer_req(&drv_ctx.op_buf);
+                        }
+                    } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
+                            || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
+                        vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
+                        drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
+                        drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
+                            (~(buffer_prop->alignment - 1));
+                        eRet = set_buffer_req(buffer_prop);
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
+                                drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
+                                portDefn->nBufferCountActual, portDefn->nBufferSize);
+                        eRet = OMX_ErrorBadParameter;
+                    }
+                } else if (portDefn->eDir ==  OMX_DirMax) {
+                    DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
+                            (int)portDefn->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
             }
-            if(drv_ctx.frame_rate.fps_denominator)
-              drv_ctx.frame_rate.fps_numerator = (int)
-                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
-              drv_ctx.frame_rate.fps_denominator = 1;
-            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
-                      drv_ctx.frame_rate.fps_numerator;
-            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
-                             frm_int, drv_ctx.frame_rate.fps_numerator /
-                             (float)drv_ctx.frame_rate.fps_denominator);
-        }
-         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
-         if(drv_ctx.video_resolution.frame_height !=
-               portDefn->format.video.nFrameHeight ||
-             drv_ctx.video_resolution.frame_width  !=
-               portDefn->format.video.nFrameWidth)
-         {
-             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
-                           portDefn->format.video.nFrameWidth,
-                           portDefn->format.video.nFrameHeight);
-             if (portDefn->format.video.nFrameHeight != 0x0 &&
-                 portDefn->format.video.nFrameWidth != 0x0)
-             {
-                 update_resolution(portDefn->format.video.nFrameWidth,
-                    portDefn->format.video.nFrameHeight);
-			fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-			fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-			fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-			fmt.fmt.pix_mp.pixelformat = output_capability;
-			DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
-			ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-               if (ret)
-               {
-                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
-                   eRet = OMX_ErrorUnsupportedSetting;
-               }
-               else
-                   eRet = get_buffer_req(&drv_ctx.op_buf);
-             }
-         }
-         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
-                  || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)
-         {
-             vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
-             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
-             drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
-                      (~(buffer_prop->alignment - 1));
-             eRet = set_buffer_req(buffer_prop);
-         }
-         else
-         {
-             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
-               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
-               portDefn->nBufferCountActual, portDefn->nBufferSize);
-             eRet = OMX_ErrorBadParameter;
-         }
-      }
-      else if (portDefn->eDir ==  OMX_DirMax)
-      {
-          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
-                      (int)portDefn->nPortIndex);
-          eRet = OMX_ErrorBadPortIndex;
-      }
-    }
-    break;
-    case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      int ret=0;
-      struct v4l2_format fmt;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
-              portFmt->eColorFormat);
-
-      if(1 == portFmt->nPortIndex)
-      {
-          fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-          fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-          fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-          fmt.fmt.pix_mp.pixelformat = capture_capability;
-          enum vdec_output_fromat op_format;
-          if((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
-                      QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
-              (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
-              op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
-          else if(portFmt->eColorFormat ==
-                  (OMX_COLOR_FORMATTYPE)
-                  QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
-              op_format = VDEC_YUV_FORMAT_TILE_4x2;
-          else
-              eRet = OMX_ErrorBadParameter;
-
-          if(eRet == OMX_ErrorNone)
-          {
-              drv_ctx.output_format = op_format;
-              ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-              if(ret)
-              {
-                  DEBUG_PRINT_ERROR("\n Set output format failed");
-                  eRet = OMX_ErrorUnsupportedSetting;
-                  /*TODO: How to handle this case */
-              }
-              else
-              {
-                  eRet = get_buffer_req(&drv_ctx.op_buf);
-              }
-          }
-          if (eRet == OMX_ErrorNone){
-           if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
-             DEBUG_PRINT_ERROR("\n Set color format failed");
-             eRet = OMX_ErrorBadParameter;
-           }
-         }
-      }
-    }
-    break;
-
-    case OMX_QcomIndexPortDefn:
-    {
-        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
-            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
-        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
-            portFmt->nFramePackingFormat);
-
-        /* Input port */
-        if (portFmt->nPortIndex == 0)
-        {
-            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
-            {
-              if(secure_mode) {
-                arbitrary_bytes = false;
-                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
-                eRet = OMX_ErrorUnsupportedSetting;
-              } else {
-               arbitrary_bytes = true;
-              }
-            }
-            else if (portFmt->nFramePackingFormat ==
-                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
-            {
-               arbitrary_bytes = false;
-            }
-            else
-            {
-                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
-                    portFmt->nFramePackingFormat);
-                eRet = OMX_ErrorUnsupportedSetting;
-            }
-        }
-        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
-        {
-          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
-          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
-               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
-              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
-          {
-            m_out_mem_region_smi = OMX_TRUE;
-            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
-            {
-              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
-              m_use_output_pmem = OMX_TRUE;
-            }
-          }
-        }
-    }
-    break;
-
-     case OMX_IndexParamStandardComponentRole:
-     {
-          OMX_PARAM_COMPONENTROLETYPE *comp_role;
-          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
-                       comp_role->cRole);
-
-          if((m_state == OMX_StateLoaded)&&
-              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-          {
-           DEBUG_PRINT_LOW("Set Parameter called in valid state");
-          }
-          else
-          {
-             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-             return OMX_ErrorIncorrectStateOperation;
-          }
-
-          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet = OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-          {
-            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-            {
-              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-          }
-          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
-                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
-                  )
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
-                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
-                    )
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-	  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-          {
-            if(!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
-               (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE)))
-            {
-              strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-            }
-	    else
-            {
-              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-	  }
-          else
-          {
-               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
-               eRet = OMX_ErrorInvalidComponentName;
-          }
-          break;
-     }
-
-    case OMX_IndexParamPriorityMgmt:
-        {
-            if(m_state != OMX_StateLoaded)
-            {
-               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-               return OMX_ErrorIncorrectStateOperation;
-            }
-            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
-            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
-              priorityMgmtype->nGroupID);
-
-            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
-             priorityMgmtype->nGroupPriority);
-
-            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
-            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
-
             break;
-        }
-
-      case OMX_IndexParamCompBufferSupplier:
-      {
-          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
-                bufferSupplierType->eBufferSupplier);
-             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
-                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
-
-             else
-
-             eRet = OMX_ErrorBadPortIndex;
-
-          break;
-
-      }
-      case OMX_IndexParamVideoAvc:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoH263:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoMpeg4:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoMpeg2:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
-                    paramIndex);
-              break;
-          }
-       case OMX_QcomIndexParamVideoDecoderPictureOrder:
-          {
-              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
-                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
-			  struct v4l2_control control;
-			  int pic_order,rc=0;
-              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
-                    pictureOrder->eOutputPictureOrder);
-		if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
-			pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
-		  }
-		else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
-			pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
-                  time_stamp_dts.set_timestamp_reorder_mode(false);
-		}
-		else
-		eRet = OMX_ErrorBadParameter;
-		if (eRet == OMX_ErrorNone)
-		{
-			control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
-			control.value = pic_order;
-			rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-			if(rc)
-			{
-				DEBUG_PRINT_ERROR("\n Set picture order failed");
-				eRet = OMX_ErrorUnsupportedSetting;
-			}
-		}
-		break;
-	}
-    case OMX_QcomIndexParamConcealMBMapExtraData:
-      if(!secure_mode)
-          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
-                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      else {
-          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-          eRet = OMX_ErrorUnsupportedSetting;
-      }
-      break;
-    case OMX_QcomIndexParamFrameInfoExtraData:
-      {
-        if(!secure_mode)
-            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
-                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
-        else {
-            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-            eRet = OMX_ErrorUnsupportedSetting;
-        }
-       break;
-      }
-    case OMX_QcomIndexParamInterlaceExtraData:
-      if(!secure_mode)
-          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      else {
-          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-          eRet = OMX_ErrorUnsupportedSetting;
-      }
-      break;
-    case OMX_QcomIndexParamH264TimeInfo:
-      if(!secure_mode)
-          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      else {
-          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-          eRet = OMX_ErrorUnsupportedSetting;
-      }
-      break;
-    case OMX_QcomIndexParamVideoDivx:
-      {
-        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
-      }
-      break;
-    case OMX_QcomIndexPlatformPvt:
-      {
-        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
-        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
-        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
-        {
-          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
-          eRet = OMX_ErrorUnsupportedSetting;
-        }
-        else
-        {
-          m_out_pvt_entry_pmem = OMX_TRUE;
-          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
-          {
-            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
-            m_use_output_pmem = OMX_TRUE;
-          }
-        }
-
-      }
-      break;
-    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
-      {
-        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
-        DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
-        struct v4l2_control control;
-        int rc;
-        drv_ctx.idr_only_decoding = 1;
-        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
-        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
-        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-        if(rc)
-        {
-          DEBUG_PRINT_ERROR("\n Set picture order failed");
-          eRet = OMX_ErrorUnsupportedSetting;
-        } else {
-            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
-            control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
-            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-            if(rc)
+        case OMX_IndexParamVideoPortFormat:
             {
-              DEBUG_PRINT_ERROR("\n Sync frame setting failed");
-              eRet = OMX_ErrorUnsupportedSetting;
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                int ret=0;
+                struct v4l2_format fmt;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
+                        portFmt->eColorFormat);
+
+                if (1 == portFmt->nPortIndex) {
+                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+                    fmt.fmt.pix_mp.pixelformat = capture_capability;
+                    enum vdec_output_fromat op_format;
+                    if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
+                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
+                            (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
+                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
+                    else if (portFmt->eColorFormat ==
+                            (OMX_COLOR_FORMATTYPE)
+                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
+                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
+                    else
+                        eRet = OMX_ErrorBadParameter;
+
+                    if (eRet == OMX_ErrorNone) {
+                        drv_ctx.output_format = op_format;
+                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                        if (ret) {
+                            DEBUG_PRINT_ERROR("\n Set output format failed");
+                            eRet = OMX_ErrorUnsupportedSetting;
+                            /*TODO: How to handle this case */
+                        } else {
+                            eRet = get_buffer_req(&drv_ctx.op_buf);
+                        }
+                    }
+                    if (eRet == OMX_ErrorNone) {
+                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
+                            DEBUG_PRINT_ERROR("\n Set color format failed");
+                            eRet = OMX_ErrorBadParameter;
+                        }
+                    }
+                }
             }
-        }
-      }
-      break;
+            break;
 
-    case OMX_QcomIndexParamIndexExtraDataType:
-      {
-        if(!secure_mode) {
-            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
-            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
-                   (extradataIndexType->bEnabled == OMX_TRUE) &&
-                   (extradataIndexType->nPortIndex == 1))
+        case OMX_QcomIndexPortDefn:
             {
-              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
-              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
+                OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
+                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
+                        portFmt->nFramePackingFormat);
+
+                /* Input port */
+                if (portFmt->nPortIndex == 0) {
+                    if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
+                        if (secure_mode) {
+                            arbitrary_bytes = false;
+                            DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
+                            eRet = OMX_ErrorUnsupportedSetting;
+                        } else {
+                            arbitrary_bytes = true;
+                        }
+                    } else if (portFmt->nFramePackingFormat ==
+                            OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
+                        arbitrary_bytes = false;
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
+                                portFmt->nFramePackingFormat);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+                    DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
+                    if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
+                                portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
+                            portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
+                        m_out_mem_region_smi = OMX_TRUE;
+                        if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+                            DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
+                            m_use_output_pmem = OMX_TRUE;
+                        }
+                    }
+                }
+            }
+            break;
+
+        case OMX_IndexParamStandardComponentRole:
+            {
+                OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
+                        comp_role->cRole);
+
+                if ((m_state == OMX_StateLoaded)&&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
+                } else {
+                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                    return OMX_ErrorIncorrectStateOperation;
+                }
+
+                if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+                        ) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+                        ) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
+                            (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
+                        strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
+                    eRet = OMX_ErrorInvalidComponentName;
+                }
+                break;
+            }
+
+        case OMX_IndexParamPriorityMgmt:
+            {
+                if (m_state != OMX_StateLoaded) {
+                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                    return OMX_ErrorIncorrectStateOperation;
+                }
+                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
+                        priorityMgmtype->nGroupID);
+
+                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
+                        priorityMgmtype->nGroupPriority);
+
+                m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
+                m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
+
+                break;
+            }
+
+        case OMX_IndexParamCompBufferSupplier:
+            {
+                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
+                        bufferSupplierType->eBufferSupplier);
+                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
+                    m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
+
+                else
+
+                    eRet = OMX_ErrorBadPortIndex;
+
+                break;
 
             }
-         }
-       }
-      break;
-    case OMX_QcomIndexParamEnableSmoothStreaming:
-      {
-	      struct v4l2_control control;
-	      struct v4l2_format fmt;
-	      control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
-	      control.value = 1;
-	      int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
-	      if(rc < 0) {
-		      DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
-		      eRet = OMX_ErrorHardware;
-	      }
-      }
-     break;
+        case OMX_IndexParamVideoAvc:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg2:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
+                        paramIndex);
+                break;
+            }
+        case OMX_QcomIndexParamVideoDecoderPictureOrder:
+            {
+                QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
+                    (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
+                struct v4l2_control control;
+                int pic_order,rc=0;
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
+                        pictureOrder->eOutputPictureOrder);
+                if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
+                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
+                } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
+                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
+                    time_stamp_dts.set_timestamp_reorder_mode(false);
+                } else
+                    eRet = OMX_ErrorBadParameter;
+                if (eRet == OMX_ErrorNone) {
+                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+                    control.value = pic_order;
+                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+                    if (rc) {
+                        DEBUG_PRINT_ERROR("\n Set picture order failed");
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+                break;
+            }
+        case OMX_QcomIndexParamConcealMBMapExtraData:
+            if (!secure_mode)
+                eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            else {
+                DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                eRet = OMX_ErrorUnsupportedSetting;
+            }
+            break;
+        case OMX_QcomIndexParamFrameInfoExtraData:
+            {
+                if (!secure_mode)
+                    eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
+                            ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                else {
+                    DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                    eRet = OMX_ErrorUnsupportedSetting;
+                }
+                break;
+            }
+        case OMX_QcomIndexParamInterlaceExtraData:
+            if (!secure_mode)
+                eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            else {
+                DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                eRet = OMX_ErrorUnsupportedSetting;
+            }
+            break;
+        case OMX_QcomIndexParamH264TimeInfo:
+            if (!secure_mode)
+                eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
+                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
+            else {
+                DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                eRet = OMX_ErrorUnsupportedSetting;
+            }
+            break;
+        case OMX_QcomIndexParamVideoDivx:
+            {
+                QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
+            }
+            break;
+        case OMX_QcomIndexPlatformPvt:
+            {
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
+                OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
+                if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+                    DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
+                    eRet = OMX_ErrorUnsupportedSetting;
+                } else {
+                    m_out_pvt_entry_pmem = OMX_TRUE;
+                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+                        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
+                        m_use_output_pmem = OMX_TRUE;
+                    }
+                }
+
+            }
+            break;
+        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
+            {
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
+                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
+                struct v4l2_control control;
+                int rc;
+                drv_ctx.idr_only_decoding = 1;
+                control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+                control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
+                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+                if (rc) {
+                    DEBUG_PRINT_ERROR("\n Set picture order failed");
+                    eRet = OMX_ErrorUnsupportedSetting;
+                } else {
+                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
+                    control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
+                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+                    if (rc) {
+                        DEBUG_PRINT_ERROR("\n Sync frame setting failed");
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+            }
+            break;
+
+        case OMX_QcomIndexParamIndexExtraDataType:
+            {
+                if (!secure_mode) {
+                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
+                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
+                            (extradataIndexType->bEnabled == OMX_TRUE) &&
+                            (extradataIndexType->nPortIndex == 1)) {
+                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
+                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
+
+                    }
+                }
+            }
+            break;
+        case OMX_QcomIndexParamEnableSmoothStreaming:
+            {
+                struct v4l2_control control;
+                struct v4l2_format fmt;
+                control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
+                control.value = 1;
+                int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
+                if (rc < 0) {
+                    DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+                    eRet = OMX_ErrorHardware;
+                }
+            }
+            break;
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-      /* Need to allow following two set_parameters even in Idle
-       * state. This is ANDROID architecture which is not in sync
-       * with openmax standard. */
-    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
-      {
-          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
-          if(enableNativeBuffers) {
-              m_enable_android_native_buffers = enableNativeBuffers->enable;
-          }
-      }
-      break;
-    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
-      {
-          eRet = use_android_native_buffer(hComp, paramData);
-      }
-      break;
+            /* Need to allow following two set_parameters even in Idle
+             * state. This is ANDROID architecture which is not in sync
+             * with openmax standard. */
+        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
+            {
+                EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
+                if (enableNativeBuffers) {
+                    m_enable_android_native_buffers = enableNativeBuffers->enable;
+                }
+            }
+            break;
+        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
+            {
+                eRet = use_android_native_buffer(hComp, paramData);
+            }
+            break;
 #endif
-    case OMX_QcomIndexParamEnableTimeStampReorder:
-      {
-        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
-        if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
-          if (reorder->bEnable == OMX_TRUE) {
-              frm_int =0;
-              time_stamp_dts.set_timestamp_reorder_mode(true);
-          }
-          else
-            time_stamp_dts.set_timestamp_reorder_mode(false);
-        } else {
-          time_stamp_dts.set_timestamp_reorder_mode(false);
-          if (reorder->bEnable == OMX_TRUE)
-          {
-            eRet = OMX_ErrorUnsupportedSetting;
-          }
-        }
-      }
-      break;
-    default:
-    {
-      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
-      eRet = OMX_ErrorUnsupportedIndex;
+        case OMX_QcomIndexParamEnableTimeStampReorder:
+            {
+                QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
+                if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
+                    if (reorder->bEnable == OMX_TRUE) {
+                        frm_int =0;
+                        time_stamp_dts.set_timestamp_reorder_mode(true);
+                    } else
+                        time_stamp_dts.set_timestamp_reorder_mode(false);
+                } else {
+                    time_stamp_dts.set_timestamp_reorder_mode(false);
+                    if (reorder->bEnable == OMX_TRUE) {
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                }
+            }
+            break;
+        default:
+            {
+                DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
+                eRet = OMX_ErrorUnsupportedIndex;
+            }
     }
-  }
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetConfig
+   FUNCTION
+   omx_vdec::GetConfig
 
-DESCRIPTION
-  OMX Get Config Method implementation.
+   DESCRIPTION
+   OMX Get Config Method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                        OMX_IN OMX_INDEXTYPE configIndex,
-                                        OMX_INOUT OMX_PTR     configData)
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_INOUT OMX_PTR     configData)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if (m_state == OMX_StateInvalid)
-  {
-     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
-     return OMX_ErrorInvalidState;
-  }
-
-  switch ((unsigned long)configIndex)
-  {
-    case OMX_QcomIndexConfigInterlaced:
-    {
-      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
-                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
-      if (configFmt->nPortIndex == 1)
-      {
-        if (configFmt->nIndex == 0)
-        {
-          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
-        }
-        else if (configFmt->nIndex == 1)
-        {
-          configFmt->eInterlaceType =
-                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
-        }
-        else if (configFmt->nIndex == 2)
-        {
-          configFmt->eInterlaceType =
-          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
-                            " NoMore Interlaced formats\n");
-          eRet = OMX_ErrorNoMore;
-        }
-
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
-        (int)configFmt->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-    break;
-    }
-    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
-    {
-        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
-          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
-	decoderinstances->nNumOfInstances = 16;
-	/*TODO: How to handle this case */
-    break;
-    }
-  case OMX_QcomIndexConfigVideoFramePackingArrangement:
-    {
-      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-      {
-        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
-          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
-        h264_parser->get_frame_pack_data(configFmt);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
-      }
-      break;
-    }
-	case OMX_IndexConfigCommonOutputCrop:
-    {
-      OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
-      memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
-      break;
-    }
-    default:
-    {
-      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
-      eRet = OMX_ErrorBadParameter;
-    }
-
-  }
-
-  return eRet;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::SetConfig
-
-DESCRIPTION
-  OMX Set Config method implementation
-
-PARAMETERS
-  <TBD>.
-
-RETURN VALUE
-  OMX Error None if successful.
-========================================================================== */
-OMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                        OMX_IN OMX_INDEXTYPE configIndex,
-                                        OMX_IN OMX_PTR        configData)
-{
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
-
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  OMX_VIDEO_CONFIG_NALSIZE *pNal;
-
-  DEBUG_PRINT_LOW("\n Set Config Called");
-
-  if (m_state == OMX_StateExecuting)
-  {
-     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
-     return ret;
-  }
-
-  if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData)
-  {
-    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
-    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
-    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
-    {
-      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
-      OMX_U32 extra_size;
-      // Parsing done here for the AVC atom is definitely not generic
-      // Currently this piece of code is working, but certainly
-      // not tested with all .mp4 files.
-      // Incase of failure, we might need to revisit this
-      // for a generic piece of code.
-
-      // Retrieve size of NAL length field
-      // byte #4 contains the size of NAL lenght field
-      nal_length = (config->pData[4] & 0x03) + 1;
-
-      extra_size = 0;
-      if (nal_length > 2)
-      {
-        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
-        extra_size = (nal_length - 2) * 2;
-      }
-
-      // SPS starts from byte #6
-      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
-      OMX_U8 *pDestBuf;
-      m_vendor_config.nPortIndex = config->nPortIndex;
-
-      // minus 6 --> SPS starts from byte #6
-      // minus 1 --> picture param set byte to be ignored from avcatom
-      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
-      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
-      OMX_U32 len;
-      OMX_U8 index = 0;
-      // case where SPS+PPS is sent as part of set_config
-      pDestBuf = m_vendor_config.pData;
-
-      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
-           m_vendor_config.nPortIndex,
-           m_vendor_config.nDataSize,
-           m_vendor_config.pData);
-      while (index < 2)
-      {
-        uint8 *psize;
-        len = *pSrcBuf;
-        len = len << 8;
-        len |= *(pSrcBuf + 1);
-        psize = (uint8 *) & len;
-        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
-        for (unsigned int i = 0; i < nal_length; i++)
-        {
-          pDestBuf[i] = psize[nal_length - 1 - i];
-        }
-        //memcpy(pDestBuf,pSrcBuf,(len+2));
-        pDestBuf += len + nal_length;
-        pSrcBuf += len + 2;
-        index++;
-        pSrcBuf++;   // skip picture param set
-        len = 0;
-      }
-    }
-    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
-             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
-    {
-      m_vendor_config.nPortIndex = config->nPortIndex;
-      m_vendor_config.nDataSize = config->nDataSize;
-      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
-      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
-    }
-    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
-    {
-        if(m_vendor_config.pData)
-        {
-            free(m_vendor_config.pData);
-            m_vendor_config.pData = NULL;
-            m_vendor_config.nDataSize = 0;
-        }
-
-        if (((*((OMX_U32 *) config->pData)) &
-             VC1_SP_MP_START_CODE_MASK) ==
-             VC1_SP_MP_START_CODE)
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize = config->nDataSize;
-            m_vendor_config.pData =
-                (OMX_U8 *) malloc(config->nDataSize);
-            memcpy(m_vendor_config.pData, config->pData,
-                   config->nDataSize);
-            m_vc1_profile = VC1_SP_MP_RCV;
-        }
-        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize = config->nDataSize;
-            m_vendor_config.pData =
-                (OMX_U8 *) malloc((config->nDataSize));
-            memcpy(m_vendor_config.pData, config->pData,
-                   config->nDataSize);
-            m_vc1_profile = VC1_AP;
-        }
-        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize  = config->nDataSize;
-            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
-            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
-            m_vc1_profile = VC1_SP_MP_RCV;
-        }
-        else
-        {
-            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
-        }
-    }
-    return ret;
-  }
-  else if (configIndex == OMX_IndexConfigVideoNalSize)
-  {
-
-    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
-    nal_length = pNal->nNaluBytes;
-    m_frame_parser.init_nal_length(nal_length);
-    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
-    return ret;
-  }
-
-  return OMX_ErrorNotImplemented;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::GetExtensionIndex
-
-DESCRIPTION
-  OMX GetExtensionIndex method implementaion.  <TBD>
-
-PARAMETERS
-  <TBD>.
-
-RETURN VALUE
-  OMX Error None if everything successful.
-
-========================================================================== */
-OMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
-                                                OMX_IN OMX_STRING      paramName,
-                                                OMX_OUT OMX_INDEXTYPE* indexType)
-{
-    if(m_state == OMX_StateInvalid)
-    {
-        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
-        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+
+    switch ((unsigned long)configIndex) {
+        case OMX_QcomIndexConfigInterlaced:
+            {
+                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
+                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
+                if (configFmt->nPortIndex == 1) {
+                    if (configFmt->nIndex == 0) {
+                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
+                    } else if (configFmt->nIndex == 1) {
+                        configFmt->eInterlaceType =
+                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+                    } else if (configFmt->nIndex == 2) {
+                        configFmt->eInterlaceType =
+                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+                    } else {
+                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
+                                " NoMore Interlaced formats\n");
+                        eRet = OMX_ErrorNoMore;
+                    }
+
+                } else {
+                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
+                            (int)configFmt->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
+            {
+                QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
+                    (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
+                decoderinstances->nNumOfInstances = 16;
+                /*TODO: How to handle this case */
+                break;
+            }
+        case OMX_QcomIndexConfigVideoFramePackingArrangement:
+            {
+                if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
+                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
+                    h264_parser->get_frame_pack_data(configFmt);
+                } else {
+                    DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
+                }
+                break;
+            }
+        case OMX_IndexConfigCommonOutputCrop:
+            {
+                OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
+                memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
+                break;
+            }
+        default:
+            {
+                DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
+                eRet = OMX_ErrorBadParameter;
+            }
+
     }
-    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
-    {
+
+    return eRet;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::SetConfig
+
+   DESCRIPTION
+   OMX Set Config method implementation
+
+   PARAMETERS
+   <TBD>.
+
+   RETURN VALUE
+   OMX Error None if successful.
+   ========================================================================== */
+OMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_IN OMX_PTR        configData)
+{
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_VIDEO_CONFIG_NALSIZE *pNal;
+
+    DEBUG_PRINT_LOW("\n Set Config Called");
+
+    if (m_state == OMX_StateExecuting) {
+        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
+        return ret;
+    }
+
+    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
+        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
+        DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
+        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
+            DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
+            OMX_U32 extra_size;
+            // Parsing done here for the AVC atom is definitely not generic
+            // Currently this piece of code is working, but certainly
+            // not tested with all .mp4 files.
+            // Incase of failure, we might need to revisit this
+            // for a generic piece of code.
+
+            // Retrieve size of NAL length field
+            // byte #4 contains the size of NAL lenght field
+            nal_length = (config->pData[4] & 0x03) + 1;
+
+            extra_size = 0;
+            if (nal_length > 2) {
+                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
+                extra_size = (nal_length - 2) * 2;
+            }
+
+            // SPS starts from byte #6
+            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
+            OMX_U8 *pDestBuf;
+            m_vendor_config.nPortIndex = config->nPortIndex;
+
+            // minus 6 --> SPS starts from byte #6
+            // minus 1 --> picture param set byte to be ignored from avcatom
+            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
+            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
+            OMX_U32 len;
+            OMX_U8 index = 0;
+            // case where SPS+PPS is sent as part of set_config
+            pDestBuf = m_vendor_config.pData;
+
+            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
+                    m_vendor_config.nPortIndex,
+                    m_vendor_config.nDataSize,
+                    m_vendor_config.pData);
+            while (index < 2) {
+                uint8 *psize;
+                len = *pSrcBuf;
+                len = len << 8;
+                len |= *(pSrcBuf + 1);
+                psize = (uint8 *) & len;
+                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
+                for (unsigned int i = 0; i < nal_length; i++) {
+                    pDestBuf[i] = psize[nal_length - 1 - i];
+                }
+                //memcpy(pDestBuf,pSrcBuf,(len+2));
+                pDestBuf += len + nal_length;
+                pSrcBuf += len + 2;
+                index++;
+                pSrcBuf++;   // skip picture param set
+                len = 0;
+            }
+        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
+                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
+            m_vendor_config.nPortIndex = config->nPortIndex;
+            m_vendor_config.nDataSize = config->nDataSize;
+            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
+            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
+        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
+            if (m_vendor_config.pData) {
+                free(m_vendor_config.pData);
+                m_vendor_config.pData = NULL;
+                m_vendor_config.nDataSize = 0;
+            }
+
+            if (((*((OMX_U32 *) config->pData)) &
+                        VC1_SP_MP_START_CODE_MASK) ==
+                    VC1_SP_MP_START_CODE) {
+                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize = config->nDataSize;
+                m_vendor_config.pData =
+                    (OMX_U8 *) malloc(config->nDataSize);
+                memcpy(m_vendor_config.pData, config->pData,
+                        config->nDataSize);
+                m_vc1_profile = VC1_SP_MP_RCV;
+            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
+                DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize = config->nDataSize;
+                m_vendor_config.pData =
+                    (OMX_U8 *) malloc((config->nDataSize));
+                memcpy(m_vendor_config.pData, config->pData,
+                        config->nDataSize);
+                m_vc1_profile = VC1_AP;
+            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
+                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize  = config->nDataSize;
+                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
+                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
+                m_vc1_profile = VC1_SP_MP_RCV;
+            } else {
+                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
+            }
+        }
+        return ret;
+    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
+
+        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
+        nal_length = pNal->nNaluBytes;
+        m_frame_parser.init_nal_length(nal_length);
+        DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
+        return ret;
+    }
+
+    return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::GetExtensionIndex
+
+   DESCRIPTION
+   OMX GetExtensionIndex method implementaion.  <TBD>
+
+   PARAMETERS
+   <TBD>.
+
+   RETURN VALUE
+   OMX Error None if everything successful.
+
+   ========================================================================== */
+OMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
+        OMX_IN OMX_STRING      paramName,
+        OMX_OUT OMX_INDEXTYPE* indexType)
+{
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
+        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+    } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
     }
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
+    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
         DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
     }
 #endif
-	else {
+    else {
         DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
         return OMX_ErrorNotImplemented;
     }
@@ -3982,1319 +3514,1232 @@
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetState
+   FUNCTION
+   omx_vdec::GetState
 
-DESCRIPTION
-  Returns the state information back to the caller.<TBD>
+   DESCRIPTION
+   Returns the state information back to the caller.<TBD>
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
-                                       OMX_OUT OMX_STATETYPE* state)
+        OMX_OUT OMX_STATETYPE* state)
 {
-  *state = m_state;
-  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
-  return OMX_ErrorNone;
+    *state = m_state;
+    DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentTunnelRequest
+   FUNCTION
+   omx_vdec::ComponentTunnelRequest
 
-DESCRIPTION
-  OMX Component Tunnel Request method implementation. <TBD>
+   DESCRIPTION
+   OMX Component Tunnel Request method implementation. <TBD>
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
-                                                     OMX_IN OMX_U32                        port,
-                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
-                                                     OMX_IN OMX_U32                    peerPort,
-                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_HANDLETYPE        peerComponent,
+        OMX_IN OMX_U32                    peerPort,
+        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
 {
-  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
-  return OMX_ErrorNotImplemented;
+    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseOutputBuffer
+   FUNCTION
+   omx_vdec::UseOutputBuffer
 
-DESCRIPTION
-  Helper function for Use buffer in the input pin
+   DESCRIPTION
+   Helper function for Use buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE omx_vdec::allocate_extradata()
 {
 #ifdef USE_ION
-  if (drv_ctx.extradata_info.buffer_size) {
-    if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
-      munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
-      close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
-      free_ion_memory(&drv_ctx.extradata_info.ion);
+    if (drv_ctx.extradata_info.buffer_size) {
+        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
+            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
+            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+            free_ion_memory(&drv_ctx.extradata_info.ion);
+        }
+        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
+        DEBUG_PRINT_HIGH("allocate extradata memory size %d\n", drv_ctx.extradata_info.size);
+        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.extradata_info.size, 4096,
+                &drv_ctx.extradata_info.ion.ion_alloc_data,
+                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
+        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
+            DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
+            return OMX_ErrorInsufficientResources;
+        }
+        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
+                drv_ctx.extradata_info.size,
+                PROT_READ|PROT_WRITE, MAP_SHARED,
+                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
+        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
+            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+            free_ion_memory(&drv_ctx.extradata_info.ion);
+            return OMX_ErrorInsufficientResources;
+        }
+        memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
     }
-    drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
-	DEBUG_PRINT_HIGH("allocate extradata memory size %d\n", drv_ctx.extradata_info.size);
-    drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
-        drv_ctx.extradata_info.size, 4096,
-        &drv_ctx.extradata_info.ion.ion_alloc_data,
-        &drv_ctx.extradata_info.ion.fd_ion_data, 0);
-    if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
-      DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
-      return OMX_ErrorInsufficientResources;
-    }
-    drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
-        drv_ctx.extradata_info.size,
-        PROT_READ|PROT_WRITE, MAP_SHARED,
-        drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
-    if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
-      DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
-      close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
-      free_ion_memory(&drv_ctx.extradata_info.ion);
-      return OMX_ErrorInsufficientResources;
-    }
-    memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
-  }
 #endif
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
-void omx_vdec::free_extradata() {
+void omx_vdec::free_extradata()
+{
 #ifdef USE_ION
-  if (drv_ctx.extradata_info.uaddr) {
-    munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
-    close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
-    free_ion_memory(&drv_ctx.extradata_info.ion);
-  }
-  memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
+    if (drv_ctx.extradata_info.uaddr) {
+        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
+        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+        free_ion_memory(&drv_ctx.extradata_info.ion);
+    }
+    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
 #endif
 }
 
 OMX_ERRORTYPE  omx_vdec::use_output_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  struct vdec_setbuffer_cmd setbuffers;
-  OMX_PTR privateAppData = NULL;
-  private_handle_t *handle = NULL;
-  OMX_U8 *buff = buffer;
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  int extra_idx = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    struct vdec_setbuffer_cmd setbuffers;
+    OMX_PTR privateAppData = NULL;
+    private_handle_t *handle = NULL;
+    OMX_U8 *buff = buffer;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    int extra_idx = 0;
 
-  if (!m_out_mem_ptr) {
-    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
-    eRet = allocate_output_headers();
-    if (eRet == OMX_ErrorNone)
-      eRet = allocate_extradata();
-  }
-
-  if (eRet == OMX_ErrorNone) {
-    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
-      if(BITMASK_ABSENT(&m_out_bm_count,i))
-      {
-        break;
-      }
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
+        eRet = allocate_output_headers();
+        if (eRet == OMX_ErrorNone)
+            eRet = allocate_extradata();
     }
-  }
 
-  if(i >= drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
-    eRet = OMX_ErrorInsufficientResources;
-  }
+    if (eRet == OMX_ErrorNone) {
+        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+                break;
+            }
+        }
+    }
 
-  if (eRet == OMX_ErrorNone) {
+    if (i >= drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
+        eRet = OMX_ErrorInsufficientResources;
+    }
+
+    if (eRet == OMX_ErrorNone) {
 #if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
-    if(m_enable_android_native_buffers) {
-        if (m_use_android_native_buffers) {
-            UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
-            sp<android_native_buffer_t> nBuf = params->nativeBuffer;
-            handle = (private_handle_t *)nBuf->handle;
-            privateAppData = params->pAppPrivate;
-        } else {
-            handle = (private_handle_t *)buff;
-            privateAppData = appData;
-        }
+        if (m_enable_android_native_buffers) {
+            if (m_use_android_native_buffers) {
+                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
+                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
+                handle = (private_handle_t *)nBuf->handle;
+                privateAppData = params->pAppPrivate;
+            } else {
+                handle = (private_handle_t *)buff;
+                privateAppData = appData;
+            }
 
-        if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
-            DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
-                              " expected %u, got %lu",
-                              drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
-            return OMX_ErrorBadParameter;
-        }
+            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
+                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
+                        " expected %u, got %lu",
+                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
+                return OMX_ErrorBadParameter;
+            }
 
-        drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
-        if (!m_use_android_native_buffers) {
-            if (!secure_mode) {
-                buff =  (OMX_U8*)mmap(0, handle->size,
-                                      PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
-                if (buff == MAP_FAILED) {
-                  DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
-                  return OMX_ErrorInsufficientResources;
+            drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
+            if (!m_use_android_native_buffers) {
+                if (!secure_mode) {
+                    buff =  (OMX_U8*)mmap(0, handle->size,
+                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
+                    if (buff == MAP_FAILED) {
+                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+                        return OMX_ErrorInsufficientResources;
+                    }
                 }
             }
-        }
 #if defined(_ANDROID_ICS_)
-        native_buffer[i].nativehandle = handle;
-        native_buffer[i].privatehandle = handle;
+            native_buffer[i].nativehandle = handle;
+            native_buffer[i].privatehandle = handle;
 #endif
-        if(!handle) {
-            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+            if (!handle) {
+                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+                return OMX_ErrorBadParameter;
+            }
+            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
+            drv_ctx.ptr_outputbuffer[i].offset = 0;
+            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+            drv_ctx.ptr_outputbuffer[i].mmaped_size =
+                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+        } else
+#endif
+
+            if (!ouput_egl_buffers && !m_use_output_pmem) {
+#ifdef USE_ION
+                DEBUG_PRINT_HIGH("allocate output buffer memory size %d\n", drv_ctx.op_buf.buffer_size);
+                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
+                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
+                        &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
+                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+                    DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+#else
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                                      open (MEM_DEVICE,O_RDWR);
+
+                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+
+                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
+                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
+                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                                          open (MEM_DEVICE,O_RDWR);
+                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                        return OMX_ErrorInsufficientResources;
+                    }
+                }
+
+                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
+                            drv_ctx.op_buf.buffer_size,
+                            drv_ctx.op_buf.alignment)) {
+                    DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+#endif
+                if (!secure_mode) {
+                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
+                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
+                                PROT_READ|PROT_WRITE, MAP_SHARED,
+                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
+                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
+                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+#ifdef USE_ION
+                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+#endif
+                        DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
+                        return OMX_ErrorInsufficientResources;
+                    }
+                }
+                drv_ctx.ptr_outputbuffer[i].offset = 0;
+                privateAppData = appData;
+            } else {
+
+                DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
+                if (!appData || !bytes ) {
+                    if (!secure_mode && !buffer) {
+                        DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
+                        return OMX_ErrorBadParameter;
+                    }
+                }
+
+                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
+                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
+                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
+                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
+                        !pmem_list->nEntries ||
+                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+                    DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
+                    return OMX_ErrorBadParameter;
+                }
+                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                    pmem_list->entryList->entry;
+                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
+                        pmem_info->pmem_fd);
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
+                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
+                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+                drv_ctx.ptr_outputbuffer[i].mmaped_size =
+                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+                privateAppData = appData;
+            }
+        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+
+        *bufferHdr = (m_out_mem_ptr + i );
+        if (secure_mode)
+            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
+                sizeof (vdec_bufferpayload));
+
+        DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
+                drv_ctx.ptr_outputbuffer[i].bufferaddr,
+                drv_ctx.ptr_outputbuffer[i].pmem_fd );
+
+        buf.index = i;
+        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        buf.memory = V4L2_MEMORY_USERPTR;
+        plane[0].length = drv_ctx.op_buf.buffer_size;
+        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
+            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
+        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+        plane[0].data_offset = 0;
+        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
+#ifdef USE_ION
+            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
+#endif
+            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
+            plane[extra_idx].data_offset = 0;
+        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
+            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
             return OMX_ErrorBadParameter;
         }
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
-        drv_ctx.ptr_outputbuffer[i].offset = 0;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
-        drv_ctx.ptr_outputbuffer[i].mmaped_size =
-            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
-    } else
-#endif
+        buf.m.planes = plane;
+        buf.length = drv_ctx.num_planes;
 
-    if (!ouput_egl_buffers && !m_use_output_pmem) {
-#ifdef USE_ION
-        DEBUG_PRINT_HIGH("allocate output buffer memory size %d\n", drv_ctx.op_buf.buffer_size);
-        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
-                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
-                &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
-        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
-          DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#else
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-          open (MEM_DEVICE,O_RDWR);
+        DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
 
-        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
-          DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-
-	/* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
-        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
-        {
-          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-            open (MEM_DEVICE,O_RDWR);
-          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
-            DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
+            DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
+            /*TODO: How to handle this case */
             return OMX_ErrorInsufficientResources;
-          }
         }
 
-        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
-          drv_ctx.op_buf.buffer_size,
-          drv_ctx.op_buf.alignment))
-        {
-          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-#endif
-        if(!secure_mode) {
-            drv_ctx.ptr_outputbuffer[i].bufferaddr =
-              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
-              PROT_READ|PROT_WRITE, MAP_SHARED,
-              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
-            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
-                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-#ifdef USE_ION
-                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
-#endif
-              DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
-              return OMX_ErrorInsufficientResources;
+        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
+            enum v4l2_buf_type buf_type;
+            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
+                return OMX_ErrorInsufficientResources;
+            } else {
+                streaming[CAPTURE_PORT] = true;
+                DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
             }
         }
-        drv_ctx.ptr_outputbuffer[i].offset = 0;
-        privateAppData = appData;
-     }
-     else {
 
-       DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
-        if (!appData || !bytes ) {
-          if(!secure_mode && !buffer) {
-              DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
-              return OMX_ErrorBadParameter;
-          }
+        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+        if (m_enable_android_native_buffers) {
+            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
+            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
+        } else {
+            (*bufferHdr)->pBuffer = buff;
         }
-
-        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
-        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
-        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
-        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
-            !pmem_list->nEntries ||
-            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
-          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
-          return OMX_ErrorBadParameter;
-        }
-        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                    pmem_list->entryList->entry;
-        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
-                          pmem_info->pmem_fd);
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
-        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
-        drv_ctx.ptr_outputbuffer[i].mmaped_size =
-        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
-        privateAppData = appData;
-     }
-     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
-     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
-
-     *bufferHdr = (m_out_mem_ptr + i );
-     if(secure_mode)
-          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
-     //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
-             sizeof (vdec_bufferpayload));
-
-     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
-                       drv_ctx.ptr_outputbuffer[i].bufferaddr,
-                       drv_ctx.ptr_outputbuffer[i].pmem_fd );
-
-     buf.index = i;
-     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-     buf.memory = V4L2_MEMORY_USERPTR;
-     plane[0].length = drv_ctx.op_buf.buffer_size;
-     plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
-             (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
-     plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
-     plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
-     plane[0].data_offset = 0;
-     extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-     if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-       plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
-#ifdef USE_ION
-       plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
-#endif
-       plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].data_offset = 0;
-     } else if  (extra_idx >= VIDEO_MAX_PLANES) {
-        DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
-        return OMX_ErrorBadParameter;
-     }
-     buf.m.planes = plane;
-     buf.length = drv_ctx.num_planes;
-
-     DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
-
-     if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
-       DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
-	   /*TODO: How to handle this case */
-       return OMX_ErrorInsufficientResources;
-     }
-
-     if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
-	     enum v4l2_buf_type buf_type;
-	     buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	     if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
-		     return OMX_ErrorInsufficientResources;
-	     } else {
-		     streaming[CAPTURE_PORT] = true;
-		     DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
-	     }
-     }
-
-     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
-     if (m_enable_android_native_buffers) {
-       DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
-       (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
-     } else {
-       (*bufferHdr)->pBuffer = buff;
-     }
-     (*bufferHdr)->pAppPrivate = privateAppData;
-     BITMASK_SET(&m_out_bm_count,i);
-  }
-  return eRet;
+        (*bufferHdr)->pAppPrivate = privateAppData;
+        BITMASK_SET(&m_out_bm_count,i);
+    }
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::use_input_heap_buffers
+   FUNCTION
+   omx_vdec::use_input_heap_buffers
 
-DESCRIPTION
-  OMX Use Buffer Heap allocation method implementation.
+   DESCRIPTION
+   OMX Use Buffer Heap allocation method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!m_inp_heap_ptr)
-    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
-               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
-               drv_ctx.ip_buf.actualcount);
-  if(!m_phdr_pmem_ptr)
-    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
-               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
-               drv_ctx.ip_buf.actualcount);
-  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
-  {
-    DEBUG_PRINT_ERROR("Insufficent memory");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
-  {
-    input_use_buffer = true;
-    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
-    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
-    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
-    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
-    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
-    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
-    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
-    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
-    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
-    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
-                (unsigned)NULL, (unsigned)NULL))
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
-      return OMX_ErrorInsufficientResources;
+    DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!m_inp_heap_ptr)
+        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
+            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+                    drv_ctx.ip_buf.actualcount);
+    if (!m_phdr_pmem_ptr)
+        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
+            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+                    drv_ctx.ip_buf.actualcount);
+    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
+        DEBUG_PRINT_ERROR("Insufficent memory");
+        eRet = OMX_ErrorInsufficientResources;
+    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
+        input_use_buffer = true;
+        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
+        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
+        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
+        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
+        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
+        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
+        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
+        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
+        DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
+        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
+                    (unsigned)NULL, (unsigned)NULL)) {
+            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+            return OMX_ErrorInsufficientResources;
+        }
+        m_in_alloc_cnt++;
+    } else {
+        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
+        eRet = OMX_ErrorInsufficientResources;
     }
-    m_in_alloc_cnt++;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseBuffer
+   FUNCTION
+   omx_vdec::UseBuffer
 
-DESCRIPTION
-  OMX Use Buffer method implementation.
+   DESCRIPTION
+   OMX Use Buffer method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE error = OMX_ErrorNone;
-  struct vdec_setbuffer_cmd setbuffers;
+    OMX_ERRORTYPE error = OMX_ErrorNone;
+    struct vdec_setbuffer_cmd setbuffers;
 
-  if (bufferHdr == NULL || bytes == 0)
-  {
-      if(!secure_mode && buffer == NULL) {
-          DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
-          return OMX_ErrorBadParameter;
-      }
-  }
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  if(port == OMX_CORE_INPUT_PORT_INDEX)
-    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
-  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
-  else
-  {
-    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
-    error = OMX_ErrorBadPortIndex;
-  }
-  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
-  if(error == OMX_ErrorNone)
-  {
-    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-    {
-      // Send the callback now
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
-      post_event(OMX_CommandStateSet,OMX_StateIdle,
-                         OMX_COMPONENT_GENERATE_EVENT);
+    if (bufferHdr == NULL || bytes == 0) {
+        if (!secure_mode && buffer == NULL) {
+            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
+            return OMX_ErrorBadParameter;
+        }
     }
-    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
-       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-    {
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-      post_event(OMX_CommandPortEnable,
-          OMX_CORE_INPUT_PORT_INDEX,
-          OMX_COMPONENT_GENERATE_EVENT);
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
     }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
-            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-    {
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-      post_event(OMX_CommandPortEnable,
-                 OMX_CORE_OUTPUT_PORT_INDEX,
-                 OMX_COMPONENT_GENERATE_EVENT);
+    if (port == OMX_CORE_INPUT_PORT_INDEX)
+        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
+    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
+        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
+    else {
+        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+        error = OMX_ErrorBadPortIndex;
     }
-  }
-  return error;
+    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
+    if (error == OMX_ErrorNone) {
+        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+            // Send the callback now
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+            post_event(OMX_CommandStateSet,OMX_StateIdle,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
+        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
+                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+            post_event(OMX_CommandPortEnable,
+                    OMX_CORE_INPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
+                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+            post_event(OMX_CommandPortEnable,
+                    OMX_CORE_OUTPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
+    }
+    return error;
 }
 
 OMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
-                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
+        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
 {
-  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
-  {
-    if(m_inp_heap_ptr[bufferindex].pBuffer)
-      free(m_inp_heap_ptr[bufferindex].pBuffer);
-    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
-  }
-  if (pmem_bufferHdr)
-    free_input_buffer(pmem_bufferHdr);
-  return OMX_ErrorNone;
+    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
+        if (m_inp_heap_ptr[bufferindex].pBuffer)
+            free(m_inp_heap_ptr[bufferindex].pBuffer);
+        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
+    }
+    if (pmem_bufferHdr)
+        free_input_buffer(pmem_bufferHdr);
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
-  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
+    unsigned int index = 0;
+    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
+        return OMX_ErrorBadParameter;
+    }
 
-  index = bufferHdr - m_inp_mem_ptr;
-  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
-
-  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
-  {
+    index = bufferHdr - m_inp_mem_ptr;
     DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
-    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
-    {
-       struct vdec_setbuffer_cmd setbuffers;
-       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
-          sizeof (vdec_bufferpayload));
-       DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
+
+    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
+        DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
+        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
+            struct vdec_setbuffer_cmd setbuffers;
+            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
+                    sizeof (vdec_bufferpayload));
+            DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
                     drv_ctx.ptr_inputbuffer[index].pmem_fd);
-       DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
+            DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
                     drv_ctx.ptr_inputbuffer[index].mmaped_size,
                     drv_ctx.ptr_inputbuffer[index].bufferaddr);
-       munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
-               drv_ctx.ptr_inputbuffer[index].mmaped_size);
-       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
-       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
-       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
-       {
-         free(m_desc_buffer_ptr[index].buf_addr);
-         m_desc_buffer_ptr[index].buf_addr = NULL;
-         m_desc_buffer_ptr[index].desc_data_size = 0;
-       }
+            munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
+                    drv_ctx.ptr_inputbuffer[index].mmaped_size);
+            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
+            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
+            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
+                free(m_desc_buffer_ptr[index].buf_addr);
+                m_desc_buffer_ptr[index].buf_addr = NULL;
+                m_desc_buffer_ptr[index].desc_data_size = 0;
+            }
 #ifdef USE_ION
-       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
+            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
 #endif
+        }
     }
-  }
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
+    unsigned int index = 0;
 
-  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
+    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
+        return OMX_ErrorBadParameter;
+    }
 
-  index = bufferHdr - m_out_mem_ptr;
-  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
+    index = bufferHdr - m_out_mem_ptr;
+    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
 
-  if (index < drv_ctx.op_buf.actualcount
-      && drv_ctx.ptr_outputbuffer)
-  {
-    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
-                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
+    if (index < drv_ctx.op_buf.actualcount
+            && drv_ctx.ptr_outputbuffer) {
+        DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
+                drv_ctx.ptr_outputbuffer[index].bufferaddr);
 
-    struct vdec_setbuffer_cmd setbuffers;
-    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
-        sizeof (vdec_bufferpayload));
+        struct vdec_setbuffer_cmd setbuffers;
+        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
+                sizeof (vdec_bufferpayload));
 #ifdef _ANDROID_
-    if(m_enable_android_native_buffers) {
-        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
-            munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
-                    drv_ctx.ptr_outputbuffer[index].mmaped_size);
-        }
-        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
-    } else {
+        if (m_enable_android_native_buffers) {
+            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
+                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
+                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
+            }
+            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+        } else {
 #endif
-        if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
-        {
-            DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
-                    drv_ctx.ptr_outputbuffer[0].pmem_fd);
-            DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
-                    drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
-                    drv_ctx.ptr_outputbuffer[0].bufferaddr);
-            munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
-                    drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
-          close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
-          drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
+            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
+                DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
+                        drv_ctx.ptr_outputbuffer[0].pmem_fd);
+                DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
+                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
+                        drv_ctx.ptr_outputbuffer[0].bufferaddr);
+                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
+                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
+                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
+                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
 #ifdef USE_ION
-       free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
+                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
 #endif
-        }
+            }
 #ifdef _ANDROID_
-    }
+        }
 #endif
-    if (release_output_done()) {
-      free_extradata();
+        if (release_output_done()) {
+            free_extradata();
+        }
     }
-  }
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
-                                         OMX_BUFFERHEADERTYPE **bufferHdr,
-                                         OMX_U32              port,
-                                         OMX_PTR              appData,
-                                         OMX_U32              bytes)
+        OMX_BUFFERHEADERTYPE **bufferHdr,
+        OMX_U32              port,
+        OMX_PTR              appData,
+        OMX_U32              bytes)
 {
-  OMX_BUFFERHEADERTYPE *input = NULL;
-  unsigned char *buf_addr = NULL;
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned   i = 0;
+    OMX_BUFFERHEADERTYPE *input = NULL;
+    unsigned char *buf_addr = NULL;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned   i = 0;
 
-  /* Sanity Check*/
-  if (bufferHdr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  if (m_inp_heap_ptr == NULL)
-  {
-    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
-                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
-                     drv_ctx.ip_buf.actualcount);
-    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
-                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
-                     drv_ctx.ip_buf.actualcount);
-
-    if (m_inp_heap_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
-      return OMX_ErrorInsufficientResources;
-    }
-  }
-
-  /*Find a Free index*/
-  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
-      break;
-    }
-  }
-
-  if (i < drv_ctx.ip_buf.actualcount)
-  {
-    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
-
-    if (buf_addr == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
+    /* Sanity Check*/
+    if (bufferHdr == NULL) {
+        return OMX_ErrorBadParameter;
     }
 
-    *bufferHdr = (m_inp_heap_ptr + i);
-    input = *bufferHdr;
-    BITMASK_SET(&m_heap_inp_bm_count,i);
+    if (m_inp_heap_ptr == NULL) {
+        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
+                         calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+                                 drv_ctx.ip_buf.actualcount);
+        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
+                          calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+                                  drv_ctx.ip_buf.actualcount);
 
-    input->pBuffer           = (OMX_U8 *)buf_addr;
-    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    input->nVersion.nVersion = OMX_SPEC_VERSION;
-    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
-    input->pAppPrivate       = appData;
-    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
-    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
-    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
-    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
-    /*Add the Buffers to freeq*/
-    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
-                (unsigned)NULL, (unsigned)NULL))
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
-      return OMX_ErrorInsufficientResources;
+        if (m_inp_heap_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
     }
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
 
-  return eRet;
+    /*Find a Free index*/
+    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
+            break;
+        }
+    }
+
+    if (i < drv_ctx.ip_buf.actualcount) {
+        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
+
+        if (buf_addr == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        *bufferHdr = (m_inp_heap_ptr + i);
+        input = *bufferHdr;
+        BITMASK_SET(&m_heap_inp_bm_count,i);
+
+        input->pBuffer           = (OMX_U8 *)buf_addr;
+        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        input->nVersion.nVersion = OMX_SPEC_VERSION;
+        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
+        input->pAppPrivate       = appData;
+        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
+        DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
+        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
+        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
+        /*Add the Buffers to freeq*/
+        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
+                    (unsigned)NULL, (unsigned)NULL)) {
+            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+            return OMX_ErrorInsufficientResources;
+        }
+    } else {
+        return OMX_ErrorBadParameter;
+    }
+
+    return eRet;
 
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateInputBuffer
+   FUNCTION
+   omx_vdec::AllocateInputBuffer
 
-DESCRIPTION
-  Helper function for allocate buffer in the input pin
+   DESCRIPTION
+   Helper function for allocate buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  struct vdec_setbuffer_cmd setbuffers;
-  OMX_BUFFERHEADERTYPE *input = NULL;
-  unsigned   i = 0;
-  unsigned char *buf_addr = NULL;
-  int pmem_fd = -1;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct vdec_setbuffer_cmd setbuffers;
+    OMX_BUFFERHEADERTYPE *input = NULL;
+    unsigned   i = 0;
+    unsigned char *buf_addr = NULL;
+    int pmem_fd = -1;
 
-  if(bytes != drv_ctx.ip_buf.buffer_size)
-  {
-    DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
-      bytes, drv_ctx.ip_buf.buffer_size);
-    return OMX_ErrorBadParameter;
-  }
-
-  if(!m_inp_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
-      drv_ctx.ip_buf.actualcount,
-      drv_ctx.ip_buf.buffer_size);
-
-    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
-    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
-
-    if (m_inp_mem_ptr == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
+    if (bytes != drv_ctx.ip_buf.buffer_size) {
+        DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
+                bytes, drv_ctx.ip_buf.buffer_size);
+        return OMX_ErrorBadParameter;
     }
 
-    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
-    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+    if (!m_inp_mem_ptr) {
+        DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
+                drv_ctx.ip_buf.actualcount,
+                drv_ctx.ip_buf.buffer_size);
 
-    if (drv_ctx.ptr_inputbuffer == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
-    }
+        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
+                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
+
+        if (m_inp_mem_ptr == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
+                                  calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+
+        if (drv_ctx.ptr_inputbuffer == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 #ifdef USE_ION
-    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
-    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
+        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
+                                  calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
 
-    if (drv_ctx.ip_buf_ion_info == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
-    }
+        if (drv_ctx.ip_buf_ion_info == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
 
-    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
-    {
-      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
+        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
+            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
 #ifdef USE_ION
-      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
+            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
 #endif
-    }
-  }
-
-  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_inp_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
-      break;
-    }
-  }
-
-  if(i < drv_ctx.ip_buf.actualcount)
-  {
-    struct v4l2_buffer buf;
-    struct v4l2_plane plane;
-    int rc;
-
-#ifdef USE_ION
-    DEBUG_PRINT_HIGH("\n Allocate input Buffer size %d\n", drv_ctx.ip_buf.buffer_size);
-    drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
-                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
-		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
-    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
-        return OMX_ErrorInsufficientResources;
-     }
-    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
-#else
-    pmem_fd = open (MEM_DEVICE,O_RDWR);
-
-    if (pmem_fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
-      return OMX_ErrorInsufficientResources;
-    }
-
-    if (pmem_fd == 0)
-    {
-      pmem_fd = open (MEM_DEVICE,O_RDWR);
-
-      if (pmem_fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
-        return OMX_ErrorInsufficientResources;
-      }
-    }
-
-    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
-      drv_ctx.ip_buf.alignment))
-    {
-      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-      close(pmem_fd);
-      return OMX_ErrorInsufficientResources;
-    }
-#endif
-    if (!secure_mode) {
-        buf_addr = (unsigned char *)mmap(NULL,
-          drv_ctx.ip_buf.buffer_size,
-          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
-
-        if (buf_addr == MAP_FAILED)
-        {
-            close(pmem_fd);
-#ifdef USE_ION
-            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
-#endif
-          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
-          return OMX_ErrorInsufficientResources;
         }
     }
-    *bufferHdr = (m_inp_mem_ptr + i);
-    if (secure_mode)
-        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
-    else
-        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
-    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
-    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
-    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
-    drv_ctx.ptr_inputbuffer [i].offset = 0;
 
-
-    buf.index = i;
-    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    buf.memory = V4L2_MEMORY_USERPTR;
-    plane.bytesused = 0;
-    plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
-    plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
-    plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
-    plane.reserved[1] = 0;
-    plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
-    buf.m.planes = &plane;
-    buf.length = 1;
-
-     DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
-
-     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
-
-     if (rc) {
-       DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
-	   /*TODO: How to handle this case */
-       return OMX_ErrorInsufficientResources;
-     }
-
-    input = *bufferHdr;
-    BITMASK_SET(&m_inp_bm_count,i);
-    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
-    if (secure_mode)
-         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
-    else
-         input->pBuffer           = (OMX_U8 *)buf_addr;
-    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    input->nVersion.nVersion = OMX_SPEC_VERSION;
-    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
-    input->pAppPrivate       = appData;
-    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
-    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
-
-    if (drv_ctx.disable_dmx)
-    {
-      eRet = allocate_desc_buffer(i);
+    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
+            break;
+        }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+
+    if (i < drv_ctx.ip_buf.actualcount) {
+        struct v4l2_buffer buf;
+        struct v4l2_plane plane;
+        int rc;
+
+#ifdef USE_ION
+        DEBUG_PRINT_HIGH("\n Allocate input Buffer size %d\n", drv_ctx.ip_buf.buffer_size);
+        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
+                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
+                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
+        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
+            return OMX_ErrorInsufficientResources;
+        }
+        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
+#else
+        pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+        if (pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        if (pmem_fd == 0) {
+            pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+            if (pmem_fd < 0) {
+                DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
+                    drv_ctx.ip_buf.alignment)) {
+            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+            close(pmem_fd);
+            return OMX_ErrorInsufficientResources;
+        }
+#endif
+        if (!secure_mode) {
+            buf_addr = (unsigned char *)mmap(NULL,
+                    drv_ctx.ip_buf.buffer_size,
+                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
+
+            if (buf_addr == MAP_FAILED) {
+                close(pmem_fd);
+#ifdef USE_ION
+                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
+#endif
+                DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+        *bufferHdr = (m_inp_mem_ptr + i);
+        if (secure_mode)
+            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
+        else
+            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
+        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
+        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
+        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
+        drv_ctx.ptr_inputbuffer [i].offset = 0;
+
+
+        buf.index = i;
+        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        buf.memory = V4L2_MEMORY_USERPTR;
+        plane.bytesused = 0;
+        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
+        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
+        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
+        plane.reserved[1] = 0;
+        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
+        buf.m.planes = &plane;
+        buf.length = 1;
+
+        DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
+
+        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
+            /*TODO: How to handle this case */
+            return OMX_ErrorInsufficientResources;
+        }
+
+        input = *bufferHdr;
+        BITMASK_SET(&m_inp_bm_count,i);
+        DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
+        if (secure_mode)
+            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
+        else
+            input->pBuffer           = (OMX_U8 *)buf_addr;
+        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        input->nVersion.nVersion = OMX_SPEC_VERSION;
+        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
+        input->pAppPrivate       = appData;
+        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
+        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
+
+        if (drv_ctx.disable_dmx) {
+            eRet = allocate_desc_buffer(i);
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
+        eRet = OMX_ErrorInsufficientResources;
+    }
+    return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateOutputBuffer
+   FUNCTION
+   omx_vdec::AllocateOutputBuffer
 
-DESCRIPTION
-  Helper fn for AllocateBuffer in the output pin
+   DESCRIPTION
+   Helper fn for AllocateBuffer in the output pin
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything went well.
+   RETURN VALUE
+   OMX Error None if everything went well.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  struct vdec_setbuffer_cmd setbuffers;
-  int extra_idx = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    struct vdec_setbuffer_cmd setbuffers;
+    int extra_idx = 0;
 #ifdef USE_ION
-  int ion_device_fd =-1;
-  struct ion_allocation_data ion_alloc_data;
-  struct ion_fd_data fd_ion_data;
+    int ion_device_fd =-1;
+    struct ion_allocation_data ion_alloc_data;
+    struct ion_fd_data fd_ion_data;
 #endif
-  if(!m_out_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
-      drv_ctx.op_buf.actualcount,
-      drv_ctx.op_buf.buffer_size);
-    int nBufHdrSize        = 0;
-    int nPlatformEntrySize = 0;
-    int nPlatformListSize  = 0;
-    int nPMEMInfoSize = 0;
-    int pmem_fd = -1;
-    unsigned char *pmem_baseaddress = NULL;
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
+                drv_ctx.op_buf.actualcount,
+                drv_ctx.op_buf.buffer_size);
+        int nBufHdrSize        = 0;
+        int nPlatformEntrySize = 0;
+        int nPlatformListSize  = 0;
+        int nPMEMInfoSize = 0;
+        int pmem_fd = -1;
+        unsigned char *pmem_baseaddress = NULL;
 
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
 
-    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
-      drv_ctx.op_buf.actualcount);
-    nBufHdrSize        = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_BUFFERHEADERTYPE);
+        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
+                drv_ctx.op_buf.actualcount);
+        nBufHdrSize        = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_BUFFERHEADERTYPE);
 
-    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
-    nPlatformListSize  = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
-    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+        nPlatformListSize  = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
 
-    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
-                         sizeof(OMX_BUFFERHEADERTYPE),
-                         nPMEMInfoSize,
-                         nPlatformListSize);
-    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
-                         drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
+                sizeof(OMX_BUFFERHEADERTYPE),
+                nPMEMInfoSize,
+                nPlatformListSize);
+        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
+                drv_ctx.op_buf.actualcount);
 #ifdef USE_ION
-    DEBUG_PRINT_HIGH("allocate outputBuffer size %d \n",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
-    ion_device_fd = alloc_map_ion_memory(
-                    drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
-                    drv_ctx.op_buf.alignment,
-                    &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
-    if (ion_device_fd < 0) {
-        return OMX_ErrorInsufficientResources;
-    }
-    pmem_fd = fd_ion_data.fd;
+        DEBUG_PRINT_HIGH("allocate outputBuffer size %d \n",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
+        ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
+                drv_ctx.op_buf.alignment,
+                &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
+        if (ion_device_fd < 0) {
+            return OMX_ErrorInsufficientResources;
+        }
+        pmem_fd = fd_ion_data.fd;
 #else
-    pmem_fd = open (MEM_DEVICE,O_RDWR);
+        pmem_fd = open (MEM_DEVICE,O_RDWR);
 
-    if (pmem_fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
-        drv_ctx.op_buf.buffer_size);
-      return OMX_ErrorInsufficientResources;
-    }
+        if (pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+                    drv_ctx.op_buf.buffer_size);
+            return OMX_ErrorInsufficientResources;
+        }
 
-    if(pmem_fd == 0)
-    {
-      pmem_fd = open (MEM_DEVICE,O_RDWR);
+        if (pmem_fd == 0) {
+            pmem_fd = open (MEM_DEVICE,O_RDWR);
 
-      if (pmem_fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
-          drv_ctx.op_buf.buffer_size);
-        return OMX_ErrorInsufficientResources;
-      }
-    }
+            if (pmem_fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+                        drv_ctx.op_buf.buffer_size);
+                return OMX_ErrorInsufficientResources;
+            }
+        }
 
-    if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
-      drv_ctx.op_buf.actualcount,
-      drv_ctx.op_buf.alignment))
-    {
-      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-      close(pmem_fd);
-      return OMX_ErrorInsufficientResources;
-    }
+        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
+                    drv_ctx.op_buf.actualcount,
+                    drv_ctx.op_buf.alignment)) {
+            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+            close(pmem_fd);
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
-   if (!secure_mode) {
-        pmem_baseaddress = (unsigned char *)mmap(NULL,
-                           (drv_ctx.op_buf.buffer_size *
-                            drv_ctx.op_buf.actualcount),
-                            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
-        if (pmem_baseaddress == MAP_FAILED)
-        {
-          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
-          drv_ctx.op_buf.buffer_size);
-          close(pmem_fd);
+        if (!secure_mode) {
+            pmem_baseaddress = (unsigned char *)mmap(NULL,
+                    (drv_ctx.op_buf.buffer_size *
+                     drv_ctx.op_buf.actualcount),
+                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
+            if (pmem_baseaddress == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
+                        drv_ctx.op_buf.buffer_size);
+                close(pmem_fd);
 #ifdef USE_ION
-          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
 #endif
-          return OMX_ErrorInsufficientResources;
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        // Alloc mem for platform specific info
+        char *pPtr=NULL;
+        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+                nPMEMInfoSize,1);
+        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
+                                   calloc (sizeof(struct vdec_bufferpayload),
+                                           drv_ctx.op_buf.actualcount);
+        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
+                                 calloc (sizeof (struct vdec_output_frameinfo),
+                                         drv_ctx.op_buf.actualcount);
+#ifdef USE_ION
+        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
+                                  calloc (sizeof(struct vdec_ion),
+                                          drv_ctx.op_buf.actualcount);
+#endif
+
+        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+                && drv_ctx.ptr_respbuffer) {
+            drv_ctx.ptr_outputbuffer[0].mmaped_size =
+                (drv_ctx.op_buf.buffer_size *
+                 drv_ctx.op_buf.actualcount);
+            bufHdr          =  m_out_mem_ptr;
+            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+                (((char *) m_platform_list)  + nPlatformListSize);
+            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                (((char *) m_platform_entry) + nPlatformEntrySize);
+            pPlatformList   = m_platform_list;
+            pPlatformEntry  = m_platform_entry;
+            pPMEMInfo       = m_pmem_info;
+
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+
+            // Settting the entire storage nicely
+            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
+            DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
+            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = bytes;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = appData;
+                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
+                // Platform specific PMEM Information
+                // Initialize the Platform Entry
+                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
+                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+                pPlatformEntry->entry      = pPMEMInfo;
+                // Initialize the Platform List
+                pPlatformList->nEntries    = 1;
+                pPlatformList->entryList   = pPlatformEntry;
+                // Keep pBuffer NULL till vdec is opened
+                bufHdr->pBuffer            = NULL;
+                bufHdr->nOffset            = 0;
+
+                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
+                pPMEMInfo->pmem_fd = 0;
+                bufHdr->pPlatformPrivate = pPlatformList;
+
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
+                m_pmem_info[i].pmem_fd = pmem_fd;
+#ifdef USE_ION
+                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
+                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
+                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
+#endif
+
+                /*Create a mapping between buffers*/
+                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
+                                                        &drv_ctx.ptr_outputbuffer[i];
+                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
+                drv_ctx.ptr_outputbuffer[i].bufferaddr =
+                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+
+                DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
+                        pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
+                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
+                // Move the buffer and buffer header pointers
+                bufHdr++;
+                pPMEMInfo++;
+                pPlatformEntry++;
+                pPlatformList++;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
+                    m_out_mem_ptr, pPtr);
+            if (m_out_mem_ptr) {
+                free(m_out_mem_ptr);
+                m_out_mem_ptr = NULL;
+            }
+            if (pPtr) {
+                free(pPtr);
+                pPtr = NULL;
+            }
+            if (drv_ctx.ptr_outputbuffer) {
+                free(drv_ctx.ptr_outputbuffer);
+                drv_ctx.ptr_outputbuffer = NULL;
+            }
+            if (drv_ctx.ptr_respbuffer) {
+                free(drv_ctx.ptr_respbuffer);
+                drv_ctx.ptr_respbuffer = NULL;
+            }
+#ifdef USE_ION
+            if (drv_ctx.op_buf_ion_info) {
+                DEBUG_PRINT_LOW("\n Free o/p ion context");
+                free(drv_ctx.op_buf_ion_info);
+                drv_ctx.op_buf_ion_info = NULL;
+            }
+#endif
+            eRet =  OMX_ErrorInsufficientResources;
+        }
+        if (eRet == OMX_ErrorNone)
+            eRet = allocate_extradata();
+    }
+
+    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
+            break;
         }
     }
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    // Alloc mem for platform specific info
-    char *pPtr=NULL;
-    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
-                                     nPMEMInfoSize,1);
-    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
-      calloc (sizeof(struct vdec_bufferpayload),
-      drv_ctx.op_buf.actualcount);
-    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
-      calloc (sizeof (struct vdec_output_frameinfo),
-      drv_ctx.op_buf.actualcount);
+
+    if (eRet == OMX_ErrorNone) {
+        if (i < drv_ctx.op_buf.actualcount) {
+            struct v4l2_buffer buf;
+            struct v4l2_plane plane[VIDEO_MAX_PLANES];
+            int rc;
+            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+
+            drv_ctx.ptr_outputbuffer[i].buffer_len =
+                drv_ctx.op_buf.buffer_size;
+
+            *bufferHdr = (m_out_mem_ptr + i );
+            if (secure_mode) {
+                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+            }
+            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
+
+            buf.index = i;
+            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            buf.memory = V4L2_MEMORY_USERPTR;
+            plane[0].length = drv_ctx.op_buf.buffer_size;
+            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
+                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
-      calloc (sizeof(struct vdec_ion),
-      drv_ctx.op_buf.actualcount);
+            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
 #endif
-
-    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
-       && drv_ctx.ptr_respbuffer)
-    {
-      drv_ctx.ptr_outputbuffer[0].mmaped_size =
-        (drv_ctx.op_buf.buffer_size *
-         drv_ctx.op_buf.actualcount);
-      bufHdr          =  m_out_mem_ptr;
-      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
-      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
-                        (((char *) m_platform_list)  + nPlatformListSize);
-      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                        (((char *) m_platform_entry) + nPlatformEntrySize);
-      pPlatformList   = m_platform_list;
-      pPlatformEntry  = m_platform_entry;
-      pPMEMInfo       = m_pmem_info;
-
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
-
-      // Settting the entire storage nicely
-      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
-      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
-      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = bytes;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = appData;
-        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
-        // Platform specific PMEM Information
-        // Initialize the Platform Entry
-        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
-        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-        pPlatformEntry->entry      = pPMEMInfo;
-        // Initialize the Platform List
-        pPlatformList->nEntries    = 1;
-        pPlatformList->entryList   = pPlatformEntry;
-        // Keep pBuffer NULL till vdec is opened
-        bufHdr->pBuffer            = NULL;
-        bufHdr->nOffset            = 0;
-
-        pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
-        pPMEMInfo->pmem_fd = 0;
-        bufHdr->pPlatformPrivate = pPlatformList;
-
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
-        m_pmem_info[i].pmem_fd = pmem_fd;
+            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+            plane[0].data_offset = 0;
+            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
 #ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
-        drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
-        drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
+                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
 #endif
+                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
+                plane[extra_idx].data_offset = 0;
+            } else if (extra_idx >= VIDEO_MAX_PLANES) {
+                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
+                return OMX_ErrorBadParameter;
+            }
+            buf.m.planes = plane;
+            buf.length = drv_ctx.num_planes;
+            DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
+            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+            if (rc) {
+                /*TODO: How to handle this case */
+                return OMX_ErrorInsufficientResources;
+            }
 
-        /*Create a mapping between buffers*/
-        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
-        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
-                                            &drv_ctx.ptr_outputbuffer[i];
-        drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr =
-          pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
+                enum v4l2_buf_type buf_type;
+                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
+                if (rc) {
+                    return OMX_ErrorInsufficientResources;
+                } else {
+                    streaming[CAPTURE_PORT] = true;
+                    DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
+                }
+            }
 
-        DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
-          pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
-          drv_ctx.ptr_outputbuffer[i].bufferaddr);
-        // Move the buffer and buffer header pointers
-        bufHdr++;
-        pPMEMInfo++;
-        pPlatformEntry++;
-        pPlatformList++;
-      }
+            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
+            (*bufferHdr)->pAppPrivate = appData;
+            BITMASK_SET(&m_out_bm_count,i);
+        } else {
+            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
+            eRet = OMX_ErrorInsufficientResources;
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
-                                        m_out_mem_ptr, pPtr);
-      if(m_out_mem_ptr)
-      {
-        free(m_out_mem_ptr);
-        m_out_mem_ptr = NULL;
-      }
-      if(pPtr)
-      {
-        free(pPtr);
-        pPtr = NULL;
-      }
-      if(drv_ctx.ptr_outputbuffer)
-      {
-        free(drv_ctx.ptr_outputbuffer);
-        drv_ctx.ptr_outputbuffer = NULL;
-      }
-      if(drv_ctx.ptr_respbuffer)
-      {
-        free(drv_ctx.ptr_respbuffer);
-        drv_ctx.ptr_respbuffer = NULL;
-      }
-#ifdef USE_ION
-    if (drv_ctx.op_buf_ion_info) {
-        DEBUG_PRINT_LOW("\n Free o/p ion context");
-	free(drv_ctx.op_buf_ion_info);
-        drv_ctx.op_buf_ion_info = NULL;
-    }
-#endif
-      eRet =  OMX_ErrorInsufficientResources;
-    }
-    if (eRet == OMX_ErrorNone)
-      eRet = allocate_extradata();
-  }
 
-  for(i=0; i< drv_ctx.op_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_out_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
-      break;
-    }
-  }
-
-  if (eRet == OMX_ErrorNone)
-  {
-    if(i < drv_ctx.op_buf.actualcount)
-    {
-      struct v4l2_buffer buf;
-      struct v4l2_plane plane[VIDEO_MAX_PLANES];
-      int rc;
-      m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
-
-      drv_ctx.ptr_outputbuffer[i].buffer_len =
-        drv_ctx.op_buf.buffer_size;
-
-    *bufferHdr = (m_out_mem_ptr + i );
-    if (secure_mode) {
-       drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
-    }
-   drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
-
-     buf.index = i;
-     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-     buf.memory = V4L2_MEMORY_USERPTR;
-     plane[0].length = drv_ctx.op_buf.buffer_size;
-     plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
-             (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
-#ifdef USE_ION
-     plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#endif
-     plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
-     plane[0].data_offset = 0;
-     extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-     if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-       plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
-#ifdef USE_ION
-       plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
-#endif
-       plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].data_offset = 0;
-     } else if (extra_idx >= VIDEO_MAX_PLANES) {
-       DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
-       return OMX_ErrorBadParameter;
-     }
-     buf.m.planes = plane;
-     buf.length = drv_ctx.num_planes;
-     DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
-     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
-     if (rc) {
-       /*TODO: How to handle this case */
-       return OMX_ErrorInsufficientResources;
-     }
-
-	  if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
-		enum v4l2_buf_type buf_type;
-		buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
-		if (rc) {
-			return OMX_ErrorInsufficientResources;
-		} else {
-			streaming[CAPTURE_PORT] = true;
-			DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
-		}
-	  }
-
-      (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
-      (*bufferHdr)->pAppPrivate = appData;
-      BITMASK_SET(&m_out_bm_count,i);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
-      eRet = OMX_ErrorInsufficientResources;
-    }
-  }
-
-  return eRet;
+    return eRet;
 }
 
 
 // AllocateBuffer  -- API Call
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateBuffer
+   FUNCTION
+   omx_vdec::AllocateBuffer
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
-                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                     OMX_IN OMX_U32                        port,
-                                     OMX_IN OMX_PTR                     appData,
-                                     OMX_IN OMX_U32                       bytes)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN OMX_U32                       bytes)
 {
     unsigned i = 0;
     OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
 
     DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
 
-    if(port == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      if (arbitrary_bytes)
-      {
-          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
-      }
-      else
-      {
-        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
-      }
-    }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    {
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        if (arbitrary_bytes) {
+            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
+        } else {
+            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
+        }
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
         eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
                 appData,bytes);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
-      eRet = OMX_ErrorBadPortIndex;
+    } else {
+        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+        eRet = OMX_ErrorBadPortIndex;
     }
     DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
-    if(eRet == OMX_ErrorNone)
-    {
-        if(allocate_done()){
-            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-            {
+    if (eRet == OMX_ErrorNone) {
+        if (allocate_done()) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
                 // Send the callback now
                 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
                 post_event(OMX_CommandStateSet,OMX_StateIdle,
-                                   OMX_COMPONENT_GENERATE_EVENT);
+                        OMX_COMPONENT_GENERATE_EVENT);
             }
         }
-        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
-        {
-          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-          {
-             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-             post_event(OMX_CommandPortEnable,
+        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
                         OMX_CORE_INPUT_PORT_INDEX,
                         OMX_COMPONENT_GENERATE_EVENT);
-          }
+            }
         }
-        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
-            {
-          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-          {
-             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
                 post_event(OMX_CommandPortEnable,
-                           OMX_CORE_OUTPUT_PORT_INDEX,
-                           OMX_COMPONENT_GENERATE_EVENT);
+                        OMX_CORE_OUTPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
             }
         }
     }
@@ -5304,172 +4749,140 @@
 
 // Free Buffer - API call
 /* ======================================================================
-FUNCTION
-  omx_vdec::FreeBuffer
+   FUNCTION
+   omx_vdec::FreeBuffer
 
-DESCRIPTION
+   DESCRIPTION
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                      OMX_IN OMX_U32                 port,
-                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_U32                 port,
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     unsigned int nPortIndex;
     DEBUG_PRINT_LOW("In for decoder free_buffer \n");
 
-    if(m_state == OMX_StateIdle &&
-       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-    {
+    if (m_state == OMX_StateIdle &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
         DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
-    }
-    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
-            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
-    {
+    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
+            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
         DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
-    }
-    else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
-              BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
-             (port == OMX_CORE_OUTPUT_PORT_INDEX &&
-              BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)))
-    {
+    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
+                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
+            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
+             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
         DEBUG_PRINT_LOW("Free Buffer while port %d enable pending\n", port);
-    }
-    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
-    {
+    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
         DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
         post_event(OMX_EventError,
-                   OMX_ErrorPortUnpopulated,
-                   OMX_COMPONENT_GENERATE_EVENT);
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
 
         return OMX_ErrorIncorrectStateOperation;
-    }
-    else if (m_state != OMX_StateInvalid)
-    {
+    } else if (m_state != OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
         post_event(OMX_EventError,
-                   OMX_ErrorPortUnpopulated,
-                   OMX_COMPONENT_GENERATE_EVENT);
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
     }
 
-    if(port == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      /*Check if arbitrary bytes*/
-      if(!arbitrary_bytes && !input_use_buffer)
-        nPortIndex = buffer - m_inp_mem_ptr;
-      else
-        nPortIndex = buffer - m_inp_heap_ptr;
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        /*Check if arbitrary bytes*/
+        if (!arbitrary_bytes && !input_use_buffer)
+            nPortIndex = buffer - m_inp_mem_ptr;
+        else
+            nPortIndex = buffer - m_inp_heap_ptr;
 
         DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
-        if(nPortIndex < drv_ctx.ip_buf.actualcount)
-        {
-         // Clear the bit associated with it.
-         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
-         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
-         if (input_use_buffer == true)
-         {
+        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
+            // Clear the bit associated with it.
+            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
+            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
+            if (input_use_buffer == true) {
 
-            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
-            if(m_phdr_pmem_ptr)
-              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
-         }
-         else
-         {
-            if (arbitrary_bytes)
-            {
-              if(m_phdr_pmem_ptr)
-                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
-              else
-                free_input_buffer(nPortIndex,NULL);
+                DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
+                if (m_phdr_pmem_ptr)
+                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
+            } else {
+                if (arbitrary_bytes) {
+                    if (m_phdr_pmem_ptr)
+                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
+                    else
+                        free_input_buffer(nPortIndex,NULL);
+                } else
+                    free_input_buffer(buffer);
             }
-            else
-              free_input_buffer(buffer);
-         }
-         m_inp_bPopulated = OMX_FALSE;
-         /*Free the Buffer Header*/
-          if (release_input_done())
-          {
-            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
-            free_input_buffer_header();
-          }
-        }
-        else
-        {
+            m_inp_bPopulated = OMX_FALSE;
+            /*Free the Buffer Header*/
+            if (release_input_done()) {
+                DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
+                free_input_buffer_header();
+            }
+        } else {
             DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
             eRet = OMX_ErrorBadPortIndex;
         }
 
-        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
-           && release_input_done())
-        {
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
+                && release_input_done()) {
             DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
             post_event(OMX_CommandPortDisable,
-                       OMX_CORE_INPUT_PORT_INDEX,
-                       OMX_COMPONENT_GENERATE_EVENT);
+                    OMX_CORE_INPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
-    }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    {
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
         // check if the buffer is valid
         nPortIndex = buffer - client_buffers.get_il_buf_hdr();
-        if(nPortIndex < drv_ctx.op_buf.actualcount)
-        {
+        if (nPortIndex < drv_ctx.op_buf.actualcount) {
             DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
             // Clear the bit associated with it.
             BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
             m_out_bPopulated = OMX_FALSE;
             client_buffers.free_output_buffer (buffer);
 
-            if (release_output_done())
-            {
-              free_output_buffer_header();
+            if (release_output_done()) {
+                free_output_buffer_header();
             }
-        }
-        else
-        {
+        } else {
             DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
             eRet = OMX_ErrorBadPortIndex;
         }
-        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
-           && release_output_done())
-        {
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
+                && release_output_done()) {
             DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
 
-                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
-                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
 #ifdef _ANDROID_ICS_
-                if (m_enable_android_native_buffers)
-                {
-                    DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
-                    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
-                }
+            if (m_enable_android_native_buffers) {
+                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
+                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+            }
 #endif
 
-                post_event(OMX_CommandPortDisable,
-                           OMX_CORE_OUTPUT_PORT_INDEX,
-                           OMX_COMPONENT_GENERATE_EVENT);
+            post_event(OMX_CommandPortDisable,
+                    OMX_CORE_OUTPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
-    }
-    else
-    {
+    } else {
         eRet = OMX_ErrorBadPortIndex;
     }
-    if((eRet == OMX_ErrorNone) &&
-       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-    {
-        if(release_done())
-        {
+    if ((eRet == OMX_ErrorNone) &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
+        if (release_done()) {
             // Send the callback now
             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
             post_event(OMX_CommandStateSet, OMX_StateLoaded,
-                                      OMX_COMPONENT_GENERATE_EVENT);
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
     }
     return eRet;
@@ -5477,487 +4890,437 @@
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::EmptyThisBuffer
+   FUNCTION
+   omx_vdec::EmptyThisBuffer
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
-  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
+    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
+    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
 
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (buffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
+        return OMX_ErrorBadParameter;
+    }
 
-  if (!m_inp_bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_inp_bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
+        return OMX_ErrorBadPortIndex;
+    }
 
 #ifdef _ANDROID_
-  if(iDivXDrmDecrypt)
-  {
-    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
-    if(drmErr != OMX_ErrorNone) {
-        // this error can be ignored
-        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+    if (iDivXDrmDecrypt) {
+        OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
+        if (drmErr != OMX_ErrorNone) {
+            // this error can be ignored
+            DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+        }
     }
-  }
 #endif //_ANDROID_
-  if (perf_flag)
-  {
-    if (!latency)
-    {
-      dec_time.stop();
-      latency = dec_time.processing_time_us();
-      dec_time.start();
+    if (perf_flag) {
+        if (!latency) {
+            dec_time.stop();
+            latency = dec_time.processing_time_us();
+            dec_time.start();
+        }
     }
-  }
 
-  if (arbitrary_bytes)
-  {
-    nBufferIndex = buffer - m_inp_heap_ptr;
-  }
-  else
-  {
-     if (input_use_buffer == true)
-     {
-       nBufferIndex = buffer - m_inp_heap_ptr;
-       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
-       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
-       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
-       buffer = &m_inp_mem_ptr[nBufferIndex];
-       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
-                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
-     }
-     else{
-       nBufferIndex = buffer - m_inp_mem_ptr;
-     }
-  }
+    if (arbitrary_bytes) {
+        nBufferIndex = buffer - m_inp_heap_ptr;
+    } else {
+        if (input_use_buffer == true) {
+            nBufferIndex = buffer - m_inp_heap_ptr;
+            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
+            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
+            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
+            buffer = &m_inp_mem_ptr[nBufferIndex];
+            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
+                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
+        } else {
+            nBufferIndex = buffer - m_inp_mem_ptr;
+        }
+    }
 
-  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
-    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
-  if (arbitrary_bytes)
-  {
-    post_event ((unsigned)hComp,(unsigned)buffer,
+    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
+            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
+    if (arbitrary_bytes) {
+        post_event ((unsigned)hComp,(unsigned)buffer,
                 OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
-  }
-  else
-  {
-    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
-      set_frame_rate(buffer->nTimeStamp);
-    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
-  }
-  return OMX_ErrorNone;
+    } else {
+        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
+            set_frame_rate(buffer->nTimeStamp);
+        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
+    }
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::empty_this_buffer_proxy
+   FUNCTION
+   omx_vdec::empty_this_buffer_proxy
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
-                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  int push_cnt = 0,i=0;
-  unsigned nPortIndex = 0;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  struct vdec_input_frameinfo frameinfo;
-  struct vdec_bufferpayload *temp_buffer;
-  struct vdec_seqheader seq_header;
-  bool port_setting_changed = true;
-  bool not_coded_vop = false;
+    int push_cnt = 0,i=0;
+    unsigned nPortIndex = 0;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    struct vdec_input_frameinfo frameinfo;
+    struct vdec_bufferpayload *temp_buffer;
+    struct vdec_seqheader seq_header;
+    bool port_setting_changed = true;
+    bool not_coded_vop = false;
 
-  /*Should we generate a Aync error event*/
-  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    /*Should we generate a Aync error event*/
+    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
 
-  if (nPortIndex > drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
-        nPortIndex);
-    return OMX_ErrorBadParameter;
-  }
+    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
+                nPortIndex);
+        return OMX_ErrorBadParameter;
+    }
 
-  pending_input_buffers++;
+    pending_input_buffers++;
 
-  /* return zero length and not an EOS buffer */
-  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
-     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
-  {
-    DEBUG_PRINT_HIGH("\n return zero legth buffer");
-    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                     OMX_COMPONENT_GENERATE_EBD);
-    return OMX_ErrorNone;
-  }
+    /* return zero length and not an EOS buffer */
+    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
+            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
+        DEBUG_PRINT_HIGH("\n return zero legth buffer");
+        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                OMX_COMPONENT_GENERATE_EBD);
+        return OMX_ErrorNone;
+    }
 
 
-  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
-    mp4StreamType psBits;
-    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
-    psBits.numBytes = buffer->nFilledLen;
-    mp4_headerparser.parseHeader(&psBits);
-    not_coded_vop = mp4_headerparser.is_notcodec_vop(
-            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
-    if(not_coded_vop) {
-        DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
-             buffer->nFilledLen,frame_count);
-        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
-          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
-          not_coded_vop = false;
-          buffer->nFilledLen = 0;
+    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
+        mp4StreamType psBits;
+        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
+        psBits.numBytes = buffer->nFilledLen;
+        mp4_headerparser.parseHeader(&psBits);
+        not_coded_vop = mp4_headerparser.is_notcodec_vop(
+                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+        if (not_coded_vop) {
+            DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
+                    buffer->nFilledLen,frame_count);
+            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+                DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
+                not_coded_vop = false;
+                buffer->nFilledLen = 0;
+            }
         }
     }
-  }
 
-  if(input_flush_progress == true
+    if (input_flush_progress == true
 
-     || not_coded_vop
+            || not_coded_vop
 
-     )
-  {
-    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
-    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                     OMX_COMPONENT_GENERATE_EBD);
-    return OMX_ErrorNone;
-  }
-
-  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
-
-  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  /*for use buffer we need to memcpy the data*/
-  temp_buffer->buffer_len = buffer->nFilledLen;
-
-  if (input_use_buffer)
-  {
-    if (buffer->nFilledLen <= temp_buffer->buffer_len)
-    {
-      if(arbitrary_bytes)
-      {
-        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
-      }
-      else
-      {
-        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
-                buffer->nFilledLen);
-      }
-    }
-    else
-    {
-      return OMX_ErrorBadParameter;
+       ) {
+        DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
+        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                OMX_COMPONENT_GENERATE_EBD);
+        return OMX_ErrorNone;
     }
 
-  }
+    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
 
-  frameinfo.bufferaddr = temp_buffer->bufferaddr;
-  frameinfo.client_data = (void *) buffer;
-  frameinfo.datalen = temp_buffer->buffer_len;
-  frameinfo.flags = 0;
-  frameinfo.offset = buffer->nOffset;
-  frameinfo.pmem_fd = temp_buffer->pmem_fd;
-  frameinfo.pmem_offset = temp_buffer->offset;
-  frameinfo.timestamp = buffer->nTimeStamp;
-  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
-  {
-    DEBUG_PRINT_LOW("ETB: dmx enabled");
-    if (m_demux_entries == 0)
-    {
-      extract_demux_addr_offsets(buffer);
+    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
+        return OMX_ErrorBadParameter;
     }
 
-    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
-    handle_demux_data(buffer);
-    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
-    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
-  }
-  else
-  {
-    frameinfo.desc_addr = NULL;
-    frameinfo.desc_size = 0;
-  }
-  if(!arbitrary_bytes)
-  {
-      frameinfo.flags |= buffer->nFlags;
-  }
+    DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    /*for use buffer we need to memcpy the data*/
+    temp_buffer->buffer_len = buffer->nFilledLen;
+
+    if (input_use_buffer) {
+        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
+            if (arbitrary_bytes) {
+                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+            } else {
+                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
+                        buffer->nFilledLen);
+            }
+        } else {
+            return OMX_ErrorBadParameter;
+        }
+
+    }
+
+    frameinfo.bufferaddr = temp_buffer->bufferaddr;
+    frameinfo.client_data = (void *) buffer;
+    frameinfo.datalen = temp_buffer->buffer_len;
+    frameinfo.flags = 0;
+    frameinfo.offset = buffer->nOffset;
+    frameinfo.pmem_fd = temp_buffer->pmem_fd;
+    frameinfo.pmem_offset = temp_buffer->offset;
+    frameinfo.timestamp = buffer->nTimeStamp;
+    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
+        DEBUG_PRINT_LOW("ETB: dmx enabled");
+        if (m_demux_entries == 0) {
+            extract_demux_addr_offsets(buffer);
+        }
+
+        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
+        handle_demux_data(buffer);
+        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
+        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
+    } else {
+        frameinfo.desc_addr = NULL;
+        frameinfo.desc_size = 0;
+    }
+    if (!arbitrary_bytes) {
+        frameinfo.flags |= buffer->nFlags;
+    }
 
 #ifdef _ANDROID_
-  if (m_debug_timestamp)
-  {
-    if(arbitrary_bytes)
-    {
-      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
-      m_timestamp_list.insert_ts(buffer->nTimeStamp);
+    if (m_debug_timestamp) {
+        if (arbitrary_bytes) {
+            DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+            m_timestamp_list.insert_ts(buffer->nTimeStamp);
+        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
+            DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+            m_timestamp_list.insert_ts(buffer->nTimeStamp);
+        }
     }
-    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
-    {
-      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
-      m_timestamp_list.insert_ts(buffer->nTimeStamp);
-    }
-  }
 #endif
 
 #ifdef INPUT_BUFFER_LOG
-  if (inputBufferFile1)
-  {
-    fwrite((const char *)temp_buffer->bufferaddr,
-      temp_buffer->buffer_len,1,inputBufferFile1);
-  }
+    if (inputBufferFile1) {
+        fwrite((const char *)temp_buffer->bufferaddr,
+                temp_buffer->buffer_len,1,inputBufferFile1);
+    }
 #endif
 
-  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
-  {
-    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-  }
+    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+    }
 
-  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
-  {
-    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
-    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
-    h264_scratch.nFilledLen = 0;
-    nal_count = 0;
-    look_ahead_nal = false;
-    frame_count = 0;
-    if (m_frame_parser.mutils)
-      m_frame_parser.mutils->initialize_frame_checking_environment();
-    m_frame_parser.flush();
-    h264_last_au_ts = LLONG_MAX;
-    h264_last_au_flags = 0;
-    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-    m_demux_entries = 0;
-  }
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane;
-  memset( (void *)&buf, 0, sizeof(buf));
-  memset( (void *)&plane, 0, sizeof(plane));
-  int rc;
-  unsigned long  print_count;
-  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
-  {  buf.flags = V4L2_BUF_FLAG_EOS;
-  DEBUG_PRINT_HIGH("\n  INPUT EOS reached \n") ;
-  }
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	buf.index = nPortIndex;
-	buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	buf.memory = V4L2_MEMORY_USERPTR;
-	plane.bytesused = temp_buffer->buffer_len;
-	plane.length = drv_ctx.ip_buf.buffer_size;
-	plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
-            (unsigned long)temp_buffer->offset;
-	plane.reserved[0] = temp_buffer->pmem_fd;
-	plane.reserved[1] = temp_buffer->offset;
-	plane.data_offset = 0;
-	buf.m.planes = &plane;
-	buf.length = 1;
-	if (frameinfo.timestamp >= LLONG_MAX) {
-          buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
-        }
-	//assumption is that timestamp is in milliseconds
-	buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
-	buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
-	buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
+    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+        DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
+        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
+        h264_scratch.nFilledLen = 0;
+        nal_count = 0;
+        look_ahead_nal = false;
+        frame_count = 0;
+        if (m_frame_parser.mutils)
+            m_frame_parser.mutils->initialize_frame_checking_environment();
+        m_frame_parser.flush();
+        h264_last_au_ts = LLONG_MAX;
+        h264_last_au_flags = 0;
+        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+        m_demux_entries = 0;
+    }
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane;
+    memset( (void *)&buf, 0, sizeof(buf));
+    memset( (void *)&plane, 0, sizeof(plane));
+    int rc;
+    unsigned long  print_count;
+    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+        buf.flags = V4L2_BUF_FLAG_EOS;
+        DEBUG_PRINT_HIGH("\n  INPUT EOS reached \n") ;
+    }
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    buf.index = nPortIndex;
+    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    buf.memory = V4L2_MEMORY_USERPTR;
+    plane.bytesused = temp_buffer->buffer_len;
+    plane.length = drv_ctx.ip_buf.buffer_size;
+    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
+        (unsigned long)temp_buffer->offset;
+    plane.reserved[0] = temp_buffer->pmem_fd;
+    plane.reserved[1] = temp_buffer->offset;
+    plane.data_offset = 0;
+    buf.m.planes = &plane;
+    buf.length = 1;
+    if (frameinfo.timestamp >= LLONG_MAX) {
+        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
+    }
+    //assumption is that timestamp is in milliseconds
+    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
+    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
+    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
 
-	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
-	if(rc)
-	{
-		DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
-		return OMX_ErrorHardware;
-	}
-  if(!streaming[OUTPUT_PORT])
-  {
-	enum v4l2_buf_type buf_type;
-	int ret,r;
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
+        return OMX_ErrorHardware;
+    }
+    if (!streaming[OUTPUT_PORT]) {
+        enum v4l2_buf_type buf_type;
+        int ret,r;
 
-	buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
         DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-	ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
-	if(!ret) {
-		DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
-		streaming[OUTPUT_PORT] = true;
-	} else{
-		/*TODO: How to handle this case */
-		DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
-                DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
-                post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                           OMX_COMPONENT_GENERATE_EBD);
-                return OMX_ErrorBadParameter;
-	}
-}
-  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
-    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
-      time_stamp_dts.insert_timestamp(buffer);
+        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
+        if (!ret) {
+            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
+            streaming[OUTPUT_PORT] = true;
+        } else {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
+            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
+            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                    OMX_COMPONENT_GENERATE_EBD);
+            return OMX_ErrorBadParameter;
+        }
+    }
+    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
+            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
+    time_stamp_dts.insert_timestamp(buffer);
 
-  return ret;
+    return ret;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::FillThisBuffer
+   FUNCTION
+   omx_vdec::FillThisBuffer
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
-                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
 
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("FTB in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (!m_out_bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_out_bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  if (buffer == NULL ||
-      ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
-  {
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL ||
+            ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) {
+        return OMX_ErrorBadParameter;
+    }
 
-  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
+        return OMX_ErrorBadPortIndex;
+    }
 
-  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
-  return OMX_ErrorNone;
+    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::fill_this_buffer_proxy
+   FUNCTION
+   omx_vdec::fill_this_buffer_proxy
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
-                         OMX_IN OMX_HANDLETYPE        hComp,
-                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
+        OMX_IN OMX_HANDLETYPE        hComp,
+        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
 {
-  OMX_ERRORTYPE nRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
-  unsigned nPortIndex = 0;
-  struct vdec_fillbuffer_cmd fillbuffer;
-  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
-  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
+    OMX_ERRORTYPE nRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
+    unsigned nPortIndex = 0;
+    struct vdec_fillbuffer_cmd fillbuffer;
+    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
+    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
 
-  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
+    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
 
-  if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
-    return OMX_ErrorBadParameter;
+    if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
+        return OMX_ErrorBadParameter;
 
-  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
-      bufferAdd, bufferAdd->pBuffer);
-  /*Return back the output buffer to client*/
-  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
-  {
-    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
-    buffer->nFilledLen = 0;
-    m_cb.FillBufferDone (hComp,m_app_data,buffer);
-    return OMX_ErrorNone;
-  }
-  pending_output_buffers++;
-  buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
-  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
-  if (ptr_respbuffer)
-  {
-    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
-  }
+    DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
+            bufferAdd, bufferAdd->pBuffer);
+    /*Return back the output buffer to client*/
+    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
+        DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
+        buffer->nFilledLen = 0;
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
+    pending_output_buffers++;
+    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
+    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
+    if (ptr_respbuffer) {
+        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
+    }
 
-  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
-  {
-      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
-      buffer->nFilledLen = 0;
-      m_cb.FillBufferDone (hComp,m_app_data,buffer);
-      pending_output_buffers--;
-      return OMX_ErrorBadParameter;
-  }
+    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
+        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
+        buffer->nFilledLen = 0;
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        pending_output_buffers--;
+        return OMX_ErrorBadParameter;
+    }
 
- /* memcpy (&fillbuffer.buffer,ptr_outputbuffer,
-          sizeof(struct vdec_bufferpayload));
-    fillbuffer.client_data = bufferAdd;*/
+    /* memcpy (&fillbuffer.buffer,ptr_outputbuffer,
+       sizeof(struct vdec_bufferpayload));
+       fillbuffer.client_data = bufferAdd;*/
 
 #ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
+    if (m_enable_android_native_buffers) {
         // Acquire a write lock on this buffer.
         if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
-                                                  GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
+                    GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
             DEBUG_PRINT_ERROR("Failed to acquire genlock");
             buffer->nFilledLen = 0;
             m_cb.FillBufferDone (hComp,m_app_data,buffer);
@@ -5965,147 +5328,139 @@
             return OMX_ErrorInsufficientResources;
         } else {
             native_buffer[buffer - m_out_mem_ptr].inuse = true;
-      }
+        }
     }
 #endif
-	int rc = 0;
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  memset( (void *)&buf, 0, sizeof(buf));
-  memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
-  int extra_idx = 0;
+    int rc = 0;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    memset( (void *)&buf, 0, sizeof(buf));
+    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
+    int extra_idx = 0;
 
-  buf.index = nPortIndex;
-  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-  buf.memory = V4L2_MEMORY_USERPTR;
-  plane[0].bytesused = buffer->nFilledLen;
-  plane[0].length = drv_ctx.op_buf.buffer_size;
-  plane[0].m.userptr =
-      (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
-      (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
-  plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
-  plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
-  plane[0].data_offset = 0;
-  extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-  if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-    plane[extra_idx].bytesused = 0;
-    plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
-    plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
+    buf.index = nPortIndex;
+    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    buf.memory = V4L2_MEMORY_USERPTR;
+    plane[0].bytesused = buffer->nFilledLen;
+    plane[0].length = drv_ctx.op_buf.buffer_size;
+    plane[0].m.userptr =
+        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
+        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
+    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+    plane[0].data_offset = 0;
+    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+        plane[extra_idx].bytesused = 0;
+        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
 #ifdef USE_ION
-    plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
+        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
 #endif
-    plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
-    plane[extra_idx].data_offset = 0;
-  } else if (extra_idx >= VIDEO_MAX_PLANES) {
-    DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
-    return OMX_ErrorBadParameter;
-  }
-  buf.m.planes = plane;
-  buf.length = drv_ctx.num_planes;
-  rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
-  if (rc) {
-    /*TODO: How to handle this case */
-    DEBUG_PRINT_ERROR("Failed to qbuf to driver");
-  }
-//#ifdef _ANDROID_ICS_
-  //  if (m_enable_android_native_buffers)
-  //  {
-        // Unlock the buffer
-   //     if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
+        plane[extra_idx].data_offset = 0;
+    } else if (extra_idx >= VIDEO_MAX_PLANES) {
+        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
+        return OMX_ErrorBadParameter;
+    }
+    buf.m.planes = plane;
+    buf.length = drv_ctx.num_planes;
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+    if (rc) {
+        /*TODO: How to handle this case */
+        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
+    }
+    //#ifdef _ANDROID_ICS_
+    //  if (m_enable_android_native_buffers)
+    //  {
+    // Unlock the buffer
+    //     if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
     //        DEBUG_PRINT_ERROR("Releasing genlock failed");
     //        return OMX_ErrorInsufficientResources;
     ///    } else {
-     //       native_buffer[buffer - m_out_mem_ptr].inuse = false;
-      //  }
-   // }
-//#endif
+    //       native_buffer[buffer - m_out_mem_ptr].inuse = false;
+    //  }
+    // }
+    //#endif
     //m_cb.FillBufferDone (hComp,m_app_data,buffer);
-   // pending_output_buffers--;
-   // return OMX_ErrorBadParameter;
-  //}
-  return OMX_ErrorNone;
+    // pending_output_buffers--;
+    // return OMX_ErrorBadParameter;
+    //}
+return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SetCallbacks
+   FUNCTION
+   omx_vdec::SetCallbacks
 
-DESCRIPTION
-  Set the callbacks.
+   DESCRIPTION
+   Set the callbacks.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
-                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
-                                           OMX_IN OMX_PTR             appData)
+        OMX_IN OMX_CALLBACKTYPE* callbacks,
+        OMX_IN OMX_PTR             appData)
 {
 
-  m_cb       = *callbacks;
-  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
-               m_cb.EventHandler,m_cb.FillBufferDone);
-  m_app_data =    appData;
-  return OMX_ErrorNotImplemented;
+    m_cb       = *callbacks;
+    DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
+            m_cb.EventHandler,m_cb.FillBufferDone);
+    m_app_data =    appData;
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentDeInit
+   FUNCTION
+   omx_vdec::ComponentDeInit
 
-DESCRIPTION
-  Destroys the component and release memory allocated to the heap.
+   DESCRIPTION
+   Destroys the component and release memory allocated to the heap.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
 {
 #ifdef _ANDROID_
-    if(iDivXDrmDecrypt)
-    {
+    if (iDivXDrmDecrypt) {
         delete iDivXDrmDecrypt;
         iDivXDrmDecrypt=NULL;
     }
 #endif //_ANDROID_
 
     unsigned i = 0;
-    if (OMX_StateLoaded != m_state)
-    {
+    if (OMX_StateLoaded != m_state) {
         DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
-                          m_state);
+                m_state);
         DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
-    }
-    else
-    {
-      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
+    } else {
+        DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
     }
 
     /*Check if the output buffers have to be cleaned up*/
-    if(m_out_mem_ptr)
-    {
+    if (m_out_mem_ptr) {
         DEBUG_PRINT_LOW("Freeing the Output Memory\n");
-        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ )
-        {
-          free_output_buffer (&m_out_mem_ptr[i]);
+        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
+            free_output_buffer (&m_out_mem_ptr[i]);
 #ifdef _ANDROID_ICS_
-        if (m_enable_android_native_buffers)
-        {
-          if (native_buffer[i].inuse)
-          {
-            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
-                DEBUG_PRINT_ERROR("Unlocking genlock failed");
+            if (m_enable_android_native_buffers) {
+                if (native_buffer[i].inuse) {
+                    if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
+                        DEBUG_PRINT_ERROR("Unlocking genlock failed");
+                    }
+                    native_buffer[i].inuse = false;
+                }
             }
-            native_buffer[i].inuse = false;
-          }
-        }
 #endif
         }
 #ifdef _ANDROID_ICS_
@@ -6114,38 +5469,32 @@
     }
 
     /*Check if the input buffers have to be cleaned up*/
-    if(m_inp_mem_ptr || m_inp_heap_ptr)
-    {
+    if (m_inp_mem_ptr || m_inp_heap_ptr) {
         DEBUG_PRINT_LOW("Freeing the Input Memory\n");
-        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ )
-        {
-          if (m_inp_mem_ptr)
-            free_input_buffer (i,&m_inp_mem_ptr[i]);
-          else
-            free_input_buffer (i,NULL);
+        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
+            if (m_inp_mem_ptr)
+                free_input_buffer (i,&m_inp_mem_ptr[i]);
+            else
+                free_input_buffer (i,NULL);
         }
     }
     free_input_buffer_header();
     free_output_buffer_header();
-    if(h264_scratch.pBuffer)
-    {
+    if (h264_scratch.pBuffer) {
         free(h264_scratch.pBuffer);
         h264_scratch.pBuffer = NULL;
     }
 
-    if (h264_parser)
-    {
+    if (h264_parser) {
         delete h264_parser;
-	h264_parser = NULL;
+        h264_parser = NULL;
     }
 
-    if(m_platform_list)
-    {
+    if (m_platform_list) {
         free(m_platform_list);
         m_platform_list = NULL;
     }
-    if(m_vendor_config.pData)
-    {
+    if (m_vendor_config.pData) {
         free(m_vendor_config.pData);
         m_vendor_config.pData = NULL;
     }
@@ -6158,15 +5507,14 @@
     m_cmd_q.m_read = m_cmd_q.m_write =0;
     m_etb_q.m_read = m_etb_q.m_write =0;
 #ifdef _ANDROID_
-    if (m_debug_timestamp)
-    {
-      m_timestamp_list.reset_ts_list();
+    if (m_debug_timestamp) {
+        m_timestamp_list.reset_ts_list();
     }
 #endif
 
     DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
     //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
-       // NULL);
+    // NULL);
     DEBUG_PRINT_HIGH("\n Close the driver instance");
 
 #ifdef INPUT_BUFFER_LOG
@@ -6174,59 +5522,59 @@
 #endif
 #ifdef OUTPUT_BUFFER_LOG
     if (outputBufferFile1)
-		fclose (outputBufferFile1);
+        fclose (outputBufferFile1);
 #endif
 #ifdef OUTPUT_EXTRADATA_LOG
     fclose (outputExtradataFile);
 #endif
-  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
-  return OMX_ErrorNone;
+    DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseEGLImage
+   FUNCTION
+   omx_vdec::UseEGLImage
 
-DESCRIPTION
-  OMX Use EGL Image method implementation <TBD>.
+   DESCRIPTION
+   OMX Use EGL Image method implementation <TBD>.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Not Implemented error.
+   RETURN VALUE
+   Not Implemented error.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
-                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                          OMX_IN OMX_U32                        port,
-                                          OMX_IN OMX_PTR                     appData,
-                                          OMX_IN void*                      eglImage)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN void*                      eglImage)
 {
-  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
-  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
+    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
+    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
 
 #ifdef USE_EGL_IMAGE_GPU
-   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
-   EGLint fd = -1, offset = 0,pmemPtr = 0;
+    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
+    EGLint fd = -1, offset = 0,pmemPtr = 0;
 #else
-   int fd = -1, offset = 0;
+    int fd = -1, offset = 0;
 #endif
-   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
-   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
-     DEBUG_PRINT_ERROR("\n ");
-   }
+    DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
+    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\n ");
+    }
 #ifdef USE_EGL_IMAGE_GPU
-   if(m_display_id == NULL) {
+    if (m_display_id == NULL) {
         DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
         return OMX_ErrorInsufficientResources;
-   }
-   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
-                    eglGetProcAddress("eglQueryImageKHR");
-   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
-   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
-   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
+    }
+    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
+        eglGetProcAddress("eglQueryImageKHR");
+    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
+    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
+    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
 #else //with OMX test app
     struct temp_egl {
         int pmem_fd;
@@ -6235,8 +5583,7 @@
     struct temp_egl *temp_egl_id = NULL;
     void * pmemPtr = (void *) eglImage;
     temp_egl_id = (struct temp_egl *)eglImage;
-    if (temp_egl_id != NULL)
-    {
+    if (temp_egl_id != NULL) {
         fd = temp_egl_id->pmem_fd;
         offset = temp_egl_id->offset;
     }
@@ -6244,617 +5591,520 @@
     if (fd < 0) {
         DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
         return OMX_ErrorInsufficientResources;
-   }
-   pmem_info.pmem_fd = (OMX_U32) fd;
-   pmem_info.offset = (OMX_U32) offset;
-   pmem_entry.entry = (void *) &pmem_info;
-   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-   pmem_list.entryList = &pmem_entry;
-   pmem_list.nEntries = 1;
-   ouput_egl_buffers = true;
-   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
-       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
-        (OMX_U8 *)pmemPtr)) {
-     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
-     return OMX_ErrorInsufficientResources;
-   }
-   return OMX_ErrorNone;
+    }
+    pmem_info.pmem_fd = (OMX_U32) fd;
+    pmem_info.offset = (OMX_U32) offset;
+    pmem_entry.entry = (void *) &pmem_info;
+    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+    pmem_list.entryList = &pmem_entry;
+    pmem_list.nEntries = 1;
+    ouput_egl_buffers = true;
+    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
+                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
+                (OMX_U8 *)pmemPtr)) {
+        DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
+        return OMX_ErrorInsufficientResources;
+    }
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentRoleEnum
+   FUNCTION
+   omx_vdec::ComponentRoleEnum
 
-DESCRIPTION
-  OMX Component Role Enum method implementation.
+   DESCRIPTION
+   OMX Component Role Enum method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   OMX Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
-                                                OMX_OUT OMX_U8*        role,
-                                                OMX_IN OMX_U32        index)
+        OMX_OUT OMX_U8*        role,
+        OMX_IN OMX_U32        index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
     }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
     }
-  }
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
 
-  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
-          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
-          )
-
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+            ) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
     }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
-           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
-           )
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
-    eRet = OMX_ErrorInvalidComponentName;
-  }
-  return eRet;
+    return eRet;
 }
 
 
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateDone
+   FUNCTION
+   omx_vdec::AllocateDone
 
-DESCRIPTION
-  Checks if entire buffer pool is allocated by IL Client or not.
-  Need this to move to IDLE state.
+   DESCRIPTION
+   Checks if entire buffer pool is allocated by IL Client or not.
+   Need this to move to IDLE state.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false.
+   RETURN VALUE
+   true/false.
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::allocate_done(void)
 {
-  bool bRet = false;
-  bool bRet_In = false;
-  bool bRet_Out = false;
+    bool bRet = false;
+    bool bRet_In = false;
+    bool bRet_Out = false;
 
-  bRet_In = allocate_input_done();
-  bRet_Out = allocate_output_done();
+    bRet_In = allocate_input_done();
+    bRet_Out = allocate_output_done();
 
-  if(bRet_In && bRet_Out)
-  {
-      bRet = true;
-  }
-
-  return bRet;
-}
-/* ======================================================================
-FUNCTION
-  omx_vdec::AllocateInputDone
-
-DESCRIPTION
-  Checks if I/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_input_done(void)
-{
-  bool bRet = false;
-  unsigned i=0;
-
-  if (m_inp_mem_ptr == NULL)
-  {
-      return bRet;
-  }
-  if(m_inp_mem_ptr )
-  {
-    for(;i<drv_ctx.ip_buf.actualcount;i++)
-    {
-      if(BITMASK_ABSENT(&m_inp_bm_count,i))
-      {
-        break;
-      }
-    }
-  }
-  if(i == drv_ctx.ip_buf.actualcount)
-  {
-    bRet = true;
-    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
-  }
-  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
-  {
-     m_inp_bPopulated = OMX_TRUE;
-  }
-  return bRet;
-}
-/* ======================================================================
-FUNCTION
-  omx_vdec::AllocateOutputDone
-
-DESCRIPTION
-  Checks if entire O/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_output_done(void)
-{
-  bool bRet = false;
-  unsigned j=0;
-
-  if (m_out_mem_ptr == NULL)
-  {
-      return bRet;
-  }
-
-  if (m_out_mem_ptr)
-  {
-    for(;j < drv_ctx.op_buf.actualcount;j++)
-    {
-      if(BITMASK_ABSENT(&m_out_bm_count,j))
-      {
-        break;
-      }
-    }
-  }
-
-  if(j == drv_ctx.op_buf.actualcount)
-  {
-    bRet = true;
-    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
-    if(m_out_bEnabled)
-       m_out_bPopulated = OMX_TRUE;
-  }
-
-  return bRet;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseDone
-
-DESCRIPTION
-  Checks if IL client has released all the buffers.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false
-
-========================================================================== */
-bool omx_vdec::release_done(void)
-{
-  bool bRet = false;
-
-  if(release_input_done())
-  {
-    if(release_output_done())
-    {
+    if (bRet_In && bRet_Out) {
         bRet = true;
     }
-  }
-  return bRet;
+
+    return bRet;
+}
+/* ======================================================================
+   FUNCTION
+   omx_vdec::AllocateInputDone
+
+   DESCRIPTION
+   Checks if I/P buffer pool is allocated by IL Client or not.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false.
+
+   ========================================================================== */
+bool omx_vdec::allocate_input_done(void)
+{
+    bool bRet = false;
+    unsigned i=0;
+
+    if (m_inp_mem_ptr == NULL) {
+        return bRet;
+    }
+    if (m_inp_mem_ptr ) {
+        for (; i<drv_ctx.ip_buf.actualcount; i++) {
+            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+                break;
+            }
+        }
+    }
+    if (i == drv_ctx.ip_buf.actualcount) {
+        bRet = true;
+        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
+    }
+    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
+        m_inp_bPopulated = OMX_TRUE;
+    }
+    return bRet;
+}
+/* ======================================================================
+   FUNCTION
+   omx_vdec::AllocateOutputDone
+
+   DESCRIPTION
+   Checks if entire O/P buffer pool is allocated by IL Client or not.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false.
+
+   ========================================================================== */
+bool omx_vdec::allocate_output_done(void)
+{
+    bool bRet = false;
+    unsigned j=0;
+
+    if (m_out_mem_ptr == NULL) {
+        return bRet;
+    }
+
+    if (m_out_mem_ptr) {
+        for (; j < drv_ctx.op_buf.actualcount; j++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
+                break;
+            }
+        }
+    }
+
+    if (j == drv_ctx.op_buf.actualcount) {
+        bRet = true;
+        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
+        if (m_out_bEnabled)
+            m_out_bPopulated = OMX_TRUE;
+    }
+
+    return bRet;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::ReleaseDone
+
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false
+
+   ========================================================================== */
+bool omx_vdec::release_done(void)
+{
+    bool bRet = false;
+
+    if (release_input_done()) {
+        if (release_output_done()) {
+            bRet = true;
+        }
+    }
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseOutputDone
+   FUNCTION
+   omx_vdec::ReleaseOutputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::release_output_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
-  if(m_out_mem_ptr)
-  {
-      for(;j < drv_ctx.op_buf.actualcount ; j++)
-      {
-        if(BITMASK_PRESENT(&m_out_bm_count,j))
-        {
-          break;
+    DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
+    if (m_out_mem_ptr) {
+        for (; j < drv_ctx.op_buf.actualcount ; j++) {
+            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
+                break;
+            }
         }
-      }
-    if(j == drv_ctx.op_buf.actualcount)
-    {
-      m_out_bm_count = 0;
-      bRet = true;
+        if (j == drv_ctx.op_buf.actualcount) {
+            m_out_bm_count = 0;
+            bRet = true;
+        }
+    } else {
+        m_out_bm_count = 0;
+        bRet = true;
     }
-  }
-  else
-  {
-    m_out_bm_count = 0;
-    bRet = true;
-  }
-  return bRet;
+    return bRet;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseInputDone
+   FUNCTION
+   omx_vdec::ReleaseInputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::release_input_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
-  if(m_inp_mem_ptr)
-  {
-      for(;j<drv_ctx.ip_buf.actualcount;j++)
-      {
-        if( BITMASK_PRESENT(&m_inp_bm_count,j))
-        {
-          break;
+    DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
+    if (m_inp_mem_ptr) {
+        for (; j<drv_ctx.ip_buf.actualcount; j++) {
+            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
+                break;
+            }
         }
-      }
-    if(j==drv_ctx.ip_buf.actualcount)
-    {
-      bRet = true;
+        if (j==drv_ctx.ip_buf.actualcount) {
+            bRet = true;
+        }
+    } else {
+        bRet = true;
     }
-  }
-  else
-  {
-    bRet = true;
-  }
-  return bRet;
+    return bRet;
 }
 
 OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
-                               OMX_BUFFERHEADERTYPE * buffer)
+        OMX_BUFFERHEADERTYPE * buffer)
 {
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
-  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
-    return OMX_ErrorBadParameter;
-  }
-  else if (output_flush_progress)
-  {
-    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
-    buffer->nFilledLen = 0;
-    buffer->nTimeStamp = 0;
-    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
-  }
-
-  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
-      buffer, buffer->pBuffer);
-  pending_output_buffers --;
-
-  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-  {
-    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
-    if (!output_flush_progress)
-      post_event((unsigned)NULL, (unsigned)NULL,
-              OMX_COMPONENT_GENERATE_EOS_DONE);
-
-    if (psource_frame)
-    {
-      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
-      psource_frame = NULL;
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
+        return OMX_ErrorBadParameter;
+    } else if (output_flush_progress) {
+        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
+        buffer->nFilledLen = 0;
+        buffer->nTimeStamp = 0;
+        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
     }
-    if (pdest_frame)
-    {
-      pdest_frame->nFilledLen = 0;
-      m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
-              (unsigned)NULL);
-      pdest_frame = NULL;
-    }
-  }
 
-  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
+    DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
+            buffer, buffer->pBuffer);
+    pending_output_buffers --;
+
+    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+        DEBUG_PRINT_HIGH("\n Output EOS has been reached");
+        if (!output_flush_progress)
+            post_event((unsigned)NULL, (unsigned)NULL,
+                    OMX_COMPONENT_GENERATE_EOS_DONE);
+
+        if (psource_frame) {
+            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
+            psource_frame = NULL;
+        }
+        if (pdest_frame) {
+            pdest_frame->nFilledLen = 0;
+            m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
+                    (unsigned)NULL);
+            pdest_frame = NULL;
+        }
+    }
+
+    DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
 #ifdef OUTPUT_BUFFER_LOG
-  if (outputBufferFile1 && buffer->nFilledLen)
-  {
-	  int buf_index = buffer - m_out_mem_ptr;
-      int stride = drv_ctx.video_resolution.stride;
-      int scanlines = drv_ctx.video_resolution.scan_lines;
-      char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
-	  int i;
-	  int bytes_written = 0;
-	  for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
-		  bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
-		  temp += stride;
-	  }
-	  temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
-      int stride_c = stride;
-	  for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
-		  bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
-		  temp += stride_c;
-	  }
-  }
+    if (outputBufferFile1 && buffer->nFilledLen) {
+        int buf_index = buffer - m_out_mem_ptr;
+        int stride = drv_ctx.video_resolution.stride;
+        int scanlines = drv_ctx.video_resolution.scan_lines;
+        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
+        int i;
+        int bytes_written = 0;
+        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
+            bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
+            temp += stride;
+        }
+        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
+        int stride_c = stride;
+        for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
+            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
+            temp += stride_c;
+        }
+    }
 #endif
 
-  /* For use buffer we need to copy the data */
-  if (!output_flush_progress)
-  {
-    time_stamp_dts.get_next_timestamp(buffer,
-    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-     ?true:false);
-    if (m_debug_timestamp)
-    {
-      {
-        OMX_TICKS expected_ts = 0;
-        m_timestamp_list.pop_min_ts(expected_ts);
-        DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
-                       buffer->nTimeStamp, expected_ts);
+    /* For use buffer we need to copy the data */
+    if (!output_flush_progress) {
+        time_stamp_dts.get_next_timestamp(buffer,
+                (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                ?true:false);
+        if (m_debug_timestamp) {
+            {
+                OMX_TICKS expected_ts = 0;
+                m_timestamp_list.pop_min_ts(expected_ts);
+                DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
+                        buffer->nTimeStamp, expected_ts);
 
-        if (buffer->nTimeStamp != expected_ts)
-        {
-          DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+                if (buffer->nTimeStamp != expected_ts) {
+                    DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+                }
+            }
         }
-      }
     }
-  }
-  if (m_cb.FillBufferDone)
-  {
-    if (buffer->nFilledLen > 0)
-    {
-      handle_extradata(buffer);
-      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-        // Keep min timestamp interval to handle corrupted bit stream scenario
-        set_frame_rate(buffer->nTimeStamp);
-      else if (arbitrary_bytes)
-        adjust_timestamp(buffer->nTimeStamp);
-      if (perf_flag)
-      {
-        if (!proc_frms)
-        {
-          dec_time.stop();
-          latency = dec_time.processing_time_us() - latency;
-          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
-          dec_time.start();
-          fps_metrics.start();
-        }
-        proc_frms++;
-        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-        {
-          OMX_U64 proc_time = 0;
-          fps_metrics.stop();
-          proc_time = fps_metrics.processing_time_us();
-          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
+    if (m_cb.FillBufferDone) {
+        if (buffer->nFilledLen > 0) {
+            handle_extradata(buffer);
+            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+                // Keep min timestamp interval to handle corrupted bit stream scenario
+                set_frame_rate(buffer->nTimeStamp);
+            else if (arbitrary_bytes)
+                adjust_timestamp(buffer->nTimeStamp);
+            if (perf_flag) {
+                if (!proc_frms) {
+                    dec_time.stop();
+                    latency = dec_time.processing_time_us() - latency;
+                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
+                    dec_time.start();
+                    fps_metrics.start();
+                }
+                proc_frms++;
+                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+                    OMX_U64 proc_time = 0;
+                    fps_metrics.stop();
+                    proc_time = fps_metrics.processing_time_us();
+                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
                             proc_frms, (float)proc_time / 1e6,
                             (float)(1e6 * proc_frms) / proc_time);
-          proc_frms = 0;
-        }
-      }
+                    proc_frms = 0;
+                }
+            }
 
 #ifdef OUTPUT_EXTRADATA_LOG
-  if (outputExtradataFile)
-  {
+            if (outputExtradataFile) {
 
-    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
-    p_extra = (OMX_OTHER_EXTRADATATYPE *)
-           ((unsigned)(buffer->pBuffer + buffer->nOffset +
-            buffer->nFilledLen + 3)&(~3));
-    while(p_extra &&
-          (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) )
-    {
-      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
-      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
-      if (p_extra->eType == OMX_ExtraDataNone)
-      {
-        break;
-      }
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-    }
-  }
+                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
+                p_extra = (OMX_OTHER_EXTRADATATYPE *)
+                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
+                        buffer->nFilledLen + 3)&(~3));
+                while (p_extra &&
+                        (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
+                    DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
+                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
+                    if (p_extra->eType == OMX_ExtraDataNone) {
+                        break;
+                    }
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                }
+            }
 #endif
-    }
-    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
-      prev_ts = LLONG_MAX;
-      rst_prev_ts = true;
-      }
+        }
+        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+            prev_ts = LLONG_MAX;
+            rst_prev_ts = true;
+        }
 
-    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
-                buffer->pPlatformPrivate)->entryList->entry;
-    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
+        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+             buffer->pPlatformPrivate)->entryList->entry;
+        DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
 #ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
-     if (native_buffer[buffer - m_out_mem_ptr].inuse) {
-      if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
-        DEBUG_PRINT_ERROR("Unlocking genlock failed");
-        return OMX_ErrorInsufficientResources;
-      }
-      else {
-        native_buffer[buffer - m_out_mem_ptr].inuse = false;
-      }
-     }
-    }
+        if (m_enable_android_native_buffers) {
+            if (native_buffer[buffer - m_out_mem_ptr].inuse) {
+                if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+                    DEBUG_PRINT_ERROR("Unlocking genlock failed");
+                    return OMX_ErrorInsufficientResources;
+                } else {
+                    native_buffer[buffer - m_out_mem_ptr].inuse = false;
+                }
+            }
+        }
 #endif
-    OMX_BUFFERHEADERTYPE *il_buffer;
-    il_buffer = client_buffers.get_il_buf_hdr(buffer);
-    if (il_buffer)
-      m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
-    else {
-      DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
-      return OMX_ErrorBadParameter;
+        OMX_BUFFERHEADERTYPE *il_buffer;
+        il_buffer = client_buffers.get_il_buf_hdr(buffer);
+        if (il_buffer)
+            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
+        else {
+            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
+            return OMX_ErrorBadParameter;
+        }
+        DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
+    } else {
+        return OMX_ErrorBadParameter;
     }
-    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
-                                          OMX_BUFFERHEADERTYPE* buffer)
+        OMX_BUFFERHEADERTYPE* buffer)
 {
 
-    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
-    {
+    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
         DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
-       return OMX_ErrorBadParameter;
+        return OMX_ErrorBadParameter;
     }
 
     DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
-        buffer, buffer->pBuffer);
+            buffer, buffer->pBuffer);
     pending_input_buffers--;
 
-    if (arbitrary_bytes)
-    {
-      if (pdest_frame == NULL && input_flush_progress == false)
-      {
-        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
-        pdest_frame = buffer;
-        buffer->nFilledLen = 0;
-        buffer->nTimeStamp = LLONG_MAX;
-        push_input_buffer (hComp);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
-        buffer->nFilledLen = 0;
-        if (!m_input_free_q.insert_entry((unsigned)buffer,
-                   (unsigned)NULL, (unsigned)NULL))
-        {
-          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+    if (arbitrary_bytes) {
+        if (pdest_frame == NULL && input_flush_progress == false) {
+            DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
+            pdest_frame = buffer;
+            buffer->nFilledLen = 0;
+            buffer->nTimeStamp = LLONG_MAX;
+            push_input_buffer (hComp);
+        } else {
+            DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
+            buffer->nFilledLen = 0;
+            if (!m_input_free_q.insert_entry((unsigned)buffer,
+                        (unsigned)NULL, (unsigned)NULL)) {
+                DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+            }
         }
-      }
-    }
-    else if(m_cb.EmptyBufferDone)
-    {
+    } else if (m_cb.EmptyBufferDone) {
         buffer->nFilledLen = 0;
-        if (input_use_buffer == true){
+        if (input_use_buffer == true) {
             buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
         }
         m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
@@ -6864,710 +6114,614 @@
 
 int omx_vdec::async_message_process (void *context, void* message)
 {
-  omx_vdec* omx = NULL;
-  struct vdec_msginfo *vdec_msg = NULL;
-  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
-  struct v4l2_buffer *v4l2_buf_ptr = NULL;
-  struct vdec_output_frameinfo *output_respbuf = NULL;
-	int rc=1;
-  if (context == NULL || message == NULL)
-  {
-    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
-    return -1;
-  }
-  vdec_msg = (struct vdec_msginfo *)message;
-
-  omx = reinterpret_cast<omx_vdec*>(context);
-
-  switch (vdec_msg->msgcode)
-  {
-
-  case VDEC_MSG_EVT_HW_ERROR:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
-  break;
-
-  case VDEC_MSG_RESP_START_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_START_DONE);
-  break;
-
-  case VDEC_MSG_RESP_STOP_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_STOP_DONE);
-  break;
-
-  case VDEC_MSG_RESP_RESUME_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_RESUME_DONE);
-  break;
-
-  case VDEC_MSG_RESP_PAUSE_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
-  break;
-
-  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
-    break;
-  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
-    break;
-  case VDEC_MSG_RESP_INPUT_FLUSHED:
-  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
-
-    /* omxhdr = (OMX_BUFFERHEADERTYPE* )
-              vdec_msg->msgdata.input_frame_clientdata; */
-
-    v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
-    omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
-    if (omxhdr == NULL ||
-       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
-    {
-       omxhdr = NULL;
-       vdec_msg->status_code = VDEC_S_EFATAL;
+    omx_vdec* omx = NULL;
+    struct vdec_msginfo *vdec_msg = NULL;
+    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+    struct v4l2_buffer *v4l2_buf_ptr = NULL;
+    struct vdec_output_frameinfo *output_respbuf = NULL;
+    int rc=1;
+    if (context == NULL || message == NULL) {
+        DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
+        return -1;
     }
+    vdec_msg = (struct vdec_msginfo *)message;
 
-    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
-                     OMX_COMPONENT_GENERATE_EBD);
-    break;
-    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
-      int64_t *timestamp;
-      timestamp = (int64_t *) malloc(sizeof(int64_t));
-      if (timestamp) {
-        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
-        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
-                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
-        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
-             vdec_msg->msgdata.output_frame.time_stamp);
-      }
-      break;
-  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
-    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+    omx = reinterpret_cast<omx_vdec*>(context);
 
-      v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
-      omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
-      DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
-		      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
-		      vdec_msg->msgdata.output_frame.pic_type);
+    switch (vdec_msg->msgcode) {
 
-    if (omxhdr && omxhdr->pOutputPortPrivate &&
-        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
-         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
-            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
-    {
-      if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
-      {
-	omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
-	omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
-        omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
-        omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
+        case VDEC_MSG_EVT_HW_ERROR:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+            break;
 
-	if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)
-	{
-	  omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
-	  //rc = -1;
-	}
-  if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ)
-  {
-    omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-  }
-  vdec_msg->msgdata.output_frame.bufferaddr =
-      omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
-  if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
-                      vdec_msg->msgdata.output_frame.framesize.left)
-        || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
-        || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
-        || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
-    omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
-    omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
-    omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
-    omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
-    DEBUG_PRINT_HIGH("\n Crop information has changed\n");
-    omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
-        OMX_COMPONENT_GENERATE_PORT_RECONFIG);
-  }
-        output_respbuf = (struct vdec_output_frameinfo *)\
-                          omxhdr->pOutputPortPrivate;
-        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
-        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
-        if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME)
-        {
-          output_respbuf->pic_type = PICTURE_TYPE_I;
-        }
-        if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME)
-        {
-          output_respbuf->pic_type = PICTURE_TYPE_P;
-        }
-        if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
-          output_respbuf->pic_type = PICTURE_TYPE_B;
-        }
+        case VDEC_MSG_RESP_START_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_START_DONE);
+            break;
 
-        if (omx->output_use_buffer)
-          memcpy ( omxhdr->pBuffer, (void *)
-                   ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
-                    (unsigned long)vdec_msg->msgdata.output_frame.offset),
-                    vdec_msg->msgdata.output_frame.len);
-      }
-      else
-        omxhdr->nFilledLen = 0;
-      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_FBD);
+        case VDEC_MSG_RESP_STOP_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_STOP_DONE);
+            break;
+
+        case VDEC_MSG_RESP_RESUME_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_RESUME_DONE);
+            break;
+
+        case VDEC_MSG_RESP_PAUSE_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
+            break;
+
+        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
+            break;
+        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
+            break;
+        case VDEC_MSG_RESP_INPUT_FLUSHED:
+        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
+
+            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
+               vdec_msg->msgdata.input_frame_clientdata; */
+
+            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
+            omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
+            if (omxhdr == NULL ||
+                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
+                omxhdr = NULL;
+                vdec_msg->status_code = VDEC_S_EFATAL;
+            }
+
+            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+                    OMX_COMPONENT_GENERATE_EBD);
+            break;
+        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
+            int64_t *timestamp;
+            timestamp = (int64_t *) malloc(sizeof(int64_t));
+            if (timestamp) {
+                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
+                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
+                DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
+                        vdec_msg->msgdata.output_frame.time_stamp);
+            }
+            break;
+        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
+        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+
+            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
+            omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
+            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
+                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
+                    vdec_msg->msgdata.output_frame.pic_type);
+
+            if (omxhdr && omxhdr->pOutputPortPrivate &&
+                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
+                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
+                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
+                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
+                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
+                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
+                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
+                    omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
+
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS) {
+                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
+                        //rc = -1;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
+                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+                    }
+                    vdec_msg->msgdata.output_frame.bufferaddr =
+                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
+                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
+                                    vdec_msg->msgdata.output_frame.framesize.left)
+                                || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
+                                || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
+                                || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
+                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
+                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
+                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
+                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
+                        DEBUG_PRINT_HIGH("\n Crop information has changed\n");
+                        omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
+                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+                    }
+                    output_respbuf = (struct vdec_output_frameinfo *)\
+                                     omxhdr->pOutputPortPrivate;
+                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
+                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
+                        output_respbuf->pic_type = PICTURE_TYPE_I;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
+                        output_respbuf->pic_type = PICTURE_TYPE_P;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
+                        output_respbuf->pic_type = PICTURE_TYPE_B;
+                    }
+
+                    if (omx->output_use_buffer)
+                        memcpy ( omxhdr->pBuffer, (void *)
+                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
+                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
+                                vdec_msg->msgdata.output_frame.len);
+                } else
+                    omxhdr->nFilledLen = 0;
+                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_FBD);
+            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
+                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_EOS_DONE);
+            else
+                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+            break;
+        case VDEC_MSG_EVT_CONFIG_CHANGED:
+            DEBUG_PRINT_HIGH("\n Port settings changed");
+            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
+                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+            break;
+        case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
+            {
+                DEBUG_PRINT_HIGH("\n Port settings changed info");
+                // get_buffer_req and populate port defn structure
+                OMX_ERRORTYPE eRet = OMX_ErrorNone;
+                struct v4l2_format fmt;
+                int ret;
+                fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+                omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
+                omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
+                omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
+                omx->m_port_def.nPortIndex = 1;
+                eRet = omx->update_portdef(&(omx->m_port_def));
+                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
+                break;
+            }
+        default:
+            break;
     }
-    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
-      omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_EOS_DONE);
-    else
-      omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
-    break;
-  case VDEC_MSG_EVT_CONFIG_CHANGED:
-    DEBUG_PRINT_HIGH("\n Port settings changed");
-    omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
-        OMX_COMPONENT_GENERATE_PORT_RECONFIG);
-    break;
-  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
-  {
-    DEBUG_PRINT_HIGH("\n Port settings changed info");
-    // get_buffer_req and populate port defn structure
-    OMX_ERRORTYPE eRet = OMX_ErrorNone;
-    struct v4l2_format fmt;
-    int ret;
-    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
-    omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
-    omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
-    omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
-    omx->m_port_def.nPortIndex = 1;
-    eRet = omx->update_portdef(&(omx->m_port_def));
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
-    break;
-  }
-  default:
-    break;
-  }
-  return rc;
+    return rc;
 }
 
 OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
-                                                   OMX_HANDLETYPE hComp,
-                                                   OMX_BUFFERHEADERTYPE *buffer
-                                                           )
+        OMX_HANDLETYPE hComp,
+        OMX_BUFFERHEADERTYPE *buffer
+        )
 {
-  unsigned address,p2,id;
-  DEBUG_PRINT_LOW("\n Empty this arbitrary");
+    unsigned address,p2,id;
+    DEBUG_PRINT_LOW("\n Empty this arbitrary");
 
-  if (buffer == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
-        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
-
-  /* return zero length and not an EOS buffer */
-  /* return buffer if input flush in progress */
-  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
-     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
-  {
-    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
-    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
-    return OMX_ErrorNone;
-  }
-
-  if (psource_frame == NULL)
-  {
-    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
-    psource_frame = buffer;
-    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
-    push_input_buffer (hComp);
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
-    if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
-                (unsigned)NULL))
-    {
-      return OMX_ErrorBadParameter;
+    if (buffer == NULL) {
+        return OMX_ErrorBadParameter;
     }
-  }
+    DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
+            buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
+
+    /* return zero length and not an EOS buffer */
+    /* return buffer if input flush in progress */
+    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
+                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
+        DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
+        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
+
+    if (psource_frame == NULL) {
+        DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
+        psource_frame = buffer;
+        DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
+        push_input_buffer (hComp);
+    } else {
+        DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
+        if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
+                    (unsigned)NULL)) {
+            return OMX_ErrorBadParameter;
+        }
+    }
 
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
 {
-  unsigned address,p2,id;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
+    unsigned address,p2,id;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
 
-  if (pdest_frame == NULL || psource_frame == NULL)
-  {
-    /*Check if we have a destination buffer*/
-    if (pdest_frame == NULL)
-    {
-      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
-      if (m_input_free_q.m_size)
-      {
-        m_input_free_q.pop_entry(&address,&p2,&id);
-        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
-        pdest_frame->nFilledLen = 0;
-        pdest_frame->nTimeStamp = LLONG_MAX;
-        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
-      }
+    if (pdest_frame == NULL || psource_frame == NULL) {
+        /*Check if we have a destination buffer*/
+        if (pdest_frame == NULL) {
+            DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
+            if (m_input_free_q.m_size) {
+                m_input_free_q.pop_entry(&address,&p2,&id);
+                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
+                pdest_frame->nFilledLen = 0;
+                pdest_frame->nTimeStamp = LLONG_MAX;
+                DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
+            }
+        }
+
+        /*Check if we have a destination buffer*/
+        if (psource_frame == NULL) {
+            DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
+            if (m_input_pending_q.m_size) {
+                m_input_pending_q.pop_entry(&address,&p2,&id);
+                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
+                DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
+                        psource_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
+                        psource_frame->nFlags,psource_frame->nFilledLen);
+
+            }
+        }
+
     }
 
-    /*Check if we have a destination buffer*/
-    if (psource_frame == NULL)
-    {
-      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
-      if (m_input_pending_q.m_size)
-      {
-        m_input_pending_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
-        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
-                psource_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
-        psource_frame->nFlags,psource_frame->nFilledLen);
-
-      }
+    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
+        switch (codec_type_parse) {
+            case CODEC_TYPE_MPEG4:
+            case CODEC_TYPE_H263:
+            case CODEC_TYPE_MPEG2:
+                ret =  push_input_sc_codec(hComp);
+                break;
+            case CODEC_TYPE_H264:
+                ret = push_input_h264(hComp);
+                break;
+            case CODEC_TYPE_HEVC:
+                ret = push_input_hevc(hComp);
+                break;
+            case CODEC_TYPE_VC1:
+                ret = push_input_vc1(hComp);
+                break;
+            default:
+                break;
+        }
+        if (ret != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
+            omx_report_error ();
+            break;
+        }
     }
 
-  }
-
-  while ((pdest_frame != NULL) && (psource_frame != NULL))
-  {
-    switch (codec_type_parse)
-    {
-      case CODEC_TYPE_MPEG4:
-      case CODEC_TYPE_H263:
-      case CODEC_TYPE_MPEG2:
-        ret =  push_input_sc_codec(hComp);
-      break;
-      case CODEC_TYPE_H264:
-        ret = push_input_h264(hComp);
-      break;
-      case CODEC_TYPE_HEVC:
-        ret = push_input_hevc(hComp);
-      break;
-      case CODEC_TYPE_VC1:
-        ret = push_input_vc1(hComp);
-      break;
-      default:
-      break;
-    }
-    if (ret != OMX_ErrorNone)
-    {
-      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
-      omx_report_error ();
-      break;
-    }
-  }
-
-  return ret;
+    return ret;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  OMX_BOOL generate_ebd = OMX_TRUE;
-  unsigned address,p2,id;
+    OMX_U32 partial_frame = 1;
+    OMX_BOOL generate_ebd = OMX_TRUE;
+    unsigned address,p2,id;
 
-  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
-        psource_frame,psource_frame->nTimeStamp);
-  if (m_frame_parser.parse_sc_frame(psource_frame,
-                                       pdest_frame,&partial_frame) == -1)
-  {
-    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-    return OMX_ErrorBadParameter;
-  }
-
-  if (partial_frame == 0)
-  {
-    DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
-          pdest_frame->nFilledLen,psource_frame,frame_count);
-
-
-    DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
-    /*First Parsed buffer will have only header Hence skip*/
-    if (frame_count == 0)
-    {
-      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
-
-      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
-         codec_type_parse == CODEC_TYPE_DIVX) {
-        mp4StreamType psBits;
-        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
-        psBits.numBytes = pdest_frame->nFilledLen;
-        mp4_headerparser.parseHeader(&psBits);
-      }
-
-      frame_count++;
+    DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
+            psource_frame,psource_frame->nTimeStamp);
+    if (m_frame_parser.parse_sc_frame(psource_frame,
+                pdest_frame,&partial_frame) == -1) {
+        DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
+        return OMX_ErrorBadParameter;
     }
-    else
-    {
-      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-      if(pdest_frame->nFilledLen)
-      {
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+
+    if (partial_frame == 0) {
+        DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
+                pdest_frame->nFilledLen,psource_frame,frame_count);
+
+
+        DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
+        /*First Parsed buffer will have only header Hence skip*/
+        if (frame_count == 0) {
+            DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
+
+            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
+                    codec_type_parse == CODEC_TYPE_DIVX) {
+                mp4StreamType psBits;
+                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
+                psBits.numBytes = pdest_frame->nFilledLen;
+                mp4_headerparser.parseHeader(&psBits);
+            }
+
+            frame_count++;
+        } else {
+            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+            if (pdest_frame->nFilledLen) {
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+
+                if (m_input_free_q.m_size) {
+                    m_input_free_q.pop_entry(&address,&p2,&id);
+                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                    pdest_frame->nFilledLen = 0;
+                }
+            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
+                DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
+                m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
+                        (unsigned)NULL);
+                pdest_frame = NULL;
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-
-        if (m_input_free_q.m_size)
-        {
-          m_input_free_q.pop_entry(&address,&p2,&id);
-          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-          pdest_frame->nFilledLen = 0;
+    } else {
+        DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
+        /*Check if Destination Buffer is full*/
+        if (pdest_frame->nAllocLen ==
+                pdest_frame->nFilledLen + pdest_frame->nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
         }
-      }
-      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
-      {
-        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
-        m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
-                (unsigned)NULL);
-        pdest_frame = NULL;
-      }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
-    /*Check if Destination Buffer is full*/
-    if (pdest_frame->nAllocLen ==
-        pdest_frame->nFilledLen + pdest_frame->nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
 
-  if (psource_frame->nFilledLen == 0)
-  {
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        pdest_frame->nFlags |= psource_frame->nFlags;
-        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
-                     pdest_frame->nFilledLen,frame_count++);
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+    if (psource_frame->nFilledLen == 0) {
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                pdest_frame->nFlags |= psource_frame->nFlags;
+                DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
+                        pdest_frame->nFilledLen,frame_count++);
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
+                generate_ebd = OMX_FALSE;
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
-        generate_ebd = OMX_FALSE;
-      }
-   }
-    if(generate_ebd)
-    {
-      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
-      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-      psource_frame = NULL;
+        if (generate_ebd) {
+            DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
+            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+            psource_frame = NULL;
 
-      if (m_input_pending_q.m_size)
-      {
-        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
-        m_input_pending_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
-                psource_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
-        psource_frame->nFlags,psource_frame->nFilledLen);
-      }
+            if (m_input_pending_q.m_size) {
+                DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
+                m_input_pending_q.pop_entry(&address,&p2,&id);
+                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+                DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
+                        psource_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
+                        psource_frame->nFlags,psource_frame->nFilledLen);
+            }
+        }
     }
-   }
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  unsigned address,p2,id;
-  OMX_BOOL isNewFrame = OMX_FALSE;
-  OMX_BOOL generate_ebd = OMX_TRUE;
+    OMX_U32 partial_frame = 1;
+    unsigned address,p2,id;
+    OMX_BOOL isNewFrame = OMX_FALSE;
+    OMX_BOOL generate_ebd = OMX_TRUE;
 
-  if (h264_scratch.pBuffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
-      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
-  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
-  if (h264_scratch.nFilledLen && look_ahead_nal)
-  {
-    look_ahead_nal = false;
-    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-         h264_scratch.nFilledLen)
-    {
-      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-              h264_scratch.pBuffer,h264_scratch.nFilledLen);
-      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
-      h264_scratch.nFilledLen = 0;
+    if (h264_scratch.pBuffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
+        return OMX_ErrorBadParameter;
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  if (nal_length == 0)
-  {
-    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
-    if (m_frame_parser.parse_sc_frame(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
-    if (m_frame_parser.parse_h264_nallength(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
-
-  if (partial_frame == 0)
-  {
-    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
-    {
-      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
-      nal_count++;
-      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
-      h264_scratch.nFlags = psource_frame->nFlags;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
-      if(h264_scratch.nFilledLen)
-      {
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
-                                 NALU_TYPE_SPS);
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
-                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
-        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-          // If timeinfo is present frame info from SEI is already processed
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
-                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
-#endif
-        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
-        nal_count++;
-        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
-          pdest_frame->nTimeStamp = h264_last_au_ts;
-          pdest_frame->nFlags = h264_last_au_flags;
-#ifdef PANSCAN_HDLR
-          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-            h264_parser->update_panscan_data(h264_last_au_ts);
-#endif
-        }
-        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
-           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
-          h264_last_au_ts = h264_scratch.nTimeStamp;
-          h264_last_au_flags = h264_scratch.nFlags;
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-          {
-            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
-            if (!VALID_TS(h264_last_au_ts))
-              h264_last_au_ts = ts_in_sei;
-          }
-#endif
-        } else
-          h264_last_au_ts = LLONG_MAX;
-      }
-
-      if (!isNewFrame)
-      {
-        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-            h264_scratch.nFilledLen)
-        {
-          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
-              h264_scratch.nFilledLen);
-          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-              h264_scratch.pBuffer,h264_scratch.nFilledLen);
-          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
-            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-          h264_scratch.nFilledLen = 0;
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
-          return OMX_ErrorBadParameter;
-        }
-      }
-      else
-      {
-        look_ahead_nal = true;
-        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
-                     pdest_frame->nFilledLen,frame_count++);
-
-        if (pdest_frame->nFilledLen == 0)
-        {
-          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
-          look_ahead_nal = false;
-          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-               h264_scratch.nFilledLen)
-          {
+    DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
+            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
+    DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
+    if (h264_scratch.nFilledLen && look_ahead_nal) {
+        look_ahead_nal = false;
+        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                h264_scratch.nFilledLen) {
             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+            DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
             h264_scratch.nFilledLen = 0;
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+        } else {
+            DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
             return OMX_ErrorBadParameter;
-          }
         }
-        else
-        {
-          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
-          {
-            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
-            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-          }
-          /*Push the frame to the Decoder*/
-          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-          {
+    }
+    if (nal_length == 0) {
+        DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
+        if (m_frame_parser.parse_sc_frame(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
             return OMX_ErrorBadParameter;
-          }
-          //frame_count++;
-          pdest_frame = NULL;
-          if (m_input_free_q.m_size)
-          {
-            m_input_free_q.pop_entry(&address,&p2,&id);
-            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
-            pdest_frame->nFilledLen = 0;
-            pdest_frame->nFlags = 0;
-            pdest_frame->nTimeStamp = LLONG_MAX;
-          }
         }
-      }
+    } else {
+        DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
+        if (m_frame_parser.parse_h264_nallength(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
+            return OMX_ErrorBadParameter;
+        }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
-    /*Check if Destination Buffer is full*/
-    if (h264_scratch.nAllocLen ==
-        h264_scratch.nFilledLen + h264_scratch.nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
 
-  if (!psource_frame->nFilledLen)
-  {
-    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
-
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
-        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-             h264_scratch.nFilledLen)
-        {
-          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
-          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-          h264_scratch.nFilledLen = 0;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
-          return OMX_ErrorBadParameter;
-        }
-        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
-        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
-
-        DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
+    if (partial_frame == 0) {
+        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
+            DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
+            nal_count++;
+            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
+            h264_scratch.nFlags = psource_frame->nFlags;
+        } else {
+            DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
+            if (h264_scratch.nFilledLen) {
+                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
+                        NALU_TYPE_SPS);
 #ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-        {
-          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
-          if (!VALID_TS(pdest_frame->nTimeStamp))
-            pdest_frame->nTimeStamp = ts_in_sei;
-        }
+                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
+                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                    // If timeinfo is present frame info from SEI is already processed
+                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
 #endif
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
+                nal_count++;
+                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
+                    pdest_frame->nTimeStamp = h264_last_au_ts;
+                    pdest_frame->nFlags = h264_last_au_flags;
+#ifdef PANSCAN_HDLR
+                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                        h264_parser->update_panscan_data(h264_last_au_ts);
+#endif
+                }
+                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
+                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
+                    h264_last_au_ts = h264_scratch.nTimeStamp;
+                    h264_last_au_flags = h264_scratch.nFlags;
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
+                        if (!VALID_TS(h264_last_au_ts))
+                            h264_last_au_ts = ts_in_sei;
+                    }
+#endif
+                } else
+                    h264_last_au_ts = LLONG_MAX;
+            }
+
+            if (!isNewFrame) {
+                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                        h264_scratch.nFilledLen) {
+                    DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
+                            h264_scratch.nFilledLen);
+                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
+                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+                    h264_scratch.nFilledLen = 0;
+                } else {
+                    DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
+                    return OMX_ErrorBadParameter;
+                }
+            } else {
+                look_ahead_nal = true;
+                DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
+                        pdest_frame->nFilledLen,frame_count++);
+
+                if (pdest_frame->nFilledLen == 0) {
+                    DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
+                    look_ahead_nal = false;
+                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                            h264_scratch.nFilledLen) {
+                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                        h264_scratch.nFilledLen = 0;
+                    } else {
+                        DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+                        return OMX_ErrorBadParameter;
+                    }
+                } else {
+                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
+                        DEBUG_PRINT_LOW("\n Reset the EOS Flag");
+                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+                    }
+                    /*Push the frame to the Decoder*/
+                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                        return OMX_ErrorBadParameter;
+                    }
+                    //frame_count++;
+                    pdest_frame = NULL;
+                    if (m_input_free_q.m_size) {
+                        m_input_free_q.pop_entry(&address,&p2,&id);
+                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                        DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
+                        pdest_frame->nFilledLen = 0;
+                        pdest_frame->nFlags = 0;
+                        pdest_frame->nTimeStamp = LLONG_MAX;
+                    }
+                }
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
-                     pdest_frame,h264_scratch.nFilledLen);
-        generate_ebd = OMX_FALSE;
-      }
+    } else {
+        DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
+        /*Check if Destination Buffer is full*/
+        if (h264_scratch.nAllocLen ==
+                h264_scratch.nFilledLen + h264_scratch.nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
+        }
     }
-  }
-  if(generate_ebd && !psource_frame->nFilledLen)
-  {
-    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-    psource_frame = NULL;
-    if (m_input_pending_q.m_size)
-    {
-      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
-      m_input_pending_q.pop_entry(&address,&p2,&id);
-      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-      DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
-      psource_frame->nFlags,psource_frame->nFilledLen);
+
+    if (!psource_frame->nFilledLen) {
+        DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
+
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
+                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                        h264_scratch.nFilledLen) {
+                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                    h264_scratch.nFilledLen = 0;
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
+                    return OMX_ErrorBadParameter;
+                }
+                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
+                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+
+                DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
+                    if (!VALID_TS(pdest_frame->nTimeStamp))
+                        pdest_frame->nTimeStamp = ts_in_sei;
+                }
+#endif
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
+                        pdest_frame,h264_scratch.nFilledLen);
+                generate_ebd = OMX_FALSE;
+            }
+        }
     }
-  }
-  return OMX_ErrorNone;
+    if (generate_ebd && !psource_frame->nFilledLen) {
+        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+        psource_frame = NULL;
+        if (m_input_pending_q.m_size) {
+            DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
+            m_input_pending_q.pop_entry(&address,&p2,&id);
+            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+            DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
+                    psource_frame->nFlags,psource_frame->nFilledLen);
+        }
+    }
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
 {
     OMX_ERRORTYPE rc = OMX_ErrorNone;
-    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen)
-    {
+    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
         memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
-        if (pDst->nTimeStamp == LLONG_MAX || pDst->nTimeStamp == 0)
-        {
+        if (pDst->nTimeStamp == LLONG_MAX || pDst->nTimeStamp == 0) {
             pDst->nTimeStamp = pSrc->nTimeStamp;
             DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp);
         }
         pDst->nFilledLen += pSrc->nFilledLen;
         pSrc->nFilledLen = 0;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT_ERROR("Error: Destination buffer overflow\n");
         rc = OMX_ErrorBadParameter;
     }
@@ -7576,184 +6730,148 @@
 
 OMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  unsigned address,p2,id;
-  OMX_BOOL isNewFrame = OMX_FALSE;
-  OMX_BOOL generate_ebd = OMX_TRUE;
-  OMX_ERRORTYPE rc = OMX_ErrorNone;
+    OMX_U32 partial_frame = 1;
+    unsigned address,p2,id;
+    OMX_BOOL isNewFrame = OMX_FALSE;
+    OMX_BOOL generate_ebd = OMX_TRUE;
+    OMX_ERRORTYPE rc = OMX_ErrorNone;
 
-  if (h264_scratch.pBuffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Hevc Scratch Buffer not allocated");
-    return OMX_ErrorBadParameter;
-  }
-
-
-  DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld\n",
-  	h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
-
-  if (h264_scratch.nFilledLen && look_ahead_nal)
-  {
-    look_ahead_nal = false;
-
-    // copy the lookahead buffer in the scratch
-    rc = copy_buffer(pdest_frame, &h264_scratch);
-    if (rc != OMX_ErrorNone)
-    {
-      return rc;
+    if (h264_scratch.pBuffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:Hevc Scratch Buffer not allocated");
+        return OMX_ErrorBadParameter;
     }
-  }
-  if (nal_length == 0)
-  {
-    if (m_frame_parser.parse_sc_frame(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d\n",nal_length);
-    if (m_frame_parser.parse_h264_nallength(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
 
-  if (partial_frame == 0)
-  {
-    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
-    {
-      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
-      nal_count++;
-      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
-      h264_scratch.nFlags = psource_frame->nFlags;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
-      if(h264_scratch.nFilledLen)
-      {
-        mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
-        nal_count++;
-      }
 
-      if (!isNewFrame)
-      {
-        DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld\n",
-            h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
+    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld\n",
+            h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
+
+    if (h264_scratch.nFilledLen && look_ahead_nal) {
+        look_ahead_nal = false;
+
+        // copy the lookahead buffer in the scratch
         rc = copy_buffer(pdest_frame, &h264_scratch);
-        if ( rc != OMX_ErrorNone)
-        {
-          return rc;
+        if (rc != OMX_ErrorNone) {
+            return rc;
         }
-      }
-      else
-      {
-        look_ahead_nal = true;
-        if (pdest_frame->nFilledLen == 0)
-        {
-          look_ahead_nal = false;
-          DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer\n");
-          rc = copy_buffer(pdest_frame, &h264_scratch);
-          if ( rc != OMX_ErrorNone )
-          {
+    }
+    if (nal_length == 0) {
+        if (m_frame_parser.parse_sc_frame(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
             return OMX_ErrorBadParameter;
-          }
         }
-        else
-        {
-          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
-          {
-            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-          }
-
-          DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld \n",
-            frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
-          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-          {
+    } else {
+        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d\n",nal_length);
+        if (m_frame_parser.parse_h264_nallength(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
             return OMX_ErrorBadParameter;
-          }
-          pdest_frame = NULL;
-          if (m_input_free_q.m_size)
-          {
-            m_input_free_q.pop_entry(&address,&p2,&id);
-            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-            DEBUG_PRINT_LOW("pop the next pdest_buffer %p\n",pdest_frame);
-            pdest_frame->nFilledLen = 0;
-            pdest_frame->nFlags = 0;
-            pdest_frame->nTimeStamp = LLONG_MAX;
-          }
         }
-      }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld \n",
-		 psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
 
-    /*Check if Destination Buffer is full*/
-    if (h264_scratch.nAllocLen ==
-        h264_scratch.nFilledLen + h264_scratch.nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
+    if (partial_frame == 0) {
+        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
+            DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
+            nal_count++;
+            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
+            h264_scratch.nFlags = psource_frame->nFlags;
+        } else {
+            DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
+            if (h264_scratch.nFilledLen) {
+                mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
+                nal_count++;
+            }
 
-  if (!psource_frame->nFilledLen)
-  {
-    DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client\n",psource_frame);
+            if (!isNewFrame) {
+                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld\n",
+                        h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
+                rc = copy_buffer(pdest_frame, &h264_scratch);
+                if ( rc != OMX_ErrorNone) {
+                    return rc;
+                }
+            } else {
+                look_ahead_nal = true;
+                if (pdest_frame->nFilledLen == 0) {
+                    look_ahead_nal = false;
+                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer\n");
+                    rc = copy_buffer(pdest_frame, &h264_scratch);
+                    if ( rc != OMX_ErrorNone ) {
+                        return OMX_ErrorBadParameter;
+                    }
+                } else {
+                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
+                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+                    }
 
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer\n");
-        rc = copy_buffer(pdest_frame, &h264_scratch);
-        if ( rc != OMX_ErrorNone )
-        {
-          return rc;
+                    DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld \n",
+                            frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
+                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                        return OMX_ErrorBadParameter;
+                    }
+                    pdest_frame = NULL;
+                    if (m_input_free_q.m_size) {
+                        m_input_free_q.pop_entry(&address,&p2,&id);
+                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p\n",pdest_frame);
+                        pdest_frame->nFilledLen = 0;
+                        pdest_frame->nFlags = 0;
+                        pdest_frame->nTimeStamp = LLONG_MAX;
+                    }
+                }
+            }
         }
-        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
-        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+    } else {
+        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld \n",
+                psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
 
-        DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld\n",
-                     frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+        /*Check if Destination Buffer is full*/
+        if (h264_scratch.nAllocLen ==
+                h264_scratch.nFilledLen + h264_scratch.nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
         }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
-                     pdest_frame,h264_scratch.nFilledLen);
-        generate_ebd = OMX_FALSE;
-      }
     }
-  }
-  if(generate_ebd && !psource_frame->nFilledLen)
-  {
-    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-    psource_frame = NULL;
-    if (m_input_pending_q.m_size)
-    {
-      m_input_pending_q.pop_entry(&address,&p2,&id);
-      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-      DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld\n",
-         psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
+
+    if (!psource_frame->nFilledLen) {
+        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client\n",psource_frame);
+
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer\n");
+                rc = copy_buffer(pdest_frame, &h264_scratch);
+                if ( rc != OMX_ErrorNone ) {
+                    return rc;
+                }
+                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
+                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+
+                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld\n",
+                        frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
+                        pdest_frame,h264_scratch.nFilledLen);
+                generate_ebd = OMX_FALSE;
+            }
+        }
     }
-  }
-  return OMX_ErrorNone;
+    if (generate_ebd && !psource_frame->nFilledLen) {
+        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+        psource_frame = NULL;
+        if (m_input_pending_q.m_size) {
+            m_input_pending_q.pop_entry(&address,&p2,&id);
+            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+            DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld\n",
+                    psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
+        }
+    }
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
@@ -7762,61 +6880,47 @@
     OMX_U32 partial_frame = 1;
     OMX_U32 buf_len, dest_len;
 
-    if(first_frame == 0)
-    {
+    if (first_frame == 0) {
         first_frame = 1;
         DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
-        if(!m_vendor_config.pData)
-        {
+        if (!m_vendor_config.pData) {
             DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
             buf = psource_frame->pBuffer;
             buf_len = psource_frame->nFilledLen;
 
             if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
-                VC1_SP_MP_START_CODE)
-            {
+                    VC1_SP_MP_START_CODE) {
                 m_vc1_profile = VC1_SP_MP_RCV;
-            }
-            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
-            {
+            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
                 m_vc1_profile = VC1_AP;
-            }
-            else
-            {
+            } else {
                 DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
                 return OMX_ErrorStreamCorrupt;
             }
-        }
-        else
-        {
+        } else {
             pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
                 pdest_frame->nOffset;
             dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
-                pdest_frame->nOffset);
+                    pdest_frame->nOffset);
 
-            if(dest_len < m_vendor_config.nDataSize)
-            {
+            if (dest_len < m_vendor_config.nDataSize) {
                 DEBUG_PRINT_ERROR("\nDestination buffer full\n");
                 return OMX_ErrorBadParameter;
-            }
-            else
-            {
+            } else {
                 memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
                 pdest_frame->nFilledLen += m_vendor_config.nDataSize;
             }
         }
     }
 
-    switch(m_vc1_profile)
-    {
+    switch (m_vc1_profile) {
         case VC1_AP:
             DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
-            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
-            {
+            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
                 DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
                 return OMX_ErrorBadParameter;
             }
-        break;
+            break;
 
         case VC1_SP_MP_RCV:
         default:
@@ -7827,136 +6931,129 @@
 }
 
 bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                                  OMX_U32 alignment)
+        OMX_U32 alignment)
 {
-  struct pmem_allocation allocation;
-  allocation.size = buffer_size;
-  allocation.align = clip2(alignment);
-  if (allocation.align < 4096)
-  {
-    allocation.align = 4096;
-  }
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
-      allocation.align, allocation.size);
-    return false;
-  }
-  return true;
+    struct pmem_allocation allocation;
+    allocation.size = buffer_size;
+    allocation.align = clip2(alignment);
+    if (allocation.align < 4096) {
+        allocation.align = 4096;
+    }
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+                allocation.align, allocation.size);
+        return false;
+    }
+    return true;
 }
 #ifdef USE_ION
 int omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
-              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
-	      struct ion_fd_data *fd_data, int flag)
+        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
+        struct ion_fd_data *fd_data, int flag)
 {
-  int fd = -EINVAL;
-  int rc = -EINVAL;
-  int ion_dev_flag;
-  struct vdec_ion ion_buf_info;
-  if (!alloc_data || buffer_size <= 0 || !fd_data) {
-     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
-     return -EINVAL;
-  }
-  ion_dev_flag = O_RDONLY;
-  fd = open (MEM_DEVICE, ion_dev_flag);
-  if (fd < 0) {
-    DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
-    return fd;
-  }
-  alloc_data->flags = 0;
-  if(!secure_mode && (flag & ION_FLAG_CACHED))
-  {
-    alloc_data->flags |= ION_FLAG_CACHED;
-  }
-  alloc_data->len = buffer_size;
-  alloc_data->align = clip2(alignment);
-  if (alloc_data->align < 4096)
-  {
-    alloc_data->align = 4096;
-  }
-  if ((secure_mode) && (flag & ION_SECURE))
-      alloc_data->flags |= ION_SECURE;
+    int fd = -EINVAL;
+    int rc = -EINVAL;
+    int ion_dev_flag;
+    struct vdec_ion ion_buf_info;
+    if (!alloc_data || buffer_size <= 0 || !fd_data) {
+        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
+        return -EINVAL;
+    }
+    ion_dev_flag = O_RDONLY;
+    fd = open (MEM_DEVICE, ion_dev_flag);
+    if (fd < 0) {
+        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
+        return fd;
+    }
+    alloc_data->flags = 0;
+    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
+        alloc_data->flags |= ION_FLAG_CACHED;
+    }
+    alloc_data->len = buffer_size;
+    alloc_data->align = clip2(alignment);
+    if (alloc_data->align < 4096) {
+        alloc_data->align = 4096;
+    }
+    if ((secure_mode) && (flag & ION_SECURE))
+        alloc_data->flags |= ION_SECURE;
 
 #ifdef _HEVC_USE_ADSP_HEAP_
-  alloc_data->heap_mask = ION_HEAP(ION_ADSP_HEAP_ID);
+    alloc_data->heap_mask = ION_HEAP(ION_ADSP_HEAP_ID);
 #else
-  alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
+    alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
 #endif
-  if (secure_mode) {
-    alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
-  }
-  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
-  if (rc || !alloc_data->handle) {
-    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
-    alloc_data->handle = NULL;
-    close(fd);
-    fd = -ENOMEM;
-    return fd;
-  }
-  fd_data->handle = alloc_data->handle;
-  rc = ioctl(fd,ION_IOC_MAP,fd_data);
-  if (rc) {
-    DEBUG_PRINT_ERROR("\n ION MAP failed ");
-    ion_buf_info.ion_alloc_data = *alloc_data;
-    ion_buf_info.ion_device_fd = fd;
-    ion_buf_info.fd_ion_data = *fd_data;
-    free_ion_memory(&ion_buf_info);
-    fd_data->fd =-1;
-    close(fd);
-    fd = -ENOMEM;
-  }
+    if (secure_mode) {
+        alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
+    }
+    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
+    if (rc || !alloc_data->handle) {
+        DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+        alloc_data->handle = NULL;
+        close(fd);
+        fd = -ENOMEM;
+        return fd;
+    }
+    fd_data->handle = alloc_data->handle;
+    rc = ioctl(fd,ION_IOC_MAP,fd_data);
+    if (rc) {
+        DEBUG_PRINT_ERROR("\n ION MAP failed ");
+        ion_buf_info.ion_alloc_data = *alloc_data;
+        ion_buf_info.ion_device_fd = fd;
+        ion_buf_info.fd_ion_data = *fd_data;
+        free_ion_memory(&ion_buf_info);
+        fd_data->fd =-1;
+        close(fd);
+        fd = -ENOMEM;
+    }
 
-  return fd;
+    return fd;
 }
 
-void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
+void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
+{
 
-     if(!buf_ion_info) {
-       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
-       return;
-     }
-     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
-             &buf_ion_info->ion_alloc_data.handle)) {
-       DEBUG_PRINT_ERROR("\n ION: free failed" );
-     }
-     close(buf_ion_info->ion_device_fd);
-     buf_ion_info->ion_device_fd = -1;
-     buf_ion_info->ion_alloc_data.handle = NULL;
-     buf_ion_info->fd_ion_data.fd = -1;
+    if (!buf_ion_info) {
+        DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
+        return;
+    }
+    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
+                &buf_ion_info->ion_alloc_data.handle)) {
+        DEBUG_PRINT_ERROR("\n ION: free failed" );
+    }
+    close(buf_ion_info->ion_device_fd);
+    buf_ion_info->ion_device_fd = -1;
+    buf_ion_info->ion_alloc_data.handle = NULL;
+    buf_ion_info->fd_ion_data.fd = -1;
 }
 #endif
 void omx_vdec::free_output_buffer_header()
 {
-  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
-  output_use_buffer = false;
-  ouput_egl_buffers = false;
+    DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
+    output_use_buffer = false;
+    ouput_egl_buffers = false;
 
-  if (m_out_mem_ptr)
-  {
-    free (m_out_mem_ptr);
-    m_out_mem_ptr = NULL;
-  }
+    if (m_out_mem_ptr) {
+        free (m_out_mem_ptr);
+        m_out_mem_ptr = NULL;
+    }
 
-  if(m_platform_list)
-  {
-    free(m_platform_list);
-    m_platform_list = NULL;
-  }
+    if (m_platform_list) {
+        free(m_platform_list);
+        m_platform_list = NULL;
+    }
 
-  if (drv_ctx.ptr_respbuffer)
-  {
-    free (drv_ctx.ptr_respbuffer);
-    drv_ctx.ptr_respbuffer = NULL;
-  }
-  if (drv_ctx.ptr_outputbuffer)
-  {
-    free (drv_ctx.ptr_outputbuffer);
-    drv_ctx.ptr_outputbuffer = NULL;
-  }
+    if (drv_ctx.ptr_respbuffer) {
+        free (drv_ctx.ptr_respbuffer);
+        drv_ctx.ptr_respbuffer = NULL;
+    }
+    if (drv_ctx.ptr_outputbuffer) {
+        free (drv_ctx.ptr_outputbuffer);
+        drv_ctx.ptr_outputbuffer = NULL;
+    }
 #ifdef USE_ION
     if (drv_ctx.op_buf_ion_info) {
         DEBUG_PRINT_LOW("\n Free o/p ion context");
-	free(drv_ctx.op_buf_ion_info);
+        free(drv_ctx.op_buf_ion_info);
         drv_ctx.op_buf_ion_info = NULL;
     }
 #endif
@@ -7965,45 +7062,39 @@
 void omx_vdec::free_input_buffer_header()
 {
     input_use_buffer = false;
-    if (arbitrary_bytes)
-    {
-      if (m_frame_parser.mutils)
-      {
-        DEBUG_PRINT_LOW("\n Free utils parser");
-        delete (m_frame_parser.mutils);
-        m_frame_parser.mutils = NULL;
-      }
+    if (arbitrary_bytes) {
+        if (m_frame_parser.mutils) {
+            DEBUG_PRINT_LOW("\n Free utils parser");
+            delete (m_frame_parser.mutils);
+            m_frame_parser.mutils = NULL;
+        }
 
-      if (m_inp_heap_ptr)
-      {
-        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
-        free (m_inp_heap_ptr);
-        m_inp_heap_ptr = NULL;
-      }
+        if (m_inp_heap_ptr) {
+            DEBUG_PRINT_LOW("\n Free input Heap Pointer");
+            free (m_inp_heap_ptr);
+            m_inp_heap_ptr = NULL;
+        }
 
-      if (m_phdr_pmem_ptr)
-      {
-        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
-        free (m_phdr_pmem_ptr);
-        m_phdr_pmem_ptr = NULL;
-      }
+        if (m_phdr_pmem_ptr) {
+            DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
+            free (m_phdr_pmem_ptr);
+            m_phdr_pmem_ptr = NULL;
+        }
     }
-    if (m_inp_mem_ptr)
-    {
-      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
-      free (m_inp_mem_ptr);
-      m_inp_mem_ptr = NULL;
+    if (m_inp_mem_ptr) {
+        DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
+        free (m_inp_mem_ptr);
+        m_inp_mem_ptr = NULL;
     }
-    if (drv_ctx.ptr_inputbuffer)
-    {
-      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
-      free (drv_ctx.ptr_inputbuffer);
-      drv_ctx.ptr_inputbuffer = NULL;
+    if (drv_ctx.ptr_inputbuffer) {
+        DEBUG_PRINT_LOW("\n Free Driver Context pointer");
+        free (drv_ctx.ptr_inputbuffer);
+        drv_ctx.ptr_inputbuffer = NULL;
     }
 #ifdef USE_ION
     if (drv_ctx.ip_buf_ion_info) {
         DEBUG_PRINT_LOW("\n Free ion context");
-	free(drv_ctx.ip_buf_ion_info);
+        free(drv_ctx.ip_buf_ion_info);
         drv_ctx.ip_buf_ion_info = NULL;
     }
 #endif
@@ -8011,1506 +7102,1422 @@
 
 int omx_vdec::stream_off(OMX_U32 port)
 {
-	enum v4l2_buf_type btype;
-	int rc = 0;
-	enum v4l2_ports v4l2_port = OUTPUT_PORT;
+    enum v4l2_buf_type btype;
+    int rc = 0;
+    enum v4l2_ports v4l2_port = OUTPUT_PORT;
 
-	if (port == OMX_CORE_INPUT_PORT_INDEX) {
-		btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		v4l2_port = OUTPUT_PORT;
-	} else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
-		btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		v4l2_port = CAPTURE_PORT;
-	} else if (port == OMX_ALL) {
-		int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
-		int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        v4l2_port = OUTPUT_PORT;
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
+        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        v4l2_port = CAPTURE_PORT;
+    } else if (port == OMX_ALL) {
+        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
+        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
 
-		if (!rc_input)
-			return rc_input;
-		else
-			return rc_output;
-	}
+        if (!rc_input)
+            return rc_input;
+        else
+            return rc_output;
+    }
 
-	if (!streaming[v4l2_port]) {
-		// already streamed off, warn and move on
-		DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
-				" which is already streamed off", v4l2_port);
-		return 0;
-	}
+    if (!streaming[v4l2_port]) {
+        // already streamed off, warn and move on
+        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
+                " which is already streamed off", v4l2_port);
+        return 0;
+    }
 
-	DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
+    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
 
-	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
-	if (rc) {
-		/*TODO: How to handle this case */
-		DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
-	} else {
-		streaming[v4l2_port] = false;
-	}
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+    if (rc) {
+        /*TODO: How to handle this case */
+        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
+    } else {
+        streaming[v4l2_port] = false;
+    }
 
-	return rc;
+    return rc;
 }
 
 OMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  struct v4l2_requestbuffers bufreq;
-  unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
-  struct v4l2_format fmt;
-  int ret = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_requestbuffers bufreq;
+    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
+    struct v4l2_format fmt;
+    int ret = 0;
 
-	bufreq.memory = V4L2_MEMORY_USERPTR;
-	bufreq.count = 1;
-   if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
-    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    fmt.fmt.pix_mp.pixelformat = output_capability;
-  }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
-    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    fmt.fmt.pix_mp.pixelformat = capture_capability;
-  }else {eRet = OMX_ErrorBadParameter;}
-  if(eRet==OMX_ErrorNone){
-  ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
-  }
-  if(ret)
-  {
-    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
-	/*TODO: How to handle this case */
-    eRet = OMX_ErrorInsufficientResources;
-	return eRet;
-  }
-  else
-  {
-    buffer_prop->actualcount = bufreq.count;
-    buffer_prop->mincount = bufreq.count;
-    DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
-  }
-  DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
+    bufreq.memory = V4L2_MEMORY_USERPTR;
+    bufreq.count = 1;
+    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.fmt.pix_mp.pixelformat = output_capability;
+    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.fmt.pix_mp.pixelformat = capture_capability;
+    } else {
+        eRet = OMX_ErrorBadParameter;
+    }
+    if (eRet==OMX_ErrorNone) {
+        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+    }
+    if (ret) {
+        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+        /*TODO: How to handle this case */
+        eRet = OMX_ErrorInsufficientResources;
+        return eRet;
+    } else {
+        buffer_prop->actualcount = bufreq.count;
+        buffer_prop->mincount = bufreq.count;
+        DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
+    }
+    DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
 
-  fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-  fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
 
-  ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
 
-  update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
-  if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
-      drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
-  DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
+    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
+    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
+    DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
 
-  if(ret)
-  {
-	/*TODO: How to handle this case */
-    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  else
-  {
-    int extra_idx = 0;
-    buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-    buf_size = buffer_prop->buffer_size;
-    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-      extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
-    } else if (extra_idx >= VIDEO_MAX_PLANES) {
-      DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
-      return OMX_ErrorBadParameter;
+    if (ret) {
+        /*TODO: How to handle this case */
+        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+        eRet = OMX_ErrorInsufficientResources;
+    } else {
+        int extra_idx = 0;
+        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+        buf_size = buffer_prop->buffer_size;
+        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
+        } else if (extra_idx >= VIDEO_MAX_PLANES) {
+            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
+            return OMX_ErrorBadParameter;
+        }
+        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
+            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+        }
+        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
+            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+        }
+        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
+            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
+                    client_extra_data_size);
+        }
+        if (client_extra_data_size) {
+            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
+        }
+        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
+        drv_ctx.extradata_info.count = buffer_prop->actualcount;
+        drv_ctx.extradata_info.buffer_size = extra_data_size;
+        buf_size += client_extra_data_size;
+        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+        DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
+                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
+        if (in_reconfig) // BufReq will be set to driver when port is disabled
+            buffer_prop->buffer_size = buf_size;
+        else if (buf_size != buffer_prop->buffer_size) {
+            buffer_prop->buffer_size = buf_size;
+            eRet = set_buffer_req(buffer_prop);
+        }
     }
-    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-    {
-      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
-      client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
-    }
-    if (client_extradata & OMX_INTERLACE_EXTRADATA)
-    {
-      client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
-    }
-    if (client_extradata & OMX_PORTDEF_EXTRADATA)
-    {
-      client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
-      DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
-         client_extra_data_size);
-    }
-    if (client_extra_data_size)
-    {
-      client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
-      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
-    }
-    drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
-    drv_ctx.extradata_info.count = buffer_prop->actualcount;
-    drv_ctx.extradata_info.buffer_size = extra_data_size;
-    buf_size += client_extra_data_size;
-    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
-    DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
-        buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
-    if (in_reconfig) // BufReq will be set to driver when port is disabled
-      buffer_prop->buffer_size = buf_size;
-    else if (buf_size != buffer_prop->buffer_size)
-    {
-      buffer_prop->buffer_size = buf_size;
-      eRet = set_buffer_req(buffer_prop);
-    }
-  }
-  DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)\n",
-    buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
-  return eRet;
+    DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)\n",
+            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned buf_size = 0;
-  struct v4l2_format fmt;
-  struct v4l2_requestbuffers bufreq;
-  int ret;
-  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
-  if (buf_size != buffer_prop->buffer_size)
-  {
-    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
-      buffer_prop->buffer_size, buf_size);
-    eRet = OMX_ErrorBadParameter;
-  }
-  else
-  {
-    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-	fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned buf_size = 0;
+    struct v4l2_format fmt;
+    struct v4l2_requestbuffers bufreq;
+    int ret;
+    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+    if (buf_size != buffer_prop->buffer_size) {
+        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
+                buffer_prop->buffer_size, buf_size);
+        eRet = OMX_ErrorBadParameter;
+    } else {
+        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
 
-	if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
-		fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fmt.fmt.pix_mp.pixelformat = output_capability;
-	} else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
-		fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.pixelformat = capture_capability;
-	} else {eRet = OMX_ErrorBadParameter;}
+        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+            fmt.fmt.pix_mp.pixelformat = output_capability;
+        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            fmt.fmt.pix_mp.pixelformat = capture_capability;
+        } else {
+            eRet = OMX_ErrorBadParameter;
+        }
 
-	ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-    if (ret)
-    {
-	  /*TODO: How to handle this case */
-      DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
-      eRet = OMX_ErrorInsufficientResources;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+        if (ret) {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
+            eRet = OMX_ErrorInsufficientResources;
+        }
+
+        bufreq.memory = V4L2_MEMORY_USERPTR;
+        bufreq.count = buffer_prop->actualcount;
+        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        } else {
+            eRet = OMX_ErrorBadParameter;
+        }
+
+        if (eRet==OMX_ErrorNone) {
+            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+        }
+
+        if (ret) {
+            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
+            /*TODO: How to handle this case */
+            eRet = OMX_ErrorInsufficientResources;
+        } else if (bufreq.count < buffer_prop->actualcount) {
+            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
+                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
+                    buffer_prop->actualcount, bufreq.count);
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            if (!client_buffers.update_buffer_req()) {
+                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
     }
-
-	bufreq.memory = V4L2_MEMORY_USERPTR;
-	bufreq.count = buffer_prop->actualcount;
-	if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	} else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	} else {eRet = OMX_ErrorBadParameter;}
-
-	if (eRet==OMX_ErrorNone) {
-		ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
-	}
-
-	if (ret)
-	{
-		DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
-		/*TODO: How to handle this case */
-		eRet = OMX_ErrorInsufficientResources;
-	} else if (bufreq.count < buffer_prop->actualcount) {
-		DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
-						" on v4l2 port %d to %d (prefers %d)", bufreq.type,
-						buffer_prop->actualcount, bufreq.count);
-		eRet = OMX_ErrorInsufficientResources;
-	} else {
-        if (!client_buffers.update_buffer_req()) {
-        DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
-        eRet = OMX_ErrorInsufficientResources;
-      }
+    if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+        // need to update extradata buffers also
+        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
+        drv_ctx.extradata_info.count = buffer_prop->actualcount;
     }
-  }
-  if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT)
-  {
-    // need to update extradata buffers also
-    drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
-    drv_ctx.extradata_info.count = buffer_prop->actualcount;
-  }
-  return eRet;
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::update_picture_resolution()
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  return eRet;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (!portDefn)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
-  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
-  portDefn->nSize = sizeof(portDefn);
-  portDefn->eDomain    = OMX_PortDomainVideo;
-  if (drv_ctx.frame_rate.fps_denominator > 0)
-    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
-                                        drv_ctx.frame_rate.fps_denominator;
-  else {
-    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
-    return OMX_ErrorBadParameter;
-  }
-  if (0 == portDefn->nPortIndex)
-  {
-    portDefn->eDir =  OMX_DirInput;
-    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
-    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
-    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
-    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
-    portDefn->format.video.eCompressionFormat = eCompressionFormat;
-    portDefn->bEnabled   = m_inp_bEnabled;
-    portDefn->bPopulated = m_inp_bPopulated;
-  }
-  else if (1 == portDefn->nPortIndex)
-  {
-    unsigned int buf_size = 0;
-    if (!client_buffers.update_buffer_req()) {
-      DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
-      return OMX_ErrorHardware;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!portDefn) {
+        return OMX_ErrorBadParameter;
     }
-    if (!client_buffers.get_buffer_req(buf_size)) {
-      DEBUG_PRINT_ERROR("\n update buffer requirements");
-      return OMX_ErrorHardware;
+    DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
+    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
+    portDefn->nSize = sizeof(portDefn);
+    portDefn->eDomain    = OMX_PortDomainVideo;
+    if (drv_ctx.frame_rate.fps_denominator > 0)
+        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
+            drv_ctx.frame_rate.fps_denominator;
+    else {
+        DEBUG_PRINT_ERROR("Error: Divide by zero \n");
+        return OMX_ErrorBadParameter;
     }
-    portDefn->nBufferSize = buf_size;
-    portDefn->eDir =  OMX_DirOutput;
-	portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
-	portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
-    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
-    portDefn->bEnabled   = m_out_bEnabled;
-    portDefn->bPopulated = m_out_bPopulated;
-    if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
-        DEBUG_PRINT_ERROR("\n Error in getting color format");
-        return OMX_ErrorHardware;
+    if (0 == portDefn->nPortIndex) {
+        portDefn->eDir =  OMX_DirInput;
+        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
+        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
+        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
+        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
+        portDefn->format.video.eCompressionFormat = eCompressionFormat;
+        portDefn->bEnabled   = m_inp_bEnabled;
+        portDefn->bPopulated = m_inp_bPopulated;
+    } else if (1 == portDefn->nPortIndex) {
+        unsigned int buf_size = 0;
+        if (!client_buffers.update_buffer_req()) {
+            DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
+            return OMX_ErrorHardware;
+        }
+        if (!client_buffers.get_buffer_req(buf_size)) {
+            DEBUG_PRINT_ERROR("\n update buffer requirements");
+            return OMX_ErrorHardware;
+        }
+        portDefn->nBufferSize = buf_size;
+        portDefn->eDir =  OMX_DirOutput;
+        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
+        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
+        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+        portDefn->bEnabled   = m_out_bEnabled;
+        portDefn->bPopulated = m_out_bPopulated;
+        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
+            DEBUG_PRINT_ERROR("\n Error in getting color format");
+            return OMX_ErrorHardware;
+        }
+    } else {
+        portDefn->eDir = OMX_DirMax;
+        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
+                (int)portDefn->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-  }
-  else
-  {
-      portDefn->eDir = OMX_DirMax;
-    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
-             (int)portDefn->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
-  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
-  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
-  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
-  DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
-    " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
-    portDefn->format.video.nFrameHeight,
-    portDefn->format.video.nStride,
-    portDefn->format.video.nSliceHeight);
-  return eRet;
+    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
+    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
+    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
+    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
+    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
+            " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
+            portDefn->format.video.nFrameHeight,
+            portDefn->format.video.nStride,
+            portDefn->format.video.nSliceHeight);
+    return eRet;
 
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_output_headers()
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
-  unsigned i= 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
+    unsigned i= 0;
 
-  if(!m_out_mem_ptr) {
-    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
-    int nBufHdrSize        = 0;
-    int nPlatformEntrySize = 0;
-    int nPlatformListSize  = 0;
-    int nPMEMInfoSize = 0;
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
+        int nBufHdrSize        = 0;
+        int nPlatformEntrySize = 0;
+        int nPlatformListSize  = 0;
+        int nPMEMInfoSize = 0;
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
 
-    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
-      drv_ctx.op_buf.actualcount);
-    nBufHdrSize        = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_BUFFERHEADERTYPE);
+        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
+                drv_ctx.op_buf.actualcount);
+        nBufHdrSize        = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_BUFFERHEADERTYPE);
 
-    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
-    nPlatformListSize  = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
-    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+        nPlatformListSize  = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
 
-    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
-                         sizeof(OMX_BUFFERHEADERTYPE),
-                         nPMEMInfoSize,
-                         nPlatformListSize);
-    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
-                         m_out_bm_count);
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    // Alloc mem for platform specific info
-    char *pPtr=NULL;
-    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
-                                     nPMEMInfoSize,1);
-    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
-      calloc (sizeof(struct vdec_bufferpayload),
-      drv_ctx.op_buf.actualcount);
-    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
-      calloc (sizeof (struct vdec_output_frameinfo),
-      drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
+                sizeof(OMX_BUFFERHEADERTYPE),
+                nPMEMInfoSize,
+                nPlatformListSize);
+        DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
+                m_out_bm_count);
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        // Alloc mem for platform specific info
+        char *pPtr=NULL;
+        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+                nPMEMInfoSize,1);
+        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
+                                   calloc (sizeof(struct vdec_bufferpayload),
+                                           drv_ctx.op_buf.actualcount);
+        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
+                                 calloc (sizeof (struct vdec_output_frameinfo),
+                                         drv_ctx.op_buf.actualcount);
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
-      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
+        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
+                                  calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
 #endif
 
-    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
-       && drv_ctx.ptr_respbuffer)
-    {
-      bufHdr          =  m_out_mem_ptr;
-      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
-      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
-                        (((char *) m_platform_list)  + nPlatformListSize);
-      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                        (((char *) m_platform_entry) + nPlatformEntrySize);
-      pPlatformList   = m_platform_list;
-      pPlatformEntry  = m_platform_entry;
-      pPMEMInfo       = m_pmem_info;
+        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+                && drv_ctx.ptr_respbuffer) {
+            bufHdr          =  m_out_mem_ptr;
+            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+                (((char *) m_platform_list)  + nPlatformListSize);
+            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                (((char *) m_platform_entry) + nPlatformEntrySize);
+            pPlatformList   = m_platform_list;
+            pPlatformEntry  = m_platform_entry;
+            pPMEMInfo       = m_pmem_info;
 
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
 
-      // Settting the entire storage nicely
-      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
-                      m_out_mem_ptr,pPlatformEntry);
-      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
-      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = 0;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = NULL;
-        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
-        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-        pPlatformEntry->entry      = pPMEMInfo;
-        // Initialize the Platform List
-        pPlatformList->nEntries    = 1;
-        pPlatformList->entryList   = pPlatformEntry;
-        // Keep pBuffer NULL till vdec is opened
-        bufHdr->pBuffer            = NULL;
-        pPMEMInfo->offset          =  0;
-        pPMEMInfo->pmem_fd = 0;
-        bufHdr->pPlatformPrivate = pPlatformList;
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
+            // Settting the entire storage nicely
+            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
+                    m_out_mem_ptr,pPlatformEntry);
+            DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
+            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = 0;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = NULL;
+                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
+                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+                pPlatformEntry->entry      = pPMEMInfo;
+                // Initialize the Platform List
+                pPlatformList->nEntries    = 1;
+                pPlatformList->entryList   = pPlatformEntry;
+                // Keep pBuffer NULL till vdec is opened
+                bufHdr->pBuffer            = NULL;
+                pPMEMInfo->offset          =  0;
+                pPMEMInfo->pmem_fd = 0;
+                bufHdr->pPlatformPrivate = pPlatformList;
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
 #ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
+                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
 #endif
-        /*Create a mapping between buffers*/
-        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
-        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
-                                            &drv_ctx.ptr_outputbuffer[i];
-        // Move the buffer and buffer header pointers
-        bufHdr++;
-        pPMEMInfo++;
-        pPlatformEntry++;
-        pPlatformList++;
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
-                                        m_out_mem_ptr, pPtr);
-      if(m_out_mem_ptr)
-      {
-        free(m_out_mem_ptr);
-        m_out_mem_ptr = NULL;
-      }
-      if(pPtr)
-      {
-        free(pPtr);
-        pPtr = NULL;
-      }
-      if(drv_ctx.ptr_outputbuffer)
-      {
-        free(drv_ctx.ptr_outputbuffer);
-        drv_ctx.ptr_outputbuffer = NULL;
-      }
-      if(drv_ctx.ptr_respbuffer)
-      {
-        free(drv_ctx.ptr_respbuffer);
-        drv_ctx.ptr_respbuffer = NULL;
-      }
+                /*Create a mapping between buffers*/
+                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
+                                                        &drv_ctx.ptr_outputbuffer[i];
+                // Move the buffer and buffer header pointers
+                bufHdr++;
+                pPMEMInfo++;
+                pPlatformEntry++;
+                pPlatformList++;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
+                    m_out_mem_ptr, pPtr);
+            if (m_out_mem_ptr) {
+                free(m_out_mem_ptr);
+                m_out_mem_ptr = NULL;
+            }
+            if (pPtr) {
+                free(pPtr);
+                pPtr = NULL;
+            }
+            if (drv_ctx.ptr_outputbuffer) {
+                free(drv_ctx.ptr_outputbuffer);
+                drv_ctx.ptr_outputbuffer = NULL;
+            }
+            if (drv_ctx.ptr_respbuffer) {
+                free(drv_ctx.ptr_respbuffer);
+                drv_ctx.ptr_respbuffer = NULL;
+            }
 #ifdef USE_ION
-    if (drv_ctx.op_buf_ion_info) {
-        DEBUG_PRINT_LOW("\n Free o/p ion context");
-	free(drv_ctx.op_buf_ion_info);
-        drv_ctx.op_buf_ion_info = NULL;
-    }
+            if (drv_ctx.op_buf_ion_info) {
+                DEBUG_PRINT_LOW("\n Free o/p ion context");
+                free(drv_ctx.op_buf_ion_info);
+                drv_ctx.op_buf_ion_info = NULL;
+            }
 #endif
-      eRet =  OMX_ErrorInsufficientResources;
+            eRet =  OMX_ErrorInsufficientResources;
+        }
+    } else {
+        eRet =  OMX_ErrorInsufficientResources;
     }
-  } else {
-    eRet =  OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+    return eRet;
 }
 
 void omx_vdec::complete_pending_buffer_done_cbs()
 {
-  unsigned p1;
-  unsigned p2;
-  unsigned ident;
-  omx_cmd_queue tmp_q, pending_bd_q;
-  pthread_mutex_lock(&m_lock);
-  // pop all pending GENERATE FDB from ftb queue
-  while (m_ftb_q.m_size)
-  {
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to ftb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_ftb_q.insert_entry(p1,p2,ident);
-  }
-  // pop all pending GENERATE EDB from etb queue
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to etb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_etb_q.insert_entry(p1,p2,ident);
-  }
-  pthread_mutex_unlock(&m_lock);
-  // process all pending buffer dones
-  while(pending_bd_q.m_size)
-  {
-    pending_bd_q.pop_entry(&p1,&p2,&ident);
-    switch(ident)
-    {
-      case OMX_COMPONENT_GENERATE_EBD:
-        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
-          omx_report_error ();
+    unsigned p1;
+    unsigned p2;
+    unsigned ident;
+    omx_cmd_queue tmp_q, pending_bd_q;
+    pthread_mutex_lock(&m_lock);
+    // pop all pending GENERATE FDB from ftb queue
+    while (m_ftb_q.m_size) {
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
         }
-        break;
+    }
+    //return all non GENERATE FDB to ftb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_ftb_q.insert_entry(p1,p2,ident);
+    }
+    // pop all pending GENERATE EDB from etb queue
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
+        }
+    }
+    //return all non GENERATE FDB to etb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_etb_q.insert_entry(p1,p2,ident);
+    }
+    pthread_mutex_unlock(&m_lock);
+    // process all pending buffer dones
+    while (pending_bd_q.m_size) {
+        pending_bd_q.pop_entry(&p1,&p2,&ident);
+        switch (ident) {
+            case OMX_COMPONENT_GENERATE_EBD:
+                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                    DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+                break;
 
-      case OMX_COMPONENT_GENERATE_FBD:
-        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
-          omx_report_error ();
+            case OMX_COMPONENT_GENERATE_FBD:
+                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                    DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+                break;
         }
-        break;
     }
-  }
 }
 
 void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
 {
-  OMX_U32 new_frame_interval = 0;
-  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
-     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
-  {
-    new_frame_interval = (act_timestamp > prev_ts)?
-                          act_timestamp - prev_ts :
-                          prev_ts - act_timestamp;
-    if (new_frame_interval < frm_int || frm_int == 0)
-    {
-      frm_int = new_frame_interval;
-      if(frm_int)
-      {
-        drv_ctx.frame_rate.fps_numerator = 1e6;
-        drv_ctx.frame_rate.fps_denominator = frm_int;
-        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
-                         frm_int, drv_ctx.frame_rate.fps_numerator /
-                         (float)drv_ctx.frame_rate.fps_denominator);
-      }
+    OMX_U32 new_frame_interval = 0;
+    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
+            && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) {
+        new_frame_interval = (act_timestamp > prev_ts)?
+            act_timestamp - prev_ts :
+            prev_ts - act_timestamp;
+        if (new_frame_interval < frm_int || frm_int == 0) {
+            frm_int = new_frame_interval;
+            if (frm_int) {
+                drv_ctx.frame_rate.fps_numerator = 1e6;
+                drv_ctx.frame_rate.fps_denominator = frm_int;
+                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
+                        frm_int, drv_ctx.frame_rate.fps_numerator /
+                        (float)drv_ctx.frame_rate.fps_denominator);
+            }
+        }
     }
-  }
-  prev_ts = act_timestamp;
+    prev_ts = act_timestamp;
 }
 
 void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
 {
-  if (rst_prev_ts && VALID_TS(act_timestamp))
-  {
-    prev_ts = act_timestamp;
-    rst_prev_ts = false;
-  }
-  else if (VALID_TS(prev_ts))
-  {
-    bool codec_cond = (drv_ctx.timestamp_adjust)?
-                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
-                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
-                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
-    if(frm_int > 0 && codec_cond)
-    {
-      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
-      act_timestamp = prev_ts + frm_int;
-      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
-      prev_ts = act_timestamp;
+    if (rst_prev_ts && VALID_TS(act_timestamp)) {
+        prev_ts = act_timestamp;
+        rst_prev_ts = false;
+    } else if (VALID_TS(prev_ts)) {
+        bool codec_cond = (drv_ctx.timestamp_adjust)?
+            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
+                                           (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
+            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
+        if (frm_int > 0 && codec_cond) {
+            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
+            act_timestamp = prev_ts + frm_int;
+            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
+            prev_ts = act_timestamp;
+        } else
+            set_frame_rate(act_timestamp);
+    } else if (frm_int > 0)          // In this case the frame rate was set along
+    {                               // with the port definition, start ts with 0
+        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
+        rst_prev_ts = true;
     }
-    else
-      set_frame_rate(act_timestamp);
-  }
-  else if (frm_int > 0)           // In this case the frame rate was set along
-  {                               // with the port definition, start ts with 0
-    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
-    rst_prev_ts = true;
-  }
 }
 
 void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
-  OMX_U32 num_conceal_MB = 0;
-  OMX_U32 frame_rate = 0;
-  int consumed_len = 0;
-  OMX_U32 num_MB_in_frame;
-  OMX_U32 recovery_sei_flags = 1;
-  int buf_index = p_buf_hdr - m_out_mem_ptr;
-  struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
-  OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
-      p_buf_hdr->nOffset;
-  if (!drv_ctx.extradata_info.uaddr) {
-    return;
-  }
-  p_extra = (OMX_OTHER_EXTRADATATYPE *)
-    ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
-  char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
-  if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
-    p_extra = NULL;
-  OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
-  if (data) {
-    while((consumed_len < drv_ctx.extradata_info.buffer_size)
-        && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
-      if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
-        DEBUG_PRINT_LOW("Invalid extra data size");
-        break;
-      }
-      switch((unsigned long)data->eType) {
-      case EXTRADATA_INTERLACE_VIDEO:
-        struct msm_vidc_interlace_payload *payload;
-        payload = (struct msm_vidc_interlace_payload *)data->data;
-        if (payload->format != INTERLACE_FRAME_PROGRESSIVE) {
-          int enable = 1;
-          OMX_U32 mbaff = 0;
-          mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
-          if ((payload->format == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
-            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-          else
-            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
-          if(m_enable_android_native_buffers)
-            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
-              PP_PARAM_INTERLACED, (void*)&enable);
-        }
-        if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
-          append_interlace_extradata(p_extra, payload->format);
-          p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-        }
-        break;
-      case EXTRADATA_FRAME_RATE:
-        struct msm_vidc_framerate_payload *frame_rate_payload;
-        frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
-        frame_rate = frame_rate_payload->frame_rate;
-      break;
-      case EXTRADATA_TIMESTAMP:
-        struct msm_vidc_ts_payload *time_stamp_payload;
-        time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
-        p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
-        p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
-      break;
-      case EXTRADATA_NUM_CONCEALED_MB:
-        struct msm_vidc_concealmb_payload *conceal_mb_payload;
-        conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
-        num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
-                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
-        num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
-      break;
-      case EXTRADATA_ASPECT_RATIO:
-        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
-        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data;
-        ((struct vdec_output_frameinfo *)
-            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
-        ((struct vdec_output_frameinfo *)
-            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
-      break;
-      case EXTRADATA_RECOVERY_POINT_SEI:
-        struct msm_vidc_recoverysei_payload *recovery_sei_payload;
-        recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
-        recovery_sei_flags = recovery_sei_payload->flags;
-       if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
-        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
-        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received\n");
-       }
-      break;
-      case EXTRADATA_PANSCAN_WINDOW:
-        panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
-        break;
-      default:
-        goto unrecognized_extradata;
-      }
-      consumed_len += data->nSize;
-      data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
+    OMX_U32 num_conceal_MB = 0;
+    OMX_U32 frame_rate = 0;
+    int consumed_len = 0;
+    OMX_U32 num_MB_in_frame;
+    OMX_U32 recovery_sei_flags = 1;
+    int buf_index = p_buf_hdr - m_out_mem_ptr;
+    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
+    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
+        p_buf_hdr->nOffset;
+    if (!drv_ctx.extradata_info.uaddr) {
+        return;
     }
-    if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
-      p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-      append_frame_info_extradata(p_extra,
-        num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
-        panscan_payload,&((struct vdec_output_frameinfo *)
-        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);}
-  }
+    p_extra = (OMX_OTHER_EXTRADATATYPE *)
+        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
+    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
+    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
+        p_extra = NULL;
+    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
+    if (data) {
+        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
+                && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
+            if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
+                DEBUG_PRINT_LOW("Invalid extra data size");
+                break;
+            }
+            switch ((unsigned long)data->eType) {
+                case EXTRADATA_INTERLACE_VIDEO:
+                    struct msm_vidc_interlace_payload *payload;
+                    payload = (struct msm_vidc_interlace_payload *)data->data;
+                    if (payload->format != INTERLACE_FRAME_PROGRESSIVE) {
+                        int enable = 1;
+                        OMX_U32 mbaff = 0;
+                        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+                        if ((payload->format == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
+                            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+                        else
+                            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+                        if (m_enable_android_native_buffers)
+                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
+                                    PP_PARAM_INTERLACED, (void*)&enable);
+                    }
+                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
+                        append_interlace_extradata(p_extra, payload->format);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                    }
+                    break;
+                case EXTRADATA_FRAME_RATE:
+                    struct msm_vidc_framerate_payload *frame_rate_payload;
+                    frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
+                    frame_rate = frame_rate_payload->frame_rate;
+                    break;
+                case EXTRADATA_TIMESTAMP:
+                    struct msm_vidc_ts_payload *time_stamp_payload;
+                    time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
+                    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
+                    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
+                    break;
+                case EXTRADATA_NUM_CONCEALED_MB:
+                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
+                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
+                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
+                    break;
+                case EXTRADATA_ASPECT_RATIO:
+                    struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
+                    aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data;
+                    ((struct vdec_output_frameinfo *)
+                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
+                    ((struct vdec_output_frameinfo *)
+                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
+                    break;
+                case EXTRADATA_RECOVERY_POINT_SEI:
+                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
+                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
+                    recovery_sei_flags = recovery_sei_payload->flags;
+                    if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
+                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
+                        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+                    }
+                    break;
+                case EXTRADATA_PANSCAN_WINDOW:
+                    panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
+                    break;
+                default:
+                    goto unrecognized_extradata;
+            }
+            consumed_len += data->nSize;
+            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+        }
+        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+            append_frame_info_extradata(p_extra,
+                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
+                    panscan_payload,&((struct vdec_output_frameinfo *)
+                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+        }
+    }
 unrecognized_extradata:
-  if(!secure_mode && client_extradata)
-    append_terminator_extradata(p_extra);
-  return;
+    if (!secure_mode && client_extradata)
+        append_terminator_extradata(p_extra);
+    return;
 }
 
 OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
-	 bool is_internal, bool enable)
+        bool is_internal, bool enable)
 {
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  struct v4l2_control control;
-  if(m_state != OMX_StateLoaded)
-  {
-     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
-     return OMX_ErrorIncorrectStateOperation;
-  }
-  DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
-    client_extradata, requested_extradata, enable, is_internal);
-
-  if (!is_internal) {
-	  if (enable)
-		  client_extradata |= requested_extradata;
-	  else
-		  client_extradata = client_extradata & ~requested_extradata;
-  }
-
-  if (enable) {
-    if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
-            " Quality of interlaced clips might be impacted.\n");
-      }
-    } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
-      {
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
-      }
-    } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA)
-    {
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-      DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
-      }
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    struct v4l2_control control;
+    if (m_state != OMX_StateLoaded) {
+        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
+        return OMX_ErrorIncorrectStateOperation;
     }
-  }
-  ret = get_buffer_req(&drv_ctx.op_buf);
-  return ret;
+    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
+            client_extradata, requested_extradata, enable, is_internal);
+
+    if (!is_internal) {
+        if (enable)
+            client_extradata |= requested_extradata;
+        else
+            client_extradata = client_extradata & ~requested_extradata;
+    }
+
+    if (enable) {
+        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
+                        " Quality of interlaced clips might be impacted.\n");
+            }
+        } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+            }
+        } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
+            }
+        }
+    }
+    ret = get_buffer_req(&drv_ctx.op_buf);
+    return ret;
 }
 
 OMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
-  OMX_U8 *data_ptr = extra->data, data = 0;
-  while (byte_count < extra->nDataSize)
-  {
-    data = *data_ptr;
-    while (data)
-    {
-      num_MB += (data&0x01);
-      data >>= 1;
+    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
+    OMX_U8 *data_ptr = extra->data, data = 0;
+    while (byte_count < extra->nDataSize) {
+        data = *data_ptr;
+        while (data) {
+            num_MB += (data&0x01);
+            data >>= 1;
+        }
+        data_ptr++;
+        byte_count++;
     }
-    data_ptr++;
-    byte_count++;
-  }
-  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
-                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
-  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
+    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
 }
 
 void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  if (!m_debug_extradata)
-     return;
-
-  DEBUG_PRINT_HIGH(
-    "============== Extra Data ==============\n"
-    "           Size: %lu \n"
-    "        Version: %lu \n"
-    "      PortIndex: %lu \n"
-    "           Type: %x \n"
-    "       DataSize: %lu \n",
-    extra->nSize, extra->nVersion.nVersion,
-    extra->nPortIndex, extra->eType, extra->nDataSize);
-
-  if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat)
-  {
-    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
-    DEBUG_PRINT_HIGH(
-      "------ Interlace Format ------\n"
-      "                Size: %lu \n"
-      "             Version: %lu \n"
-      "           PortIndex: %lu \n"
-      " Is Interlace Format: %d \n"
-      "   Interlace Formats: %lu \n"
-      "=========== End of Interlace ===========\n",
-      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
-      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
-  }
-  else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo)
-  {
-    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+    if (!m_debug_extradata)
+        return;
 
     DEBUG_PRINT_HIGH(
-      "-------- Frame Format --------\n"
-      "             Picture Type: %d \n"
-      "           Interlace Type: %d \n"
-      " Pan Scan Total Frame Num: %lu \n"
-      "   Concealed Macro Blocks: %lu \n"
-      "               frame rate: %lu \n"
-      "           Aspect Ratio X: %lu \n"
-      "           Aspect Ratio Y: %lu \n",
-      fminfo->ePicType,
-      fminfo->interlaceType,
-      fminfo->panScan.numWindows,
-      fminfo->nConcealedMacroblocks,
-      fminfo->nFrameRate,
-      fminfo->aspectRatio.aspectRatioX,
-      fminfo->aspectRatio.aspectRatioY);
+            "============== Extra Data ==============\n"
+            "           Size: %lu \n"
+            "        Version: %lu \n"
+            "      PortIndex: %lu \n"
+            "           Type: %x \n"
+            "       DataSize: %lu \n",
+            extra->nSize, extra->nVersion.nVersion,
+            extra->nPortIndex, extra->eType, extra->nDataSize);
 
-    for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++)
-    {
-      DEBUG_PRINT_HIGH(
-        "------------------------------\n"
-        "     Pan Scan Frame Num: %lu \n"
-        "            Rectangle x: %ld \n"
-        "            Rectangle y: %ld \n"
-        "           Rectangle dx: %ld \n"
-        "           Rectangle dy: %ld \n",
-        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
-        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
+        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+        DEBUG_PRINT_HIGH(
+                "------ Interlace Format ------\n"
+                "                Size: %lu \n"
+                "             Version: %lu \n"
+                "           PortIndex: %lu \n"
+                " Is Interlace Format: %d \n"
+                "   Interlace Formats: %lu \n"
+                "=========== End of Interlace ===========\n",
+                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
+                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
+    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
+        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+
+        DEBUG_PRINT_HIGH(
+                "-------- Frame Format --------\n"
+                "             Picture Type: %d \n"
+                "           Interlace Type: %d \n"
+                " Pan Scan Total Frame Num: %lu \n"
+                "   Concealed Macro Blocks: %lu \n"
+                "               frame rate: %lu \n"
+                "           Aspect Ratio X: %lu \n"
+                "           Aspect Ratio Y: %lu \n",
+                fminfo->ePicType,
+                fminfo->interlaceType,
+                fminfo->panScan.numWindows,
+                fminfo->nConcealedMacroblocks,
+                fminfo->nFrameRate,
+                fminfo->aspectRatio.aspectRatioX,
+                fminfo->aspectRatio.aspectRatioY);
+
+        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
+            DEBUG_PRINT_HIGH(
+                    "------------------------------\n"
+                    "     Pan Scan Frame Num: %lu \n"
+                    "            Rectangle x: %ld \n"
+                    "            Rectangle y: %ld \n"
+                    "           Rectangle dx: %ld \n"
+                    "           Rectangle dy: %ld \n",
+                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
+                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+        }
+
+        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
+    } else if (extra->eType == OMX_ExtraDataNone) {
+        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
+    } else {
+        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
     }
-
-    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
-  }
-  else if (extra->eType == OMX_ExtraDataNone)
-  {
-    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
-  }
-  else
-  {
-    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
-  }
 }
 
 void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                          OMX_U32 interlaced_format_type)
+        OMX_U32 interlaced_format_type)
 {
-  OMX_STREAMINTERLACEFORMAT *interlace_format;
-  OMX_U32 mbaff = 0;
-  if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
-	return;
-  }
-  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
-  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
-  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
-  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
-  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
-  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
-  if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
-  {
-    interlace_format->bInterlaceFormat = OMX_FALSE;
-    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
-    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-  }
-  else
-  {
-    interlace_format->bInterlaceFormat = OMX_TRUE;
-    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
-    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
-  }
-  print_debug_extradata(extra);
+    OMX_STREAMINTERLACEFORMAT *interlace_format;
+    OMX_U32 mbaff = 0;
+    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
+        return;
+    }
+    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
+    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
+    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+    if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff) {
+        interlace_format->bInterlaceFormat = OMX_FALSE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+    } else {
+        interlace_format->bInterlaceFormat = OMX_TRUE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
+        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+    }
+    print_debug_extradata(extra);
 }
 
 void omx_vdec::fill_aspect_ratio_info(
-                       struct vdec_aspectratioinfo *aspect_ratio_info,
-                       OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
+        struct vdec_aspectratioinfo *aspect_ratio_info,
+        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
 {
-  m_extradata = frame_info;
-  m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
-  m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
-  DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
-                                                     m_extradata->aspectRatio.aspectRatioY);
+    m_extradata = frame_info;
+    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
+    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
+    DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
+            m_extradata->aspectRatio.aspectRatioY);
 }
 
 void omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
+        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
         struct msm_vidc_panscan_window_payload *panscan_payload,
         struct vdec_aspectratioinfo *aspect_ratio_info)
 {
-  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
-  struct msm_vidc_panscan_window *panscan_window;
-  if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
+    struct msm_vidc_panscan_window *panscan_window;
+    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
         return;
-  }
-  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
-  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
-  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
-  switch (picture_type)
-  {
-    case PICTURE_TYPE_I:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
-    break;
-    case PICTURE_TYPE_P:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
-    break;
-    case PICTURE_TYPE_B:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
-    break;
-    default:
-       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
-  }
-  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
-    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
-  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
-    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
-  else
-    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
-  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
-  frame_info->nConcealedMacroblocks = num_conceal_mb;
-  frame_info->nFrameRate = frame_rate;
-  frame_info->panScan.numWindows = 0;
-  if(panscan_payload) {
-  frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
-  panscan_window = &panscan_payload->wnd[0];
-  for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++)
-    {
-      frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
-      frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
-      frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
-      frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
-      panscan_window++;
     }
-  }
-  fill_aspect_ratio_info(aspect_ratio_info, frame_info);
-  print_debug_extradata(extra);
+    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
+    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
+    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+    switch (picture_type) {
+        case PICTURE_TYPE_I:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
+            break;
+        case PICTURE_TYPE_P:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
+            break;
+        case PICTURE_TYPE_B:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
+            break;
+        default:
+            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
+    }
+    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+    else
+        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
+    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
+    frame_info->nConcealedMacroblocks = num_conceal_mb;
+    frame_info->nFrameRate = frame_rate;
+    frame_info->panScan.numWindows = 0;
+    if (panscan_payload) {
+        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
+        panscan_window = &panscan_payload->wnd[0];
+        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
+            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
+            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
+            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
+            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
+            panscan_window++;
+        }
+    }
+    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
+    print_debug_extradata(extra);
 }
 
 void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
-  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
-  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
-  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
-  *portDefn = m_port_def;
-  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
-     "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
-     portDefn->format.video.nFrameWidth,
-     portDefn->format.video.nStride,
-     portDefn->format.video.nSliceHeight);
+    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
+    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
+    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
+    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
+    *portDefn = m_port_def;
+    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
+            "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
+            portDefn->format.video.nFrameWidth,
+            portDefn->format.video.nStride,
+            portDefn->format.video.nSliceHeight);
 }
 
 void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  if (!client_extradata) {
-	return;
-  }
-  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->eType = OMX_ExtraDataNone;
-  extra->nDataSize = 0;
-  extra->data[0] = 0;
+    if (!client_extradata) {
+        return;
+    }
+    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->eType = OMX_ExtraDataNone;
+    extra->nDataSize = 0;
+    extra->data[0] = 0;
 
-  print_debug_extradata(extra);
+    print_debug_extradata(extra);
 }
 
 OMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (index >= drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
-    return OMX_ErrorInsufficientResources;
-  }
-  if (m_desc_buffer_ptr == NULL)
-  {
-    m_desc_buffer_ptr = (desc_buffer_hdr*) \
-                     calloc( (sizeof(desc_buffer_hdr)),
-                     drv_ctx.ip_buf.actualcount);
-    if (m_desc_buffer_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
-      return OMX_ErrorInsufficientResources;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (index >= drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
+        return OMX_ErrorInsufficientResources;
     }
-  }
+    if (m_desc_buffer_ptr == NULL) {
+        m_desc_buffer_ptr = (desc_buffer_hdr*) \
+                            calloc( (sizeof(desc_buffer_hdr)),
+                                    drv_ctx.ip_buf.actualcount);
+        if (m_desc_buffer_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
+    }
 
-  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
-  if (m_desc_buffer_ptr[index].buf_addr == NULL)
-  {
-    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
-    return OMX_ErrorInsufficientResources;
-  }
+    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
+    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
+        DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
+        return OMX_ErrorInsufficientResources;
+    }
 
-  return eRet;
+    return eRet;
 }
 
 void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
 {
-  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
-  if (m_demux_entries < 8192)
-  {
-    m_demux_offsets[m_demux_entries++] = address_offset;
-  }
-  return;
+    DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
+    if (m_demux_entries < 8192) {
+        m_demux_offsets[m_demux_entries++] = address_offset;
+    }
+    return;
 }
 
 void omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
 {
-  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
-  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
-  OMX_U32 index = 0;
+    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
+    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
+    OMX_U32 index = 0;
 
-  m_demux_entries = 0;
+    m_demux_entries = 0;
 
-  while (index < bytes_to_parse)
-  {
-    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
-          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
-         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
-          (buf[index+2] == 0x01)) )
-    {
-      //Found start code, insert address offset
-      insert_demux_addr_offset(index);
-      if (buf[index+2] == 0x01) // 3 byte start code
-        index += 3;
-      else                      //4 byte start code
-        index += 4;
+    while (index < bytes_to_parse) {
+        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
+                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+                 (buf[index+2] == 0x01)) ) {
+            //Found start code, insert address offset
+            insert_demux_addr_offset(index);
+            if (buf[index+2] == 0x01) // 3 byte start code
+                index += 3;
+            else                      //4 byte start code
+                index += 4;
+        } else
+            index++;
     }
-    else
-      index++;
-  }
-  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
-  return;
+    DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
+    return;
 }
 
 OMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  //fix this, handle 3 byte start code, vc1 terminator entry
-  OMX_U8 *p_demux_data = NULL;
-  OMX_U32 desc_data = 0;
-  OMX_U32 start_addr = 0;
-  OMX_U32 nal_size = 0;
-  OMX_U32 suffix_byte = 0;
-  OMX_U32 demux_index = 0;
-  OMX_U32 buffer_index = 0;
+    //fix this, handle 3 byte start code, vc1 terminator entry
+    OMX_U8 *p_demux_data = NULL;
+    OMX_U32 desc_data = 0;
+    OMX_U32 start_addr = 0;
+    OMX_U32 nal_size = 0;
+    OMX_U32 suffix_byte = 0;
+    OMX_U32 demux_index = 0;
+    OMX_U32 buffer_index = 0;
 
-  if (m_desc_buffer_ptr == NULL)
-  {
-    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
-    return OMX_ErrorBadParameter;
-  }
-
-  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
-  if (buffer_index > drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
-    return OMX_ErrorBadParameter;
-  }
-
-  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
-
-  if ( ((OMX_U8*)p_demux_data == NULL) ||
-      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
-  {
-    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
-    return OMX_ErrorBadParameter;
-  }
-  else
-  {
-    for (; demux_index < m_demux_entries; demux_index++)
-    {
-      desc_data = 0;
-      start_addr = m_demux_offsets[demux_index];
-      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
-      {
-        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
-      }
-      else
-      {
-        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
-      }
-      if (demux_index < (m_demux_entries - 1))
-      {
-        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
-      }
-      else
-      {
-        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
-      }
-      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
-                        start_addr,
-                        suffix_byte,
-                        nal_size,
-                        demux_index);
-      desc_data = (start_addr >> 3) << 1;
-      desc_data |= (start_addr & 7) << 21;
-      desc_data |= suffix_byte << 24;
-
-      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
-      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
-      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-
-      p_demux_data += 16;
+    if (m_desc_buffer_ptr == NULL) {
+        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
+        return OMX_ErrorBadParameter;
     }
-    if (codec_type_parse == CODEC_TYPE_VC1)
-    {
-      DEBUG_PRINT_LOW("VC1 terminator entry");
-      desc_data = 0;
-      desc_data = 0x82 << 24;
-      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
-      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-      p_demux_data += 16;
-      m_demux_entries++;
-    }
-    //Add zero word to indicate end of descriptors
-    memset(p_demux_data, 0, sizeof(OMX_U32));
 
-    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
-    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
-  }
-  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-  m_demux_entries = 0;
-  DEBUG_PRINT_LOW("Demux table complete!");
-  return OMX_ErrorNone;
+    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+    if (buffer_index > drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
+        return OMX_ErrorBadParameter;
+    }
+
+    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
+
+    if ( ((OMX_U8*)p_demux_data == NULL) ||
+            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
+        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
+        return OMX_ErrorBadParameter;
+    } else {
+        for (; demux_index < m_demux_entries; demux_index++) {
+            desc_data = 0;
+            start_addr = m_demux_offsets[demux_index];
+            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
+                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
+            } else {
+                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
+            }
+            if (demux_index < (m_demux_entries - 1)) {
+                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
+            } else {
+                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
+            }
+            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
+                    start_addr,
+                    suffix_byte,
+                    nal_size,
+                    demux_index);
+            desc_data = (start_addr >> 3) << 1;
+            desc_data |= (start_addr & 7) << 21;
+            desc_data |= suffix_byte << 24;
+
+            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
+            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+
+            p_demux_data += 16;
+        }
+        if (codec_type_parse == CODEC_TYPE_VC1) {
+            DEBUG_PRINT_LOW("VC1 terminator entry");
+            desc_data = 0;
+            desc_data = 0x82 << 24;
+            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+            p_demux_data += 16;
+            m_demux_entries++;
+        }
+        //Add zero word to indicate end of descriptors
+        memset(p_demux_data, 0, sizeof(OMX_U32));
+
+        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
+        DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
+    }
+    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+    m_demux_entries = 0;
+    DEBUG_PRINT_LOW("Demux table complete!");
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::createDivxDrmContext()
 {
-     OMX_ERRORTYPE err = OMX_ErrorNone;
-     iDivXDrmDecrypt = DivXDrmDecrypt::Create();
-     if (iDivXDrmDecrypt) {
-          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
-          if(err!=OMX_ErrorNone) {
+    OMX_ERRORTYPE err = OMX_ErrorNone;
+    iDivXDrmDecrypt = DivXDrmDecrypt::Create();
+    if (iDivXDrmDecrypt) {
+        OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
+        if (err!=OMX_ErrorNone) {
             DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
             delete iDivXDrmDecrypt;
             iDivXDrmDecrypt = NULL;
-          }
-     }
-     else {
-          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
-          err = OMX_ErrorUndefined;
-     }
-     return err;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
+        err = OMX_ErrorUndefined;
+    }
+    return err;
 }
 
 omx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
 {
-  enabled = false;
-  omx = NULL;
-  init_members();
-  ColorFormat = OMX_COLOR_FormatMax;
+    enabled = false;
+    omx = NULL;
+    init_members();
+    ColorFormat = OMX_COLOR_FormatMax;
 }
 
 void omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
 {
-  omx = reinterpret_cast<omx_vdec*>(client);
+    omx = reinterpret_cast<omx_vdec*>(client);
 }
 
-void omx_vdec::allocate_color_convert_buf::init_members() {
-  allocated_count = 0;
-  buffer_size_req = 0;
-  buffer_alignment_req = 0;
-  memset(m_platform_list_client,0,sizeof(m_platform_list_client));
-  memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
-  memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
-  memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
+void omx_vdec::allocate_color_convert_buf::init_members()
+{
+    allocated_count = 0;
+    buffer_size_req = 0;
+    buffer_alignment_req = 0;
+    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
+    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
+    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
+    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
 #ifdef USE_ION
-  memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
+    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
 #endif
-  for (int i = 0; i < MAX_COUNT;i++)
-    pmem_fd[i] = -1;
+    for (int i = 0; i < MAX_COUNT; i++)
+        pmem_fd[i] = -1;
 }
 
-omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
-  c2d.destroy();
+omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
+{
+    c2d.destroy();
 }
 
 bool omx_vdec::allocate_color_convert_buf::update_buffer_req()
 {
-  bool status = true;
-  unsigned int src_size = 0, destination_size = 0;
-  OMX_COLOR_FORMATTYPE drv_color_format;
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
-    return false;
-  }
-  if (!enabled){
-    DEBUG_PRINT_HIGH("\n No color conversion required");
-    return status;
-  }
-  pthread_mutex_lock(&omx->c_lock);
-  if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
-      ColorFormat != OMX_COLOR_FormatYUV420Planar) {
-    DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
-    status = false;
-    goto fail_update_buf_req;
-  }
-  c2d.close();
-  status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
-                    omx->drv_ctx.video_resolution.frame_width,
-                    NV12_128m,YCbCr420P);
-  if (status) {
-    status = c2d.get_buffer_size(C2D_INPUT,src_size);
-    if (status)
-      status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
-  }
-  if (status) {
-    if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
-        !destination_size) {
-      DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
-            "driver size %d destination size %d",
-             src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
-      status = false;
-      c2d.close();
-      buffer_size_req = 0;
-    } else {
-      buffer_size_req = destination_size;
-      if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
-	     buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
-      if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
-            buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+    bool status = true;
+    unsigned int src_size = 0, destination_size = 0;
+    OMX_COLOR_FORMATTYPE drv_color_format;
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+        return false;
     }
-  }
+    if (!enabled) {
+        DEBUG_PRINT_HIGH("\n No color conversion required");
+        return status;
+    }
+    pthread_mutex_lock(&omx->c_lock);
+    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
+            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+        DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
+        status = false;
+        goto fail_update_buf_req;
+    }
+    c2d.close();
+    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
+            omx->drv_ctx.video_resolution.frame_width,
+            NV12_128m,YCbCr420P);
+    if (status) {
+        status = c2d.get_buffer_size(C2D_INPUT,src_size);
+        if (status)
+            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
+    }
+    if (status) {
+        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
+                !destination_size) {
+            DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
+                    "driver size %d destination size %d",
+                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
+            status = false;
+            c2d.close();
+            buffer_size_req = 0;
+        } else {
+            buffer_size_req = destination_size;
+            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
+                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
+            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+        }
+    }
 fail_update_buf_req:
-  pthread_mutex_unlock(&omx->c_lock);
-  return status;
+    pthread_mutex_unlock(&omx->c_lock);
+    return status;
 }
 
 bool omx_vdec::allocate_color_convert_buf::set_color_format(
-  OMX_COLOR_FORMATTYPE dest_color_format)
+        OMX_COLOR_FORMATTYPE dest_color_format)
 {
-  bool status = true;
-  OMX_COLOR_FORMATTYPE drv_color_format;
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
-    return false;
-  }
-  pthread_mutex_lock(&omx->c_lock);
-  if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
-    drv_color_format = (OMX_COLOR_FORMATTYPE)
-    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
-  else {
-    DEBUG_PRINT_ERROR("\n Incorrect color format");
-    status = false;
-  }
-  if (status && (drv_color_format != dest_color_format)) {
-    DEBUG_PRINT_LOW("Enabling C2D\n");
-    if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
-      DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
-      status = false;
-    } else {
-      ColorFormat = OMX_COLOR_FormatYUV420Planar;
-      if (enabled)
-        c2d.destroy();
-      enabled = false;
-      if (!c2d.init()) {
-        DEBUG_PRINT_ERROR("\n open failed for c2d");
-        status = false;
-      } else
-        enabled = true;
+    bool status = true;
+    OMX_COLOR_FORMATTYPE drv_color_format;
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+        return false;
     }
-  } else {
-    if (enabled)
-      c2d.destroy();
-    enabled = false;
-  }
-  pthread_mutex_unlock(&omx->c_lock);
-  return status;
+    pthread_mutex_lock(&omx->c_lock);
+    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+        drv_color_format = (OMX_COLOR_FORMATTYPE)
+            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+    else {
+        DEBUG_PRINT_ERROR("\n Incorrect color format");
+        status = false;
+    }
+    if (status && (drv_color_format != dest_color_format)) {
+        DEBUG_PRINT_LOW("Enabling C2D\n");
+        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
+            DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
+            status = false;
+        } else {
+            ColorFormat = OMX_COLOR_FormatYUV420Planar;
+            if (enabled)
+                c2d.destroy();
+            enabled = false;
+            if (!c2d.init()) {
+                DEBUG_PRINT_ERROR("\n open failed for c2d");
+                status = false;
+            } else
+                enabled = true;
+        }
+    } else {
+        if (enabled)
+            c2d.destroy();
+        enabled = false;
+    }
+    pthread_mutex_unlock(&omx->c_lock);
+    return status;
 }
 
 OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
 {
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return omx->m_out_mem_ptr;
-  return m_out_mem_ptr_client;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
-       (OMX_BUFFERHEADERTYPE *bufadd)
-{
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return bufadd;
-
-  unsigned index = 0;
-  index = bufadd - omx->m_out_mem_ptr;
-  if (index < omx->drv_ctx.op_buf.actualcount) {
-    m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
-    m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
-    bool status;
-    if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
-       pthread_mutex_lock(&omx->c_lock);
-      status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
-                  omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
-                  pmem_baseaddress[index], pmem_baseaddress[index]);
-       pthread_mutex_unlock(&omx->c_lock);
-      m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
-      if (!status){
-        DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
-        m_out_mem_ptr_client[index].nFilledLen = 0;
-        return &m_out_mem_ptr_client[index];
-      }
-    } else
-      m_out_mem_ptr_client[index].nFilledLen = 0;
-    return &m_out_mem_ptr_client[index];
-  }
-  DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
-  return NULL;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
-                                              (OMX_BUFFERHEADERTYPE *bufadd)
-{
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return bufadd;
-  unsigned index = 0;
-  index = bufadd - m_out_mem_ptr_client;
-  if (index < omx->drv_ctx.op_buf.actualcount) {
-    return &omx->m_out_mem_ptr[index];
-  }
-  DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
-  return NULL;
-}
-bool omx_vdec::allocate_color_convert_buf::get_buffer_req
-          (unsigned int &buffer_size)
-{
-  bool status = true;
-  pthread_mutex_lock(&omx->c_lock);
-  if (!enabled)
-    buffer_size = omx->drv_ctx.op_buf.buffer_size;
-  else {
-    if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
-      DEBUG_PRINT_ERROR("\n Get buffer size failed");
-      status = false;
-      goto fail_get_buffer_size;
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
     }
-  }
-  if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+    if (!enabled)
+        return omx->m_out_mem_ptr;
+    return m_out_mem_ptr_client;
+}
+
+    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
+{
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
+    }
+    if (!enabled)
+        return bufadd;
+
+    unsigned index = 0;
+    index = bufadd - omx->m_out_mem_ptr;
+    if (index < omx->drv_ctx.op_buf.actualcount) {
+        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
+        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
+        bool status;
+        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
+            pthread_mutex_lock(&omx->c_lock);
+            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
+                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
+                    pmem_baseaddress[index], pmem_baseaddress[index]);
+            pthread_mutex_unlock(&omx->c_lock);
+            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
+            if (!status) {
+                DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
+                m_out_mem_ptr_client[index].nFilledLen = 0;
+                return &m_out_mem_ptr_client[index];
+            }
+        } else
+            m_out_mem_ptr_client[index].nFilledLen = 0;
+        return &m_out_mem_ptr_client[index];
+    }
+    DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
+    return NULL;
+}
+
+    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
+{
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
+    }
+    if (!enabled)
+        return bufadd;
+    unsigned index = 0;
+    index = bufadd - m_out_mem_ptr_client;
+    if (index < omx->drv_ctx.op_buf.actualcount) {
+        return &omx->m_out_mem_ptr[index];
+    }
+    DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
+    return NULL;
+}
+    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
+(unsigned int &buffer_size)
+{
+    bool status = true;
+    pthread_mutex_lock(&omx->c_lock);
+    if (!enabled)
         buffer_size = omx->drv_ctx.op_buf.buffer_size;
-  if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
-	  buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+    else {
+        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
+            DEBUG_PRINT_ERROR("\n Get buffer size failed");
+            status = false;
+            goto fail_get_buffer_size;
+        }
+    }
+    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+        buffer_size = omx->drv_ctx.op_buf.buffer_size;
+    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
 fail_get_buffer_size:
-  pthread_mutex_unlock(&omx->c_lock);
-  return status;
+    pthread_mutex_unlock(&omx->c_lock);
+    return status;
 }
 OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
-  OMX_BUFFERHEADERTYPE *bufhdr) {
-  unsigned int index = 0;
+        OMX_BUFFERHEADERTYPE *bufhdr)
+{
+    unsigned int index = 0;
 
-  if (!enabled)
-    return omx->free_output_buffer(bufhdr);
-  if (enabled && omx->is_component_secure())
-    return OMX_ErrorNone;
-  if (!allocated_count || !bufhdr) {
-    DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
-    return OMX_ErrorBadParameter;
-  }
-  index = bufhdr - m_out_mem_ptr_client;
-  if (index >= omx->drv_ctx.op_buf.actualcount){
-    DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
-    return OMX_ErrorBadParameter;
-  }
-  if (pmem_fd[index] > 0) {
-    munmap(pmem_baseaddress[index], buffer_size_req);
-    close(pmem_fd[index]);
-  }
-  pmem_fd[index] = -1;
+    if (!enabled)
+        return omx->free_output_buffer(bufhdr);
+    if (enabled && omx->is_component_secure())
+        return OMX_ErrorNone;
+    if (!allocated_count || !bufhdr) {
+        DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
+        return OMX_ErrorBadParameter;
+    }
+    index = bufhdr - m_out_mem_ptr_client;
+    if (index >= omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
+        return OMX_ErrorBadParameter;
+    }
+    if (pmem_fd[index] > 0) {
+        munmap(pmem_baseaddress[index], buffer_size_req);
+        close(pmem_fd[index]);
+    }
+    pmem_fd[index] = -1;
 #ifdef USE_ION
-  omx->free_ion_memory(&op_buf_ion_info[index]);
+    omx->free_ion_memory(&op_buf_ion_info[index]);
 #endif
-  m_heap_ptr[index].video_heap_ptr = NULL;
-  if (allocated_count > 0)
-    allocated_count--;
-  else
-    allocated_count = 0;
-  if (!allocated_count) {
-    pthread_mutex_lock(&omx->c_lock);
-    c2d.close();
-    init_members();
-    pthread_mutex_unlock(&omx->c_lock);
-  }
-  return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
+    m_heap_ptr[index].video_heap_ptr = NULL;
+    if (allocated_count > 0)
+        allocated_count--;
+    else
+        allocated_count = 0;
+    if (!allocated_count) {
+        pthread_mutex_lock(&omx->c_lock);
+        c2d.close();
+        init_members();
+        pthread_mutex_unlock(&omx->c_lock);
+    }
+    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
-  OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
+        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (!enabled){
-    eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
-    return eRet;
-  }
-  if (enabled && omx->is_component_secure()) {
-    DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
-                      omx->is_component_secure());
-    return OMX_ErrorUnsupportedSetting;
-  }
-  if (!bufferHdr || bytes > buffer_size_req) {
-    DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
-    DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
-                      buffer_size_req,bytes);
-    return OMX_ErrorBadParameter;
-  }
-  if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
-    return OMX_ErrorInsufficientResources;
-  }
-  OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
-  eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
-         port,appData,omx->drv_ctx.op_buf.buffer_size);
-  if (eRet != OMX_ErrorNone || !temp_bufferHdr){
-    DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
-    return eRet;
-  }
-  if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
-      omx->drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("\n Invalid header index %d",
-             (temp_bufferHdr - omx->m_out_mem_ptr));
-    return OMX_ErrorUndefined;
-  }
-  unsigned int i = allocated_count;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!enabled) {
+        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+        return eRet;
+    }
+    if (enabled && omx->is_component_secure()) {
+        DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
+                omx->is_component_secure());
+        return OMX_ErrorUnsupportedSetting;
+    }
+    if (!bufferHdr || bytes > buffer_size_req) {
+        DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
+        DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
+                buffer_size_req,bytes);
+        return OMX_ErrorBadParameter;
+    }
+    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
+        return OMX_ErrorInsufficientResources;
+    }
+    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
+    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
+            port,appData,omx->drv_ctx.op_buf.buffer_size);
+    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
+        DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
+        return eRet;
+    }
+    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
+            omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Invalid header index %d",
+                (temp_bufferHdr - omx->m_out_mem_ptr));
+        return OMX_ErrorUndefined;
+    }
+    unsigned int i = allocated_count;
 #ifdef USE_ION
-  op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
-    buffer_size_req,buffer_alignment_req,
-    &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
-    0);
-  pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
-  if (op_buf_ion_info[i].ion_device_fd < 0) {
-    DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
-    return OMX_ErrorInsufficientResources;
-  }
-  pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
-                     PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
+    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
+            buffer_size_req,buffer_alignment_req,
+            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
+            0);
+    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
+    if (op_buf_ion_info[i].ion_device_fd < 0) {
+        DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
+        return OMX_ErrorInsufficientResources;
+    }
+    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
+            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
 
-  if (pmem_baseaddress[i] == MAP_FAILED) {
-    DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
-    close(pmem_fd[i]);
-    omx->free_ion_memory(&op_buf_ion_info[i]);
-    return OMX_ErrorInsufficientResources;
-  }
-  m_heap_ptr[i].video_heap_ptr = new VideoHeap (
-    op_buf_ion_info[i].ion_device_fd,buffer_size_req,
-    pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
+    if (pmem_baseaddress[i] == MAP_FAILED) {
+        DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
+        close(pmem_fd[i]);
+        omx->free_ion_memory(&op_buf_ion_info[i]);
+        return OMX_ErrorInsufficientResources;
+    }
+    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
+            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
+            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
 #endif
-  m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
-  m_pmem_info_client[i].offset = 0;
-  m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
-  m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-  m_platform_list_client[i].nEntries = 1;
-  m_platform_list_client[i].entryList = &m_platform_entry_client[i];
-  m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
-  m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
-  m_out_mem_ptr_client[i].nFilledLen = 0;
-  m_out_mem_ptr_client[i].nFlags = 0;
-  m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
-  m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
-  m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
-  m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
-  m_out_mem_ptr_client[i].pAppPrivate = appData;
-  *bufferHdr = &m_out_mem_ptr_client[i];
-  DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
-  allocated_count++;
-  return eRet;
+    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
+    m_pmem_info_client[i].offset = 0;
+    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
+    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+    m_platform_list_client[i].nEntries = 1;
+    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
+    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
+    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
+    m_out_mem_ptr_client[i].nFilledLen = 0;
+    m_out_mem_ptr_client[i].nFlags = 0;
+    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
+    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
+    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
+    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
+    m_out_mem_ptr_client[i].pAppPrivate = appData;
+    *bufferHdr = &m_out_mem_ptr_client[i];
+    DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
+    allocated_count++;
+    return eRet;
 }
 
 bool omx_vdec::is_component_secure()
 {
-  return secure_mode;
+    return secure_mode;
 }
 
 bool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
 {
-  bool status = true;
-  if (!enabled) {
-    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
-     dest_color_format =  (OMX_COLOR_FORMATTYPE)
-            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
-    else
-      status = false;
-  } else {
-    if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
-      status = false;
-    } else
-      dest_color_format = OMX_COLOR_FormatYUV420Planar;
-  }
-  return status;
+    bool status = true;
+    if (!enabled) {
+        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+            dest_color_format =  (OMX_COLOR_FORMATTYPE)
+                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+        else
+            status = false;
+    } else {
+        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+            status = false;
+        } else
+            dest_color_format = OMX_COLOR_FormatYUV420Planar;
+    }
+    return status;
 }
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
index e04cb0c..1cc9e01 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -121,9 +121,9 @@
 #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
 
 #ifdef _ANDROID_
-    extern "C"{
-        #include<utils/Log.h>
-    }
+extern "C" {
+#include<utils/Log.h>
+}
 #endif//_ANDROID_
 
 #define SZ_4K 0x1000
@@ -136,163 +136,158 @@
 #define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
 void* async_message_thread (void *input)
 {
-  OMX_BUFFERHEADERTYPE *buffer;
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  struct pollfd pfd;
-  struct v4l2_buffer v4l2_buf;
-  memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
-  struct v4l2_event dqevent;
-  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
-  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
-  pfd.fd = omx->drv_ctx.video_driver_fd;
-  int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
-  DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
-  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
-  while (1)
-  {
-    rc = poll(&pfd, 1, POLL_TIMEOUT);
-    if (!rc) {
-      DEBUG_PRINT_ERROR("Poll timedout\n");
-      break;
-    } else if (rc < 0) {
-      DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
-      break;
+    OMX_BUFFERHEADERTYPE *buffer;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    struct pollfd pfd;
+    struct v4l2_buffer v4l2_buf;
+    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
+    struct v4l2_event dqevent;
+    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
+    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
+    pfd.fd = omx->drv_ctx.video_driver_fd;
+    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
+    DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
+    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
+    while (1) {
+        rc = poll(&pfd, 1, POLL_TIMEOUT);
+        if (!rc) {
+            DEBUG_PRINT_ERROR("Poll timedout\n");
+            break;
+        } else if (rc < 0) {
+            DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
+            break;
+        }
+        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
+            struct vdec_msginfo vdec_msg;
+            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+            v4l2_buf.length = omx->drv_ctx.num_planes;
+            v4l2_buf.m.planes = plane;
+            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
+                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
+                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
+                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
+                    (uint64_t)v4l2_buf.timestamp.tv_usec;
+                if (vdec_msg.msgdata.output_frame.len) {
+                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
+                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
+                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
+                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
+                }
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            }
+        }
+        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
+            struct vdec_msginfo vdec_msg;
+            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+            v4l2_buf.length = 1;
+            v4l2_buf.m.planes = plane;
+            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            }
+        }
+        if (pfd.revents & POLLPRI) {
+            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved insufficient\n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
+                DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
+                break;
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
+                struct vdec_msginfo vdec_msg;
+                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
+                vdec_msg.status_code=VDEC_S_SUCCESS;
+                DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
+                if (omx->async_message_process(input,&vdec_msg) < 0) {
+                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
+                    break;
+                }
+            } else {
+                DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
+                continue;
+            }
+        }
     }
-    if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
-      struct vdec_msginfo vdec_msg;
-      v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-      v4l2_buf.memory = V4L2_MEMORY_USERPTR;
-      v4l2_buf.length = omx->drv_ctx.num_planes;
-      v4l2_buf.m.planes = plane;
-      while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
-        vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
-        vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
-        vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
-        vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
-          (uint64_t)v4l2_buf.timestamp.tv_usec;
-        if (vdec_msg.msgdata.output_frame.len) {
-            vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
-            vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
-            vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
-            vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
-        }
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      }
-    }
-    if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
-      struct vdec_msginfo vdec_msg;
-      v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-      v4l2_buf.memory = V4L2_MEMORY_USERPTR;
-      v4l2_buf.length = 1;
-      v4l2_buf.m.planes = plane;
-      while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
-        vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      }
-    }
-    if (pfd.revents & POLLPRI){
-      rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
-      if(dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved insufficient\n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-        vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
-        DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
-        break;
-      } else if(dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
-        struct vdec_msginfo vdec_msg;
-        vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
-        vdec_msg.status_code=VDEC_S_SUCCESS;
-        DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
-        if (omx->async_message_process(input,&vdec_msg) < 0) {
-          DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
-          break;
-        }
-      } else {
-        DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
-        continue;
-      }
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
-  return NULL;
+    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
+    return NULL;
 }
 
 void* message_thread(void *input)
 {
-  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
-  unsigned char id;
-  int n;
+    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
+    unsigned char id;
+    int n;
 
-  DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
-  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
-  while (1)
-  {
+    DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
+    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
+    while (1) {
 
-    n = read(omx->m_pipe_in, &id, 1);
+        n = read(omx->m_pipe_in, &id, 1);
 
-    if(0 == n)
-    {
-      break;
+        if (0 == n) {
+            break;
+        }
+
+        if (1 == n) {
+            omx->process_event_cb(omx, id);
+        }
+        if ((n < 0) && (errno != EINTR)) {
+            DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
+            break;
+        }
     }
-
-    if (1 == n)
-    {
-        omx->process_event_cb(omx, id);
-    }
-    if ((n < 0) && (errno != EINTR))
-    {
-      DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
-      break;
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
-  return 0;
+    DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
+    return 0;
 }
 
 void post_message(omx_vdec *omx, unsigned char id)
 {
-      int ret_value;
-      DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
-      ret_value = write(omx->m_pipe_out, &id, 1);
-      DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
+    int ret_value;
+    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
+    ret_value = write(omx->m_pipe_out, &id, 1);
+    DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
 }
 
 // omx_cmd_queue destructor
 omx_vdec::omx_cmd_queue::~omx_cmd_queue()
 {
-  // Nothing to do
+    // Nothing to do
 }
 
 // omx cmd queue constructor
@@ -304,49 +299,41 @@
 // omx cmd queue insert
 bool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
 {
-  bool ret = true;
-  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
-  {
-    m_q[m_write].id       = id;
-    m_q[m_write].param1   = p1;
-    m_q[m_write].param2   = p2;
-    m_write++;
-    m_size ++;
-    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_write = 0;
+    bool ret = true;
+    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
+        m_q[m_write].id       = id;
+        m_q[m_write].param1   = p1;
+        m_q[m_write].param2   = p2;
+        m_write++;
+        m_size ++;
+        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_write = 0;
+        }
+    } else {
+        ret = false;
+        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
     }
-  }
-  else
-  {
-    ret = false;
-    DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
-  }
-  return ret;
+    return ret;
 }
 
 // omx cmd queue pop
 bool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
 {
-  bool ret = true;
-  if (m_size > 0)
-  {
-    *id = m_q[m_read].id;
-    *p1 = m_q[m_read].param1;
-    *p2 = m_q[m_read].param2;
-    // Move the read pointer ahead
-    ++m_read;
-    --m_size;
-    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_read = 0;
+    bool ret = true;
+    if (m_size > 0) {
+        *id = m_q[m_read].id;
+        *p1 = m_q[m_read].param1;
+        *p2 = m_q[m_read].param2;
+        // Move the read pointer ahead
+        ++m_read;
+        --m_size;
+        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_read = 0;
+        }
+    } else {
+        ret = false;
     }
-  }
-  else
-  {
-    ret = false;
-  }
-  return ret;
+    return ret;
 }
 
 // Retrieve the first mesg type in the queue
@@ -358,116 +345,104 @@
 #ifdef _ANDROID_
 omx_vdec::ts_arr_list::ts_arr_list()
 {
-  //initialize timestamps array
-  memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
+    //initialize timestamps array
+    memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
 }
 omx_vdec::ts_arr_list::~ts_arr_list()
 {
-  //free m_ts_arr_list?
+    //free m_ts_arr_list?
 }
 
 bool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
 {
-  bool ret = true;
-  bool duplicate_ts = false;
-  int idx = 0;
+    bool ret = true;
+    bool duplicate_ts = false;
+    int idx = 0;
 
-  //insert at the first available empty location
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
-    if (!m_ts_arr_list[idx].valid)
-    {
-      //found invalid or empty entry, save timestamp
-      m_ts_arr_list[idx].valid = true;
-      m_ts_arr_list[idx].timestamp = ts;
-      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
-                       ts, idx);
-      break;
+    //insert at the first available empty location
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+        if (!m_ts_arr_list[idx].valid) {
+            //found invalid or empty entry, save timestamp
+            m_ts_arr_list[idx].valid = true;
+            m_ts_arr_list[idx].timestamp = ts;
+            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
+                    ts, idx);
+            break;
+        }
     }
-  }
 
-  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
-  {
-    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
-    ret = false;
-  }
-  return ret;
+    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
+        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
+        ret = false;
+    }
+    return ret;
 }
 
 bool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
 {
-  bool ret = true;
-  int min_idx = -1;
-  OMX_TICKS min_ts = 0;
-  int idx = 0;
+    bool ret = true;
+    int min_idx = -1;
+    OMX_TICKS min_ts = 0;
+    int idx = 0;
 
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
 
-    if (m_ts_arr_list[idx].valid)
-    {
-      //found valid entry, save index
-      if (min_idx < 0)
-      {
-        //first valid entry
-        min_ts = m_ts_arr_list[idx].timestamp;
-        min_idx = idx;
-      }
-      else if (m_ts_arr_list[idx].timestamp < min_ts)
-      {
-        min_ts = m_ts_arr_list[idx].timestamp;
-        min_idx = idx;
-      }
+        if (m_ts_arr_list[idx].valid) {
+            //found valid entry, save index
+            if (min_idx < 0) {
+                //first valid entry
+                min_ts = m_ts_arr_list[idx].timestamp;
+                min_idx = idx;
+            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
+                min_ts = m_ts_arr_list[idx].timestamp;
+                min_idx = idx;
+            }
+        }
+
     }
 
-  }
+    if (min_idx < 0) {
+        //no valid entries found
+        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
+        ts = 0;
+        ret = false;
+    } else {
+        ts = m_ts_arr_list[min_idx].timestamp;
+        m_ts_arr_list[min_idx].valid = false;
+        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
+                ts, min_idx);
+    }
 
-  if (min_idx < 0)
-  {
-    //no valid entries found
-    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
-    ts = 0;
-    ret = false;
-  }
-  else
-  {
-    ts = m_ts_arr_list[min_idx].timestamp;
-    m_ts_arr_list[min_idx].valid = false;
-    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
-                     ts, min_idx);
-  }
-
-  return ret;
+    return ret;
 
 }
 
 
 bool omx_vdec::ts_arr_list::reset_ts_list()
 {
-  bool ret = true;
-  int idx = 0;
+    bool ret = true;
+    int idx = 0;
 
-  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
-  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
-  {
-    m_ts_arr_list[idx].valid = false;
-  }
-  return ret;
+    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
+    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+        m_ts_arr_list[idx].valid = false;
+    }
+    return ret;
 }
 #endif
 
 // factory function executed by the core to create instances
 void *get_omx_component_factory_fn(void)
 {
-  return (new omx_vdec);
+    return (new omx_vdec);
 }
 
 #ifdef _ANDROID_
 #ifdef USE_ION
 VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
-                     struct ion_handle *handle, int ionMapfd)
+        struct ion_handle *handle, int ionMapfd)
 {
-//    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
+    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
 }
 #else
 VideoHeap::VideoHeap(int fd, size_t size, void* base)
@@ -478,859 +453,760 @@
 #endif
 #endif // _ANDROID_
 /* ======================================================================
-FUNCTION
-  omx_vdec::omx_vdec
+   FUNCTION
+   omx_vdec::omx_vdec
 
-DESCRIPTION
-  Constructor
+   DESCRIPTION
+   Constructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_vdec::omx_vdec(): m_error_propogated(false),
-	m_state(OMX_StateInvalid),
-	m_app_data(NULL),
-	m_inp_mem_ptr(NULL),
-	m_out_mem_ptr(NULL),
-	m_inp_err_count(0),
-	input_flush_progress (false),
-	output_flush_progress (false),
-	input_use_buffer (false),
-	output_use_buffer (false),
-	ouput_egl_buffers(false),
-	m_use_output_pmem(OMX_FALSE),
-	m_out_mem_region_smi(OMX_FALSE),
-	m_out_pvt_entry_pmem(OMX_FALSE),
-	pending_input_buffers(0),
-	pending_output_buffers(0),
-	m_out_bm_count(0),
-	m_inp_bm_count(0),
-	m_inp_bPopulated(OMX_FALSE),
-	m_out_bPopulated(OMX_FALSE),
-	m_flags(0),
+    m_state(OMX_StateInvalid),
+    m_app_data(NULL),
+    m_inp_mem_ptr(NULL),
+    m_out_mem_ptr(NULL),
+    m_inp_err_count(0),
+    input_flush_progress (false),
+    output_flush_progress (false),
+    input_use_buffer (false),
+    output_use_buffer (false),
+    ouput_egl_buffers(false),
+    m_use_output_pmem(OMX_FALSE),
+    m_out_mem_region_smi(OMX_FALSE),
+    m_out_pvt_entry_pmem(OMX_FALSE),
+    pending_input_buffers(0),
+    pending_output_buffers(0),
+    m_out_bm_count(0),
+    m_inp_bm_count(0),
+    m_inp_bPopulated(OMX_FALSE),
+    m_out_bPopulated(OMX_FALSE),
+    m_flags(0),
 #ifdef _ANDROID_
-	m_heap_ptr(NULL),
+    m_heap_ptr(NULL),
 #endif
-	m_inp_bEnabled(OMX_TRUE),
-	m_out_bEnabled(OMX_TRUE),
-	m_in_alloc_cnt(0),
-	m_platform_list(NULL),
-	m_platform_entry(NULL),
-	m_pmem_info(NULL),
-	arbitrary_bytes (true),
-	psource_frame (NULL),
-	pdest_frame (NULL),
-	m_inp_heap_ptr (NULL),
-	m_phdr_pmem_ptr(NULL),
-	m_heap_inp_bm_count (0),
-	codec_type_parse ((codec_type)0),
-	first_frame_meta (true),
-	frame_count (0),
-	nal_count (0),
-	nal_length(0),
-	look_ahead_nal (false),
-	first_frame(0),
-	first_buffer(NULL),
-	first_frame_size (0),
-	m_device_file_ptr(NULL),
-	m_vc1_profile((vc1_profile_type)0),
-	m_profile(0),
-	h264_last_au_ts(LLONG_MAX),
-	h264_last_au_flags(0),
-	prev_ts(LLONG_MAX),
-	rst_prev_ts(true),
-	frm_int(0),
-	m_disp_hor_size(0),
-	m_disp_vert_size(0),
-	in_reconfig(false),
-	m_display_id(NULL),
-	h264_parser(NULL),
-	client_extradata(0),
-	m_reject_avc_1080p_mp (0),
+    m_inp_bEnabled(OMX_TRUE),
+    m_out_bEnabled(OMX_TRUE),
+    m_in_alloc_cnt(0),
+    m_platform_list(NULL),
+    m_platform_entry(NULL),
+    m_pmem_info(NULL),
+    arbitrary_bytes (true),
+    psource_frame (NULL),
+    pdest_frame (NULL),
+    m_inp_heap_ptr (NULL),
+    m_phdr_pmem_ptr(NULL),
+    m_heap_inp_bm_count (0),
+    codec_type_parse ((codec_type)0),
+    first_frame_meta (true),
+    frame_count (0),
+    nal_count (0),
+    nal_length(0),
+    look_ahead_nal (false),
+    first_frame(0),
+    first_buffer(NULL),
+    first_frame_size (0),
+    m_device_file_ptr(NULL),
+    m_vc1_profile((vc1_profile_type)0),
+    m_profile(0),
+    h264_last_au_ts(LLONG_MAX),
+    h264_last_au_flags(0),
+    prev_ts(LLONG_MAX),
+    rst_prev_ts(true),
+    frm_int(0),
+    m_disp_hor_size(0),
+    m_disp_vert_size(0),
+    in_reconfig(false),
+    m_display_id(NULL),
+    h264_parser(NULL),
+    client_extradata(0),
+    m_reject_avc_1080p_mp (0),
 #ifdef _ANDROID_
-	m_enable_android_native_buffers(OMX_FALSE),
-	m_use_android_native_buffers(OMX_FALSE),
-	iDivXDrmDecrypt(NULL),
+    m_enable_android_native_buffers(OMX_FALSE),
+    m_use_android_native_buffers(OMX_FALSE),
+    iDivXDrmDecrypt(NULL),
 #endif
-	m_desc_buffer_ptr(NULL),
-	secure_mode(false),
-	client_set_fps(false)
+    m_desc_buffer_ptr(NULL),
+    secure_mode(false),
+    client_set_fps(false)
 {
-  /* Assumption is that , to begin with , we have all the frames with decoder */
-  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
+    /* Assumption is that , to begin with , we have all the frames with decoder */
+    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
 #ifdef _ANDROID_
-  char property_value[PROPERTY_VALUE_MAX] = {0};
-  property_get("vidc.dec.debug.perf", property_value, "0");
-  perf_flag = atoi(property_value);
-  if (perf_flag)
-  {
-    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
-    dec_time.start();
-    proc_frms = latency = 0;
-  }
-  prev_n_filled_len = 0;
-  property_value[0] = '\0';
-  property_get("vidc.dec.debug.ts", property_value, "0");
-  m_debug_timestamp = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
-  if (m_debug_timestamp)
-  {
-    time_stamp_dts.set_timestamp_reorder_mode(true);
-    time_stamp_dts.enable_debug_print(true);
-  }
+    char property_value[PROPERTY_VALUE_MAX] = {0};
+    property_get("vidc.dec.debug.perf", property_value, "0");
+    perf_flag = atoi(property_value);
+    if (perf_flag) {
+        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
+        dec_time.start();
+        proc_frms = latency = 0;
+    }
+    prev_n_filled_len = 0;
+    property_value[0] = '\0';
+    property_get("vidc.dec.debug.ts", property_value, "0");
+    m_debug_timestamp = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
+    if (m_debug_timestamp) {
+        time_stamp_dts.set_timestamp_reorder_mode(true);
+        time_stamp_dts.enable_debug_print(true);
+    }
 
-  property_value[0] = '\0';
-  property_get("vidc.dec.debug.concealedmb", property_value, "0");
-  m_debug_concealedmb = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
+    property_value[0] = '\0';
+    property_get("vidc.dec.debug.concealedmb", property_value, "0");
+    m_debug_concealedmb = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
 
-  property_value[0] = '\0';
-  property_get("vidc.dec.profile.check", property_value, "0");
-  m_reject_avc_1080p_mp = atoi(property_value);
-  DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
+    property_value[0] = '\0';
+    property_get("vidc.dec.profile.check", property_value, "0");
+    m_reject_avc_1080p_mp = atoi(property_value);
+    DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
 
 #endif
-  memset(&m_cmp,0,sizeof(m_cmp));
-  memset(&m_cb,0,sizeof(m_cb));
-  memset (&drv_ctx,0,sizeof(drv_ctx));
-  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
-  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
-  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-  m_demux_entries = 0;
-  msg_thread_id = 0;
-  async_thread_id = 0;
-  msg_thread_created = false;
-  async_thread_created = false;
+    memset(&m_cmp,0,sizeof(m_cmp));
+    memset(&m_cb,0,sizeof(m_cb));
+    memset (&drv_ctx,0,sizeof(drv_ctx));
+    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
+    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
+    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+    m_demux_entries = 0;
+    msg_thread_id = 0;
+    async_thread_id = 0;
+    msg_thread_created = false;
+    async_thread_created = false;
 #ifdef _ANDROID_ICS_
-  memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
 #endif
-  memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
-  drv_ctx.timestamp_adjust = false;
-  drv_ctx.video_driver_fd = -1;
-  m_vendor_config.pData = NULL;
-  pthread_mutex_init(&m_lock, NULL);
-  pthread_mutex_init(&c_lock, NULL);
-  sem_init(&m_cmd_lock,0,0);
-  streaming[CAPTURE_PORT] =
-      streaming[OUTPUT_PORT] = false;
+    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
+    drv_ctx.timestamp_adjust = false;
+    drv_ctx.video_driver_fd = -1;
+    m_vendor_config.pData = NULL;
+    pthread_mutex_init(&m_lock, NULL);
+    pthread_mutex_init(&c_lock, NULL);
+    sem_init(&m_cmd_lock,0,0);
+    streaming[CAPTURE_PORT] =
+        streaming[OUTPUT_PORT] = false;
 #ifdef _ANDROID_
-  char extradata_value[PROPERTY_VALUE_MAX] = {0};
-  property_get("vidc.dec.debug.extradata", extradata_value, "0");
-  m_debug_extradata = atoi(extradata_value);
-  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
+    char extradata_value[PROPERTY_VALUE_MAX] = {0};
+    property_get("vidc.dec.debug.extradata", extradata_value, "0");
+    m_debug_extradata = atoi(extradata_value);
+    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
 #endif
-  m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
-  client_buffers.set_vdec_client(this);
+    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
+    client_buffers.set_vdec_client(this);
 }
 
 static const int event_type[] = {
-	V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
-	V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
-	V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
-	V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
-	V4L2_EVENT_MSM_VIDC_SYS_ERROR
+    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
+    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
+    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
+    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
+    V4L2_EVENT_MSM_VIDC_SYS_ERROR
 };
 
 static OMX_ERRORTYPE subscribe_to_events(int fd)
 {
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_event_subscription sub;
-	int array_sz = sizeof(event_type)/sizeof(int);
-	int i,rc;
-	if (fd < 0) {
-		printf("Invalid input: %d\n", fd);
-		return OMX_ErrorBadParameter;
-	}
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_event_subscription sub;
+    int array_sz = sizeof(event_type)/sizeof(int);
+    int i,rc;
+    if (fd < 0) {
+        printf("Invalid input: %d\n", fd);
+        return OMX_ErrorBadParameter;
+    }
 
-	for (i = 0; i < array_sz; ++i) {
-		memset(&sub, 0, sizeof(sub));
-		sub.type = event_type[i];
-		rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
-		if (rc) {
-			printf("Failed to subscribe event: 0x%x\n", sub.type);
-			break;
-		}
-	}
-	if (i < array_sz) {
-		for (--i; i >=0 ; i--) {
-			memset(&sub, 0, sizeof(sub));
-			sub.type = event_type[i];
-			rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
-			if (rc)
-				printf("Failed to unsubscribe event: 0x%x\n", sub.type);
-		}
-		eRet = OMX_ErrorNotImplemented;
-	}
-	return eRet;
+    for (i = 0; i < array_sz; ++i) {
+        memset(&sub, 0, sizeof(sub));
+        sub.type = event_type[i];
+        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+        if (rc) {
+            printf("Failed to subscribe event: 0x%x\n", sub.type);
+            break;
+        }
+    }
+    if (i < array_sz) {
+        for (--i; i >=0 ; i--) {
+            memset(&sub, 0, sizeof(sub));
+            sub.type = event_type[i];
+            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+            if (rc)
+                printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+        }
+        eRet = OMX_ErrorNotImplemented;
+    }
+    return eRet;
 }
 
 
 static OMX_ERRORTYPE unsubscribe_to_events(int fd)
 {
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_event_subscription sub;
-	int array_sz = sizeof(event_type)/sizeof(int);
-	int i,rc;
-	if (fd < 0) {
-		printf("Invalid input: %d\n", fd);
-		return OMX_ErrorBadParameter;
-	}
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_event_subscription sub;
+    int array_sz = sizeof(event_type)/sizeof(int);
+    int i,rc;
+    if (fd < 0) {
+        printf("Invalid input: %d\n", fd);
+        return OMX_ErrorBadParameter;
+    }
 
-	for (i = 0; i < array_sz; ++i) {
-		memset(&sub, 0, sizeof(sub));
-		sub.type = event_type[i];
-		rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
-		if (rc) {
-			printf("Failed to unsubscribe event: 0x%x\n", sub.type);
-			break;
-		}
-	}
-	return eRet;
+    for (i = 0; i < array_sz; ++i) {
+        memset(&sub, 0, sizeof(sub));
+        sub.type = event_type[i];
+        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+        if (rc) {
+            printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+            break;
+        }
+    }
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::~omx_vdec
+   FUNCTION
+   omx_vdec::~omx_vdec
 
-DESCRIPTION
-  Destructor
+   DESCRIPTION
+   Destructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_vdec::~omx_vdec()
 {
-  m_pmem_info = NULL;
-  struct v4l2_decoder_cmd dec;
-  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
-  if(m_pipe_in) close(m_pipe_in);
-  if(m_pipe_out) close(m_pipe_out);
-  m_pipe_in = -1;
-  m_pipe_out = -1;
-  DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
-  if (msg_thread_created)
-    pthread_join(msg_thread_id,NULL);
-  DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
-  dec.cmd = V4L2_DEC_CMD_STOP;
-  if (drv_ctx.video_driver_fd >=0 ) {
-    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
-      DEBUG_PRINT_ERROR("\n STOP Command failed\n");
-  }
-  if (async_thread_created)
-    pthread_join(async_thread_id,NULL);
-  unsubscribe_to_events(drv_ctx.video_driver_fd);
-  close(drv_ctx.video_driver_fd);
-  pthread_mutex_destroy(&m_lock);
-  pthread_mutex_destroy(&c_lock);
-  sem_destroy(&m_cmd_lock);
-  if (perf_flag)
-  {
-    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
-    dec_time.end();
-  }
-  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
+    m_pmem_info = NULL;
+    struct v4l2_decoder_cmd dec;
+    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
+    if (m_pipe_in) close(m_pipe_in);
+    if (m_pipe_out) close(m_pipe_out);
+    m_pipe_in = -1;
+    m_pipe_out = -1;
+    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
+    if (msg_thread_created)
+        pthread_join(msg_thread_id,NULL);
+    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
+    dec.cmd = V4L2_DEC_CMD_STOP;
+    if (drv_ctx.video_driver_fd >=0 ) {
+        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
+            DEBUG_PRINT_ERROR("\n STOP Command failed\n");
+    }
+    if (async_thread_created)
+        pthread_join(async_thread_id,NULL);
+    unsubscribe_to_events(drv_ctx.video_driver_fd);
+    close(drv_ctx.video_driver_fd);
+    pthread_mutex_destroy(&m_lock);
+    pthread_mutex_destroy(&c_lock);
+    sem_destroy(&m_cmd_lock);
+    if (perf_flag) {
+        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
+        dec_time.end();
+    }
+    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
 }
 
-int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) {
-	struct v4l2_requestbuffers bufreq;
-	int rc = 0;
-	if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
-		bufreq.memory = V4L2_MEMORY_USERPTR;
-		bufreq.count = 0;
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
-	}
-	return rc;
+int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
+{
+    struct v4l2_requestbuffers bufreq;
+    int rc = 0;
+    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+        bufreq.memory = V4L2_MEMORY_USERPTR;
+        bufreq.count = 0;
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+    }
+    return rc;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::OMXCntrlProcessMsgCb
+   FUNCTION
+   omx_vdec::OMXCntrlProcessMsgCb
 
-DESCRIPTION
-  IL Client callbacks are generated through this routine. The decoder
-  provides the thread context for this routine.
+   DESCRIPTION
+   IL Client callbacks are generated through this routine. The decoder
+   provides the thread context for this routine.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
 {
-  signed p1; // Parameter - 1
-  signed p2; // Parameter - 2
-  unsigned ident;
-  unsigned qsize=0; // qsize
-  omx_vdec *pThis = (omx_vdec *) ctxt;
+    signed p1; // Parameter - 1
+    signed p2; // Parameter - 2
+    unsigned ident;
+    unsigned qsize=0; // qsize
+    omx_vdec *pThis = (omx_vdec *) ctxt;
 
-  if(!pThis)
-  {
-    DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
-        __func__);
-    return;
-  }
-
-  // Protect the shared queue data structure
-  do
-  {
-    /*Read the message id's from the queue*/
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if(qsize)
-    {
-      pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+    if (!pThis) {
+        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
+                __func__);
+        return;
     }
 
-    if (qsize == 0 && pThis->m_state != OMX_StatePause)
-    {
-      qsize = pThis->m_ftb_q.m_size;
-      if (qsize)
-      {
-        pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
-      }
-    }
-
-    if (qsize == 0 && pThis->m_state != OMX_StatePause)
-    {
-      qsize = pThis->m_etb_q.m_size;
-      if (qsize)
-      {
-        pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
-      }
-    }
-    pthread_mutex_unlock(&pThis->m_lock);
-
-    /*process message if we have one*/
-    if(qsize > 0)
-    {
-      id = ident;
-      switch (id)
-      {
-        case OMX_COMPONENT_GENERATE_EVENT:
-          if (pThis->m_cb.EventHandler)
-          {
-            switch (p1)
-            {
-              case OMX_CommandStateSet:
-                pThis->m_state = (OMX_STATETYPE) p2;
-                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
-                    pThis->m_state);
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventCmdComplete, p1, p2, NULL);
-                break;
-
-              case OMX_EventError:
-                if(p2 == OMX_StateInvalid)
-                {
-                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
-                    pThis->m_state = (OMX_STATETYPE) p2;
-                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
-                }
-                else if (p2 == OMX_ErrorHardware)
-                {
-                   pThis->omx_report_error();
-                }
-                else
-		  {		
-                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventError, p2, (OMX_U32)NULL, NULL );
-                }
-                break;
-
-              case OMX_CommandPortDisable:
-                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
-                if (BITMASK_PRESENT(&pThis->m_flags,
-                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
-                {
-                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
-                  break;
-                }
-                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX)
-                {
-				  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-				  pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
-				  if(release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
-					  DEBUG_PRINT_HIGH("Failed to release output buffers\n");
-				  OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
-				  pThis->in_reconfig = false;
-                  if(eRet !=  OMX_ErrorNone)
-                  {
-                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
-                      pThis->omx_report_error();
-                      break;
-                  }
-                }
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                      OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-              case OMX_CommandPortEnable:
-                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
-                                      OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-
-              default:
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                         OMX_EventCmdComplete, p1, p2, NULL );
-                break;
-
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
-          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
-              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
-            pThis->omx_report_error ();
-          }
-      break;
-        case OMX_COMPONENT_GENERATE_ETB:
-          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
-            pThis->omx_report_error ();
-          }
-         break;
-
-        case OMX_COMPONENT_GENERATE_FTB:
-          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-          {
-             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
-             pThis->omx_report_error ();
-          }
-        break;
-
-        case OMX_COMPONENT_GENERATE_COMMAND:
-          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
-                                    (OMX_U32)p2,(OMX_PTR)NULL);
-          break;
-
-        case OMX_COMPONENT_GENERATE_EBD:
-
-          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
-          {
-            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
-            pThis->omx_report_error ();
-          }
-          else
-          {
-            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
-            {
-              pThis->m_inp_err_count++;
-              pThis->time_stamp_dts.remove_time_stamp(
-              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
-              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-                ?true:false);
-            }
-            else
-            {
-              pThis->m_inp_err_count = 0;
-            }
-            if ( pThis->empty_buffer_done(&pThis->m_cmp,
-                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-            {
-               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
-               pThis->omx_report_error ();
-            }
-            if(pThis->m_inp_err_count >= MAX_INPUT_ERROR)
-            {
-               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
-               pThis->omx_report_error ();
-            }
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
-          {
-            int64_t *timestamp = (int64_t *)p1;
-            if (p1)
-            {
-              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
-              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-              ?true:false);
-              free(timestamp);
-            }
-          }
-          break;
-        case OMX_COMPONENT_GENERATE_FBD:
-          if (p2 != VDEC_S_SUCCESS)
-          {
-            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
-            pThis->omx_report_error ();
-          }
-          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
-                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-          {
-            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
-            pThis->omx_report_error ();
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
-          DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
-          if (!pThis->input_flush_progress)
-          {
-            DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
-          }
-          else
-          {
-            pThis->execute_input_flush();
-            if (pThis->m_cb.EventHandler)
-            {
-              if (p2 != VDEC_S_SUCCESS)
-              {
-                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
-                pThis->omx_report_error ();
-              }
-              else
-              {
-                /*Check if we need generate event for Flush done*/
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
-                {
-                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
-                  DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
-                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                           OMX_EventCmdComplete,OMX_CommandFlush,
-                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
-                }
-                if (BITMASK_PRESENT(&pThis->m_flags,
-                                         OMX_COMPONENT_IDLE_PENDING))
-                {
-                   if(pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
-                           DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
-						   pThis->omx_report_error ();
-				   } else {
-					   pThis->streaming[OUTPUT_PORT] = false;
-				   }
-                  if (!pThis->output_flush_progress)
-                  {
-                     DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
-					 pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
-							 OMX_COMPONENT_GENERATE_STOP_DONE);
-                  }
-                }
-              }
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
-          DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
-          if (!pThis->output_flush_progress)
-          {
-            DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
-          }
-          else
-          {
-            pThis->execute_output_flush();
-            if (pThis->m_cb.EventHandler)
-            {
-              if (p2 != VDEC_S_SUCCESS)
-              {
-                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
-                pThis->omx_report_error ();
-              }
-              else
-              {
-                /*Check if we need generate event for Flush done*/
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
-                {
-                  DEBUG_PRINT_LOW("\n Notify Output Flush done");
-                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                           OMX_EventCmdComplete,OMX_CommandFlush,
-                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
-                }
-                if(BITMASK_PRESENT(&pThis->m_flags,
-                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
-                {
-                  DEBUG_PRINT_LOW("\n Internal flush complete");
-                  BITMASK_CLEAR (&pThis->m_flags,
-                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
-                  if (BITMASK_PRESENT(&pThis->m_flags,
-                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
-                  {
-                    pThis->post_event(OMX_CommandPortDisable,
-                               OMX_CORE_OUTPUT_PORT_INDEX,
-                               OMX_COMPONENT_GENERATE_EVENT);
-                    BITMASK_CLEAR (&pThis->m_flags,
-                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
-
-                  }
-                }
-
-                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
-                {
-                   if(pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
-                           DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
-						   pThis->omx_report_error ();
-						   break;
-                   }
-				   pThis->streaming[CAPTURE_PORT] = false;
-                  if (!pThis->input_flush_progress)
-                  {
-                    DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
-					 pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
-							 OMX_COMPONENT_GENERATE_STOP_DONE);
-                  }
-                }
-              }
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_START_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
-
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n Move to executing");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-                pThis->m_state = OMX_StateExecuting;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StateExecuting, NULL);
-              }
-              else if (BITMASK_PRESENT(&pThis->m_flags,
-                                       OMX_COMPONENT_PAUSE_PENDING))
-              {
-                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
-                           VDEC_IOCTL_CMD_PAUSE,NULL ) < */0)
-                {
-                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
-                  pThis->omx_report_error ();
-                }
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
-          }
-          break;
-
-        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              pThis->complete_pending_buffer_done_cbs();
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
-                //Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
-                pThis->m_state = OMX_StatePause;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StatePause, NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_RESUME_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-                pThis->m_state = OMX_StateExecuting;
-                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                       OMX_EventCmdComplete,OMX_CommandStateSet,
-                                       OMX_StateExecuting,NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_STOP_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
-          if (pThis->m_cb.EventHandler)
-          {
-            if (p2 != VDEC_S_SUCCESS)
-            {
-              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
-              pThis->omx_report_error ();
-            }
-            else
-            {
-              pThis->complete_pending_buffer_done_cbs();
-              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
-              {
-                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
-                // Send the callback now
-                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
-                pThis->m_state = OMX_StateIdle;
-                DEBUG_PRINT_LOW("\n Move to Idle State");
-                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
-                                         OMX_EventCmdComplete,OMX_CommandStateSet,
-                                         OMX_StateIdle,NULL);
-              }
-            }
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          break;
-
-        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
-
-          if (p2 == OMX_IndexParamPortDefinition) {
-            pThis->in_reconfig = true;
-          }
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                OMX_EventPortSettingsChanged, p1, p2, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-
-          if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
-          {
-            OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
-            OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
-            if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
-                format = OMX_InterlaceInterleaveFrameTopFieldFirst;
-            else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
-                format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
-            else //unsupported interlace format; raise a error
-                event = OMX_EventError;
-            if (pThis->m_cb.EventHandler) {
-              pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                  event, format, 0, NULL );
-            } else {
-              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-            }
-          }
-        break;
-
-        case OMX_COMPONENT_GENERATE_EOS_DONE:
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
-                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
-          pThis->prev_ts = LLONG_MAX;
-          pThis->rst_prev_ts = true;
-          break;
-
-        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
-          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
-          pThis->omx_report_error ();
-          break;
-
-        case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
-          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING\n");
-          pThis->omx_report_unsupported_setting();
-          break;
-
-        case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
-        {
-          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
-          if (pThis->m_cb.EventHandler) {
-            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
-          } else {
-            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
-          }
+    // Protect the shared queue data structure
+    do {
+        /*Read the message id's from the queue*/
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
+        if (qsize) {
+            pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
         }
-        default:
-          break;
+
+        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+            qsize = pThis->m_ftb_q.m_size;
+            if (qsize) {
+                pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+            }
         }
-      }
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if (pThis->m_state != OMX_StatePause)
-        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
-    pthread_mutex_unlock(&pThis->m_lock);
-  }
-  while(qsize>0);
+
+        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+            qsize = pThis->m_etb_q.m_size;
+            if (qsize) {
+                pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+            }
+        }
+        pthread_mutex_unlock(&pThis->m_lock);
+
+        /*process message if we have one*/
+        if (qsize > 0) {
+            id = ident;
+            switch (id) {
+                case OMX_COMPONENT_GENERATE_EVENT:
+                    if (pThis->m_cb.EventHandler) {
+                        switch (p1) {
+                            case OMX_CommandStateSet:
+                                pThis->m_state = (OMX_STATETYPE) p2;
+                                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
+                                        pThis->m_state);
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL);
+                                break;
+
+                            case OMX_EventError:
+                                if (p2 == OMX_StateInvalid) {
+                                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
+                                    pThis->m_state = (OMX_STATETYPE) p2;
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
+                                } else if (p2 == OMX_ErrorHardware) {
+                                    pThis->omx_report_error();
+                                } else {
+                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
+                                }
+                                break;
+
+                            case OMX_CommandPortDisable:
+                                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
+                                if (BITMASK_PRESENT(&pThis->m_flags,
+                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+                                    break;
+                                }
+                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
+                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
+                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
+                                        DEBUG_PRINT_HIGH("Failed to release output buffers\n");
+                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
+                                    pThis->in_reconfig = false;
+                                    if (eRet !=  OMX_ErrorNone) {
+                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
+                                        pThis->omx_report_error();
+                                        break;
+                                    }
+                                }
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+                            case OMX_CommandPortEnable:
+                                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+
+                            default:
+                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
+                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB:
+                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_FTB:
+                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_COMMAND:
+                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
+                            (OMX_U32)p2,(OMX_PTR)NULL);
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EBD:
+
+                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
+                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
+                        pThis->omx_report_error ();
+                    } else {
+                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
+                            pThis->m_inp_err_count++;
+                            pThis->time_stamp_dts.remove_time_stamp(
+                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
+                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                                    ?true:false);
+                        } else {
+                            pThis->m_inp_err_count = 0;
+                        }
+                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
+                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                            DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
+                            pThis->omx_report_error ();
+                        }
+                        if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
+                            DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
+                            pThis->omx_report_error ();
+                        }
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
+                                            int64_t *timestamp = (int64_t *)p1;
+                                            if (p1) {
+                                                pThis->time_stamp_dts.remove_time_stamp(*timestamp,
+                                                        (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+                                                        ?true:false);
+                                                free(timestamp);
+                                            }
+                                        }
+                                        break;
+                case OMX_COMPONENT_GENERATE_FBD:
+                                        if (p2 != VDEC_S_SUCCESS) {
+                                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
+                                            pThis->omx_report_error ();
+                                        } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
+                                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                                            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
+                                            pThis->omx_report_error ();
+                                        }
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
+                                        DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
+                                        if (!pThis->input_flush_progress) {
+                                            DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
+                                        } else {
+                                            pThis->execute_input_flush();
+                                            if (pThis->m_cb.EventHandler) {
+                                                if (p2 != VDEC_S_SUCCESS) {
+                                                    DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
+                                                    pThis->omx_report_error ();
+                                                } else {
+                                                    /*Check if we need generate event for Flush done*/
+                                                    if (BITMASK_PRESENT(&pThis->m_flags,
+                                                                OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
+                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
+                                                        DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
+                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                                OMX_EventCmdComplete,OMX_CommandFlush,
+                                                                OMX_CORE_INPUT_PORT_INDEX,NULL );
+                                                    }
+                                                    if (BITMASK_PRESENT(&pThis->m_flags,
+                                                                OMX_COMPONENT_IDLE_PENDING)) {
+                                                        if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
+                                                            DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
+                                                            pThis->omx_report_error ();
+                                                        } else {
+                                                            pThis->streaming[OUTPUT_PORT] = false;
+                                                        }
+                                                        if (!pThis->output_flush_progress) {
+                                                            DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
+                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
+                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
+                                                        }
+                                                    }
+                                                }
+                                            } else {
+                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                            }
+                                        }
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
+                                        DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
+                                        if (!pThis->output_flush_progress) {
+                                            DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
+                                        } else {
+                                            pThis->execute_output_flush();
+                                            if (pThis->m_cb.EventHandler) {
+                                                if (p2 != VDEC_S_SUCCESS) {
+                                                    DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
+                                                    pThis->omx_report_error ();
+                                                } else {
+                                                    /*Check if we need generate event for Flush done*/
+                                                    if (BITMASK_PRESENT(&pThis->m_flags,
+                                                                OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
+                                                        DEBUG_PRINT_LOW("\n Notify Output Flush done");
+                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                                OMX_EventCmdComplete,OMX_CommandFlush,
+                                                                OMX_CORE_OUTPUT_PORT_INDEX,NULL );
+                                                    }
+                                                    if (BITMASK_PRESENT(&pThis->m_flags,
+                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+                                                        DEBUG_PRINT_LOW("\n Internal flush complete");
+                                                        BITMASK_CLEAR (&pThis->m_flags,
+                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+                                                        if (BITMASK_PRESENT(&pThis->m_flags,
+                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
+                                                            pThis->post_event(OMX_CommandPortDisable,
+                                                                    OMX_CORE_OUTPUT_PORT_INDEX,
+                                                                    OMX_COMPONENT_GENERATE_EVENT);
+                                                            BITMASK_CLEAR (&pThis->m_flags,
+                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+
+                                                        }
+                                                    }
+
+                                                    if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
+                                                        if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
+                                                            DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
+                                                            pThis->omx_report_error ();
+                                                            break;
+                                                        }
+                                                        pThis->streaming[CAPTURE_PORT] = false;
+                                                        if (!pThis->input_flush_progress) {
+                                                            DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
+                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
+                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
+                                                        }
+                                                    }
+                                                }
+                                            } else {
+                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                            }
+                                        }
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_START_DONE:
+                                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
+
+                                        if (pThis->m_cb.EventHandler) {
+                                            if (p2 != VDEC_S_SUCCESS) {
+                                                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
+                                                pThis->omx_report_error ();
+                                            } else {
+                                                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
+                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                                                    DEBUG_PRINT_LOW("\n Move to executing");
+                                                    // Send the callback now
+                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                                                    pThis->m_state = OMX_StateExecuting;
+                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
+                                                            OMX_StateExecuting, NULL);
+                                                } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                                            OMX_COMPONENT_PAUSE_PENDING)) {
+                                                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
+                                                          VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
+                                                        DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
+                                                        pThis->omx_report_error ();
+                                                    }
+                                                }
+                                            }
+                                        } else {
+                                            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
+                                        }
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
+                                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
+                                        if (pThis->m_cb.EventHandler) {
+                                            if (p2 != VDEC_S_SUCCESS) {
+                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
+                                                pThis->omx_report_error ();
+                                            } else {
+                                                pThis->complete_pending_buffer_done_cbs();
+                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
+                                                    DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
+                                                    //Send the callback now
+                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
+                                                    pThis->m_state = OMX_StatePause;
+                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
+                                                            OMX_StatePause, NULL);
+                                                }
+                                            }
+                                        } else {
+                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                        }
+
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_RESUME_DONE:
+                                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
+                                        if (pThis->m_cb.EventHandler) {
+                                            if (p2 != VDEC_S_SUCCESS) {
+                                                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
+                                                pThis->omx_report_error ();
+                                            } else {
+                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                                                    DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
+                                                    // Send the callback now
+                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                                                    pThis->m_state = OMX_StateExecuting;
+                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
+                                                            OMX_StateExecuting,NULL);
+                                                }
+                                            }
+                                        } else {
+                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                        }
+
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_STOP_DONE:
+                                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
+                                        if (pThis->m_cb.EventHandler) {
+                                            if (p2 != VDEC_S_SUCCESS) {
+                                                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
+                                                pThis->omx_report_error ();
+                                            } else {
+                                                pThis->complete_pending_buffer_done_cbs();
+                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                                                    DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
+                                                    // Send the callback now
+                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
+                                                    pThis->m_state = OMX_StateIdle;
+                                                    DEBUG_PRINT_LOW("\n Move to Idle State");
+                                                    pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
+                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
+                                                            OMX_StateIdle,NULL);
+                                                }
+                                            }
+                                        } else {
+                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                        }
+
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
+                                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
+
+                                        if (p2 == OMX_IndexParamPortDefinition) {
+                                            pThis->in_reconfig = true;
+                                        }
+                                        if (pThis->m_cb.EventHandler) {
+                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                    OMX_EventPortSettingsChanged, p1, p2, NULL );
+                                        } else {
+                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                        }
+
+                                        if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
+                                            OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
+                                            OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
+                                            if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+                                                format = OMX_InterlaceInterleaveFrameTopFieldFirst;
+                                            else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+                                                format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
+                                            else //unsupported interlace format; raise a error
+                                                event = OMX_EventError;
+                                            if (pThis->m_cb.EventHandler) {
+                                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                        event, format, 0, NULL );
+                                            } else {
+                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                            }
+                                        }
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_EOS_DONE:
+                                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
+                                        if (pThis->m_cb.EventHandler) {
+                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
+                                                    OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
+                                        } else {
+                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                        }
+                                        pThis->prev_ts = LLONG_MAX;
+                                        pThis->rst_prev_ts = true;
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
+                                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
+                                        pThis->omx_report_error ();
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
+                                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING\n");
+                                        pThis->omx_report_unsupported_setting();
+                                        break;
+
+                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: {
+                                            DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
+                                            if (pThis->m_cb.EventHandler) {
+                                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                                        (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
+                                            } else {
+                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+                                            }
+                                        }
+                default:
+                                        break;
+            }
+        }
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
+        if (pThis->m_state != OMX_StatePause)
+            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
+        pthread_mutex_unlock(&pThis->m_lock);
+    } while (qsize>0);
 
 }
 
 int omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
 {
-	int format_changed = 0;
-	if ((height != drv_ctx.video_resolution.frame_height) ||
-		(width != drv_ctx.video_resolution.frame_width)) {
-		DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)\n",
-			width, drv_ctx.video_resolution.frame_width,
-			height,drv_ctx.video_resolution.frame_height);
-		format_changed = 1;
-	}
+    int format_changed = 0;
+    if ((height != drv_ctx.video_resolution.frame_height) ||
+            (width != drv_ctx.video_resolution.frame_width)) {
+        DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)\n",
+                width, drv_ctx.video_resolution.frame_width,
+                height,drv_ctx.video_resolution.frame_height);
+        format_changed = 1;
+    }
     drv_ctx.video_resolution.frame_height = height;
     drv_ctx.video_resolution.frame_width = width;
     drv_ctx.video_resolution.scan_lines = scan_lines;
@@ -1339,325 +1215,299 @@
     rectangle.nTop = 0;
     rectangle.nWidth = drv_ctx.video_resolution.frame_width;
     rectangle.nHeight = drv_ctx.video_resolution.frame_height;
-	return format_changed;
+    return format_changed;
 }
 
 OMX_ERRORTYPE omx_vdec::is_video_session_supported()
 {
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
-              OMX_MAX_STRINGNAME_SIZE) &&
-     (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
-    m_decoder_capability.max_width = 1280;
-    m_decoder_capability.max_height = 720;
-    DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
-  }
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
+                OMX_MAX_STRINGNAME_SIZE) &&
+            (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
+        m_decoder_capability.max_width = 1280;
+        m_decoder_capability.max_height = 720;
+        DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
+    }
 
-  if ((drv_ctx.video_resolution.frame_width *
-       drv_ctx.video_resolution.frame_height >
-       m_decoder_capability.max_width *
-       m_decoder_capability.max_height) ||
-       (drv_ctx.video_resolution.frame_width*
-       drv_ctx.video_resolution.frame_height <
-       m_decoder_capability.min_width *
-       m_decoder_capability.min_height))
-  {
-      DEBUG_PRINT_ERROR(
-         "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
-          drv_ctx.video_resolution.frame_width,
-          drv_ctx.video_resolution.frame_height,
-          m_decoder_capability.min_width,
-          m_decoder_capability.min_height,
-          m_decoder_capability.max_width,
-          m_decoder_capability.max_height);
-      return OMX_ErrorUnsupportedSetting;
-  }
-  DEBUG_PRINT_HIGH("\n video session supported\n");
-  return OMX_ErrorNone;
+    if ((drv_ctx.video_resolution.frame_width *
+                drv_ctx.video_resolution.frame_height >
+                m_decoder_capability.max_width *
+                m_decoder_capability.max_height) ||
+            (drv_ctx.video_resolution.frame_width*
+             drv_ctx.video_resolution.frame_height <
+             m_decoder_capability.min_width *
+             m_decoder_capability.min_height)) {
+        DEBUG_PRINT_ERROR(
+                "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
+                drv_ctx.video_resolution.frame_width,
+                drv_ctx.video_resolution.frame_height,
+                m_decoder_capability.min_width,
+                m_decoder_capability.min_height,
+                m_decoder_capability.max_width,
+                m_decoder_capability.max_height);
+        return OMX_ErrorUnsupportedSetting;
+    }
+    DEBUG_PRINT_HIGH("\n video session supported\n");
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentInit
+   FUNCTION
+   omx_vdec::ComponentInit
 
-DESCRIPTION
-  Initialize the component.
+   DESCRIPTION
+   Initialize the component.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
 {
 
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_fmtdesc fdesc;
-	struct v4l2_format fmt;
-	struct v4l2_requestbuffers bufreq;
-	struct v4l2_control control;
-	struct v4l2_frmsizeenum frmsize;
-	unsigned int   alignment = 0,buffer_size = 0;
-	int fds[2];
-	int r,ret=0;
-	bool codec_ambiguous = false;
-	OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_dec";
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_fmtdesc fdesc;
+    struct v4l2_format fmt;
+    struct v4l2_requestbuffers bufreq;
+    struct v4l2_control control;
+    struct v4l2_frmsizeenum frmsize;
+    unsigned int   alignment = 0,buffer_size = 0;
+    int fds[2];
+    int r,ret=0;
+    bool codec_ambiguous = false;
+    OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_dec";
 
 #ifdef _ANDROID_
-	char platform_name[64];
-	property_get("ro.board.platform", platform_name, "0");
-	if (!strncmp(platform_name, "msm8610", 7)) {
-	    device_name = (OMX_STRING)"/dev/video/q6_dec";
-	}
+    char platform_name[64];
+    property_get("ro.board.platform", platform_name, "0");
+    if (!strncmp(platform_name, "msm8610", 7)) {
+        device_name = (OMX_STRING)"/dev/video/q6_dec";
+    }
 #endif
 
-	if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
-		struct v4l2_control control;
-		secure_mode = true;
-		arbitrary_bytes = false;
-		role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
-	}
+    if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) {
+        struct v4l2_control control;
+        secure_mode = true;
+        arbitrary_bytes = false;
+        role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
+    }
 
-	drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
 
-	DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
-			drv_ctx.video_driver_fd, errno);
+    DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
+            drv_ctx.video_driver_fd, errno);
 
-	if(drv_ctx.video_driver_fd == 0){
-	  DEBUG_PRINT_ERROR("omx_vdec_msm8974 :: Got fd as 0 for msm_vidc_dec, Opening again\n");
-	  drv_ctx.video_driver_fd = open(device_name, O_RDWR);
-	  close(0);
-	}
+    if (drv_ctx.video_driver_fd == 0) {
+        DEBUG_PRINT_ERROR("omx_vdec_msm8974 :: Got fd as 0 for msm_vidc_dec, Opening again\n");
+        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+        close(0);
+    }
 
-	if(drv_ctx.video_driver_fd < 0)
-	{
-		DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
-		return OMX_ErrorInsufficientResources;
-	}
-	drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
-	drv_ctx.frame_rate.fps_denominator = 1;
+    if (drv_ctx.video_driver_fd < 0) {
+        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
+        return OMX_ErrorInsufficientResources;
+    }
+    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
+    drv_ctx.frame_rate.fps_denominator = 1;
 
     ret = subscribe_to_events(drv_ctx.video_driver_fd);
     if (!ret) {
-      async_thread_created = true;
-      ret = pthread_create(&async_thread_id,0,async_message_thread,this);
-	}
-    if(ret) {
-	  DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
-	  async_thread_created = false;
-	  return OMX_ErrorInsufficientResources;
+        async_thread_created = true;
+        ret = pthread_create(&async_thread_id,0,async_message_thread,this);
+    }
+    if (ret) {
+        DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
+        async_thread_created = false;
+        return OMX_ErrorInsufficientResources;
     }
 
 #ifdef INPUT_BUFFER_LOG
-	strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
+    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-	outputBufferFile1 = fopen (outputfilename, "ab");
+    outputBufferFile1 = fopen (outputfilename, "ab");
 #endif
 #ifdef OUTPUT_EXTRADATA_LOG
-	outputExtradataFile = fopen (ouputextradatafilename, "ab");
+    outputExtradataFile = fopen (ouputextradatafilename, "ab");
 #endif
 
-	// Copy the role information which provides the decoder kind
-	strlcpy(drv_ctx.kind,role,128);
+    // Copy the role information which provides the decoder kind
+    strlcpy(drv_ctx.kind,role,128);
 
-	if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
-				OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.timestamp_adjust = true;
-		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
-		eCompressionFormat = OMX_VIDEO_CodingMPEG4;
-		output_capability=V4L2_PIX_FMT_MPEG4;
-		/*Initialize Start Code for MPEG4*/
-		codec_type_parse = CODEC_TYPE_MPEG4;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.timestamp_adjust = true;
+        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
+        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+        output_capability=V4L2_PIX_FMT_MPEG4;
+        /*Initialize Start Code for MPEG4*/
+        codec_type_parse = CODEC_TYPE_MPEG4;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "m4v");
+        strcat(inputfilename, "m4v");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
-				OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
-		output_capability = V4L2_PIX_FMT_MPEG2;
-		eCompressionFormat = OMX_VIDEO_CodingMPEG2;
-		/*Initialize Start Code for MPEG2*/
-		codec_type_parse = CODEC_TYPE_MPEG2;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
+                OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
+        output_capability = V4L2_PIX_FMT_MPEG2;
+        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
+        /*Initialize Start Code for MPEG2*/
+        codec_type_parse = CODEC_TYPE_MPEG2;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "mpg");
+        strcat(inputfilename, "mpg");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_LOW("\n H263 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
-		eCompressionFormat = OMX_VIDEO_CodingH263;
-		output_capability = V4L2_PIX_FMT_H263;
-		codec_type_parse = CODEC_TYPE_H263;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_LOW("\n H263 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
+        eCompressionFormat = OMX_VIDEO_CodingH263;
+        output_capability = V4L2_PIX_FMT_H263;
+        codec_type_parse = CODEC_TYPE_H263;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "263");
+        strcat(inputfilename, "263");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
-		output_capability = V4L2_PIX_FMT_DIVX_311;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-		codec_type_parse = CODEC_TYPE_DIVX;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
+        output_capability = V4L2_PIX_FMT_DIVX_311;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
-		eRet = createDivxDrmContext();
-		if (eRet != OMX_ErrorNone) {
-			DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-			return eRet;
-		}
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
-		output_capability = V4L2_PIX_FMT_DIVX;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-		codec_type_parse = CODEC_TYPE_DIVX;
-		codec_ambiguous = true;
-		m_frame_parser.init_start_codes (codec_type_parse);
+        eRet = createDivxDrmContext();
+        if (eRet != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            return eRet;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
+        output_capability = V4L2_PIX_FMT_DIVX;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        codec_ambiguous = true;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
-		eRet = createDivxDrmContext();
-		if (eRet != OMX_ErrorNone) {
-			DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-			return eRet;
-		}
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-		DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
-		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
-		output_capability = V4L2_PIX_FMT_DIVX;
-		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-		codec_type_parse = CODEC_TYPE_DIVX;
-		codec_ambiguous = true;
-		m_frame_parser.init_start_codes (codec_type_parse);
+        eRet = createDivxDrmContext();
+        if (eRet != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            return eRet;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+        DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
+        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
+        output_capability = V4L2_PIX_FMT_DIVX;
+        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+        codec_type_parse = CODEC_TYPE_DIVX;
+        codec_ambiguous = true;
+        m_frame_parser.init_start_codes (codec_type_parse);
 
-		eRet = createDivxDrmContext();
-		if (eRet != OMX_ErrorNone) {
-			DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
-			return eRet;
-		}
+        eRet = createDivxDrmContext();
+        if (eRet != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+            return eRet;
+        }
 
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
-		output_capability=V4L2_PIX_FMT_H264;
-		eCompressionFormat = OMX_VIDEO_CodingAVC;
-		codec_type_parse = CODEC_TYPE_H264;
-		m_frame_parser.init_start_codes (codec_type_parse);
-		m_frame_parser.init_nal_length(nal_length);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
+        output_capability=V4L2_PIX_FMT_H264;
+        eCompressionFormat = OMX_VIDEO_CodingAVC;
+        codec_type_parse = CODEC_TYPE_H264;
+        m_frame_parser.init_start_codes (codec_type_parse);
+        m_frame_parser.init_nal_length(nal_length);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "264");
+        strcat(inputfilename, "264");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
-		eCompressionFormat = OMX_VIDEO_CodingWMV;
-		codec_type_parse = CODEC_TYPE_VC1;
-		output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
+        eCompressionFormat = OMX_VIDEO_CodingWMV;
+        codec_type_parse = CODEC_TYPE_VC1;
+        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "vc1");
+        strcat(inputfilename, "vc1");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
-		eCompressionFormat = OMX_VIDEO_CodingWMV;
-		codec_type_parse = CODEC_TYPE_VC1;
-		output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
-		m_frame_parser.init_start_codes (codec_type_parse);
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
+        eCompressionFormat = OMX_VIDEO_CodingWMV;
+        codec_type_parse = CODEC_TYPE_VC1;
+        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
+        m_frame_parser.init_start_codes (codec_type_parse);
 #ifdef INPUT_BUFFER_LOG
-		strcat(inputfilename, "vc1");
+        strcat(inputfilename, "vc1");
 #endif
-	}
-	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",	\
-				OMX_MAX_STRINGNAME_SIZE))
-	{
-		strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-		output_capability=V4L2_PIX_FMT_VP8;
-		eCompressionFormat = OMX_VIDEO_CodingVPX;
-		codec_type_parse = CODEC_TYPE_VP8;
-		arbitrary_bytes = false;
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",    \
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+        output_capability=V4L2_PIX_FMT_VP8;
+        eCompressionFormat = OMX_VIDEO_CodingVPX;
+        codec_type_parse = CODEC_TYPE_VP8;
+        arbitrary_bytes = false;
 #ifdef INPUT_BUFFER_LOG
-                strcat(inputfilename, "ivf");
+        strcat(inputfilename, "ivf");
 #endif
 
-	}
-	else
-	{
-		DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
-		eRet = OMX_ErrorInvalidComponentName;
-	}
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
+    }
 #ifdef INPUT_BUFFER_LOG
-	inputBufferFile1 = fopen (inputfilename, "ab");
-	if (output_capability == V4L2_PIX_FMT_VP8) {
-		struct ivf_file_header
-		{
-			OMX_U8 signature[4]; //='DKIF';
-			OMX_U8 version         ; //= 0;
-			OMX_U8 headersize      ; //= 32;
-			OMX_U32 FourCC;
-			OMX_U8 width;
-			OMX_U8 height;
-			OMX_U32 rate;
-			OMX_U32 scale;
-			OMX_U32 length;
-			OMX_U8 unused[4];
-		} file_header;
-		 memset((void *)&file_header,0,sizeof(file_header));
-		file_header.signature[0] = 'D';
-		file_header.signature[1] = 'K';
-		file_header.signature[2] = 'I';
-		file_header.signature[3] = 'F';
-		file_header.version = 0;
-		file_header.headersize = 32;
-		file_header.FourCC = 0x30385056;
-		if (inputBufferFile1)
-		{
-			fwrite((const char *)&file_header,
-					sizeof(file_header),1,inputBufferFile1);
-		}
-	}
+    inputBufferFile1 = fopen (inputfilename, "ab");
+    if (output_capability == V4L2_PIX_FMT_VP8) {
+        struct ivf_file_header {
+            OMX_U8 signature[4]; //='DKIF';
+            OMX_U8 version         ; //= 0;
+            OMX_U8 headersize      ; //= 32;
+            OMX_U32 FourCC;
+            OMX_U8 width;
+            OMX_U8 height;
+            OMX_U32 rate;
+            OMX_U32 scale;
+            OMX_U32 length;
+            OMX_U8 unused[4];
+        } file_header;
+        memset((void *)&file_header,0,sizeof(file_header));
+        file_header.signature[0] = 'D';
+        file_header.signature[1] = 'K';
+        file_header.signature[2] = 'I';
+        file_header.signature[3] = 'F';
+        file_header.version = 0;
+        file_header.headersize = 32;
+        file_header.FourCC = 0x30385056;
+        if (inputBufferFile1) {
+            fwrite((const char *)&file_header,
+                    sizeof(file_header),1,inputBufferFile1);
+        }
+    }
 #endif
-	if (eRet == OMX_ErrorNone)
-	{
+    if (eRet == OMX_ErrorNone) {
 
-		drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
+        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
         OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
             QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
         if (!client_buffers.set_color_format(dest_color_format)) {
@@ -1665,124 +1515,124 @@
             eRet = OMX_ErrorInsufficientResources;
         }
 
-		capture_capability= V4L2_PIX_FMT_NV12;
+        capture_capability= V4L2_PIX_FMT_NV12;
 
-		struct v4l2_capability cap;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
-		if (ret) {
-		  DEBUG_PRINT_ERROR("Failed to query capabilities\n");
-		  /*TODO: How to handle this case */
-		} else {
-		  DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
-				" version = %d, capabilities = %x\n", cap.driver, cap.card,
-				cap.bus_info, cap.version, cap.capabilities);
-		}
-		ret=0;
-		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fdesc.index=0;
-		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
-			DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
-					fdesc.pixelformat, fdesc.flags);
-			fdesc.index++;
-		}
-		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fdesc.index=0;
-		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+        struct v4l2_capability cap;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
+        if (ret) {
+            DEBUG_PRINT_ERROR("Failed to query capabilities\n");
+            /*TODO: How to handle this case */
+        } else {
+            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
+                    " version = %d, capabilities = %x\n", cap.driver, cap.card,
+                    cap.bus_info, cap.version, cap.capabilities);
+        }
+        ret=0;
+        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fdesc.index=0;
+        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+                    fdesc.pixelformat, fdesc.flags);
+            fdesc.index++;
+        }
+        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fdesc.index=0;
+        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
 
-			DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
-					fdesc.pixelformat, fdesc.flags);
-			fdesc.index++;
-		}
+            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+                    fdesc.pixelformat, fdesc.flags);
+            fdesc.index++;
+        }
         update_resolution(320, 240, 320, 240);
-		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-		fmt.fmt.pix_mp.pixelformat = output_capability;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-		if (ret) {
-			/*TODO: How to handle this case */
-			DEBUG_PRINT_ERROR("Failed to set format on output port\n");
-			return OMX_ErrorInsufficientResources;
-				}
-		DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
-		if (codec_ambiguous) {
-			if (output_capability == V4L2_PIX_FMT_DIVX) {
-				struct v4l2_control divx_ctrl;
+        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+        fmt.fmt.pix_mp.pixelformat = output_capability;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+        if (ret) {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR("Failed to set format on output port\n");
+            return OMX_ErrorInsufficientResources;
+        }
+        DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
+        if (codec_ambiguous) {
+            if (output_capability == V4L2_PIX_FMT_DIVX) {
+                struct v4l2_control divx_ctrl;
 
-				if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
-					divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
-				} else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
-					divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
-				} else {
-					divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
-				}
+                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
+                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
+                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
+                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
+                } else {
+                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
+                }
 
-				divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
-				ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
-				if (ret) {
-					DEBUG_PRINT_ERROR("Failed to set divx version\n");
-				}
-			} else {
-				DEBUG_PRINT_ERROR("Codec should not be ambiguous");
-			}
-		}
+                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
+                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
+                if (ret) {
+                    DEBUG_PRINT_ERROR("Failed to set divx version\n");
+                }
+            } else {
+                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
+            }
+        }
 
-		//Get the hardware capabilities
-		memset((void *)&frmsize,0,sizeof(frmsize));
-		frmsize.index = 0;
-		frmsize.pixel_format = output_capability;
-		ret = ioctl(drv_ctx.video_driver_fd,
-			VIDIOC_ENUM_FRAMESIZES, &frmsize);
-		if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
-			DEBUG_PRINT_ERROR("Failed to get framesizes\n");
-			return OMX_ErrorHardware;
-		}
+        //Get the hardware capabilities
+        memset((void *)&frmsize,0,sizeof(frmsize));
+        frmsize.index = 0;
+        frmsize.pixel_format = output_capability;
+        ret = ioctl(drv_ctx.video_driver_fd,
+                VIDIOC_ENUM_FRAMESIZES, &frmsize);
+        if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
+            DEBUG_PRINT_ERROR("Failed to get framesizes\n");
+            return OMX_ErrorHardware;
+        }
 
-		if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
-		    m_decoder_capability.min_width = frmsize.stepwise.min_width;
-		    m_decoder_capability.max_width = frmsize.stepwise.max_width;
-		    m_decoder_capability.min_height = frmsize.stepwise.min_height;
-		    m_decoder_capability.max_height = frmsize.stepwise.max_height;
-		}
+        if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
+            m_decoder_capability.min_width = frmsize.stepwise.min_width;
+            m_decoder_capability.max_width = frmsize.stepwise.max_width;
+            m_decoder_capability.min_height = frmsize.stepwise.min_height;
+            m_decoder_capability.max_height = frmsize.stepwise.max_height;
+        }
 
-		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-		fmt.fmt.pix_mp.pixelformat = capture_capability;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-		if (ret) {
-			/*TODO: How to handle this case */	
-			DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
-				}
-		DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
-		if(secure_mode){
-			control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
-			control.value = 1;
-			DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
-			ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
-			if (ret) {
-				DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
-				return OMX_ErrorInsufficientResources;
-			}
-		}
+        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+        fmt.fmt.pix_mp.pixelformat = capture_capability;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+        if (ret) {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
+        }
+        DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
+        if (secure_mode) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
+            control.value = 1;
+            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
+            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
+            if (ret) {
+                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
+                return OMX_ErrorInsufficientResources;
+            }
+        }
 
-		/*Get the Buffer requirements for input and output ports*/
-		drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-		drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-		if (secure_mode) {
-			drv_ctx.op_buf.alignment=SZ_1M;
-			drv_ctx.ip_buf.alignment=SZ_1M;
-		} else {
-			drv_ctx.op_buf.alignment=SZ_4K;
-			drv_ctx.ip_buf.alignment=SZ_4K;
-		}
-		drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-		drv_ctx.extradata = 0;
-		drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
-		control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
-		control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
-		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-		drv_ctx.idr_only_decoding = 0;
+        /*Get the Buffer requirements for input and output ports*/
+        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        if (secure_mode) {
+            drv_ctx.op_buf.alignment=SZ_1M;
+            drv_ctx.ip_buf.alignment=SZ_1M;
+        } else {
+            drv_ctx.op_buf.alignment=SZ_4K;
+            drv_ctx.ip_buf.alignment=SZ_4K;
+        }
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+        drv_ctx.extradata = 0;
+        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
+        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+        drv_ctx.idr_only_decoding = 0;
 
         m_state = OMX_StateLoaded;
 #ifdef DEFAULT_EXTRADATA
@@ -1792,155 +1642,135 @@
         eRet=get_buffer_req(&drv_ctx.ip_buf);
         DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
         get_buffer_req(&drv_ctx.op_buf);
-		if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-		{
-			if (m_frame_parser.mutils == NULL)
-			{
-				m_frame_parser.mutils = new H264_Utils();
+        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+            if (m_frame_parser.mutils == NULL) {
+                m_frame_parser.mutils = new H264_Utils();
 
-				if (m_frame_parser.mutils == NULL)
-				{
-					DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
-					eRet = OMX_ErrorInsufficientResources;
-				}
-				else
-				{
-					h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
-					h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
-					h264_scratch.nFilledLen = 0;
-					h264_scratch.nOffset = 0;
+                if (m_frame_parser.mutils == NULL) {
+                    DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
+                    eRet = OMX_ErrorInsufficientResources;
+                } else {
+                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
+                    h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
+                    h264_scratch.nFilledLen = 0;
+                    h264_scratch.nOffset = 0;
 
-					if (h264_scratch.pBuffer == NULL)
-					{
-						DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
-						return OMX_ErrorInsufficientResources;
-					}
-					m_frame_parser.mutils->initialize_frame_checking_environment();
-					m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
-				}
-			}
+                    if (h264_scratch.pBuffer == NULL) {
+                        DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
+                        return OMX_ErrorInsufficientResources;
+                    }
+                    m_frame_parser.mutils->initialize_frame_checking_environment();
+                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
+                }
+            }
 
-			h264_parser = new h264_stream_parser();
-			if (!h264_parser)
-			{
-				DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
-				eRet = OMX_ErrorInsufficientResources;
-			}
-		}
+            h264_parser = new h264_stream_parser();
+            if (!h264_parser) {
+                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
 
-		if(pipe(fds))
-		{
-			DEBUG_PRINT_ERROR("pipe creation failed\n");
-			eRet = OMX_ErrorInsufficientResources;
-		}
-		else
-		{
-			int temp1[2];
-			if(fds[0] == 0 || fds[1] == 0)
-			{
-				if (pipe (temp1))
-				{
-					DEBUG_PRINT_ERROR("pipe creation failed\n");
-					return OMX_ErrorInsufficientResources;
-				}
-				//close (fds[0]);
-				//close (fds[1]);
-				fds[0] = temp1 [0];
-				fds[1] = temp1 [1];
-			}
-			m_pipe_in = fds[0];
-			m_pipe_out = fds[1];
-			msg_thread_created = true;
-			r = pthread_create(&msg_thread_id,0,message_thread,this);
-			
-			if(r < 0)
-			{
-				DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
-				msg_thread_created = false;
-				eRet = OMX_ErrorInsufficientResources;
-			}
-		}
-	}
+        if (pipe(fds)) {
+            DEBUG_PRINT_ERROR("pipe creation failed\n");
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            int temp1[2];
+            if (fds[0] == 0 || fds[1] == 0) {
+                if (pipe (temp1)) {
+                    DEBUG_PRINT_ERROR("pipe creation failed\n");
+                    return OMX_ErrorInsufficientResources;
+                }
+                //close (fds[0]);
+                //close (fds[1]);
+                fds[0] = temp1 [0];
+                fds[1] = temp1 [1];
+            }
+            m_pipe_in = fds[0];
+            m_pipe_out = fds[1];
+            msg_thread_created = true;
+            r = pthread_create(&msg_thread_id,0,message_thread,this);
 
-	if (eRet != OMX_ErrorNone)
-	{
-		DEBUG_PRINT_ERROR("\n Component Init Failed");
-	}
-	else
-	{
-		DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
-	}
-	//memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
-	return eRet;
+            if (r < 0) {
+                DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
+                msg_thread_created = false;
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
+    }
+
+    if (eRet != OMX_ErrorNone) {
+        DEBUG_PRINT_ERROR("\n Component Init Failed");
+    } else {
+        DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
+    }
+    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetComponentVersion
+   FUNCTION
+   omx_vdec::GetComponentVersion
 
-DESCRIPTION
-  Returns the component version.
+   DESCRIPTION
+   Returns the component version.
 
-PARAMETERS
-  TBD.
+   PARAMETERS
+   TBD.
 
-RETURN VALUE
-  OMX_ErrorNone.
+   RETURN VALUE
+   OMX_ErrorNone.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_component_version
-                                     (
-                                      OMX_IN OMX_HANDLETYPE hComp,
-                                      OMX_OUT OMX_STRING componentName,
-                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
-                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
-                                      OMX_OUT OMX_UUIDTYPE* componentUUID
-                                      )
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID
+ )
 {
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-  /* TBD -- Return the proper version */
-  if (specVersion)
-  {
-    specVersion->nVersion = OMX_SPEC_VERSION;
-  }
-  return OMX_ErrorNone;
+    /* TBD -- Return the proper version */
+    if (specVersion) {
+        specVersion->nVersion = OMX_SPEC_VERSION;
+    }
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommand
+   FUNCTION
+   omx_vdec::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
-                                      OMX_IN OMX_COMMANDTYPE cmd,
-                                      OMX_IN OMX_U32 param1,
-                                      OMX_IN OMX_PTR cmdData
-                                      )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
     DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
     if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
-      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
-    {
-      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
-        "to invalid port: %lu", param1);
-      return OMX_ErrorBadPortIndex;
+            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
+        DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
+                "to invalid port: %lu", param1);
+        return OMX_ErrorBadPortIndex;
     }
     post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
     sem_wait(&m_cmd_lock);
@@ -1949,1133 +1779,953 @@
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommand
+   FUNCTION
+   omx_vdec::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
-                                            OMX_IN OMX_COMMANDTYPE cmd,
-                                            OMX_IN OMX_U32 param1,
-                                            OMX_IN OMX_PTR cmdData
-                                            )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
-  int bFlag = 1,sem_posted = 0,ret=0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
+    int bFlag = 1,sem_posted = 0,ret=0;
 
-  DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
-  DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
-    m_state, eState);
+    DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
+    DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
+            m_state, eState);
 
-  if(cmd == OMX_CommandStateSet)
-  {
-    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
-    DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
-    /***************************/
-    /* Current State is Loaded */
-    /***************************/
-    if(m_state == OMX_StateLoaded)
-    {
-      if(eState == OMX_StateIdle)
-      {
-        //if all buffers are allocated or all ports disabled
-        if(allocate_done() ||
-          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Loaded to Loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Loaded to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        /* Since error is None , we will post an event
-           at the end of this function definition */
-        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
-      }
-      /* Requesting transition from Loaded to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
-                          eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-
-    /***************************/
-    /* Current State is IDLE */
-    /***************************/
-    else if(m_state == OMX_StateIdle)
-    {
-      if(eState == OMX_StateLoaded)
-      {
-        if(release_done())
-        {
-          /*
-             Since error is None , we will post an event at the end
-             of this function definition
-          */
-          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Idle to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-        //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
-        bFlag = 1;
-	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-	    m_state=OMX_StateExecuting;
-	    DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
-      }
-      /* Requesting transition from Idle to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Idle to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-       /* Requesting transition from Idle to Pause */
-       else if(eState == OMX_StatePause)
-      {
-         /*To pause the Video core we need to start the driver*/
-         if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
-                    NULL) < */0)
-         {
-           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
-           omx_report_error ();
-           eRet = OMX_ErrorHardware;
-         }
-         else
-         {
-           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
-           DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
-           bFlag = 0;
-         }
-      }
-      /* Requesting transition from Idle to Invalid */
-       else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-
-    /******************************/
-    /* Current State is Executing */
-    /******************************/
-    else if(m_state == OMX_StateExecuting)
-    {
-       DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
-       /* Requesting transition from Executing to Idle */
-       if(eState == OMX_StateIdle)
-	   {
-		   /* Since error is None , we will post an event
-			  at the end of this function definition
-			*/
-		   DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
-		   BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-		   if(!sem_posted)
-		   {
-			   sem_posted = 1;
-			   sem_post (&m_cmd_lock);
-			   execute_omx_flush(OMX_ALL);
-		   }
-		   bFlag = 0;
-	   }
-       /* Requesting transition from Executing to Paused */
-       else if(eState == OMX_StatePause)
-       {
-         DEBUG_PRINT_LOW("\n PAUSE Command Issued");
-         m_state = OMX_StatePause;
-         bFlag = 1;
-       }
-       /* Requesting transition from Executing to Loaded */
-       else if(eState == OMX_StateLoaded)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
-         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorIncorrectStateTransition;
-       }
-       /* Requesting transition from Executing to WaitForResources */
-       else if(eState == OMX_StateWaitForResources)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
-         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorIncorrectStateTransition;
-       }
-       /* Requesting transition from Executing to Executing */
-       else if(eState == OMX_StateExecuting)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
-         post_event(OMX_EventError,OMX_ErrorSameState,\
-                    OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorSameState;
-       }
-       /* Requesting transition from Executing to Invalid */
-       else if(eState == OMX_StateInvalid)
-       {
-         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
-         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-         eRet = OMX_ErrorInvalidState;
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
-         eRet = OMX_ErrorBadParameter;
-       }
-    }
-    /***************************/
-    /* Current State is Pause  */
-    /***************************/
-    else if(m_state == OMX_StatePause)
-    {
-      /* Requesting transition from Pause to Executing */
-      if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
-        m_state = OMX_StateExecuting;
-        bFlag = 1;
-      }
-      /* Requesting transition from Pause to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
-         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-         if(!sem_posted)
-         {
-           sem_posted = 1;
-           sem_post (&m_cmd_lock);
-           execute_omx_flush(OMX_ALL);
-         }
-         bFlag = 0;
-      }
-      /* Requesting transition from Pause to loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-       /* Requesting transition from Pause to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-     /***************************/
-    /* Current State is WaitForResources  */
-    /***************************/
-    else if(m_state == OMX_StateWaitForResources)
-    {
-      /* Requesting transition from WaitForResources to Loaded */
-      if(eState == OMX_StateLoaded)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
-      }
-      /* Requesting transition from WaitForResources to WaitForResources */
-      else if (eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from WaitForResources to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      /* Requesting transition from WaitForResources to Loaded -
-      is NOT tested by Khronos TS */
-
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
-      eRet = OMX_ErrorBadParameter;
-    }
-  }
-  /********************************/
-  /* Current State is Invalid */
-  /*******************************/
-  else if(m_state == OMX_StateInvalid)
-  {
-    /* State Transition from Inavlid to any state */
-    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
-                  || OMX_StateIdle || OMX_StateExecuting
-                  || OMX_StatePause || OMX_StateInvalid))
-    {
-      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
-      post_event(OMX_EventError,OMX_ErrorInvalidState,\
-                 OMX_COMPONENT_GENERATE_EVENT);
-      eRet = OMX_ErrorInvalidState;
-    }
-  }
-  else if (cmd == OMX_CommandFlush)
-  {
-    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
-        "with param1: %lu", param1);
-    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
-    }
-    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-    }
-    if (!sem_posted){
-      sem_posted = 1;
-      DEBUG_PRINT_LOW("\n Set the Semaphore");
-      sem_post (&m_cmd_lock);
-      execute_omx_flush(param1);
-    }
-    bFlag = 0;
-  }
-  else if ( cmd == OMX_CommandPortEnable)
-  {
-    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
-        "with param1: %lu", param1);
-    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-        m_inp_bEnabled = OMX_TRUE;
-
-        if( (m_state == OMX_StateLoaded &&
-             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-            || allocate_input_done())
-        {
-          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
-                     OMX_COMPONENT_GENERATE_EVENT);
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
-        }
-      }
-      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          DEBUG_PRINT_LOW("\n Enable output Port command recieved");
-          m_out_bEnabled = OMX_TRUE;
-
-          if( (m_state == OMX_StateLoaded &&
-              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-              || (allocate_output_done()))
-          {
-             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
-                        OMX_COMPONENT_GENERATE_EVENT);
-
-          }
-          else
-          {
-              DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
-              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-              // Skip the event notification
-              bFlag = 0;
-          }
-      }
-  }
-  else if (cmd == OMX_CommandPortDisable)
-  {
-      DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
-          "with param1: %lu", param1);
-      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          m_inp_bEnabled = OMX_FALSE;
-          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-              && release_input_done())
-          {
-             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
-                        OMX_COMPONENT_GENERATE_EVENT);
-          }
-          else
-          {
-             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
-             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-             {
-               if(!sem_posted)
-               {
-                 sem_posted = 1;
-                 sem_post (&m_cmd_lock);
-               }
-               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
-             }
-
-             // Skip the event notification
-             bFlag = 0;
-          }
-      }
-      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
-      {
-          m_out_bEnabled = OMX_FALSE;
-          DEBUG_PRINT_LOW("\n Disable output Port command recieved");
-          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-              && release_output_done())
-          {
-             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
-                        OMX_COMPONENT_GENERATE_EVENT);
-          }
-          else
-         {
-            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
-            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-            {
-              if (!sem_posted)
-              {
-                sem_posted = 1;
-                sem_post (&m_cmd_lock);
-              }
-                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
-                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+    if (cmd == OMX_CommandStateSet) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
+        DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
+        /***************************/
+        /* Current State is Loaded */
+        /***************************/
+        if (m_state == OMX_StateLoaded) {
+            if (eState == OMX_StateIdle) {
+                //if all buffers are allocated or all ports disabled
+                if (allocate_done() ||
+                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
+                } else {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
             }
-            // Skip the event notification
-            bFlag = 0;
+            /* Requesting transition from Loaded to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Loaded to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
+            }
+            /* Requesting transition from Loaded to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
+                        eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
 
-         }
-      }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
-    eRet = OMX_ErrorNotImplemented;
-  }
-  if(eRet == OMX_ErrorNone && bFlag)
-  {
-    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
-  }
-  if(!sem_posted)
-  {
-    sem_post(&m_cmd_lock);
-  }
+        /***************************/
+        /* Current State is IDLE */
+        /***************************/
+        else if (m_state == OMX_StateIdle) {
+            if (eState == OMX_StateLoaded) {
+                if (release_done()) {
+                    /*
+                       Since error is None , we will post an event at the end
+                       of this function definition
+                     */
+                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
+                } else {
+                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
+                bFlag = 1;
+                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+                m_state=OMX_StateExecuting;
+                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
+            }
+            /* Requesting transition from Idle to Idle */
+            else if (eState == OMX_StateIdle) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Idle to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Idle to Pause */
+            else if (eState == OMX_StatePause) {
+                /*To pause the Video core we need to start the driver*/
+                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
+                      NULL) < */0) {
+                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
+                    omx_report_error ();
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
 
-  return eRet;
+        /******************************/
+        /* Current State is Executing */
+        /******************************/
+        else if (m_state == OMX_StateExecuting) {
+            DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
+            /* Requesting transition from Executing to Idle */
+            if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition
+                 */
+                DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+                if (!sem_posted) {
+                    sem_posted = 1;
+                    sem_post (&m_cmd_lock);
+                    execute_omx_flush(OMX_ALL);
+                }
+                bFlag = 0;
+            }
+            /* Requesting transition from Executing to Paused */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_LOW("\n PAUSE Command Issued");
+                m_state = OMX_StatePause;
+                bFlag = 1;
+            }
+            /* Requesting transition from Executing to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Executing to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is Pause  */
+        /***************************/
+        else if (m_state == OMX_StatePause) {
+            /* Requesting transition from Pause to Executing */
+            if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_LOW("\n Pause --> Executing \n");
+                m_state = OMX_StateExecuting;
+                bFlag = 1;
+            }
+            /* Requesting transition from Pause to Idle */
+            else if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("\n Pause --> Idle \n");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+                if (!sem_posted) {
+                    sem_posted = 1;
+                    sem_post (&m_cmd_lock);
+                    execute_omx_flush(OMX_ALL);
+                }
+                bFlag = 0;
+            }
+            /* Requesting transition from Pause to loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Pause to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is WaitForResources  */
+        /***************************/
+        else if (m_state == OMX_StateWaitForResources) {
+            /* Requesting transition from WaitForResources to Loaded */
+            if (eState == OMX_StateLoaded) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
+            }
+            /* Requesting transition from WaitForResources to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from WaitForResources to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            }
+            /* Requesting transition from WaitForResources to Loaded -
+               is NOT tested by Khronos TS */
+
+        } else {
+            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
+            eRet = OMX_ErrorBadParameter;
+        }
+    }
+    /********************************/
+    /* Current State is Invalid */
+    /*******************************/
+    else if (m_state == OMX_StateInvalid) {
+        /* State Transition from Inavlid to any state */
+        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
+                    || OMX_StateIdle || OMX_StateExecuting
+                    || OMX_StatePause || OMX_StateInvalid)) {
+            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
+            post_event(OMX_EventError,OMX_ErrorInvalidState,\
+                    OMX_COMPONENT_GENERATE_EVENT);
+            eRet = OMX_ErrorInvalidState;
+        }
+    } else if (cmd == OMX_CommandFlush) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
+                "with param1: %lu", param1);
+        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
+        }
+        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+        }
+        if (!sem_posted) {
+            sem_posted = 1;
+            DEBUG_PRINT_LOW("\n Set the Semaphore");
+            sem_post (&m_cmd_lock);
+            execute_omx_flush(param1);
+        }
+        bFlag = 0;
+    } else if ( cmd == OMX_CommandPortEnable) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
+                "with param1: %lu", param1);
+        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_inp_bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || allocate_input_done()) {
+                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+            DEBUG_PRINT_LOW("\n Enable output Port command recieved");
+            m_out_bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || (allocate_output_done())) {
+                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+
+            } else {
+                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+    } else if (cmd == OMX_CommandPortDisable) {
+        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
+                "with param1: %lu", param1);
+        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_inp_bEnabled = OMX_FALSE;
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_input_done()) {
+                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    if (!sem_posted) {
+                        sem_posted = 1;
+                        sem_post (&m_cmd_lock);
+                    }
+                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
+                }
+
+                // Skip the event notification
+                bFlag = 0;
+            }
+        }
+        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+            m_out_bEnabled = OMX_FALSE;
+            DEBUG_PRINT_LOW("\n Disable output Port command recieved");
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_output_done()) {
+                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    if (!sem_posted) {
+                        sem_posted = 1;
+                        sem_post (&m_cmd_lock);
+                    }
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+                }
+                // Skip the event notification
+                bFlag = 0;
+
+            }
+        }
+    } else {
+        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
+        eRet = OMX_ErrorNotImplemented;
+    }
+    if (eRet == OMX_ErrorNone && bFlag) {
+        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
+    }
+    if (!sem_posted) {
+        sem_post(&m_cmd_lock);
+    }
+
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ExecuteOmxFlush
+   FUNCTION
+   omx_vdec::ExecuteOmxFlush
 
-DESCRIPTION
-  Executes the OMX flush.
+   DESCRIPTION
+   Executes the OMX flush.
 
-PARAMETERS
-  flushtype - input flush(1)/output flush(0)/ both.
+   PARAMETERS
+   flushtype - input flush(1)/output flush(0)/ both.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
 {
-  bool bRet = false;
-  struct v4l2_plane plane;
-  struct v4l2_buffer v4l2_buf;
-  struct v4l2_decoder_cmd dec;
-  DEBUG_PRINT_LOW("in %s, flushing %d", __func__, flushType);
-  memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
-  dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
+    bool bRet = false;
+    struct v4l2_plane plane;
+    struct v4l2_buffer v4l2_buf;
+    struct v4l2_decoder_cmd dec;
+    DEBUG_PRINT_LOW("in %s, flushing %d", __func__, flushType);
+    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
+    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
 
-  DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
+    DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
 
-  if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX)
-  {
-    output_flush_progress = true;
-    dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
-  }
-  else
-  {
-    /* XXX: The driver/hardware does not support flushing of individual ports
-     * in all states. So we pretty much need to flush both ports internally,
-     * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
-     * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
-     * we automatically omit sending the FLUSH done for the "opposite" port. */
-    input_flush_progress = true;
-    output_flush_progress = true;
-    dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
-  }
+    if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
+        output_flush_progress = true;
+        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
+    } else {
+        /* XXX: The driver/hardware does not support flushing of individual ports
+         * in all states. So we pretty much need to flush both ports internally,
+         * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
+         * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
+         * we automatically omit sending the FLUSH done for the "opposite" port. */
+        input_flush_progress = true;
+        output_flush_progress = true;
+        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
+    }
 
-  if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
-  {
-    DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
-    bRet = false;
-  }
+    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
+        DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
+        bRet = false;
+    }
 
-  return bRet;
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_output_flush
 
 DESCRIPTION
-  Executes the OMX flush at OUTPUT PORT.
+Executes the OMX flush at OUTPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_vdec::execute_output_flush()
 {
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate FBD for all Buffers in the FTBq*/
-  pthread_mutex_lock(&m_lock);
-  DEBUG_PRINT_LOW("\n Initiate Output Flush");
-  while (m_ftb_q.m_size)
-  {
-    DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
-                       m_ftb_q.m_size,pending_output_buffers);
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
-    if(ident == m_fill_output_msg )
-    {
-      m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+    /*Generate FBD for all Buffers in the FTBq*/
+    pthread_mutex_lock(&m_lock);
+    DEBUG_PRINT_LOW("\n Initiate Output Flush");
+    while (m_ftb_q.m_size) {
+        DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
+                m_ftb_q.m_size,pending_output_buffers);
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+        DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
+        if (ident == m_fill_output_msg ) {
+            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-    else if (ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-  pthread_mutex_unlock(&m_lock);
-  output_flush_progress = false;
+    pthread_mutex_unlock(&m_lock);
+    output_flush_progress = false;
 
-  if (arbitrary_bytes)
-  {
-    prev_ts = LLONG_MAX;
-    rst_prev_ts = true;
-  }
-  DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
-  return bRet;
+    if (arbitrary_bytes) {
+        prev_ts = LLONG_MAX;
+        rst_prev_ts = true;
+    }
+    DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_input_flush
 
 DESCRIPTION
-  Executes the OMX flush at INPUT PORT.
+Executes the OMX flush at INPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_vdec::execute_input_flush()
 {
-  unsigned       i =0;
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned       i =0;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate EBD for all Buffers in the ETBq*/
-  DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
+    /*Generate EBD for all Buffers in the ETBq*/
+    DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
 
-  pthread_mutex_lock(&m_lock);
-  DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
+    pthread_mutex_lock(&m_lock);
+    DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
 
-    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
-    {
-      DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+            DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
+            pending_input_buffers++;
+            DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
+                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
+                    (OMX_BUFFERHEADERTYPE *)p1);
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-    else if(ident == OMX_COMPONENT_GENERATE_ETB)
-    {
-      pending_input_buffers++;
-      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
-        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
-    }
-    else if (ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
-        (OMX_BUFFERHEADERTYPE *)p1);
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-  time_stamp_dts.flush_timestamp();
-  /*Check if Heap Buffers are to be flushed*/
-  if (arbitrary_bytes && !(codec_config_flag))
-  {
-    DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
-    h264_scratch.nFilledLen = 0;
-    nal_count = 0;
-    look_ahead_nal = false;
-    frame_count = 0;
-    h264_last_au_ts = LLONG_MAX;
-    h264_last_au_flags = 0;
-    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-    m_demux_entries = 0;
-    DEBUG_PRINT_LOW("\n Initialize parser");
-    if (m_frame_parser.mutils)
-    {
-      m_frame_parser.mutils->initialize_frame_checking_environment();
-    }
+    time_stamp_dts.flush_timestamp();
+    /*Check if Heap Buffers are to be flushed*/
+    if (arbitrary_bytes && !(codec_config_flag)) {
+        DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
+        h264_scratch.nFilledLen = 0;
+        nal_count = 0;
+        look_ahead_nal = false;
+        frame_count = 0;
+        h264_last_au_ts = LLONG_MAX;
+        h264_last_au_flags = 0;
+        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+        m_demux_entries = 0;
+        DEBUG_PRINT_LOW("\n Initialize parser");
+        if (m_frame_parser.mutils) {
+            m_frame_parser.mutils->initialize_frame_checking_environment();
+        }
 
-    while (m_input_pending_q.m_size)
-    {
-      m_input_pending_q.pop_entry(&p1,&p2,&ident);
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
-    }
+        while (m_input_pending_q.m_size) {
+            m_input_pending_q.pop_entry(&p1,&p2,&ident);
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
+        }
 
-    if (psource_frame)
-    {
-      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
-      psource_frame = NULL;
-    }
+        if (psource_frame) {
+            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
+            psource_frame = NULL;
+        }
 
-    if (pdest_frame)
-    {
-      pdest_frame->nFilledLen = 0;
-      m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
-              (unsigned int)NULL);
-      pdest_frame = NULL;
+        if (pdest_frame) {
+            pdest_frame->nFilledLen = 0;
+            m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
+                    (unsigned int)NULL);
+            pdest_frame = NULL;
+        }
+        m_frame_parser.flush();
+    } else if (codec_config_flag) {
+        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
+                "is not sent to the driver yet");
     }
-    m_frame_parser.flush();
-  }
-  else if (codec_config_flag)
-  {
-    DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
-       "is not sent to the driver yet");
-  }
-  pthread_mutex_unlock(&m_lock);
-  input_flush_progress = false;
-  if (!arbitrary_bytes)
-  {
-    prev_ts = LLONG_MAX;
-    rst_prev_ts = true;
-  }
+    pthread_mutex_unlock(&m_lock);
+    input_flush_progress = false;
+    if (!arbitrary_bytes) {
+        prev_ts = LLONG_MAX;
+        rst_prev_ts = true;
+    }
 #ifdef _ANDROID_
-  if (m_debug_timestamp)
-  {
-    m_timestamp_list.reset_ts_list();
-  }
+    if (m_debug_timestamp) {
+        m_timestamp_list.reset_ts_list();
+    }
 #endif
-  DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
-  return bRet;
+    DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SendCommandEvent
+   FUNCTION
+   omx_vdec::SendCommandEvent
 
-DESCRIPTION
-  Send the event to decoder pipe.  This is needed to generate the callbacks
-  in decoder thread context.
+   DESCRIPTION
+   Send the event to decoder pipe.  This is needed to generate the callbacks
+   in decoder thread context.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::post_event(unsigned int p1,
-                          unsigned int p2,
-                          unsigned int id)
+        unsigned int p2,
+        unsigned int id)
 {
-  bool bRet      =                      false;
+    bool bRet      =                      false;
 
 
-  pthread_mutex_lock(&m_lock);
+    pthread_mutex_lock(&m_lock);
 
-  if (id == m_fill_output_msg ||
-      id == OMX_COMPONENT_GENERATE_FBD)
-  {
-    m_ftb_q.insert_entry(p1,p2,id);
-  }
-  else if (id == OMX_COMPONENT_GENERATE_ETB ||
-           id == OMX_COMPONENT_GENERATE_EBD ||
-           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
-  {
-	  m_etb_q.insert_entry(p1,p2,id);
-  }
-  else
-  {
-    m_cmd_q.insert_entry(p1,p2,id);
-  }
+    if (id == m_fill_output_msg ||
+            id == OMX_COMPONENT_GENERATE_FBD) {
+        m_ftb_q.insert_entry(p1,p2,id);
+    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
+            id == OMX_COMPONENT_GENERATE_EBD ||
+            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+        m_etb_q.insert_entry(p1,p2,id);
+    } else {
+        m_cmd_q.insert_entry(p1,p2,id);
+    }
 
-  bRet = true;
-  DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
-  post_message(this, id);
+    bRet = true;
+    DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
+    post_message(this, id);
 
-  pthread_mutex_unlock(&m_lock);
+    pthread_mutex_unlock(&m_lock);
 
-  return bRet;
+    return bRet;
 }
 
 OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!profileLevelType)
-    return OMX_ErrorBadParameter;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!profileLevelType)
+        return OMX_ErrorBadParameter;
 
-  if(profileLevelType->nPortIndex == 0) {
-    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+    if (profileLevelType->nPortIndex == 0) {
+        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
 
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+            eRet = OMX_ErrorNoMore;
+        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s\n", drv_ctx.kind);
+            eRet = OMX_ErrorNoMore;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-    {
-        eRet = OMX_ErrorNoMore;
-    }
-    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s\n", drv_ctx.kind);
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetParameter
+   FUNCTION
+   omx_vdec::GetParameter
 
-DESCRIPTION
-  OMX Get Parameter method implementation
+   DESCRIPTION
+   OMX Get Parameter method implementation
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if successful.
+   RETURN VALUE
+   Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                           OMX_IN OMX_INDEXTYPE paramIndex,
-                                           OMX_INOUT OMX_PTR     paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_INOUT OMX_PTR     paramData)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
     DEBUG_PRINT_LOW("get_parameter: \n");
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    if(paramData == NULL)
-    {
+    if (paramData == NULL) {
         DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
         return OMX_ErrorBadParameter;
     }
-  switch((unsigned long)paramIndex)
-  {
-    case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
-                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
-      eRet = update_portdef(portDefn);
-      if (eRet == OMX_ErrorNone)
-          m_port_def = *portDefn;
-      break;
-    }
-    case OMX_IndexParamVideoInit:
-    {
-      OMX_PORT_PARAM_TYPE *portParamType =
-                              (OMX_PORT_PARAM_TYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
+    switch ((unsigned long)paramIndex) {
+        case OMX_IndexParamPortDefinition: {
+                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
+                                   (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
+                               eRet = update_portdef(portDefn);
+                               if (eRet == OMX_ErrorNone)
+                                   m_port_def = *portDefn;
+                               break;
+                           }
+        case OMX_IndexParamVideoInit: {
+                              OMX_PORT_PARAM_TYPE *portParamType =
+                                  (OMX_PORT_PARAM_TYPE *) paramData;
+                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
 
-      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-      portParamType->nSize = sizeof(portParamType);
-      portParamType->nPorts           = 2;
-      portParamType->nStartPortNumber = 0;
-      break;
-    }
-    case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
+                              portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                              portParamType->nSize = sizeof(portParamType);
+                              portParamType->nPorts           = 2;
+                              portParamType->nStartPortNumber = 0;
+                              break;
+                          }
+        case OMX_IndexParamVideoPortFormat: {
+                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
 
-      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
-      portFmt->nSize             = sizeof(portFmt);
+                                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
+                                portFmt->nSize             = sizeof(portFmt);
 
-      if (0 == portFmt->nPortIndex)
-      {
-        if (0 == portFmt->nIndex)
-        {
-              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
-              portFmt->eCompressionFormat = eCompressionFormat;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
-              " NoMore compression formats\n");
-          eRet =  OMX_ErrorNoMore;
-        }
-      }
-      else if (1 == portFmt->nPortIndex)
-      {
-        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
+                                if (0 == portFmt->nPortIndex) {
+                                    if (0 == portFmt->nIndex) {
+                                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
+                                        portFmt->eCompressionFormat = eCompressionFormat;
+                                    } else {
+                                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
+                                                " NoMore compression formats\n");
+                                        eRet =  OMX_ErrorNoMore;
+                                    }
+                                } else if (1 == portFmt->nPortIndex) {
+                                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
 
-        if(0 == portFmt->nIndex)
-            portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
-                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
-        else if (1 == portFmt->nIndex)
-          portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
-        else
-        {
-           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
-                  " NoMore Color formats\n");
-           eRet =  OMX_ErrorNoMore;
-        }
-	DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
-                          (int)portFmt->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamAudioInit:
-    {
-        OMX_PORT_PARAM_TYPE *audioPortParamType =
-                                              (OMX_PORT_PARAM_TYPE *) paramData;
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
-        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-        audioPortParamType->nSize = sizeof(audioPortParamType);
-        audioPortParamType->nPorts           = 0;
-        audioPortParamType->nStartPortNumber = 0;
-        break;
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamImageInit:
-    {
-        OMX_PORT_PARAM_TYPE *imagePortParamType =
-                                              (OMX_PORT_PARAM_TYPE *) paramData;
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
-        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
-        imagePortParamType->nSize = sizeof(imagePortParamType);
-        imagePortParamType->nPorts           = 0;
-        imagePortParamType->nStartPortNumber = 0;
-        break;
+                                    if (0 == portFmt->nIndex)
+                                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+                                    else if (1 == portFmt->nIndex)
+                                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+                                    else {
+                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
+                                                " NoMore Color formats\n");
+                                        eRet =  OMX_ErrorNoMore;
+                                    }
+                                    DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
+                                } else {
+                                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
+                                            (int)portFmt->nPortIndex);
+                                    eRet = OMX_ErrorBadPortIndex;
+                                }
+                                break;
+                            }
+                            /*Component should support this port definition*/
+        case OMX_IndexParamAudioInit: {
+                              OMX_PORT_PARAM_TYPE *audioPortParamType =
+                                  (OMX_PORT_PARAM_TYPE *) paramData;
+                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
+                              audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                              audioPortParamType->nSize = sizeof(audioPortParamType);
+                              audioPortParamType->nPorts           = 0;
+                              audioPortParamType->nStartPortNumber = 0;
+                              break;
+                          }
+                          /*Component should support this port definition*/
+        case OMX_IndexParamImageInit: {
+                              OMX_PORT_PARAM_TYPE *imagePortParamType =
+                                  (OMX_PORT_PARAM_TYPE *) paramData;
+                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
+                              imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+                              imagePortParamType->nSize = sizeof(imagePortParamType);
+                              imagePortParamType->nPorts           = 0;
+                              imagePortParamType->nStartPortNumber = 0;
+                              break;
 
-    }
-    /*Component should support this port definition*/
-    case OMX_IndexParamOtherInit:
-    {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
-                          paramIndex);
-        eRet =OMX_ErrorUnsupportedIndex;
-        break;
-    }
-    case OMX_IndexParamStandardComponentRole:
-    {
-        OMX_PARAM_COMPONENTROLETYPE *comp_role;
-        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
-        comp_role->nSize = sizeof(*comp_role);
+                          }
+                          /*Component should support this port definition*/
+        case OMX_IndexParamOtherInit: {
+                              DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
+                                      paramIndex);
+                              eRet =OMX_ErrorUnsupportedIndex;
+                              break;
+                          }
+        case OMX_IndexParamStandardComponentRole: {
+                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                                  comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
+                                  comp_role->nSize = sizeof(*comp_role);
 
-        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
-                    paramIndex);
-        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
-                    OMX_MAX_STRINGNAME_SIZE);
-        break;
-    }
-    /* Added for parameter test */
-    case OMX_IndexParamPriorityMgmt:
-        {
+                                  DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
+                                          paramIndex);
+                                  strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
+                                          OMX_MAX_STRINGNAME_SIZE);
+                                  break;
+                              }
+                              /* Added for parameter test */
+        case OMX_IndexParamPriorityMgmt: {
 
-            OMX_PRIORITYMGMTTYPE *priorityMgmType =
-                                             (OMX_PRIORITYMGMTTYPE *) paramData;
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
-            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
-            priorityMgmType->nSize = sizeof(priorityMgmType);
+                             OMX_PRIORITYMGMTTYPE *priorityMgmType =
+                                 (OMX_PRIORITYMGMTTYPE *) paramData;
+                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
+                             priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
+                             priorityMgmType->nSize = sizeof(priorityMgmType);
 
-            break;
-        }
-    /* Added for parameter test */
-    case OMX_IndexParamCompBufferSupplier:
-        {
-            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
-                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
+                             break;
+                         }
+                         /* Added for parameter test */
+        case OMX_IndexParamCompBufferSupplier: {
+                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
+                                       (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                                   DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
 
-            bufferSupplierType->nSize = sizeof(bufferSupplierType);
-            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
-            if(0 == bufferSupplierType->nPortIndex)
-                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
-            else if (1 == bufferSupplierType->nPortIndex)
-                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
-            else
-                eRet = OMX_ErrorBadPortIndex;
+                                   bufferSupplierType->nSize = sizeof(bufferSupplierType);
+                                   bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
+                                   if (0 == bufferSupplierType->nPortIndex)
+                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+                                   else if (1 == bufferSupplierType->nPortIndex)
+                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+                                   else
+                                       eRet = OMX_ErrorBadPortIndex;
 
 
-            break;
-        }
-    case OMX_IndexParamVideoAvc:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
-                        paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoH263:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
-                        paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoMpeg4:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
-                        paramIndex);
-            break;
-        }
-    case OMX_IndexParamVideoMpeg2:
-        {
-          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
-              paramIndex);
-          break;
-        }
-    case OMX_IndexParamVideoProfileLevelQuerySupported:
-        {
-          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
-          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
-            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
-    eRet = get_supported_profile_level_for_1080p(profileLevelType);
-          break;
-        }
+                                   break;
+                               }
+        case OMX_IndexParamVideoAvc: {
+                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
+                                     paramIndex);
+                             break;
+                         }
+        case OMX_IndexParamVideoH263: {
+                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
+                                      paramIndex);
+                              break;
+                          }
+        case OMX_IndexParamVideoMpeg4: {
+                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
+                                       paramIndex);
+                               break;
+                           }
+        case OMX_IndexParamVideoMpeg2: {
+                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
+                                       paramIndex);
+                               break;
+                           }
+        case OMX_IndexParamVideoProfileLevelQuerySupported: {
+                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
+                                        OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
+                                            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+                                        eRet = get_supported_profile_level_for_1080p(profileLevelType);
+                                        break;
+                                    }
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
-        {
-            DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
-            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
-            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
+                                        DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
+                                        GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
+                                        if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
 
-                if(secure_mode) {
-                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
-                                                      GRALLOC_USAGE_PRIVATE_UNCACHED);
-                } else {
-                        nativeBuffersUsage->nUsage =
-                            (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |
-                             GRALLOC_USAGE_PRIVATE_UNCACHED);
-                }
-            } else {
-                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
-                eRet = OMX_ErrorBadParameter;
-            }
-        }
-        break;
+                                            if (secure_mode) {
+                                                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
+                                                        GRALLOC_USAGE_PRIVATE_UNCACHED);
+                                            } else {
+                                                nativeBuffersUsage->nUsage =
+                                                    (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |
+                                                     GRALLOC_USAGE_PRIVATE_UNCACHED);
+                                            }
+                                        } else {
+                                            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
+                                            eRet = OMX_ErrorBadParameter;
+                                        }
+                                    }
+                                    break;
 #endif
 
-    default:
-    {
-      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
-      eRet =OMX_ErrorUnsupportedIndex;
+        default: {
+                 DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
+                 eRet =OMX_ErrorUnsupportedIndex;
+             }
+
     }
 
-  }
+    DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
+            drv_ctx.video_resolution.frame_width,
+            drv_ctx.video_resolution.frame_height,
+            drv_ctx.video_resolution.stride,
+            drv_ctx.video_resolution.scan_lines);
 
-  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
-      drv_ctx.video_resolution.frame_width,
-      drv_ctx.video_resolution.frame_height,
-      drv_ctx.video_resolution.stride,
-      drv_ctx.video_resolution.scan_lines);
-
-  return eRet;
+    return eRet;
 }
 
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
@@ -3085,22 +2735,22 @@
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
 
-    if((params == NULL) ||
-      (params->nativeBuffer == NULL) ||
-      (params->nativeBuffer->handle == NULL) ||
-      !m_enable_android_native_buffers)
+    if ((params == NULL) ||
+            (params->nativeBuffer == NULL) ||
+            (params->nativeBuffer->handle == NULL) ||
+            !m_enable_android_native_buffers)
         return OMX_ErrorBadParameter;
     m_use_android_native_buffers = OMX_TRUE;
     sp<android_native_buffer_t> nBuf = params->nativeBuffer;
     private_handle_t *handle = (private_handle_t *)nBuf->handle;
-    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
+    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
         OMX_U8 *buffer = NULL;
-        if(!secure_mode) {
-                buffer = (OMX_U8*)mmap(0, handle->size,
+        if (!secure_mode) {
+            buffer = (OMX_U8*)mmap(0, handle->size,
                     PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
-                if(buffer == MAP_FAILED) {
-                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
-                    return OMX_ErrorInsufficientResources;
+            if (buffer == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+                return OMX_ErrorInsufficientResources;
             }
         }
         eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
@@ -3111,1077 +2761,906 @@
 }
 #endif
 /* ======================================================================
-FUNCTION
-  omx_vdec::Setparameter
+   FUNCTION
+   omx_vdec::Setparameter
 
-DESCRIPTION
-  OMX Set Parameter method implementation.
+   DESCRIPTION
+   OMX Set Parameter method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                           OMX_IN OMX_INDEXTYPE paramIndex,
-                                           OMX_IN OMX_PTR        paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_IN OMX_PTR        paramData)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     int ret=0;
     struct v4l2_format fmt;
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    if(paramData == NULL)
-    {
-         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
-         return OMX_ErrorBadParameter;
+    if (paramData == NULL) {
+        DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
+        return OMX_ErrorBadParameter;
     }
-    if((m_state != OMX_StateLoaded) &&
-          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
-          (m_out_bEnabled == OMX_TRUE) &&
-          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
-          (m_inp_bEnabled == OMX_TRUE)) {
+    if ((m_state != OMX_StateLoaded) &&
+            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
+            (m_out_bEnabled == OMX_TRUE) &&
+            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
+            (m_inp_bEnabled == OMX_TRUE)) {
         DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
         return OMX_ErrorIncorrectStateOperation;
     }
-  switch((unsigned long)paramIndex)
-  {
-    case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
-      //been called.
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
-             (int)portDefn->format.video.nFrameHeight,
-             (int)portDefn->format.video.nFrameWidth);
-      if(OMX_DirOutput == portDefn->eDir)
-      {
-          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
-          m_display_id = portDefn->format.video.pNativeWindow;
-          unsigned int buffer_size;
-          if (!client_buffers.get_buffer_req(buffer_size)) {
-              DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
-              eRet = OMX_ErrorBadParameter;
-          } else {
-              if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
-                      portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size )
-              {
-                  drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
-                  drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
-                  drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount;
-                  drv_ctx.extradata_info.size = drv_ctx.extradata_info.count *
-                                        drv_ctx.extradata_info.buffer_size;
-                  eRet = set_buffer_req(&drv_ctx.op_buf);
-                  if (eRet == OMX_ErrorNone)
-                      m_port_def = *portDefn;
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
-                          drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
-                          portDefn->nBufferCountActual, portDefn->nBufferSize);
-                  eRet = OMX_ErrorBadParameter;
-              }
-          }
-      }
-      else if(OMX_DirInput == portDefn->eDir)
-      {
-        bool port_format_changed = false;
-        if((portDefn->format.video.xFramerate >> 16) > 0 &&
-           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
-        {
-            // Frame rate only should be set if this is a "known value" or to
-            // activate ts prediction logic (arbitrary mode only) sending input
-            // timestamps with max value (LLONG_MAX).
-            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
-                             portDefn->format.video.xFramerate >> 16);
-            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
-                          drv_ctx.frame_rate.fps_denominator);
-            if(!drv_ctx.frame_rate.fps_numerator)
-            {
-              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
-              drv_ctx.frame_rate.fps_numerator = 30;
-            }
-            if(drv_ctx.frame_rate.fps_denominator)
-              drv_ctx.frame_rate.fps_numerator = (int)
-                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
-              drv_ctx.frame_rate.fps_denominator = 1;
-            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
-                      drv_ctx.frame_rate.fps_numerator;
-            DEBUG_PRINT_LOW("set_parameter: frm_int(%lu) fps(%.2f)",
-                             frm_int, drv_ctx.frame_rate.fps_numerator /
-                             (float)drv_ctx.frame_rate.fps_denominator);
-        }
-         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
-         if(drv_ctx.video_resolution.frame_height !=
-               portDefn->format.video.nFrameHeight ||
-             drv_ctx.video_resolution.frame_width  !=
-               portDefn->format.video.nFrameWidth)
-         {
-             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%lu x %lu)\n",
-                           portDefn->format.video.nFrameWidth,
-                           portDefn->format.video.nFrameHeight);
-             port_format_changed = true;
-             if (portDefn->format.video.nFrameHeight != 0x0 &&
-                 portDefn->format.video.nFrameWidth != 0x0)
-             {
-                 update_resolution(portDefn->format.video.nFrameWidth,
-                    portDefn->format.video.nFrameHeight,
-					portDefn->format.video.nFrameWidth,
-					portDefn->format.video.nFrameHeight);
-                 eRet = is_video_session_supported();
-                 if (eRet)
-                    break;
-			fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-			fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-			fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-			fmt.fmt.pix_mp.pixelformat = output_capability;
-			DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
-			ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-               if (ret)
-               {
-                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
-                   eRet = OMX_ErrorUnsupportedSetting;
-               }
-               else
-                   eRet = get_buffer_req(&drv_ctx.op_buf);
-             }
-         }
-         if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
-                  || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)
-         {
-             port_format_changed = true;
-             vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
-             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
-             drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
-                      (~(buffer_prop->alignment - 1));
-             eRet = set_buffer_req(buffer_prop);
-         }
-         if (false == port_format_changed)
-         {
-             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
-               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
-               portDefn->nBufferCountActual, portDefn->nBufferSize);
-             eRet = OMX_ErrorBadParameter;
-         }
-      }
-      else if (portDefn->eDir ==  OMX_DirMax)
-      {
-          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
-                      (int)portDefn->nPortIndex);
-          eRet = OMX_ErrorBadPortIndex;
-      }
-    }
-    break;
-    case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      int ret=0;
-      struct v4l2_format fmt;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
-              portFmt->eColorFormat);
+    switch ((unsigned long)paramIndex) {
+        case OMX_IndexParamPortDefinition: {
+                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                               portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                               //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
+                               //been called.
+                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
+                                       (int)portDefn->format.video.nFrameHeight,
+                                       (int)portDefn->format.video.nFrameWidth);
+                               if (OMX_DirOutput == portDefn->eDir) {
+                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
+                                   m_display_id = portDefn->format.video.pNativeWindow;
+                                   unsigned int buffer_size;
+                                   if (!client_buffers.get_buffer_req(buffer_size)) {
+                                       DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
+                                       eRet = OMX_ErrorBadParameter;
+                                   } else {
+                                       if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
+                                               portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
+                                           drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
+                                           drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
+                                           drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount;
+                                           drv_ctx.extradata_info.size = drv_ctx.extradata_info.count *
+                                               drv_ctx.extradata_info.buffer_size;
+                                           eRet = set_buffer_req(&drv_ctx.op_buf);
+                                           if (eRet == OMX_ErrorNone)
+                                               m_port_def = *portDefn;
+                                       } else {
+                                           DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
+                                                   drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
+                                                   portDefn->nBufferCountActual, portDefn->nBufferSize);
+                                           eRet = OMX_ErrorBadParameter;
+                                       }
+                                   }
+                               } else if (OMX_DirInput == portDefn->eDir) {
+                                   bool port_format_changed = false;
+                                   if ((portDefn->format.video.xFramerate >> 16) > 0 &&
+                                           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
+                                       // Frame rate only should be set if this is a "known value" or to
+                                       // activate ts prediction logic (arbitrary mode only) sending input
+                                       // timestamps with max value (LLONG_MAX).
+                                       DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
+                                               portDefn->format.video.xFramerate >> 16);
+                                       Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
+                                               drv_ctx.frame_rate.fps_denominator);
+                                       if (!drv_ctx.frame_rate.fps_numerator) {
+                                           DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
+                                           drv_ctx.frame_rate.fps_numerator = 30;
+                                       }
+                                       if (drv_ctx.frame_rate.fps_denominator)
+                                           drv_ctx.frame_rate.fps_numerator = (int)
+                                               drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
+                                       drv_ctx.frame_rate.fps_denominator = 1;
+                                       frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
+                                           drv_ctx.frame_rate.fps_numerator;
+                                       DEBUG_PRINT_LOW("set_parameter: frm_int(%lu) fps(%.2f)",
+                                               frm_int, drv_ctx.frame_rate.fps_numerator /
+                                               (float)drv_ctx.frame_rate.fps_denominator);
+                                   }
+                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
+                                   if (drv_ctx.video_resolution.frame_height !=
+                                           portDefn->format.video.nFrameHeight ||
+                                           drv_ctx.video_resolution.frame_width  !=
+                                           portDefn->format.video.nFrameWidth) {
+                                       DEBUG_PRINT_LOW("\n SetParam IP: WxH(%lu x %lu)\n",
+                                               portDefn->format.video.nFrameWidth,
+                                               portDefn->format.video.nFrameHeight);
+                                       port_format_changed = true;
+                                       if (portDefn->format.video.nFrameHeight != 0x0 &&
+                                               portDefn->format.video.nFrameWidth != 0x0) {
+                                           update_resolution(portDefn->format.video.nFrameWidth,
+                                                   portDefn->format.video.nFrameHeight,
+                                                   portDefn->format.video.nFrameWidth,
+                                                   portDefn->format.video.nFrameHeight);
+                                           eRet = is_video_session_supported();
+                                           if (eRet)
+                                               break;
+                                           fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+                                           fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+                                           fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+                                           fmt.fmt.pix_mp.pixelformat = output_capability;
+                                           DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
+                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                                           if (ret) {
+                                               DEBUG_PRINT_ERROR("\n Set Resolution failed");
+                                               eRet = OMX_ErrorUnsupportedSetting;
+                                           } else
+                                               eRet = get_buffer_req(&drv_ctx.op_buf);
+                                       }
+                                   }
+                                   if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
+                                           || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
+                                       port_format_changed = true;
+                                       vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
+                                       drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
+                                       drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
+                                           (~(buffer_prop->alignment - 1));
+                                       eRet = set_buffer_req(buffer_prop);
+                                   }
+                                   if (false == port_format_changed) {
+                                       DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
+                                               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
+                                               portDefn->nBufferCountActual, portDefn->nBufferSize);
+                                       eRet = OMX_ErrorBadParameter;
+                                   }
+                               } else if (portDefn->eDir ==  OMX_DirMax) {
+                                   DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
+                                           (int)portDefn->nPortIndex);
+                                   eRet = OMX_ErrorBadPortIndex;
+                               }
+                           }
+                           break;
+        case OMX_IndexParamVideoPortFormat: {
+                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                                int ret=0;
+                                struct v4l2_format fmt;
+                                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
+                                        portFmt->eColorFormat);
 
-      if(1 == portFmt->nPortIndex)
-      {
-          fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-          fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-          fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-          fmt.fmt.pix_mp.pixelformat = capture_capability;
-          enum vdec_output_fromat op_format;
-          if((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
-                      QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
-              (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
-              op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
-          else if(portFmt->eColorFormat ==
-                  (OMX_COLOR_FORMATTYPE)
-                  QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
-              op_format = VDEC_YUV_FORMAT_TILE_4x2;
-          else
-              eRet = OMX_ErrorBadParameter;
+                                if (1 == portFmt->nPortIndex) {
+                                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+                                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+                                    fmt.fmt.pix_mp.pixelformat = capture_capability;
+                                    enum vdec_output_fromat op_format;
+                                    if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
+                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
+                                            (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
+                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
+                                    else if (portFmt->eColorFormat ==
+                                            (OMX_COLOR_FORMATTYPE)
+                                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
+                                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
+                                    else
+                                        eRet = OMX_ErrorBadParameter;
 
-          if(eRet == OMX_ErrorNone)
-          {
-              drv_ctx.output_format = op_format;
-              ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-              if(ret)
-              {
-                  DEBUG_PRINT_ERROR("\n Set output format failed");
-                  eRet = OMX_ErrorUnsupportedSetting;
-                  /*TODO: How to handle this case */
-              }
-              else
-              {
-                  eRet = get_buffer_req(&drv_ctx.op_buf);
-              }
-          }
-          if (eRet == OMX_ErrorNone){
-           if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
-             DEBUG_PRINT_ERROR("\n Set color format failed");
-             eRet = OMX_ErrorBadParameter;
-           }
-         }
-      }
-    }
-    break;
+                                    if (eRet == OMX_ErrorNone) {
+                                        drv_ctx.output_format = op_format;
+                                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                                        if (ret) {
+                                            DEBUG_PRINT_ERROR("\n Set output format failed");
+                                            eRet = OMX_ErrorUnsupportedSetting;
+                                            /*TODO: How to handle this case */
+                                        } else {
+                                            eRet = get_buffer_req(&drv_ctx.op_buf);
+                                        }
+                                    }
+                                    if (eRet == OMX_ErrorNone) {
+                                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
+                                            DEBUG_PRINT_ERROR("\n Set color format failed");
+                                            eRet = OMX_ErrorBadParameter;
+                                        }
+                                    }
+                                }
+                            }
+                            break;
 
-    case OMX_QcomIndexPortDefn:
-    {
-        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
-            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
-        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %lu\n",
-            portFmt->nFramePackingFormat);
+        case OMX_QcomIndexPortDefn: {
+                            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
+                                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
+                            DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %lu\n",
+                                    portFmt->nFramePackingFormat);
 
-        /* Input port */
-        if (portFmt->nPortIndex == 0)
-        {
-            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
-            {
-              if(secure_mode) {
-                arbitrary_bytes = false;
-                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
-                eRet = OMX_ErrorUnsupportedSetting;
-              } else {
-               arbitrary_bytes = true;
-              }
-            }
-            else if (portFmt->nFramePackingFormat ==
-                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
-            {
-               arbitrary_bytes = false;
-            }
-            else
-            {
-                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
-                    portFmt->nFramePackingFormat);
-                eRet = OMX_ErrorUnsupportedSetting;
-            }
-        }
-        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
-        {
-          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
-          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
-               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
-              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
-          {
-            m_out_mem_region_smi = OMX_TRUE;
-            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
-            {
-              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
-              m_use_output_pmem = OMX_TRUE;
-            }
-          }
-        }
-    }
-    break;
+                            /* Input port */
+                            if (portFmt->nPortIndex == 0) {
+                                if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
+                                    if (secure_mode) {
+                                        arbitrary_bytes = false;
+                                        DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
+                                        eRet = OMX_ErrorUnsupportedSetting;
+                                    } else {
+                                        arbitrary_bytes = true;
+                                    }
+                                } else if (portFmt->nFramePackingFormat ==
+                                        OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
+                                    arbitrary_bytes = false;
+                                } else {
+                                    DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
+                                            portFmt->nFramePackingFormat);
+                                    eRet = OMX_ErrorUnsupportedSetting;
+                                }
+                            } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+                                DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
+                                if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
+                                            portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
+                                        portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
+                                    m_out_mem_region_smi = OMX_TRUE;
+                                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+                                        DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
+                                        m_use_output_pmem = OMX_TRUE;
+                                    }
+                                }
+                            }
+                        }
+                        break;
 
-     case OMX_IndexParamStandardComponentRole:
-     {
-          OMX_PARAM_COMPONENTROLETYPE *comp_role;
-          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
-                       comp_role->cRole);
+        case OMX_IndexParamStandardComponentRole: {
+                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                                  DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
+                                          comp_role->cRole);
 
-          if((m_state == OMX_StateLoaded)&&
-              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-          {
-           DEBUG_PRINT_LOW("Set Parameter called in valid state");
-          }
-          else
-          {
-             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-             return OMX_ErrorIncorrectStateOperation;
-          }
+                                  if ((m_state == OMX_StateLoaded)&&
+                                          !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                                      DEBUG_PRINT_LOW("Set Parameter called in valid state");
+                                  } else {
+                                      DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                                      return OMX_ErrorIncorrectStateOperation;
+                                  }
 
-          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet = OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-          {
-            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-            {
-              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-          }
-          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
-                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
-                  )
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
-                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
-                    )
-          {
-              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
-              {
-                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-              }
-              else
-              {
-                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-                  eRet =OMX_ErrorUnsupportedSetting;
-              }
-          }
-	  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-          {
-            if(!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
-               (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE)))
-            {
-              strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-            }
-	    else
-            {
-              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-	  }
-          else
-          {
-               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
-               eRet = OMX_ErrorInvalidComponentName;
-          }
-          break;
-     }
+                                  if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                                      if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                                          strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet =OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                                      if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                                          strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet = OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                                      if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                                          strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet =OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+                                      if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+                                          strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet = OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+                                        ) {
+                                      if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
+                                          strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet =OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+                                        ) {
+                                      if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
+                                          strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet =OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+                                      if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
+                                              (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
+                                          strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+                                      } else {
+                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+                                          eRet = OMX_ErrorUnsupportedSetting;
+                                      }
+                                  } else {
+                                      DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
+                                      eRet = OMX_ErrorInvalidComponentName;
+                                  }
+                                  break;
+                              }
 
-    case OMX_IndexParamPriorityMgmt:
-        {
-            if(m_state != OMX_StateLoaded)
-            {
-               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-               return OMX_ErrorIncorrectStateOperation;
-            }
-            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
-            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu\n",
-              priorityMgmtype->nGroupID);
+        case OMX_IndexParamPriorityMgmt: {
+                             if (m_state != OMX_StateLoaded) {
+                                 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                                 return OMX_ErrorIncorrectStateOperation;
+                             }
+                             OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
+                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu\n",
+                                     priorityMgmtype->nGroupID);
 
-            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu\n",
-             priorityMgmtype->nGroupPriority);
+                             DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu\n",
+                                     priorityMgmtype->nGroupPriority);
 
-            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
-            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
+                             m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
+                             m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
 
-            break;
-        }
+                             break;
+                         }
 
-      case OMX_IndexParamCompBufferSupplier:
-      {
-          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
-                bufferSupplierType->eBufferSupplier);
-             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
-                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
+        case OMX_IndexParamCompBufferSupplier: {
+                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
+                                           bufferSupplierType->eBufferSupplier);
+                                   if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
+                                       m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
 
-             else
+                                   else
 
-             eRet = OMX_ErrorBadPortIndex;
+                                       eRet = OMX_ErrorBadPortIndex;
 
-          break;
+                                   break;
 
-      }
-      case OMX_IndexParamVideoAvc:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoH263:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoMpeg4:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
-                    paramIndex);
-              break;
-          }
-      case OMX_IndexParamVideoMpeg2:
-          {
-              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
-                    paramIndex);
-              break;
-          }
-       case OMX_QcomIndexParamVideoDecoderPictureOrder:
-          {
-              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
-                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
-			  struct v4l2_control control;
-			  int pic_order,rc=0;
-              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
-                    pictureOrder->eOutputPictureOrder);
-		if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
-			pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
-		  }
-		else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
-			pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
-                  time_stamp_dts.set_timestamp_reorder_mode(false);
-		}
-		else
-		eRet = OMX_ErrorBadParameter;
-		if (eRet == OMX_ErrorNone)
-		{
-			control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
-			control.value = pic_order;
-			rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-			if(rc)
-			{
-				DEBUG_PRINT_ERROR("\n Set picture order failed");
-				eRet = OMX_ErrorUnsupportedSetting;
-			}
-		}
-		break;
-	}
-    case OMX_QcomIndexParamConcealMBMapExtraData:
-      if(!secure_mode)
-          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
-                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      else {
-          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-          eRet = OMX_ErrorUnsupportedSetting;
-      }
-      break;
-    case OMX_QcomIndexParamFrameInfoExtraData:
-      {
-        if(!secure_mode)
-            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
-                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
-        else {
-            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-            eRet = OMX_ErrorUnsupportedSetting;
-        }
-       break;
-      }
-    case OMX_QcomIndexParamInterlaceExtraData:
-      if(!secure_mode)
-          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      else {
-          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-          eRet = OMX_ErrorUnsupportedSetting;
-      }
-      break;
-    case OMX_QcomIndexParamH264TimeInfo:
-      if(!secure_mode)
-          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
-                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
-      else {
-          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
-          eRet = OMX_ErrorUnsupportedSetting;
-      }
-      break;
-    case OMX_QcomIndexParamVideoDivx:
-      {
-        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
-      }
-      break;
-    case OMX_QcomIndexPlatformPvt:
-      {
-        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
-        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
-        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
-        {
-          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
-          eRet = OMX_ErrorUnsupportedSetting;
-        }
-        else
-        {
-          m_out_pvt_entry_pmem = OMX_TRUE;
-          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
-          {
-            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
-            m_use_output_pmem = OMX_TRUE;
-          }
-        }
+                               }
+        case OMX_IndexParamVideoAvc: {
+                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
+                                     paramIndex);
+                             break;
+                         }
+        case OMX_IndexParamVideoH263: {
+                              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
+                                      paramIndex);
+                              break;
+                          }
+        case OMX_IndexParamVideoMpeg4: {
+                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
+                                       paramIndex);
+                               break;
+                           }
+        case OMX_IndexParamVideoMpeg2: {
+                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
+                                       paramIndex);
+                               break;
+                           }
+        case OMX_QcomIndexParamVideoDecoderPictureOrder: {
+                                     QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
+                                         (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
+                                     struct v4l2_control control;
+                                     int pic_order,rc=0;
+                                     DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
+                                             pictureOrder->eOutputPictureOrder);
+                                     if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
+                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
+                                     } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
+                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
+                                         time_stamp_dts.set_timestamp_reorder_mode(false);
+                                     } else
+                                         eRet = OMX_ErrorBadParameter;
+                                     if (eRet == OMX_ErrorNone) {
+                                         control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+                                         control.value = pic_order;
+                                         rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+                                         if (rc) {
+                                             DEBUG_PRINT_ERROR("\n Set picture order failed");
+                                             eRet = OMX_ErrorUnsupportedSetting;
+                                         }
+                                     }
+                                     break;
+                                 }
+        case OMX_QcomIndexParamConcealMBMapExtraData:
+                                 if (!secure_mode)
+                                     eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
+                                             ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                                 else {
+                                     DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                                     eRet = OMX_ErrorUnsupportedSetting;
+                                 }
+                                 break;
+        case OMX_QcomIndexParamFrameInfoExtraData: {
+                                   if (!secure_mode)
+                                       eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
+                                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                                   else {
+                                       DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                                       eRet = OMX_ErrorUnsupportedSetting;
+                                   }
+                                   break;
+                               }
+        case OMX_QcomIndexParamInterlaceExtraData:
+                               if (!secure_mode)
+                                   eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
+                                           ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               else {
+                                   DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                                   eRet = OMX_ErrorUnsupportedSetting;
+                               }
+                               break;
+        case OMX_QcomIndexParamH264TimeInfo:
+                               if (!secure_mode)
+                                   eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
+                                           ((QOMX_ENABLETYPE *)paramData)->bEnable);
+                               else {
+                                   DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+                                   eRet = OMX_ErrorUnsupportedSetting;
+                               }
+                               break;
+        case OMX_QcomIndexParamVideoDivx: {
+                              QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
+                          }
+                          break;
+        case OMX_QcomIndexPlatformPvt: {
+                               DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
+                               OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
+                               if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+                                   DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
+                                   eRet = OMX_ErrorUnsupportedSetting;
+                               } else {
+                                   m_out_pvt_entry_pmem = OMX_TRUE;
+                                   if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
+                                       m_use_output_pmem = OMX_TRUE;
+                                   }
+                               }
 
-      }
-      break;
-    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
-      {
-        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
-        DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
-        struct v4l2_control control;
-        int rc;
-        drv_ctx.idr_only_decoding = 1;
-        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
-        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
-        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-        if(rc)
-        {
-          DEBUG_PRINT_ERROR("\n Set picture order failed");
-          eRet = OMX_ErrorUnsupportedSetting;
-        } else {
-            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
-            control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
-            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
-            if(rc)
-            {
-              DEBUG_PRINT_ERROR("\n Sync frame setting failed");
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-            /*Setting sync frame decoding on driver might change buffer
-             * requirements so update them here*/
-            if (get_buffer_req(&drv_ctx.ip_buf)) {
-              DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer i/p requirements");
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-            if (get_buffer_req(&drv_ctx.op_buf)) {
-              DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer o/p requirements");
-              eRet = OMX_ErrorUnsupportedSetting;
-            }
-        }
-      }
-      break;
+                           }
+                           break;
+        case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
+                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
+                                       DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
+                                       struct v4l2_control control;
+                                       int rc;
+                                       drv_ctx.idr_only_decoding = 1;
+                                       control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+                                       control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
+                                       rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+                                       if (rc) {
+                                           DEBUG_PRINT_ERROR("\n Set picture order failed");
+                                           eRet = OMX_ErrorUnsupportedSetting;
+                                       } else {
+                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
+                                           control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
+                                           rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+                                           if (rc) {
+                                               DEBUG_PRINT_ERROR("\n Sync frame setting failed");
+                                               eRet = OMX_ErrorUnsupportedSetting;
+                                           }
+                                           /*Setting sync frame decoding on driver might change buffer
+                                            * requirements so update them here*/
+                                           if (get_buffer_req(&drv_ctx.ip_buf)) {
+                                               DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer i/p requirements");
+                                               eRet = OMX_ErrorUnsupportedSetting;
+                                           }
+                                           if (get_buffer_req(&drv_ctx.op_buf)) {
+                                               DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer o/p requirements");
+                                               eRet = OMX_ErrorUnsupportedSetting;
+                                           }
+                                       }
+                                   }
+                                   break;
 
-    case OMX_QcomIndexParamIndexExtraDataType:
-      {
-        if(!secure_mode) {
-            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
-            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
-                   (extradataIndexType->bEnabled == OMX_TRUE) &&
-                   (extradataIndexType->nPortIndex == 1))
-            {
-              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
-              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
+        case OMX_QcomIndexParamIndexExtraDataType: {
+                                   if (!secure_mode) {
+                                       QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
+                                       if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
+                                               (extradataIndexType->bEnabled == OMX_TRUE) &&
+                                               (extradataIndexType->nPortIndex == 1)) {
+                                           DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
+                                           eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
 
-            }
-         }
-       }
-      break;
-    case OMX_QcomIndexParamEnableSmoothStreaming:
-      {
+                                       }
+                                   }
+                               }
+                               break;
+        case OMX_QcomIndexParamEnableSmoothStreaming: {
 #ifndef SMOOTH_STREAMING_DISABLED
-	      struct v4l2_control control;
-	      struct v4l2_format fmt;
-	      control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
-	      control.value = 1;
-	      int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
-	      if(rc < 0) {
-		      DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
-		      eRet = OMX_ErrorHardware;
-	      }
+                                      struct v4l2_control control;
+                                      struct v4l2_format fmt;
+                                      control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
+                                      control.value = 1;
+                                      int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
+                                      if (rc < 0) {
+                                          DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+                                          eRet = OMX_ErrorHardware;
+                                      }
 #else
-       eRet = OMX_ErrorUnsupportedSetting;
+                                      eRet = OMX_ErrorUnsupportedSetting;
 #endif
-      }
-     break;
+                                  }
+                                  break;
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-      /* Need to allow following two set_parameters even in Idle
-       * state. This is ANDROID architecture which is not in sync
-       * with openmax standard. */
-    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
-      {
-          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
-          if(enableNativeBuffers) {
-              m_enable_android_native_buffers = enableNativeBuffers->enable;
-          }
-      }
-      break;
-    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
-      {
-          eRet = use_android_native_buffer(hComp, paramData);
-      }
-      break;
+                                  /* Need to allow following two set_parameters even in Idle
+                                   * state. This is ANDROID architecture which is not in sync
+                                   * with openmax standard. */
+        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
+                                           EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
+                                           if (enableNativeBuffers) {
+                                               m_enable_android_native_buffers = enableNativeBuffers->enable;
+                                           }
+                                       }
+                                       break;
+        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
+                                       eRet = use_android_native_buffer(hComp, paramData);
+                                   }
+                                   break;
 #endif
-    case OMX_QcomIndexParamEnableTimeStampReorder:
-      {
-        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
-        if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
-          if (reorder->bEnable == OMX_TRUE) {
-              frm_int =0;
-              time_stamp_dts.set_timestamp_reorder_mode(true);
-          }
-          else
-            time_stamp_dts.set_timestamp_reorder_mode(false);
-        } else {
-          time_stamp_dts.set_timestamp_reorder_mode(false);
-          if (reorder->bEnable == OMX_TRUE)
-          {
-            eRet = OMX_ErrorUnsupportedSetting;
-          }
-        }
-      }
-      break;
-     case OMX_IndexParamVideoProfileLevelCurrent:
-       {
-         OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
-		(OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
-         if (pParam) {
-           m_profile_lvl.eProfile = pParam->eProfile;
-           m_profile_lvl.eLevel = pParam->eLevel;
-         }
-         break;
+        case OMX_QcomIndexParamEnableTimeStampReorder: {
+                                       QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
+                                       if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
+                                           if (reorder->bEnable == OMX_TRUE) {
+                                               frm_int =0;
+                                               time_stamp_dts.set_timestamp_reorder_mode(true);
+                                           } else
+                                               time_stamp_dts.set_timestamp_reorder_mode(false);
+                                       } else {
+                                           time_stamp_dts.set_timestamp_reorder_mode(false);
+                                           if (reorder->bEnable == OMX_TRUE) {
+                                               eRet = OMX_ErrorUnsupportedSetting;
+                                           }
+                                       }
+                                   }
+                                   break;
+        case OMX_IndexParamVideoProfileLevelCurrent: {
+                                     OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
+                                         (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
+                                     if (pParam) {
+                                         m_profile_lvl.eProfile = pParam->eProfile;
+                                         m_profile_lvl.eLevel = pParam->eLevel;
+                                     }
+                                     break;
 
-       }
-    default:
-    {
-      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
-      eRet = OMX_ErrorUnsupportedIndex;
+                                 }
+        default: {
+                 DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
+                 eRet = OMX_ErrorUnsupportedIndex;
+             }
     }
-  }
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetConfig
+   FUNCTION
+   omx_vdec::GetConfig
 
-DESCRIPTION
-  OMX Get Config Method implementation.
+   DESCRIPTION
+   OMX Get Config Method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                        OMX_IN OMX_INDEXTYPE configIndex,
-                                        OMX_INOUT OMX_PTR     configData)
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_INOUT OMX_PTR     configData)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if (m_state == OMX_StateInvalid)
-  {
-     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
-     return OMX_ErrorInvalidState;
-  }
-
-  switch ((unsigned long)configIndex)
-  {
-    case OMX_QcomIndexConfigInterlaced:
-    {
-      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
-                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
-      if (configFmt->nPortIndex == 1)
-      {
-        if (configFmt->nIndex == 0)
-        {
-          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
-        }
-        else if (configFmt->nIndex == 1)
-        {
-          configFmt->eInterlaceType =
-                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
-        }
-        else if (configFmt->nIndex == 2)
-        {
-          configFmt->eInterlaceType =
-          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
-                            " NoMore Interlaced formats\n");
-          eRet = OMX_ErrorNoMore;
-        }
-
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
-        (int)configFmt->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-    break;
-    }
-    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
-    {
-        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
-          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
-	decoderinstances->nNumOfInstances = 16;
-	/*TODO: How to handle this case */	
-    break;
-    }
-  case OMX_QcomIndexConfigVideoFramePackingArrangement:
-    {
-      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
-      {
-        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
-          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
-        h264_parser->get_frame_pack_data(configFmt);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
-      }
-      break;
-    }
-  case OMX_IndexConfigCommonOutputCrop:
-    {
-      OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
-      memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
-      break;
-    }
-  default:
-    {
-      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
-      eRet = OMX_ErrorBadParameter;
-    }
-
-  }
-
-  return eRet;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::SetConfig
-
-DESCRIPTION
-  OMX Set Config method implementation
-
-PARAMETERS
-  <TBD>.
-
-RETURN VALUE
-  OMX Error None if successful.
-========================================================================== */
-OMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                        OMX_IN OMX_INDEXTYPE configIndex,
-                                        OMX_IN OMX_PTR        configData)
-{
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
-
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  OMX_VIDEO_CONFIG_NALSIZE *pNal;
-
-  DEBUG_PRINT_LOW("\n Set Config Called");
-
-  if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData)
-  {
-    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
-    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
-    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
-    {
-      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
-      OMX_U32 extra_size;
-      // Parsing done here for the AVC atom is definitely not generic
-      // Currently this piece of code is working, but certainly
-      // not tested with all .mp4 files.
-      // Incase of failure, we might need to revisit this
-      // for a generic piece of code.
-
-      // Retrieve size of NAL length field
-      // byte #4 contains the size of NAL lenght field
-      nal_length = (config->pData[4] & 0x03) + 1;
-
-      extra_size = 0;
-      if (nal_length > 2)
-      {
-        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
-        extra_size = (nal_length - 2) * 2;
-      }
-
-      // SPS starts from byte #6
-      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
-      OMX_U8 *pDestBuf;
-      m_vendor_config.nPortIndex = config->nPortIndex;
-
-      // minus 6 --> SPS starts from byte #6
-      // minus 1 --> picture param set byte to be ignored from avcatom
-      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
-      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
-      OMX_U32 len;
-      OMX_U8 index = 0;
-      // case where SPS+PPS is sent as part of set_config
-      pDestBuf = m_vendor_config.pData;
-
-      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%lu] len[%lu] data[%p]\n",
-           m_vendor_config.nPortIndex,
-           m_vendor_config.nDataSize,
-           m_vendor_config.pData);
-      while (index < 2)
-      {
-        uint8 *psize;
-        len = *pSrcBuf;
-        len = len << 8;
-        len |= *(pSrcBuf + 1);
-        psize = (uint8 *) & len;
-        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
-        for (unsigned int i = 0; i < nal_length; i++)
-        {
-          pDestBuf[i] = psize[nal_length - 1 - i];
-        }
-        //memcpy(pDestBuf,pSrcBuf,(len+2));
-        pDestBuf += len + nal_length;
-        pSrcBuf += len + 2;
-        index++;
-        pSrcBuf++;   // skip picture param set
-        len = 0;
-      }
-    }
-    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
-             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
-    {
-      m_vendor_config.nPortIndex = config->nPortIndex;
-      m_vendor_config.nDataSize = config->nDataSize;
-      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
-      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
-    }
-    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
-    {
-        if(m_vendor_config.pData)
-        {
-            free(m_vendor_config.pData);
-            m_vendor_config.pData = NULL;
-            m_vendor_config.nDataSize = 0;
-        }
-
-        if (((*((OMX_U32 *) config->pData)) &
-             VC1_SP_MP_START_CODE_MASK) ==
-             VC1_SP_MP_START_CODE)
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize = config->nDataSize;
-            m_vendor_config.pData =
-                (OMX_U8 *) malloc(config->nDataSize);
-            memcpy(m_vendor_config.pData, config->pData,
-                   config->nDataSize);
-            m_vc1_profile = VC1_SP_MP_RCV;
-        }
-        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize = config->nDataSize;
-            m_vendor_config.pData =
-                (OMX_U8 *) malloc((config->nDataSize));
-            memcpy(m_vendor_config.pData, config->pData,
-                   config->nDataSize);
-            m_vc1_profile = VC1_AP;
-        }
-        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
-        {
-            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
-            m_vendor_config.nPortIndex = config->nPortIndex;
-            m_vendor_config.nDataSize  = config->nDataSize;
-            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
-            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
-            m_vc1_profile = VC1_SP_MP_RCV;
-        }
-        else
-        {
-            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
-        }
-    }
-    return ret;
-  }
-  else if (configIndex == OMX_IndexConfigVideoNalSize)
-  {
-    struct v4l2_control temp;
-    temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
-
-    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
-    switch (pNal->nNaluBytes) {
-      case 0:
-        temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
-        break;
-      case 2:
-        temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
-        break;
-      case 4:
-        temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
-        break;
-      default:
-        return OMX_ErrorUnsupportedSetting;
-    }
-
-    if (!arbitrary_bytes) {
-      /* In arbitrary bytes mode, the assembler strips out nal size and replaces
-       * with start code, so only need to notify driver in frame by frame mode */
-      if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp))
-      {
-        DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
-        return OMX_ErrorHardware;
-      }
-    }
-
-    nal_length = pNal->nNaluBytes;
-    m_frame_parser.init_nal_length(nal_length);
-
-    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
-    return ret;
-  }
-  else if (configIndex == OMX_IndexVendorVideoFrameRate)
-  {
-    OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
-    DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %d", config->nFps);
-
-    if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      if (config->bEnabled)
-      {
-        if ((config->nFps >> 16) > 0)
-        {
-            DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %d",
-                            config->nFps >> 16);
-            Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
-                          drv_ctx.frame_rate.fps_denominator);
-
-            if (!drv_ctx.frame_rate.fps_numerator)
-            {
-              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
-              drv_ctx.frame_rate.fps_numerator = 30;
-            }
-
-            if (drv_ctx.frame_rate.fps_denominator)
-            {
-              drv_ctx.frame_rate.fps_numerator = (int)
-                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
-            }
-
-            drv_ctx.frame_rate.fps_denominator = 1;
-            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
-                      drv_ctx.frame_rate.fps_numerator;
-
-            struct v4l2_outputparm oparm;
-            /*XXX: we're providing timing info as seconds per frame rather than frames
-             * per second.*/
-            oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
-            oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
-
-            struct v4l2_streamparm sparm;
-            sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-            sparm.parm.output = oparm;
-            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm))
-            {
-              DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
-                  performance might be affected");
-              ret = OMX_ErrorHardware;
-            }
-            client_set_fps = true;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("Frame rate not supported.");
-          ret = OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
-        client_set_fps = false;
-      }
-    }
-    else
-    {
-        DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
-                      (int)config->nPortIndex);
-        ret = OMX_ErrorBadPortIndex;
-    }
-
-    return ret;
-  }
-
-  return OMX_ErrorNotImplemented;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::GetExtensionIndex
-
-DESCRIPTION
-  OMX GetExtensionIndex method implementaion.  <TBD>
-
-PARAMETERS
-  <TBD>.
-
-RETURN VALUE
-  OMX Error None if everything successful.
-
-========================================================================== */
-OMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
-                                                OMX_IN OMX_STRING      paramName,
-                                                OMX_OUT OMX_INDEXTYPE* indexType)
-{
-    if(m_state == OMX_StateInvalid)
-    {
-        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
-    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
-        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+
+    switch ((unsigned long)configIndex) {
+        case OMX_QcomIndexConfigInterlaced: {
+                                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
+                                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
+                                if (configFmt->nPortIndex == 1) {
+                                    if (configFmt->nIndex == 0) {
+                                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
+                                    } else if (configFmt->nIndex == 1) {
+                                        configFmt->eInterlaceType =
+                                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+                                    } else if (configFmt->nIndex == 2) {
+                                        configFmt->eInterlaceType =
+                                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+                                    } else {
+                                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
+                                                " NoMore Interlaced formats\n");
+                                        eRet = OMX_ErrorNoMore;
+                                    }
+
+                                } else {
+                                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
+                                            (int)configFmt->nPortIndex);
+                                    eRet = OMX_ErrorBadPortIndex;
+                                }
+                                break;
+                            }
+        case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
+                                     QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
+                                         (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
+                                     decoderinstances->nNumOfInstances = 16;
+                                     /*TODO: How to handle this case */
+                                     break;
+                                 }
+        case OMX_QcomIndexConfigVideoFramePackingArrangement: {
+                                          if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+                                              OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
+                                                  (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
+                                              h264_parser->get_frame_pack_data(configFmt);
+                                          } else {
+                                              DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
+                                          }
+                                          break;
+                                      }
+        case OMX_IndexConfigCommonOutputCrop: {
+                                  OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
+                                  memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
+                                  break;
+                              }
+        default: {
+                 DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
+                 eRet = OMX_ErrorBadParameter;
+             }
+
     }
-    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
-    {
+
+    return eRet;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::SetConfig
+
+   DESCRIPTION
+   OMX Set Config method implementation
+
+   PARAMETERS
+   <TBD>.
+
+   RETURN VALUE
+   OMX Error None if successful.
+   ========================================================================== */
+OMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_IN OMX_PTR        configData)
+{
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_VIDEO_CONFIG_NALSIZE *pNal;
+
+    DEBUG_PRINT_LOW("\n Set Config Called");
+
+    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
+        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
+        DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
+        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
+            DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
+            OMX_U32 extra_size;
+            // Parsing done here for the AVC atom is definitely not generic
+            // Currently this piece of code is working, but certainly
+            // not tested with all .mp4 files.
+            // Incase of failure, we might need to revisit this
+            // for a generic piece of code.
+
+            // Retrieve size of NAL length field
+            // byte #4 contains the size of NAL lenght field
+            nal_length = (config->pData[4] & 0x03) + 1;
+
+            extra_size = 0;
+            if (nal_length > 2) {
+                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
+                extra_size = (nal_length - 2) * 2;
+            }
+
+            // SPS starts from byte #6
+            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
+            OMX_U8 *pDestBuf;
+            m_vendor_config.nPortIndex = config->nPortIndex;
+
+            // minus 6 --> SPS starts from byte #6
+            // minus 1 --> picture param set byte to be ignored from avcatom
+            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
+            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
+            OMX_U32 len;
+            OMX_U8 index = 0;
+            // case where SPS+PPS is sent as part of set_config
+            pDestBuf = m_vendor_config.pData;
+
+            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%lu] len[%lu] data[%p]\n",
+                    m_vendor_config.nPortIndex,
+                    m_vendor_config.nDataSize,
+                    m_vendor_config.pData);
+            while (index < 2) {
+                uint8 *psize;
+                len = *pSrcBuf;
+                len = len << 8;
+                len |= *(pSrcBuf + 1);
+                psize = (uint8 *) & len;
+                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
+                for (unsigned int i = 0; i < nal_length; i++) {
+                    pDestBuf[i] = psize[nal_length - 1 - i];
+                }
+                //memcpy(pDestBuf,pSrcBuf,(len+2));
+                pDestBuf += len + nal_length;
+                pSrcBuf += len + 2;
+                index++;
+                pSrcBuf++;   // skip picture param set
+                len = 0;
+            }
+        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
+                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
+            m_vendor_config.nPortIndex = config->nPortIndex;
+            m_vendor_config.nDataSize = config->nDataSize;
+            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
+            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
+        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
+            if (m_vendor_config.pData) {
+                free(m_vendor_config.pData);
+                m_vendor_config.pData = NULL;
+                m_vendor_config.nDataSize = 0;
+            }
+
+            if (((*((OMX_U32 *) config->pData)) &
+                        VC1_SP_MP_START_CODE_MASK) ==
+                    VC1_SP_MP_START_CODE) {
+                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize = config->nDataSize;
+                m_vendor_config.pData =
+                    (OMX_U8 *) malloc(config->nDataSize);
+                memcpy(m_vendor_config.pData, config->pData,
+                        config->nDataSize);
+                m_vc1_profile = VC1_SP_MP_RCV;
+            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
+                DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize = config->nDataSize;
+                m_vendor_config.pData =
+                    (OMX_U8 *) malloc((config->nDataSize));
+                memcpy(m_vendor_config.pData, config->pData,
+                        config->nDataSize);
+                m_vc1_profile = VC1_AP;
+            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
+                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
+                m_vendor_config.nPortIndex = config->nPortIndex;
+                m_vendor_config.nDataSize  = config->nDataSize;
+                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
+                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
+                m_vc1_profile = VC1_SP_MP_RCV;
+            } else {
+                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
+            }
+        }
+        return ret;
+    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
+        struct v4l2_control temp;
+        temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
+
+        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
+        switch (pNal->nNaluBytes) {
+            case 0:
+                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
+                break;
+            case 2:
+                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
+                break;
+            case 4:
+                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
+                break;
+            default:
+                return OMX_ErrorUnsupportedSetting;
+        }
+
+        if (!arbitrary_bytes) {
+            /* In arbitrary bytes mode, the assembler strips out nal size and replaces
+             * with start code, so only need to notify driver in frame by frame mode */
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
+                DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
+                return OMX_ErrorHardware;
+            }
+        }
+
+        nal_length = pNal->nNaluBytes;
+        m_frame_parser.init_nal_length(nal_length);
+
+        DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
+        return ret;
+    } else if (configIndex == OMX_IndexVendorVideoFrameRate) {
+        OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
+        DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %d", config->nFps);
+
+        if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
+            if (config->bEnabled) {
+                if ((config->nFps >> 16) > 0) {
+                    DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %d",
+                            config->nFps >> 16);
+                    Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
+                            drv_ctx.frame_rate.fps_denominator);
+
+                    if (!drv_ctx.frame_rate.fps_numerator) {
+                        DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
+                        drv_ctx.frame_rate.fps_numerator = 30;
+                    }
+
+                    if (drv_ctx.frame_rate.fps_denominator) {
+                        drv_ctx.frame_rate.fps_numerator = (int)
+                            drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
+                    }
+
+                    drv_ctx.frame_rate.fps_denominator = 1;
+                    frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
+                        drv_ctx.frame_rate.fps_numerator;
+
+                    struct v4l2_outputparm oparm;
+                    /*XXX: we're providing timing info as seconds per frame rather than frames
+                     * per second.*/
+                    oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
+                    oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
+
+                    struct v4l2_streamparm sparm;
+                    sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+                    sparm.parm.output = oparm;
+                    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
+                        DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
+                                performance might be affected");
+                        ret = OMX_ErrorHardware;
+                    }
+                    client_set_fps = true;
+                } else {
+                    DEBUG_PRINT_ERROR("Frame rate not supported.");
+                    ret = OMX_ErrorUnsupportedSetting;
+                }
+            } else {
+                DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
+                client_set_fps = false;
+            }
+        } else {
+            DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
+                    (int)config->nPortIndex);
+            ret = OMX_ErrorBadPortIndex;
+        }
+
+        return ret;
+    }
+
+    return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::GetExtensionIndex
+
+   DESCRIPTION
+   OMX GetExtensionIndex method implementaion.  <TBD>
+
+   PARAMETERS
+   <TBD>.
+
+   RETURN VALUE
+   OMX Error None if everything successful.
+
+   ========================================================================== */
+OMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
+        OMX_IN OMX_STRING      paramName,
+        OMX_OUT OMX_INDEXTYPE* indexType)
+{
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
+        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+    } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
     }
 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
-    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
+    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
         DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
-    }
-    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
+    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
     }
 #endif
-	else {
+    else {
         DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
         return OMX_ErrorNotImplemented;
     }
@@ -4189,1318 +3668,1231 @@
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::GetState
+   FUNCTION
+   omx_vdec::GetState
 
-DESCRIPTION
-  Returns the state information back to the caller.<TBD>
+   DESCRIPTION
+   Returns the state information back to the caller.<TBD>
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
-                                       OMX_OUT OMX_STATETYPE* state)
+        OMX_OUT OMX_STATETYPE* state)
 {
-  *state = m_state;
-  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
-  return OMX_ErrorNone;
+    *state = m_state;
+    DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentTunnelRequest
+   FUNCTION
+   omx_vdec::ComponentTunnelRequest
 
-DESCRIPTION
-  OMX Component Tunnel Request method implementation. <TBD>
+   DESCRIPTION
+   OMX Component Tunnel Request method implementation. <TBD>
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
-                                                     OMX_IN OMX_U32                        port,
-                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
-                                                     OMX_IN OMX_U32                    peerPort,
-                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_HANDLETYPE        peerComponent,
+        OMX_IN OMX_U32                    peerPort,
+        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
 {
-  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
-  return OMX_ErrorNotImplemented;
+    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseOutputBuffer
+   FUNCTION
+   omx_vdec::UseOutputBuffer
 
-DESCRIPTION
-  Helper function for Use buffer in the input pin
+   DESCRIPTION
+   Helper function for Use buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE omx_vdec::allocate_extradata()
 {
 #ifdef USE_ION
-  if (drv_ctx.extradata_info.buffer_size) {
-    if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
-      munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
-      close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
-      free_ion_memory(&drv_ctx.extradata_info.ion);
+    if (drv_ctx.extradata_info.buffer_size) {
+        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
+            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
+            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+            free_ion_memory(&drv_ctx.extradata_info.ion);
+        }
+        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
+        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.extradata_info.size, 4096,
+                &drv_ctx.extradata_info.ion.ion_alloc_data,
+                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
+        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
+            DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
+            return OMX_ErrorInsufficientResources;
+        }
+        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
+                drv_ctx.extradata_info.size,
+                PROT_READ|PROT_WRITE, MAP_SHARED,
+                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
+        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
+            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+            free_ion_memory(&drv_ctx.extradata_info.ion);
+            return OMX_ErrorInsufficientResources;
+        }
     }
-    drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
-    drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
-        drv_ctx.extradata_info.size, 4096,
-        &drv_ctx.extradata_info.ion.ion_alloc_data,
-        &drv_ctx.extradata_info.ion.fd_ion_data, 0);
-    if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
-      DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
-      return OMX_ErrorInsufficientResources;
-    }
-    drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
-        drv_ctx.extradata_info.size,
-        PROT_READ|PROT_WRITE, MAP_SHARED,
-        drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
-    if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
-      DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
-      close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
-      free_ion_memory(&drv_ctx.extradata_info.ion);
-      return OMX_ErrorInsufficientResources;
-    }
-  }
 #endif
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
-void omx_vdec::free_extradata() {
+void omx_vdec::free_extradata()
+{
 #ifdef USE_ION
-  if (drv_ctx.extradata_info.uaddr) {
-    munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
-    close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
-    free_ion_memory(&drv_ctx.extradata_info.ion);
-  }
-  memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
+    if (drv_ctx.extradata_info.uaddr) {
+        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
+        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+        free_ion_memory(&drv_ctx.extradata_info.ion);
+    }
+    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
 #endif
 }
 
 OMX_ERRORTYPE  omx_vdec::use_output_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  struct vdec_setbuffer_cmd setbuffers;
-  OMX_PTR privateAppData = NULL;
-  private_handle_t *handle = NULL;
-  OMX_U8 *buff = buffer;
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  int extra_idx = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    struct vdec_setbuffer_cmd setbuffers;
+    OMX_PTR privateAppData = NULL;
+    private_handle_t *handle = NULL;
+    OMX_U8 *buff = buffer;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    int extra_idx = 0;
 
-  if (!m_out_mem_ptr) {
-    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
-    eRet = allocate_output_headers();
-    if (eRet == OMX_ErrorNone)
-      eRet = allocate_extradata();
-  }
-
-  if (eRet == OMX_ErrorNone) {
-    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
-      if(BITMASK_ABSENT(&m_out_bm_count,i))
-      {
-        break;
-      }
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
+        eRet = allocate_output_headers();
+        if (eRet == OMX_ErrorNone)
+            eRet = allocate_extradata();
     }
-  }
 
-  if(i >= drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
-    eRet = OMX_ErrorInsufficientResources;
-  }
+    if (eRet == OMX_ErrorNone) {
+        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+                break;
+            }
+        }
+    }
 
-  if (eRet == OMX_ErrorNone) {
+    if (i >= drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
+        eRet = OMX_ErrorInsufficientResources;
+    }
+
+    if (eRet == OMX_ErrorNone) {
 #if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
-    if(m_enable_android_native_buffers) {
-        if (m_use_android_native_buffers) {
-            UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
-            sp<android_native_buffer_t> nBuf = params->nativeBuffer;
-            handle = (private_handle_t *)nBuf->handle;
-            privateAppData = params->pAppPrivate;
-        } else {
-            handle = (private_handle_t *)buff;
-            privateAppData = appData;
-        }
+        if (m_enable_android_native_buffers) {
+            if (m_use_android_native_buffers) {
+                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
+                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
+                handle = (private_handle_t *)nBuf->handle;
+                privateAppData = params->pAppPrivate;
+            } else {
+                handle = (private_handle_t *)buff;
+                privateAppData = appData;
+            }
 
-        if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
-            DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
-                              " expected %u, got %lu",
-                              drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
-            return OMX_ErrorBadParameter;
-        }
+            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
+                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
+                        " expected %u, got %lu",
+                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
+                return OMX_ErrorBadParameter;
+            }
 
-        if (!m_use_android_native_buffers) {
-            if (!secure_mode) {
-                buff =  (OMX_U8*)mmap(0, handle->size,
-                                      PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
-                if (buff == MAP_FAILED) {
-                  DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
-                  return OMX_ErrorInsufficientResources;
+            if (!m_use_android_native_buffers) {
+                if (!secure_mode) {
+                    buff =  (OMX_U8*)mmap(0, handle->size,
+                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
+                    if (buff == MAP_FAILED) {
+                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+                        return OMX_ErrorInsufficientResources;
+                    }
                 }
             }
-        }
 #if defined(_ANDROID_ICS_)
-        native_buffer[i].nativehandle = handle;
-        native_buffer[i].privatehandle = handle;
+            native_buffer[i].nativehandle = handle;
+            native_buffer[i].privatehandle = handle;
 #endif
-        if(!handle) {
-            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+            if (!handle) {
+                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+                return OMX_ErrorBadParameter;
+            }
+            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
+            drv_ctx.ptr_outputbuffer[i].offset = 0;
+            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+            drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
+        } else
+#endif
+
+            if (!ouput_egl_buffers && !m_use_output_pmem) {
+#ifdef USE_ION
+                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
+                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
+                        &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
+                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+                    DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+#else
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                      open (MEM_DEVICE,O_RDWR);
+
+                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+
+                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
+                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
+                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+                                          open (MEM_DEVICE,O_RDWR);
+                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                        return OMX_ErrorInsufficientResources;
+                    }
+                }
+
+                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
+                            drv_ctx.op_buf.buffer_size,
+                            drv_ctx.op_buf.alignment)) {
+                    DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+                    return OMX_ErrorInsufficientResources;
+                }
+#endif
+                if (!secure_mode) {
+                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
+                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
+                                PROT_READ|PROT_WRITE, MAP_SHARED,
+                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
+                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
+                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+#ifdef USE_ION
+                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+#endif
+                        DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
+                        return OMX_ErrorInsufficientResources;
+                    }
+                }
+                drv_ctx.ptr_outputbuffer[i].offset = 0;
+                privateAppData = appData;
+            } else {
+
+                DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
+                if (!appData || !bytes ) {
+                    if (!secure_mode && !buffer) {
+                        DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
+                        return OMX_ErrorBadParameter;
+                    }
+                }
+
+                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
+                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
+                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
+                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
+                        !pmem_list->nEntries ||
+                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+                    DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
+                    return OMX_ErrorBadParameter;
+                }
+                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                    pmem_list->entryList->entry;
+                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
+                        pmem_info->pmem_fd);
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
+                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
+                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+                drv_ctx.ptr_outputbuffer[i].mmaped_size =
+                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+                privateAppData = appData;
+            }
+        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+
+        *bufferHdr = (m_out_mem_ptr + i );
+        if (secure_mode)
+            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
+                sizeof (vdec_bufferpayload));
+
+        DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
+                drv_ctx.ptr_outputbuffer[i].bufferaddr,
+                drv_ctx.ptr_outputbuffer[i].pmem_fd );
+
+        buf.index = i;
+        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        buf.memory = V4L2_MEMORY_USERPTR;
+        plane[0].length = drv_ctx.op_buf.buffer_size;
+        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
+            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
+        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+        plane[0].data_offset = 0;
+        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
+#ifdef USE_ION
+            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
+#endif
+            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
+            plane[extra_idx].data_offset = 0;
+        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
+            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
             return OMX_ErrorBadParameter;
         }
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
-        drv_ctx.ptr_outputbuffer[i].offset = 0;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
-        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
-        drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
-    } else
-#endif
+        buf.m.planes = plane;
+        buf.length = drv_ctx.num_planes;
 
-    if (!ouput_egl_buffers && !m_use_output_pmem) {
-#ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
-                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
-                &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
-        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
-          DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#else
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-          open (MEM_DEVICE,O_RDWR);
-
-        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
-          DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-
-	/* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
-        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
-        {
-          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
-            open (MEM_DEVICE,O_RDWR);
-          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
-            DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
+            DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
+            /*TODO: How to handle this case */
             return OMX_ErrorInsufficientResources;
-          }
         }
 
-        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
-          drv_ctx.op_buf.buffer_size,
-          drv_ctx.op_buf.alignment))
-        {
-          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-          return OMX_ErrorInsufficientResources;
-        }
-#endif
-        if(!secure_mode) {
-            drv_ctx.ptr_outputbuffer[i].bufferaddr =
-              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
-              PROT_READ|PROT_WRITE, MAP_SHARED,
-              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
-            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
-                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-#ifdef USE_ION
-                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
-#endif
-              DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
-              return OMX_ErrorInsufficientResources;
+        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
+            enum v4l2_buf_type buf_type;
+            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
+                return OMX_ErrorInsufficientResources;
+            } else {
+                streaming[CAPTURE_PORT] = true;
+                DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
             }
         }
-        drv_ctx.ptr_outputbuffer[i].offset = 0;
-        privateAppData = appData;
-     }
-     else {
 
-       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
-        if (!appData || !bytes ) {
-          if(!secure_mode && !buffer) {
-              DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
-              return OMX_ErrorBadParameter;
-          }
+        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+        if (m_enable_android_native_buffers) {
+            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
+            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
+        } else {
+            (*bufferHdr)->pBuffer = buff;
         }
-
-        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
-        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
-        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
-        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
-            !pmem_list->nEntries ||
-            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
-          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
-          return OMX_ErrorBadParameter;
-        }
-        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                    pmem_list->entryList->entry;
-        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
-                          pmem_info->pmem_fd);
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
-        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
-        drv_ctx.ptr_outputbuffer[i].mmaped_size =
-        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
-        privateAppData = appData;
-     }
-     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
-     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
-
-     *bufferHdr = (m_out_mem_ptr + i );
-     if(secure_mode)
-          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
-     //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
-             sizeof (vdec_bufferpayload));
-
-     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
-                       drv_ctx.ptr_outputbuffer[i].bufferaddr,
-                       drv_ctx.ptr_outputbuffer[i].pmem_fd );
-
-     buf.index = i;
-     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-     buf.memory = V4L2_MEMORY_USERPTR;
-     plane[0].length = drv_ctx.op_buf.buffer_size;
-     plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
-             (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
-     plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
-     plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
-     plane[0].data_offset = 0;
-     extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-     if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-       plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
-#ifdef USE_ION
-       plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
-#endif
-       plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].data_offset = 0;
-     } else if  (extra_idx >= VIDEO_MAX_PLANES) {
-        DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
-        return OMX_ErrorBadParameter;
-     }
-     buf.m.planes = plane;
-     buf.length = drv_ctx.num_planes;
-
-     if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
-       DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
-	   /*TODO: How to handle this case */	
-       return OMX_ErrorInsufficientResources;
-     }
-
-     if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
-	     enum v4l2_buf_type buf_type;
-	     buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	     if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
-		     return OMX_ErrorInsufficientResources;
-	     } else {
-		     streaming[CAPTURE_PORT] = true;
-		     DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
-	     }
-     }
-
-     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
-     if (m_enable_android_native_buffers) {
-       DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
-       (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
-     } else {
-       (*bufferHdr)->pBuffer = buff;
-     }
-     (*bufferHdr)->pAppPrivate = privateAppData;
-     BITMASK_SET(&m_out_bm_count,i);
-  }
-  return eRet;
+        (*bufferHdr)->pAppPrivate = privateAppData;
+        BITMASK_SET(&m_out_bm_count,i);
+    }
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::use_input_heap_buffers
+   FUNCTION
+   omx_vdec::use_input_heap_buffers
 
-DESCRIPTION
-  OMX Use Buffer Heap allocation method implementation.
+   DESCRIPTION
+   OMX Use Buffer Heap allocation method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!m_inp_heap_ptr)
-    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
-               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
-               drv_ctx.ip_buf.actualcount);
-  if(!m_phdr_pmem_ptr)
-    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
-               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
-               drv_ctx.ip_buf.actualcount);
-  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
-  {
-    DEBUG_PRINT_ERROR("Insufficent memory");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
-  {
-    input_use_buffer = true;
-    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
-    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
-    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
-    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
-    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
-    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
-    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
-    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
-    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
-    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
-                (unsigned)NULL, (unsigned)NULL))
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
-      return OMX_ErrorInsufficientResources;
+    DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!m_inp_heap_ptr)
+        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
+            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+                    drv_ctx.ip_buf.actualcount);
+    if (!m_phdr_pmem_ptr)
+        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
+            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+                    drv_ctx.ip_buf.actualcount);
+    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
+        DEBUG_PRINT_ERROR("Insufficent memory");
+        eRet = OMX_ErrorInsufficientResources;
+    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
+        input_use_buffer = true;
+        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
+        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
+        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
+        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
+        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
+        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
+        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
+        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
+        DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
+        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
+                    (unsigned)NULL, (unsigned)NULL)) {
+            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+            return OMX_ErrorInsufficientResources;
+        }
+        m_in_alloc_cnt++;
+    } else {
+        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
+        eRet = OMX_ErrorInsufficientResources;
     }
-    m_in_alloc_cnt++;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseBuffer
+   FUNCTION
+   omx_vdec::UseBuffer
 
-DESCRIPTION
-  OMX Use Buffer method implementation.
+   DESCRIPTION
+   OMX Use Buffer method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes,
-                         OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE error = OMX_ErrorNone;
-  struct vdec_setbuffer_cmd setbuffers;
- 
-  if (bufferHdr == NULL || bytes == 0)
-  {
-      if(!secure_mode && buffer == NULL) {
-          DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
-          return OMX_ErrorBadParameter;
-      }
-  }
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  if(port == OMX_CORE_INPUT_PORT_INDEX)
-    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
-  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
-  else
-  {
-    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
-    error = OMX_ErrorBadPortIndex;
-  }
-  DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error);
-  if(error == OMX_ErrorNone)
-  {
-    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-    {
-      // Send the callback now
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
-      post_event(OMX_CommandStateSet,OMX_StateIdle,
-                         OMX_COMPONENT_GENERATE_EVENT);
+    OMX_ERRORTYPE error = OMX_ErrorNone;
+    struct vdec_setbuffer_cmd setbuffers;
+
+    if (bufferHdr == NULL || bytes == 0) {
+        if (!secure_mode && buffer == NULL) {
+            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
+            return OMX_ErrorBadParameter;
+        }
     }
-    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
-       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-    {
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-      post_event(OMX_CommandPortEnable,
-          OMX_CORE_INPUT_PORT_INDEX,
-          OMX_COMPONENT_GENERATE_EVENT);
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
     }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
-            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-    {
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-      post_event(OMX_CommandPortEnable,
-                 OMX_CORE_OUTPUT_PORT_INDEX,
-                 OMX_COMPONENT_GENERATE_EVENT);
+    if (port == OMX_CORE_INPUT_PORT_INDEX)
+        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
+    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
+        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
+    else {
+        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+        error = OMX_ErrorBadPortIndex;
     }
-  }
-  return error;
+    DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error);
+    if (error == OMX_ErrorNone) {
+        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+            // Send the callback now
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+            post_event(OMX_CommandStateSet,OMX_StateIdle,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
+        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
+                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+            post_event(OMX_CommandPortEnable,
+                    OMX_CORE_INPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
+                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+            post_event(OMX_CommandPortEnable,
+                    OMX_CORE_OUTPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
+    }
+    return error;
 }
 
 OMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
-                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
+        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
 {
-  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
-  {
-    if(m_inp_heap_ptr[bufferindex].pBuffer)
-      free(m_inp_heap_ptr[bufferindex].pBuffer);
-    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
-  }
-  if (pmem_bufferHdr)
-    free_input_buffer(pmem_bufferHdr);
-  return OMX_ErrorNone;
+    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
+        if (m_inp_heap_ptr[bufferindex].pBuffer)
+            free(m_inp_heap_ptr[bufferindex].pBuffer);
+        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
+    }
+    if (pmem_bufferHdr)
+        free_input_buffer(pmem_bufferHdr);
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
-  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  index = bufferHdr - m_inp_mem_ptr;
-  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
-
-  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
-  {
-    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
-    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
-    {
-       struct vdec_setbuffer_cmd setbuffers;
-       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
-          sizeof (vdec_bufferpayload));
-       if(!secure_mode) {
-           DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
-                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
-           DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %p",
-                       drv_ctx.ptr_inputbuffer[index].mmaped_size,
-                       drv_ctx.ptr_inputbuffer[index].bufferaddr);
-           munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
-                   drv_ctx.ptr_inputbuffer[index].mmaped_size);
-       }
-       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
-       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
-       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
-       {
-         free(m_desc_buffer_ptr[index].buf_addr);
-         m_desc_buffer_ptr[index].buf_addr = NULL;
-         m_desc_buffer_ptr[index].desc_data_size = 0;
-       }
-#ifdef USE_ION
-       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
-#endif
+    unsigned int index = 0;
+    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
+        return OMX_ErrorBadParameter;
     }
-  }
 
-  return OMX_ErrorNone;
+    index = bufferHdr - m_inp_mem_ptr;
+    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
+
+    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
+        DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
+        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
+            struct vdec_setbuffer_cmd setbuffers;
+            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
+                    sizeof (vdec_bufferpayload));
+            if (!secure_mode) {
+                DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
+                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
+                DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %p",
+                        drv_ctx.ptr_inputbuffer[index].mmaped_size,
+                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
+                munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
+                        drv_ctx.ptr_inputbuffer[index].mmaped_size);
+            }
+            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
+            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
+            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
+                free(m_desc_buffer_ptr[index].buf_addr);
+                m_desc_buffer_ptr[index].buf_addr = NULL;
+                m_desc_buffer_ptr[index].desc_data_size = 0;
+            }
+#ifdef USE_ION
+            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
+#endif
+        }
+    }
+
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
+    unsigned int index = 0;
 
-  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
+    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
+        return OMX_ErrorBadParameter;
+    }
 
-  index = bufferHdr - m_out_mem_ptr;
-  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
+    index = bufferHdr - m_out_mem_ptr;
+    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
 
-  if (index < drv_ctx.op_buf.actualcount
-      && drv_ctx.ptr_outputbuffer)
-  {
-    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %p", index,
-                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
+    if (index < drv_ctx.op_buf.actualcount
+            && drv_ctx.ptr_outputbuffer) {
+        DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %p", index,
+                drv_ctx.ptr_outputbuffer[index].bufferaddr);
 
-    struct vdec_setbuffer_cmd setbuffers;
-    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
-        sizeof (vdec_bufferpayload));
+        struct vdec_setbuffer_cmd setbuffers;
+        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
+                sizeof (vdec_bufferpayload));
 #ifdef _ANDROID_
-    if(m_enable_android_native_buffers) {
+        if (m_enable_android_native_buffers) {
             if (!secure_mode) {
-            if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
-                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
-                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
+                if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
+                    munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
+                            drv_ctx.ptr_outputbuffer[index].mmaped_size);
+                }
             }
-        }
-        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
-    } else {
+            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+        } else {
 #endif
-        if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
-        {
-            if (!secure_mode) {
-                DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
-                        drv_ctx.ptr_outputbuffer[0].pmem_fd);
-                DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %p",
-                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
-                        drv_ctx.ptr_outputbuffer[0].bufferaddr);
-                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
-                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
-            }
-            close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
-            drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
+            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
+                if (!secure_mode) {
+                    DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
+                            drv_ctx.ptr_outputbuffer[0].pmem_fd);
+                    DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %p",
+                            drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
+                            drv_ctx.ptr_outputbuffer[0].bufferaddr);
+                    munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
+                            drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
+                }
+                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
+                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
 #ifdef USE_ION
-            free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
+                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
 #endif
-        }
+            }
 #ifdef _ANDROID_
-    }
+        }
 #endif
-    if (release_output_done()) {
-      free_extradata();
+        if (release_output_done()) {
+            free_extradata();
+        }
     }
-  }
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
-                                         OMX_BUFFERHEADERTYPE **bufferHdr,
-                                         OMX_U32              port,
-                                         OMX_PTR              appData,
-                                         OMX_U32              bytes)
+        OMX_BUFFERHEADERTYPE **bufferHdr,
+        OMX_U32              port,
+        OMX_PTR              appData,
+        OMX_U32              bytes)
 {
-  OMX_BUFFERHEADERTYPE *input = NULL;
-  unsigned char *buf_addr = NULL;
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned   i = 0;
+    OMX_BUFFERHEADERTYPE *input = NULL;
+    unsigned char *buf_addr = NULL;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned   i = 0;
 
-  /* Sanity Check*/
-  if (bufferHdr == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-
-  if (m_inp_heap_ptr == NULL)
-  {
-    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
-                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
-                     drv_ctx.ip_buf.actualcount);
-    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
-                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
-                     drv_ctx.ip_buf.actualcount);
-
-    if (m_inp_heap_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
-      return OMX_ErrorInsufficientResources;
-    }
-  }
-
-  /*Find a Free index*/
-  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
-      break;
-    }
-  }
-
-  if (i < drv_ctx.ip_buf.actualcount)
-  {
-    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
-
-    if (buf_addr == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
+    /* Sanity Check*/
+    if (bufferHdr == NULL) {
+        return OMX_ErrorBadParameter;
     }
 
-    *bufferHdr = (m_inp_heap_ptr + i);
-    input = *bufferHdr;
-    BITMASK_SET(&m_heap_inp_bm_count,i);
+    if (m_inp_heap_ptr == NULL) {
+        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
+                 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+                         drv_ctx.ip_buf.actualcount);
+        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
+                  calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+                          drv_ctx.ip_buf.actualcount);
 
-    input->pBuffer           = (OMX_U8 *)buf_addr;
-    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    input->nVersion.nVersion = OMX_SPEC_VERSION;
-    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
-    input->pAppPrivate       = appData;
-    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
-    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
-    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
-    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
-    /*Add the Buffers to freeq*/
-    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
-                (unsigned)NULL, (unsigned)NULL))
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
-      return OMX_ErrorInsufficientResources;
+        if (m_inp_heap_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
     }
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
 
-  return eRet;
+    /*Find a Free index*/
+    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
+            break;
+        }
+    }
+
+    if (i < drv_ctx.ip_buf.actualcount) {
+        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
+
+        if (buf_addr == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        *bufferHdr = (m_inp_heap_ptr + i);
+        input = *bufferHdr;
+        BITMASK_SET(&m_heap_inp_bm_count,i);
+
+        input->pBuffer           = (OMX_U8 *)buf_addr;
+        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        input->nVersion.nVersion = OMX_SPEC_VERSION;
+        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
+        input->pAppPrivate       = appData;
+        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
+        DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
+        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
+        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
+        /*Add the Buffers to freeq*/
+        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
+                    (unsigned)NULL, (unsigned)NULL)) {
+            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+            return OMX_ErrorInsufficientResources;
+        }
+    } else {
+        return OMX_ErrorBadParameter;
+    }
+
+    return eRet;
 
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateInputBuffer
+   FUNCTION
+   omx_vdec::AllocateInputBuffer
 
-DESCRIPTION
-  Helper function for allocate buffer in the input pin
+   DESCRIPTION
+   Helper function for allocate buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  struct vdec_setbuffer_cmd setbuffers;
-  OMX_BUFFERHEADERTYPE *input = NULL;
-  unsigned   i = 0;
-  unsigned char *buf_addr = NULL;
-  int pmem_fd = -1;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct vdec_setbuffer_cmd setbuffers;
+    OMX_BUFFERHEADERTYPE *input = NULL;
+    unsigned   i = 0;
+    unsigned char *buf_addr = NULL;
+    int pmem_fd = -1;
 
-  if(bytes != drv_ctx.ip_buf.buffer_size)
-  {
-    DEBUG_PRINT_LOW("\n Requested Size is wrong %lu epected is %d",
-      bytes, drv_ctx.ip_buf.buffer_size);
-    return OMX_ErrorBadParameter;
-  }
-
-  if(!m_inp_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
-      drv_ctx.ip_buf.actualcount,
-      drv_ctx.ip_buf.buffer_size);
-
-    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
-    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
-
-    if (m_inp_mem_ptr == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
+    if (bytes != drv_ctx.ip_buf.buffer_size) {
+        DEBUG_PRINT_LOW("\n Requested Size is wrong %lu epected is %d",
+                bytes, drv_ctx.ip_buf.buffer_size);
+        return OMX_ErrorBadParameter;
     }
 
-    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
-    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+    if (!m_inp_mem_ptr) {
+        DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
+                drv_ctx.ip_buf.actualcount,
+                drv_ctx.ip_buf.buffer_size);
 
-    if (drv_ctx.ptr_inputbuffer == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
-    }
+        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
+                calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
+
+        if (m_inp_mem_ptr == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
+
+        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
+                      calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+
+        if (drv_ctx.ptr_inputbuffer == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 #ifdef USE_ION
-    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
-    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
+        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
+                      calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
 
-    if (drv_ctx.ip_buf_ion_info == NULL)
-    {
-      return OMX_ErrorInsufficientResources;
-    }
+        if (drv_ctx.ip_buf_ion_info == NULL) {
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
 
-    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
-    {
-      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
+        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
+            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
 #ifdef USE_ION
-      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
+            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
 #endif
-    }
-  }
-
-  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_inp_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
-      break;
-    }
-  }
-
-  if(i < drv_ctx.ip_buf.actualcount)
-  {
-    struct v4l2_buffer buf;
-    struct v4l2_plane plane;
-    int rc;
-    DEBUG_PRINT_LOW("\n Allocate input Buffer");
-#ifdef USE_ION
- drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
-                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
-                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
-		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
-    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
-        return OMX_ErrorInsufficientResources;
-     }
-    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
-#else
-    pmem_fd = open (MEM_DEVICE,O_RDWR);
-
-    if (pmem_fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
-      return OMX_ErrorInsufficientResources;
-    }
-
-    if (pmem_fd == 0)
-    {
-      pmem_fd = open (MEM_DEVICE,O_RDWR);
-
-      if (pmem_fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
-        return OMX_ErrorInsufficientResources;
-      }
-    }
-
-    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
-      drv_ctx.ip_buf.alignment))
-    {
-      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-      close(pmem_fd);
-      return OMX_ErrorInsufficientResources;
-    }
-#endif
-    if (!secure_mode) {
-        buf_addr = (unsigned char *)mmap(NULL,
-          drv_ctx.ip_buf.buffer_size,
-          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
-
-        if (buf_addr == MAP_FAILED)
-        {
-            close(pmem_fd);
-#ifdef USE_ION
-            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
-#endif
-          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
-          return OMX_ErrorInsufficientResources;
         }
     }
-    *bufferHdr = (m_inp_mem_ptr + i);
-    if (secure_mode)
-        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
-    else
-        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
-    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
-    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
-    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
-    drv_ctx.ptr_inputbuffer [i].offset = 0;
 
-
-    buf.index = i;
-    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    buf.memory = V4L2_MEMORY_USERPTR;
-    plane.bytesused = 0;
-    plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
-    plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
-    plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
-    plane.reserved[1] = 0;
-    plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
-    buf.m.planes = &plane;
-    buf.length = 1;
-
-     DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %p", i,
-             drv_ctx.ptr_inputbuffer[i].bufferaddr);
-
-     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
-    
-     if (rc) {
-       DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
-	   /*TODO: How to handle this case */	
-       return OMX_ErrorInsufficientResources;
-     }
-
-    input = *bufferHdr;
-    BITMASK_SET(&m_inp_bm_count,i);
-    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
-    if (secure_mode)
-         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
-    else
-         input->pBuffer           = (OMX_U8 *)buf_addr;
-    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    input->nVersion.nVersion = OMX_SPEC_VERSION;
-    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
-    input->pAppPrivate       = appData;
-    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
-    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
-
-    if (drv_ctx.disable_dmx)
-    {
-      eRet = allocate_desc_buffer(i);
+    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
+            break;
+        }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+
+    if (i < drv_ctx.ip_buf.actualcount) {
+        struct v4l2_buffer buf;
+        struct v4l2_plane plane;
+        int rc;
+        DEBUG_PRINT_LOW("\n Allocate input Buffer");
+#ifdef USE_ION
+        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
+                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
+                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
+        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
+            return OMX_ErrorInsufficientResources;
+        }
+        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
+#else
+        pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+        if (pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        if (pmem_fd == 0) {
+            pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+            if (pmem_fd < 0) {
+                DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+
+        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
+                    drv_ctx.ip_buf.alignment)) {
+            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+            close(pmem_fd);
+            return OMX_ErrorInsufficientResources;
+        }
+#endif
+        if (!secure_mode) {
+            buf_addr = (unsigned char *)mmap(NULL,
+                    drv_ctx.ip_buf.buffer_size,
+                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
+
+            if (buf_addr == MAP_FAILED) {
+                close(pmem_fd);
+#ifdef USE_ION
+                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
+#endif
+                DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+        *bufferHdr = (m_inp_mem_ptr + i);
+        if (secure_mode)
+            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
+        else
+            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
+        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
+        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
+        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
+        drv_ctx.ptr_inputbuffer [i].offset = 0;
+
+
+        buf.index = i;
+        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        buf.memory = V4L2_MEMORY_USERPTR;
+        plane.bytesused = 0;
+        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
+        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
+        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
+        plane.reserved[1] = 0;
+        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
+        buf.m.planes = &plane;
+        buf.length = 1;
+
+        DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %p", i,
+                drv_ctx.ptr_inputbuffer[i].bufferaddr);
+
+        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
+            /*TODO: How to handle this case */
+            return OMX_ErrorInsufficientResources;
+        }
+
+        input = *bufferHdr;
+        BITMASK_SET(&m_inp_bm_count,i);
+        DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
+        if (secure_mode)
+            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
+        else
+            input->pBuffer           = (OMX_U8 *)buf_addr;
+        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        input->nVersion.nVersion = OMX_SPEC_VERSION;
+        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
+        input->pAppPrivate       = appData;
+        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
+        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
+
+        if (drv_ctx.disable_dmx) {
+            eRet = allocate_desc_buffer(i);
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
+        eRet = OMX_ErrorInsufficientResources;
+    }
+    return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateOutputBuffer
+   FUNCTION
+   omx_vdec::AllocateOutputBuffer
 
-DESCRIPTION
-  Helper fn for AllocateBuffer in the output pin
+   DESCRIPTION
+   Helper fn for AllocateBuffer in the output pin
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything went well.
+   RETURN VALUE
+   OMX Error None if everything went well.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
-                         OMX_IN OMX_HANDLETYPE            hComp,
-                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                         OMX_IN OMX_U32                   port,
-                         OMX_IN OMX_PTR                   appData,
-                         OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  struct vdec_setbuffer_cmd setbuffers;
-  int extra_idx = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    struct vdec_setbuffer_cmd setbuffers;
+    int extra_idx = 0;
 #ifdef USE_ION
-  int ion_device_fd =-1;
-  struct ion_allocation_data ion_alloc_data;
-  struct ion_fd_data fd_ion_data;
+    int ion_device_fd =-1;
+    struct ion_allocation_data ion_alloc_data;
+    struct ion_fd_data fd_ion_data;
 #endif
-  if(!m_out_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
-      drv_ctx.op_buf.actualcount,
-      drv_ctx.op_buf.buffer_size);
-    int nBufHdrSize        = 0;
-    int nPlatformEntrySize = 0;
-    int nPlatformListSize  = 0;
-    int nPMEMInfoSize = 0;
-    int pmem_fd = -1;
-    unsigned char *pmem_baseaddress = NULL;
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
+                drv_ctx.op_buf.actualcount,
+                drv_ctx.op_buf.buffer_size);
+        int nBufHdrSize        = 0;
+        int nPlatformEntrySize = 0;
+        int nPlatformListSize  = 0;
+        int nPMEMInfoSize = 0;
+        int pmem_fd = -1;
+        unsigned char *pmem_baseaddress = NULL;
 
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
 
-    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
-      drv_ctx.op_buf.actualcount);
-    nBufHdrSize        = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_BUFFERHEADERTYPE);
+        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
+                drv_ctx.op_buf.actualcount);
+        nBufHdrSize        = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_BUFFERHEADERTYPE);
 
-    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
-    nPlatformListSize  = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
-    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+        nPlatformListSize  = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
 
-    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
-                         sizeof(OMX_BUFFERHEADERTYPE),
-                         nPMEMInfoSize,
-                         nPlatformListSize);
-    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
-                         drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
+                sizeof(OMX_BUFFERHEADERTYPE),
+                nPMEMInfoSize,
+                nPlatformListSize);
+        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
+                drv_ctx.op_buf.actualcount);
 #ifdef USE_ION
- ion_device_fd = alloc_map_ion_memory(
-                    drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
-                    drv_ctx.op_buf.alignment,
-                    &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
-    if (ion_device_fd < 0) {
-        return OMX_ErrorInsufficientResources;
-    }
-    pmem_fd = fd_ion_data.fd;
+        ion_device_fd = alloc_map_ion_memory(
+                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
+                drv_ctx.op_buf.alignment,
+                &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
+        if (ion_device_fd < 0) {
+            return OMX_ErrorInsufficientResources;
+        }
+        pmem_fd = fd_ion_data.fd;
 #else
-    pmem_fd = open (MEM_DEVICE,O_RDWR);
+        pmem_fd = open (MEM_DEVICE,O_RDWR);
 
-    if (pmem_fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
-        drv_ctx.op_buf.buffer_size);
-      return OMX_ErrorInsufficientResources;
-    }
+        if (pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+                    drv_ctx.op_buf.buffer_size);
+            return OMX_ErrorInsufficientResources;
+        }
 
-    if(pmem_fd == 0)
-    {
-      pmem_fd = open (MEM_DEVICE,O_RDWR);
+        if (pmem_fd == 0) {
+            pmem_fd = open (MEM_DEVICE,O_RDWR);
 
-      if (pmem_fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
-          drv_ctx.op_buf.buffer_size);
-        return OMX_ErrorInsufficientResources;
-      }
-    }
+            if (pmem_fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+                        drv_ctx.op_buf.buffer_size);
+                return OMX_ErrorInsufficientResources;
+            }
+        }
 
-    if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
-      drv_ctx.op_buf.actualcount,
-      drv_ctx.op_buf.alignment))
-    {
-      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
-      close(pmem_fd);
-      return OMX_ErrorInsufficientResources;
-    }
+        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
+                    drv_ctx.op_buf.actualcount,
+                    drv_ctx.op_buf.alignment)) {
+            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+            close(pmem_fd);
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
-   if (!secure_mode) {
-        pmem_baseaddress = (unsigned char *)mmap(NULL,
-                           (drv_ctx.op_buf.buffer_size *
-                            drv_ctx.op_buf.actualcount),
-                            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
-        if (pmem_baseaddress == MAP_FAILED)
-        {
-          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
-          drv_ctx.op_buf.buffer_size);
-          close(pmem_fd);
+        if (!secure_mode) {
+            pmem_baseaddress = (unsigned char *)mmap(NULL,
+                    (drv_ctx.op_buf.buffer_size *
+                     drv_ctx.op_buf.actualcount),
+                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
+            if (pmem_baseaddress == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
+                        drv_ctx.op_buf.buffer_size);
+                close(pmem_fd);
 #ifdef USE_ION
-          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
 #endif
-          return OMX_ErrorInsufficientResources;
+                return OMX_ErrorInsufficientResources;
+            }
+        }
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        // Alloc mem for platform specific info
+        char *pPtr=NULL;
+        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+                nPMEMInfoSize,1);
+        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
+                       calloc (sizeof(struct vdec_bufferpayload),
+                               drv_ctx.op_buf.actualcount);
+        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
+                     calloc (sizeof (struct vdec_output_frameinfo),
+                             drv_ctx.op_buf.actualcount);
+#ifdef USE_ION
+        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
+                      calloc (sizeof(struct vdec_ion),
+                              drv_ctx.op_buf.actualcount);
+#endif
+
+        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+                && drv_ctx.ptr_respbuffer) {
+            drv_ctx.ptr_outputbuffer[0].mmaped_size =
+                (drv_ctx.op_buf.buffer_size *
+                 drv_ctx.op_buf.actualcount);
+            bufHdr          =  m_out_mem_ptr;
+            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+                (((char *) m_platform_list)  + nPlatformListSize);
+            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                (((char *) m_platform_entry) + nPlatformEntrySize);
+            pPlatformList   = m_platform_list;
+            pPlatformEntry  = m_platform_entry;
+            pPMEMInfo       = m_pmem_info;
+
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+
+            // Settting the entire storage nicely
+            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
+            DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
+            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = bytes;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = appData;
+                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
+                // Platform specific PMEM Information
+                // Initialize the Platform Entry
+                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
+                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+                pPlatformEntry->entry      = pPMEMInfo;
+                // Initialize the Platform List
+                pPlatformList->nEntries    = 1;
+                pPlatformList->entryList   = pPlatformEntry;
+                // Keep pBuffer NULL till vdec is opened
+                bufHdr->pBuffer            = NULL;
+                bufHdr->nOffset            = 0;
+
+                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
+                pPMEMInfo->pmem_fd = 0;
+                bufHdr->pPlatformPrivate = pPlatformList;
+
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
+                m_pmem_info[i].pmem_fd = pmem_fd;
+#ifdef USE_ION
+                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
+                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
+                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
+#endif
+
+                /*Create a mapping between buffers*/
+                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
+                                    &drv_ctx.ptr_outputbuffer[i];
+                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
+                drv_ctx.ptr_outputbuffer[i].bufferaddr =
+                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+
+                DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
+                        pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
+                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
+                // Move the buffer and buffer header pointers
+                bufHdr++;
+                pPMEMInfo++;
+                pPlatformEntry++;
+                pPlatformList++;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
+                    m_out_mem_ptr, pPtr);
+            if (m_out_mem_ptr) {
+                free(m_out_mem_ptr);
+                m_out_mem_ptr = NULL;
+            }
+            if (pPtr) {
+                free(pPtr);
+                pPtr = NULL;
+            }
+            if (drv_ctx.ptr_outputbuffer) {
+                free(drv_ctx.ptr_outputbuffer);
+                drv_ctx.ptr_outputbuffer = NULL;
+            }
+            if (drv_ctx.ptr_respbuffer) {
+                free(drv_ctx.ptr_respbuffer);
+                drv_ctx.ptr_respbuffer = NULL;
+            }
+#ifdef USE_ION
+            if (drv_ctx.op_buf_ion_info) {
+                DEBUG_PRINT_LOW("\n Free o/p ion context");
+                free(drv_ctx.op_buf_ion_info);
+                drv_ctx.op_buf_ion_info = NULL;
+            }
+#endif
+            eRet =  OMX_ErrorInsufficientResources;
+        }
+        if (eRet == OMX_ErrorNone)
+            eRet = allocate_extradata();
+    }
+
+    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
+            break;
         }
     }
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    // Alloc mem for platform specific info
-    char *pPtr=NULL;
-    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
-                                     nPMEMInfoSize,1);
-    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
-      calloc (sizeof(struct vdec_bufferpayload),
-      drv_ctx.op_buf.actualcount);
-    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
-      calloc (sizeof (struct vdec_output_frameinfo),
-      drv_ctx.op_buf.actualcount);
+
+    if (eRet == OMX_ErrorNone) {
+        if (i < drv_ctx.op_buf.actualcount) {
+            struct v4l2_buffer buf;
+            struct v4l2_plane plane[VIDEO_MAX_PLANES];
+            int rc;
+            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+
+            drv_ctx.ptr_outputbuffer[i].buffer_len =
+                drv_ctx.op_buf.buffer_size;
+
+            *bufferHdr = (m_out_mem_ptr + i );
+            if (secure_mode) {
+                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+            }
+            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
+
+            buf.index = i;
+            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            buf.memory = V4L2_MEMORY_USERPTR;
+            plane[0].length = drv_ctx.op_buf.buffer_size;
+            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
+                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
-      calloc (sizeof(struct vdec_ion),
-      drv_ctx.op_buf.actualcount);
+            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
 #endif
-
-    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
-       && drv_ctx.ptr_respbuffer)
-    {
-      drv_ctx.ptr_outputbuffer[0].mmaped_size =
-        (drv_ctx.op_buf.buffer_size *
-         drv_ctx.op_buf.actualcount);
-      bufHdr          =  m_out_mem_ptr;
-      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
-      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
-                        (((char *) m_platform_list)  + nPlatformListSize);
-      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                        (((char *) m_platform_entry) + nPlatformEntrySize);
-      pPlatformList   = m_platform_list;
-      pPlatformEntry  = m_platform_entry;
-      pPMEMInfo       = m_pmem_info;
-
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
-
-      // Settting the entire storage nicely
-      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
-      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
-      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = bytes;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = appData;
-        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
-        // Platform specific PMEM Information
-        // Initialize the Platform Entry
-        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
-        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-        pPlatformEntry->entry      = pPMEMInfo;
-        // Initialize the Platform List
-        pPlatformList->nEntries    = 1;
-        pPlatformList->entryList   = pPlatformEntry;
-        // Keep pBuffer NULL till vdec is opened
-        bufHdr->pBuffer            = NULL;
-        bufHdr->nOffset            = 0;
-
-        pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
-        pPMEMInfo->pmem_fd = 0;
-        bufHdr->pPlatformPrivate = pPlatformList;
-
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
-        m_pmem_info[i].pmem_fd = pmem_fd;
+            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+            plane[0].data_offset = 0;
+            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
 #ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
-        drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
-        drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
+                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
 #endif
+                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
+                plane[extra_idx].data_offset = 0;
+            } else if (extra_idx >= VIDEO_MAX_PLANES) {
+                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
+                return OMX_ErrorBadParameter;
+            }
+            buf.m.planes = plane;
+            buf.length = drv_ctx.num_planes;
+            DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
+            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+            if (rc) {
+                /*TODO: How to handle this case */
+                return OMX_ErrorInsufficientResources;
+            }
 
-        /*Create a mapping between buffers*/
-        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
-        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
-                                            &drv_ctx.ptr_outputbuffer[i];
-        drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
-        drv_ctx.ptr_outputbuffer[i].bufferaddr =
-          pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
+                enum v4l2_buf_type buf_type;
+                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
+                if (rc) {
+                    return OMX_ErrorInsufficientResources;
+                } else {
+                    streaming[CAPTURE_PORT] = true;
+                    DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
+                }
+            }
 
-        DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
-          pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
-          drv_ctx.ptr_outputbuffer[i].bufferaddr);
-        // Move the buffer and buffer header pointers
-        bufHdr++;
-        pPMEMInfo++;
-        pPlatformEntry++;
-        pPlatformList++;
-      }
+            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
+            (*bufferHdr)->pAppPrivate = appData;
+            BITMASK_SET(&m_out_bm_count,i);
+        } else {
+            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
+            eRet = OMX_ErrorInsufficientResources;
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
-                                        m_out_mem_ptr, pPtr);
-      if(m_out_mem_ptr)
-      {
-        free(m_out_mem_ptr);
-        m_out_mem_ptr = NULL;
-      }
-      if(pPtr)
-      {
-        free(pPtr);
-        pPtr = NULL;
-      }
-      if(drv_ctx.ptr_outputbuffer)
-      {
-        free(drv_ctx.ptr_outputbuffer);
-        drv_ctx.ptr_outputbuffer = NULL;
-      }
-      if(drv_ctx.ptr_respbuffer)
-      {
-        free(drv_ctx.ptr_respbuffer);
-        drv_ctx.ptr_respbuffer = NULL;
-      }
-#ifdef USE_ION
-    if (drv_ctx.op_buf_ion_info) {
-        DEBUG_PRINT_LOW("\n Free o/p ion context");
-	free(drv_ctx.op_buf_ion_info);
-        drv_ctx.op_buf_ion_info = NULL;
-    }
-#endif
-      eRet =  OMX_ErrorInsufficientResources;
-    }
-    if (eRet == OMX_ErrorNone)
-      eRet = allocate_extradata();
-  }
 
-  for(i=0; i< drv_ctx.op_buf.actualcount; i++)
-  {
-    if(BITMASK_ABSENT(&m_out_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
-      break;
-    }
-  }
-
-  if (eRet == OMX_ErrorNone)
-  {
-    if(i < drv_ctx.op_buf.actualcount)
-    {
-      struct v4l2_buffer buf;
-      struct v4l2_plane plane[VIDEO_MAX_PLANES];
-      int rc;
-      m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
-
-      drv_ctx.ptr_outputbuffer[i].buffer_len =
-        drv_ctx.op_buf.buffer_size;
-
-    *bufferHdr = (m_out_mem_ptr + i );
-    if (secure_mode) {
-       drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
-    }
-   drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
-
-     buf.index = i;
-     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-     buf.memory = V4L2_MEMORY_USERPTR;
-     plane[0].length = drv_ctx.op_buf.buffer_size;
-     plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
-             (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
-#ifdef USE_ION
-     plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#endif
-     plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
-     plane[0].data_offset = 0;
-     extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-     if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-       plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
-#ifdef USE_ION
-       plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
-#endif
-       plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
-       plane[extra_idx].data_offset = 0;
-     } else if (extra_idx >= VIDEO_MAX_PLANES) {
-       DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
-       return OMX_ErrorBadParameter;
-     }
-     buf.m.planes = plane;
-     buf.length = drv_ctx.num_planes;
-     DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
-     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
-     if (rc) {
-       /*TODO: How to handle this case */
-       return OMX_ErrorInsufficientResources;
-     }
-
-	  if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
-		enum v4l2_buf_type buf_type;
-		buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
-		if (rc) {
-			return OMX_ErrorInsufficientResources;
-		} else {
-			streaming[CAPTURE_PORT] = true;
-			DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
-		}
-	  }
-
-      (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
-      (*bufferHdr)->pAppPrivate = appData;
-      BITMASK_SET(&m_out_bm_count,i);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
-      eRet = OMX_ErrorInsufficientResources;
-    }
-  }
-
-  return eRet;
+    return eRet;
 }
 
 
 // AllocateBuffer  -- API Call
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateBuffer
+   FUNCTION
+   omx_vdec::AllocateBuffer
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
-                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                     OMX_IN OMX_U32                        port,
-                                     OMX_IN OMX_PTR                     appData,
-                                     OMX_IN OMX_U32                       bytes)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN OMX_U32                       bytes)
 {
     unsigned i = 0;
     OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
 
     DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
-    if(m_state == OMX_StateInvalid)
-    {
+    if (m_state == OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
         return OMX_ErrorInvalidState;
     }
 
-    if(port == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      if (arbitrary_bytes)
-      {
-          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
-      }
-      else
-      {
-        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
-      }
-    }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    {
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        if (arbitrary_bytes) {
+            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
+        } else {
+            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
+        }
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
         eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
                 appData,bytes);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
-      eRet = OMX_ErrorBadPortIndex;
+    } else {
+        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+        eRet = OMX_ErrorBadPortIndex;
     }
     DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
-    if(eRet == OMX_ErrorNone)
-    {
-        if(allocate_done()){
-            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-            {
+    if (eRet == OMX_ErrorNone) {
+        if (allocate_done()) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
                 // Send the callback now
                 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
                 post_event(OMX_CommandStateSet,OMX_StateIdle,
-                                   OMX_COMPONENT_GENERATE_EVENT);
+                        OMX_COMPONENT_GENERATE_EVENT);
             }
         }
-        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
-        {
-          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-          {
-             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-             post_event(OMX_CommandPortEnable,
+        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
                         OMX_CORE_INPUT_PORT_INDEX,
                         OMX_COMPONENT_GENERATE_EVENT);
-          }
+            }
         }
-        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
-            {
-          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-          {
-             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
                 post_event(OMX_CommandPortEnable,
-                           OMX_CORE_OUTPUT_PORT_INDEX,
-                           OMX_COMPONENT_GENERATE_EVENT);
+                        OMX_CORE_OUTPUT_PORT_INDEX,
+                        OMX_COMPONENT_GENERATE_EVENT);
             }
         }
     }
@@ -5510,172 +4902,140 @@
 
 // Free Buffer - API call
 /* ======================================================================
-FUNCTION
-  omx_vdec::FreeBuffer
+   FUNCTION
+   omx_vdec::FreeBuffer
 
-DESCRIPTION
+   DESCRIPTION
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                      OMX_IN OMX_U32                 port,
-                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_U32                 port,
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     unsigned int nPortIndex;
     DEBUG_PRINT_LOW("In for decoder free_buffer \n");
 
-    if(m_state == OMX_StateIdle &&
-       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-    {
+    if (m_state == OMX_StateIdle &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
         DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
-    }
-    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
-            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
-    {
+    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
+            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
         DEBUG_PRINT_LOW("Free Buffer while port %lu disabled\n", port);
-    }
-    else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
-              BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
-             (port == OMX_CORE_OUTPUT_PORT_INDEX &&
-              BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)))
-    {
+    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
+                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
+            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
+             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
         DEBUG_PRINT_LOW("Free Buffer while port %d enable pending\n", port);
-    }
-    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
-    {
+    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
         DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
         post_event(OMX_EventError,
-                   OMX_ErrorPortUnpopulated,
-                   OMX_COMPONENT_GENERATE_EVENT);
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
 
         return OMX_ErrorIncorrectStateOperation;
-    }
-    else if (m_state != OMX_StateInvalid)
-    {
+    } else if (m_state != OMX_StateInvalid) {
         DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
         post_event(OMX_EventError,
-                   OMX_ErrorPortUnpopulated,
-                   OMX_COMPONENT_GENERATE_EVENT);
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
     }
 
-    if(port == OMX_CORE_INPUT_PORT_INDEX)
-    {
-      /*Check if arbitrary bytes*/
-      if(!arbitrary_bytes && !input_use_buffer)
-        nPortIndex = buffer - m_inp_mem_ptr;
-      else
-        nPortIndex = buffer - m_inp_heap_ptr;
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        /*Check if arbitrary bytes*/
+        if (!arbitrary_bytes && !input_use_buffer)
+            nPortIndex = buffer - m_inp_mem_ptr;
+        else
+            nPortIndex = buffer - m_inp_heap_ptr;
 
         DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
-        if(nPortIndex < drv_ctx.ip_buf.actualcount)
-        {
-         // Clear the bit associated with it.
-         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
-         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
-         if (input_use_buffer == true)
-         {
+        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
+            // Clear the bit associated with it.
+            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
+            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
+            if (input_use_buffer == true) {
 
-            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
-            if(m_phdr_pmem_ptr)
-              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
-         }
-         else
-         {
-            if (arbitrary_bytes)
-            {
-              if(m_phdr_pmem_ptr)
-                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
-              else
-                free_input_buffer(nPortIndex,NULL);
+                DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
+                if (m_phdr_pmem_ptr)
+                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
+            } else {
+                if (arbitrary_bytes) {
+                    if (m_phdr_pmem_ptr)
+                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
+                    else
+                        free_input_buffer(nPortIndex,NULL);
+                } else
+                    free_input_buffer(buffer);
             }
-            else
-              free_input_buffer(buffer);
-         }
-         m_inp_bPopulated = OMX_FALSE;
-         /*Free the Buffer Header*/
-          if (release_input_done())
-          {
-            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
-            free_input_buffer_header();
-          }
-        }
-        else
-        {
+            m_inp_bPopulated = OMX_FALSE;
+            /*Free the Buffer Header*/
+            if (release_input_done()) {
+                DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
+                free_input_buffer_header();
+            }
+        } else {
             DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
             eRet = OMX_ErrorBadPortIndex;
         }
 
-        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
-           && release_input_done())
-        {
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
+                && release_input_done()) {
             DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
             post_event(OMX_CommandPortDisable,
-                       OMX_CORE_INPUT_PORT_INDEX,
-                       OMX_COMPONENT_GENERATE_EVENT);
+                    OMX_CORE_INPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
-    }
-    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
-    {
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
         // check if the buffer is valid
         nPortIndex = buffer - client_buffers.get_il_buf_hdr();
-        if(nPortIndex < drv_ctx.op_buf.actualcount)
-        {
+        if (nPortIndex < drv_ctx.op_buf.actualcount) {
             DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
             // Clear the bit associated with it.
             BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
             m_out_bPopulated = OMX_FALSE;
             client_buffers.free_output_buffer (buffer);
 
-            if (release_output_done())
-            {
-              free_output_buffer_header();
+            if (release_output_done()) {
+                free_output_buffer_header();
             }
-        }
-        else
-        {
+        } else {
             DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
             eRet = OMX_ErrorBadPortIndex;
         }
-        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
-           && release_output_done())
-        {
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
+                && release_output_done()) {
             DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
 
-                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
-                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
 #ifdef _ANDROID_ICS_
-                if (m_enable_android_native_buffers)
-                {
-                    DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
-                    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
-                }
+            if (m_enable_android_native_buffers) {
+                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
+                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+            }
 #endif
 
-                post_event(OMX_CommandPortDisable,
-                           OMX_CORE_OUTPUT_PORT_INDEX,
-                           OMX_COMPONENT_GENERATE_EVENT);
+            post_event(OMX_CommandPortDisable,
+                    OMX_CORE_OUTPUT_PORT_INDEX,
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
-    }
-    else
-    {
+    } else {
         eRet = OMX_ErrorBadPortIndex;
     }
-    if((eRet == OMX_ErrorNone) &&
-       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-    {
-        if(release_done())
-        {
+    if ((eRet == OMX_ErrorNone) &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
+        if (release_done()) {
             // Send the callback now
             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
             post_event(OMX_CommandStateSet, OMX_StateLoaded,
-                                      OMX_COMPONENT_GENERATE_EVENT);
+                    OMX_COMPONENT_GENERATE_EVENT);
         }
     }
     return eRet;
@@ -5683,536 +5043,480 @@
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::EmptyThisBuffer
+   FUNCTION
+   omx_vdec::EmptyThisBuffer
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
-  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
+    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
+    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
 
-  if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
-  {
-    codec_config_flag = true;
-    DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
-  }
-  else
-  {
-    codec_config_flag = false;
-  }
+    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+        codec_config_flag = true;
+        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
+    } else {
+        codec_config_flag = false;
+    }
 
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (buffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
+        return OMX_ErrorBadParameter;
+    }
 
-  if (!m_inp_bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_inp_bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
+        return OMX_ErrorBadPortIndex;
+    }
 
 #ifdef _ANDROID_
-  if(iDivXDrmDecrypt)
-  {
-    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
-    if(drmErr != OMX_ErrorNone) {
-        // this error can be ignored
-        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+    if (iDivXDrmDecrypt) {
+        OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
+        if (drmErr != OMX_ErrorNone) {
+            // this error can be ignored
+            DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+        }
     }
-  }
 #endif //_ANDROID_
-  if (perf_flag)
-  {
-    if (!latency)
-    {
-      dec_time.stop();
-      latency = dec_time.processing_time_us();
-      dec_time.start();
+    if (perf_flag) {
+        if (!latency) {
+            dec_time.stop();
+            latency = dec_time.processing_time_us();
+            dec_time.start();
+        }
     }
-  }
 
-  if (arbitrary_bytes)
-  {
-    nBufferIndex = buffer - m_inp_heap_ptr;
-  }
-  else
-  {
-     if (input_use_buffer == true)
-     {
-       nBufferIndex = buffer - m_inp_heap_ptr;
-       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
-       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
-       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
-       buffer = &m_inp_mem_ptr[nBufferIndex];
-       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %lu",
-                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
-     }
-     else{
-       nBufferIndex = buffer - m_inp_mem_ptr;
-     }
-  }
+    if (arbitrary_bytes) {
+        nBufferIndex = buffer - m_inp_heap_ptr;
+    } else {
+        if (input_use_buffer == true) {
+            nBufferIndex = buffer - m_inp_heap_ptr;
+            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
+            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
+            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
+            buffer = &m_inp_mem_ptr[nBufferIndex];
+            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %lu",
+                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
+        } else {
+            nBufferIndex = buffer - m_inp_mem_ptr;
+        }
+    }
 
-  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
-  {
-    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
+        DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
-    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
-  if (arbitrary_bytes)
-  {
-    post_event ((unsigned)hComp,(unsigned)buffer,
+    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
+            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
+    if (arbitrary_bytes) {
+        post_event ((unsigned)hComp,(unsigned)buffer,
                 OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
-  }
-  else
-  {
-    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
-      set_frame_rate(buffer->nTimeStamp);
-    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
-  }
-  return OMX_ErrorNone;
+    } else {
+        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
+            set_frame_rate(buffer->nTimeStamp);
+        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
+    }
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::empty_this_buffer_proxy
+   FUNCTION
+   omx_vdec::empty_this_buffer_proxy
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
-                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  int push_cnt = 0,i=0;
-  unsigned nPortIndex = 0;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  struct vdec_input_frameinfo frameinfo;
-  struct vdec_bufferpayload *temp_buffer;
-  struct vdec_seqheader seq_header;
-  bool port_setting_changed = true;
-  bool not_coded_vop = false;
+    int push_cnt = 0,i=0;
+    unsigned nPortIndex = 0;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    struct vdec_input_frameinfo frameinfo;
+    struct vdec_bufferpayload *temp_buffer;
+    struct vdec_seqheader seq_header;
+    bool port_setting_changed = true;
+    bool not_coded_vop = false;
 
-  /*Should we generate a Aync error event*/
-  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    /*Should we generate a Aync error event*/
+    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
 
-  if (nPortIndex > drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
-        nPortIndex);
-    return OMX_ErrorBadParameter;
-  }
+    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
+                nPortIndex);
+        return OMX_ErrorBadParameter;
+    }
 
-  pending_input_buffers++;
+    pending_input_buffers++;
 
-  /* return zero length and not an EOS buffer */
-  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
-     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
-  {
-    DEBUG_PRINT_HIGH("\n return zero legth buffer");
-    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                     OMX_COMPONENT_GENERATE_EBD);
-    return OMX_ErrorNone;
-  }
+    /* return zero length and not an EOS buffer */
+    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
+            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
+        DEBUG_PRINT_HIGH("\n return zero legth buffer");
+        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                OMX_COMPONENT_GENERATE_EBD);
+        return OMX_ErrorNone;
+    }
 
 
-  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
-    mp4StreamType psBits;
-    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
-    psBits.numBytes = buffer->nFilledLen;
-    mp4_headerparser.parseHeader(&psBits);
-    not_coded_vop = mp4_headerparser.is_notcodec_vop(
-            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
-    if(not_coded_vop) {
-        DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
-             buffer->nFilledLen,frame_count);
-        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
-          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
-          not_coded_vop = false;
-          buffer->nFilledLen = 0;
+    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
+        mp4StreamType psBits;
+        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
+        psBits.numBytes = buffer->nFilledLen;
+        mp4_headerparser.parseHeader(&psBits);
+        not_coded_vop = mp4_headerparser.is_notcodec_vop(
+                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+        if (not_coded_vop) {
+            DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
+                    buffer->nFilledLen,frame_count);
+            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+                DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
+                not_coded_vop = false;
+                buffer->nFilledLen = 0;
+            }
         }
     }
-  }
 
-  if(input_flush_progress == true
+    if (input_flush_progress == true
 
-     || not_coded_vop
+            || not_coded_vop
 
-     )
-  {
-    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
-    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-                     OMX_COMPONENT_GENERATE_EBD);
-    return OMX_ErrorNone;
-  }
-
-  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
-
-  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  /* If its first frame, H264 codec and reject is true, then parse the nal
-     and get the profile. Based on this, reject the clip playback */
-  if(first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
-     m_reject_avc_1080p_mp)
-  {
-    first_frame = 1;
-    DEBUG_PRINT_ERROR("\nParse nal to get the profile");
-    h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
-                                 NALU_TYPE_SPS);
-    m_profile = h264_parser->get_profile();
-    ret = is_video_session_supported();
-    if (ret)
-    {
-      post_event ((unsigned int)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
-      post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
-      /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
-      m_state = OMX_StateInvalid;
-      return OMX_ErrorNone;
-    }
-  }
-
-  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  /*for use buffer we need to memcpy the data*/
-  temp_buffer->buffer_len = buffer->nFilledLen;
-
-  if (input_use_buffer)
-  {
-    if (buffer->nFilledLen <= temp_buffer->buffer_len)
-    {
-      if(arbitrary_bytes)
-      {
-        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
-      }
-      else
-      {
-        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
-                buffer->nFilledLen);
-      }
-    }
-    else
-    {
-      return OMX_ErrorBadParameter;
+       ) {
+        DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
+        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                OMX_COMPONENT_GENERATE_EBD);
+        return OMX_ErrorNone;
     }
 
-  }
+    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
 
-  frameinfo.bufferaddr = temp_buffer->bufferaddr;
-  frameinfo.client_data = (void *) buffer;
-  frameinfo.datalen = temp_buffer->buffer_len;
-  frameinfo.flags = 0;
-  frameinfo.offset = buffer->nOffset;
-  frameinfo.pmem_fd = temp_buffer->pmem_fd;
-  frameinfo.pmem_offset = temp_buffer->offset;
-  frameinfo.timestamp = buffer->nTimeStamp;
-  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
-  {
-    DEBUG_PRINT_LOW("ETB: dmx enabled");
-    if (m_demux_entries == 0)
-    {
-      extract_demux_addr_offsets(buffer);
+    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
+        return OMX_ErrorBadParameter;
+    }
+    /* If its first frame, H264 codec and reject is true, then parse the nal
+       and get the profile. Based on this, reject the clip playback */
+    if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
+            m_reject_avc_1080p_mp) {
+        first_frame = 1;
+        DEBUG_PRINT_ERROR("\nParse nal to get the profile");
+        h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
+                NALU_TYPE_SPS);
+        m_profile = h264_parser->get_profile();
+        ret = is_video_session_supported();
+        if (ret) {
+            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
+            post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
+            /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
+            m_state = OMX_StateInvalid;
+            return OMX_ErrorNone;
+        }
     }
 
-    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%lu",m_demux_entries);
-    handle_demux_data(buffer);
-    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
-    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
-  }
-  else
-  {
-    frameinfo.desc_addr = NULL;
-    frameinfo.desc_size = 0;
-  }
-  if(!arbitrary_bytes)
-  {
-      frameinfo.flags |= buffer->nFlags;
-  }
+    DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    /*for use buffer we need to memcpy the data*/
+    temp_buffer->buffer_len = buffer->nFilledLen;
+
+    if (input_use_buffer) {
+        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
+            if (arbitrary_bytes) {
+                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+            } else {
+                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
+                        buffer->nFilledLen);
+            }
+        } else {
+            return OMX_ErrorBadParameter;
+        }
+
+    }
+
+    frameinfo.bufferaddr = temp_buffer->bufferaddr;
+    frameinfo.client_data = (void *) buffer;
+    frameinfo.datalen = temp_buffer->buffer_len;
+    frameinfo.flags = 0;
+    frameinfo.offset = buffer->nOffset;
+    frameinfo.pmem_fd = temp_buffer->pmem_fd;
+    frameinfo.pmem_offset = temp_buffer->offset;
+    frameinfo.timestamp = buffer->nTimeStamp;
+    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
+        DEBUG_PRINT_LOW("ETB: dmx enabled");
+        if (m_demux_entries == 0) {
+            extract_demux_addr_offsets(buffer);
+        }
+
+        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%lu",m_demux_entries);
+        handle_demux_data(buffer);
+        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
+        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
+    } else {
+        frameinfo.desc_addr = NULL;
+        frameinfo.desc_size = 0;
+    }
+    if (!arbitrary_bytes) {
+        frameinfo.flags |= buffer->nFlags;
+    }
 
 #ifdef _ANDROID_
-  if (m_debug_timestamp)
-  {
-    if(arbitrary_bytes)
-    {
-      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
-      m_timestamp_list.insert_ts(buffer->nTimeStamp);
+    if (m_debug_timestamp) {
+        if (arbitrary_bytes) {
+            DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+            m_timestamp_list.insert_ts(buffer->nTimeStamp);
+        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
+            DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+            m_timestamp_list.insert_ts(buffer->nTimeStamp);
+        }
     }
-    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
-    {
-      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
-      m_timestamp_list.insert_ts(buffer->nTimeStamp);
-    }
-  }
 #endif
 
 #ifdef INPUT_BUFFER_LOG
-  if (output_capability == V4L2_PIX_FMT_VP8) {
-    struct vp8_ivf_frame_header{
-       OMX_U32 framesize;
-       OMX_U32 timestamp_lo;
-       OMX_U32 timestamp_hi;
-    } vp8_frame_header;
-    vp8_frame_header.framesize = temp_buffer->buffer_len;
-    /* Currently FW doesn't use timestamp values */
-    vp8_frame_header.timestamp_lo = 0;
-    vp8_frame_header.timestamp_hi = 0;
-    if (inputBufferFile1)
-    {
-      fwrite((const char *)&vp8_frame_header,
-        sizeof(vp8_frame_header),1,inputBufferFile1);
-      fwrite((const char *)temp_buffer->bufferaddr,
-        temp_buffer->buffer_len,1,inputBufferFile1);
-      }
-  } else {
-    if (inputBufferFile1)
-    {
-      fwrite((const char *)temp_buffer->bufferaddr,
-        temp_buffer->buffer_len,1,inputBufferFile1);
+    if (output_capability == V4L2_PIX_FMT_VP8) {
+        struct vp8_ivf_frame_header {
+            OMX_U32 framesize;
+            OMX_U32 timestamp_lo;
+            OMX_U32 timestamp_hi;
+        } vp8_frame_header;
+        vp8_frame_header.framesize = temp_buffer->buffer_len;
+        /* Currently FW doesn't use timestamp values */
+        vp8_frame_header.timestamp_lo = 0;
+        vp8_frame_header.timestamp_hi = 0;
+        if (inputBufferFile1) {
+            fwrite((const char *)&vp8_frame_header,
+                    sizeof(vp8_frame_header),1,inputBufferFile1);
+            fwrite((const char *)temp_buffer->bufferaddr,
+                    temp_buffer->buffer_len,1,inputBufferFile1);
+        }
+    } else {
+        if (inputBufferFile1) {
+            fwrite((const char *)temp_buffer->bufferaddr,
+                    temp_buffer->buffer_len,1,inputBufferFile1);
+        }
     }
-  }
 #endif
 
-  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
-  {
-    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-  }
+    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+    }
 
-  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
-  {
-    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
-    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
-    h264_scratch.nFilledLen = 0;
-    nal_count = 0;
-    look_ahead_nal = false;
-    frame_count = 0;
-    if (m_frame_parser.mutils)
-      m_frame_parser.mutils->initialize_frame_checking_environment();
-    m_frame_parser.flush();
-    h264_last_au_ts = LLONG_MAX;
-    h264_last_au_flags = 0;
-    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-    m_demux_entries = 0;
-  }
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane;
-  memset( (void *)&buf, 0, sizeof(buf));
-  memset( (void *)&plane, 0, sizeof(plane));
-  int rc;
-  unsigned long  print_count;
-  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
-  {  buf.flags = V4L2_BUF_FLAG_EOS;
-  DEBUG_PRINT_HIGH("\n  INPUT EOS reached \n") ;
-  }
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	buf.index = nPortIndex;
-	buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	buf.memory = V4L2_MEMORY_USERPTR;
-	plane.bytesused = temp_buffer->buffer_len;
-	plane.length = drv_ctx.ip_buf.buffer_size;
-	plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
-            (unsigned long)temp_buffer->offset;
-	plane.reserved[0] = temp_buffer->pmem_fd;
-	plane.reserved[1] = temp_buffer->offset;
-	plane.data_offset = 0;
-	buf.m.planes = &plane;
-	buf.length = 1;
-	if (frameinfo.timestamp >= LLONG_MAX) {
-          buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
-        }
-	//assumption is that timestamp is in milliseconds
-	buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
-	buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
-	buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
-	buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
+    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+        DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
+        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
+        h264_scratch.nFilledLen = 0;
+        nal_count = 0;
+        look_ahead_nal = false;
+        frame_count = 0;
+        if (m_frame_parser.mutils)
+            m_frame_parser.mutils->initialize_frame_checking_environment();
+        m_frame_parser.flush();
+        h264_last_au_ts = LLONG_MAX;
+        h264_last_au_flags = 0;
+        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+        m_demux_entries = 0;
+    }
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane;
+    memset( (void *)&buf, 0, sizeof(buf));
+    memset( (void *)&plane, 0, sizeof(plane));
+    int rc;
+    unsigned long  print_count;
+    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+        buf.flags = V4L2_BUF_FLAG_EOS;
+        DEBUG_PRINT_HIGH("\n  INPUT EOS reached \n") ;
+    }
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    buf.index = nPortIndex;
+    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    buf.memory = V4L2_MEMORY_USERPTR;
+    plane.bytesused = temp_buffer->buffer_len;
+    plane.length = drv_ctx.ip_buf.buffer_size;
+    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
+        (unsigned long)temp_buffer->offset;
+    plane.reserved[0] = temp_buffer->pmem_fd;
+    plane.reserved[1] = temp_buffer->offset;
+    plane.data_offset = 0;
+    buf.m.planes = &plane;
+    buf.length = 1;
+    if (frameinfo.timestamp >= LLONG_MAX) {
+        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
+    }
+    //assumption is that timestamp is in milliseconds
+    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
+    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
+    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
+    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
 
-	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
-	if(rc)
-	{
-		DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
-		return OMX_ErrorHardware;
-	}
-  if(!streaming[OUTPUT_PORT])
-  {
-	enum v4l2_buf_type buf_type;
-	int ret,r;
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
+        return OMX_ErrorHardware;
+    }
+    if (!streaming[OUTPUT_PORT]) {
+        enum v4l2_buf_type buf_type;
+        int ret,r;
 
-	buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
         DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-	ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
-	if(!ret) {
-		DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
-		streaming[OUTPUT_PORT] = true;
-	} else{
-		DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
-		DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
-		post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
-				OMX_COMPONENT_GENERATE_EBD);
-		return OMX_ErrorBadParameter;
-	}
-}
-  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
-    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
-      time_stamp_dts.insert_timestamp(buffer);
+        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
+        if (!ret) {
+            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
+            streaming[OUTPUT_PORT] = true;
+        } else {
+            DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
+            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
+            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+                    OMX_COMPONENT_GENERATE_EBD);
+            return OMX_ErrorBadParameter;
+        }
+    }
+    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
+            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
+    time_stamp_dts.insert_timestamp(buffer);
 
-  return ret;
+    return ret;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::FillThisBuffer
+   FUNCTION
+   omx_vdec::FillThisBuffer
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
-                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
 
-  if(m_state == OMX_StateInvalid)
-  {
-      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
-      return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("FTB in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (!m_out_bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_out_bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  if (buffer == NULL ||
-      ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
-  {
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL ||
+            ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) {
+        return OMX_ErrorBadParameter;
+    }
 
-  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
+        return OMX_ErrorBadPortIndex;
+    }
 
-  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
-  return OMX_ErrorNone;
+    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::fill_this_buffer_proxy
+   FUNCTION
+   omx_vdec::fill_this_buffer_proxy
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
-                         OMX_IN OMX_HANDLETYPE        hComp,
-                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
+        OMX_IN OMX_HANDLETYPE        hComp,
+        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
 {
-  OMX_ERRORTYPE nRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
-  unsigned nPortIndex = 0;
-  struct vdec_fillbuffer_cmd fillbuffer;
-  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
-  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
+    OMX_ERRORTYPE nRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
+    unsigned nPortIndex = 0;
+    struct vdec_fillbuffer_cmd fillbuffer;
+    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
+    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
 
-  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
+    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
 
-  if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
-    return OMX_ErrorBadParameter;
+    if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
+        return OMX_ErrorBadParameter;
 
-  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
-      bufferAdd, bufferAdd->pBuffer);
-  /*Return back the output buffer to client*/
-  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
-  {
-    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
-    buffer->nFilledLen = 0;
-    m_cb.FillBufferDone (hComp,m_app_data,buffer);
-    return OMX_ErrorNone;
-  }
-  pending_output_buffers++;
-  buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
-  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
-  if (ptr_respbuffer)
-  {
-    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
-  }
+    DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
+            bufferAdd, bufferAdd->pBuffer);
+    /*Return back the output buffer to client*/
+    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
+        DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
+        buffer->nFilledLen = 0;
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
+    pending_output_buffers++;
+    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
+    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
+    if (ptr_respbuffer) {
+        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
+    }
 
-  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
-  {
-      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
-      buffer->nFilledLen = 0;
-      m_cb.FillBufferDone (hComp,m_app_data,buffer);
-      pending_output_buffers--;
-      return OMX_ErrorBadParameter;
-  }
+    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
+        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
+        buffer->nFilledLen = 0;
+        m_cb.FillBufferDone (hComp,m_app_data,buffer);
+        pending_output_buffers--;
+        return OMX_ErrorBadParameter;
+    }
 
- /* memcpy (&fillbuffer.buffer,ptr_outputbuffer,
-          sizeof(struct vdec_bufferpayload));
-    fillbuffer.client_data = bufferAdd;*/
+    /* memcpy (&fillbuffer.buffer,ptr_outputbuffer,
+       sizeof(struct vdec_bufferpayload));
+       fillbuffer.client_data = bufferAdd;*/
 
 #ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
+    if (m_enable_android_native_buffers) {
         // Acquire a write lock on this buffer.
         if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
-                                                  GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
+                    GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
             DEBUG_PRINT_ERROR("Failed to acquire genlock");
             buffer->nFilledLen = 0;
             m_cb.FillBufferDone (hComp,m_app_data,buffer);
@@ -6220,147 +5524,139 @@
             return OMX_ErrorInsufficientResources;
         } else {
             native_buffer[buffer - m_out_mem_ptr].inuse = true;
-      }
+        }
     }
 #endif
-	int rc = 0;
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  memset( (void *)&buf, 0, sizeof(buf));
-  memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
-  int extra_idx = 0;
+    int rc = 0;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    memset( (void *)&buf, 0, sizeof(buf));
+    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
+    int extra_idx = 0;
 
-  buf.index = nPortIndex;
-  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-  buf.memory = V4L2_MEMORY_USERPTR;
-  plane[0].bytesused = buffer->nFilledLen;
-  plane[0].length = drv_ctx.op_buf.buffer_size;
-  plane[0].m.userptr =
-      (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
-      (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
-  plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
-  plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
-  plane[0].data_offset = 0;
-  extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-  if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-    plane[extra_idx].bytesused = 0;
-    plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
-    plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
+    buf.index = nPortIndex;
+    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    buf.memory = V4L2_MEMORY_USERPTR;
+    plane[0].bytesused = buffer->nFilledLen;
+    plane[0].length = drv_ctx.op_buf.buffer_size;
+    plane[0].m.userptr =
+        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
+        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
+    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+    plane[0].data_offset = 0;
+    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+        plane[extra_idx].bytesused = 0;
+        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
 #ifdef USE_ION
-    plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
+        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
 #endif
-    plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
-    plane[extra_idx].data_offset = 0;
-  } else if (extra_idx >= VIDEO_MAX_PLANES) {
-    DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
-    return OMX_ErrorBadParameter;
-  }
-  buf.m.planes = plane;
-  buf.length = drv_ctx.num_planes;
-  rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
-  if (rc) {
-    /*TODO: How to handle this case */
-    DEBUG_PRINT_ERROR("Failed to qbuf to driver");
-  }
-//#ifdef _ANDROID_ICS_
-  //  if (m_enable_android_native_buffers)
-  //  {
-        // Unlock the buffer
-   //     if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
+        plane[extra_idx].data_offset = 0;
+    } else if (extra_idx >= VIDEO_MAX_PLANES) {
+        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
+        return OMX_ErrorBadParameter;
+    }
+    buf.m.planes = plane;
+    buf.length = drv_ctx.num_planes;
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+    if (rc) {
+        /*TODO: How to handle this case */
+        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
+    }
+    //#ifdef _ANDROID_ICS_
+    //  if (m_enable_android_native_buffers)
+    //  {
+    // Unlock the buffer
+    //     if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
     //        DEBUG_PRINT_ERROR("Releasing genlock failed");
     //        return OMX_ErrorInsufficientResources;
     ///    } else {
-     //       native_buffer[buffer - m_out_mem_ptr].inuse = false;
-      //  }
-   // }
-//#endif
+    //       native_buffer[buffer - m_out_mem_ptr].inuse = false;
+    //  }
+    // }
+    //#endif
     //m_cb.FillBufferDone (hComp,m_app_data,buffer);
-   // pending_output_buffers--;
-   // return OMX_ErrorBadParameter;
-  //}
-  return OMX_ErrorNone;
+    // pending_output_buffers--;
+    // return OMX_ErrorBadParameter;
+    //}
+return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::SetCallbacks
+   FUNCTION
+   omx_vdec::SetCallbacks
 
-DESCRIPTION
-  Set the callbacks.
+   DESCRIPTION
+   Set the callbacks.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
-                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
-                                           OMX_IN OMX_PTR             appData)
+        OMX_IN OMX_CALLBACKTYPE* callbacks,
+        OMX_IN OMX_PTR             appData)
 {
 
-  m_cb       = *callbacks;
-  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
-               m_cb.EventHandler,m_cb.FillBufferDone);
-  m_app_data =    appData;
-  return OMX_ErrorNotImplemented;
+    m_cb       = *callbacks;
+    DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
+            m_cb.EventHandler,m_cb.FillBufferDone);
+    m_app_data =    appData;
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentDeInit
+   FUNCTION
+   omx_vdec::ComponentDeInit
 
-DESCRIPTION
-  Destroys the component and release memory allocated to the heap.
+   DESCRIPTION
+   Destroys the component and release memory allocated to the heap.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
 {
 #ifdef _ANDROID_
-    if(iDivXDrmDecrypt)
-    {
+    if (iDivXDrmDecrypt) {
         delete iDivXDrmDecrypt;
         iDivXDrmDecrypt=NULL;
     }
 #endif //_ANDROID_
 
     unsigned i = 0;
-    if (OMX_StateLoaded != m_state)
-    {
+    if (OMX_StateLoaded != m_state) {
         DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
-                          m_state);
+                m_state);
         DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
-    }
-    else
-    {
-      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
+    } else {
+        DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
     }
 
     /*Check if the output buffers have to be cleaned up*/
-    if(m_out_mem_ptr)
-    {
+    if (m_out_mem_ptr) {
         DEBUG_PRINT_LOW("Freeing the Output Memory\n");
-        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ )
-        {
-          free_output_buffer (&m_out_mem_ptr[i]);
+        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
+            free_output_buffer (&m_out_mem_ptr[i]);
 #ifdef _ANDROID_ICS_
-        if (m_enable_android_native_buffers)
-        {
-          if (native_buffer[i].inuse)
-          {
-            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
-                DEBUG_PRINT_ERROR("Unlocking genlock failed");
+            if (m_enable_android_native_buffers) {
+                if (native_buffer[i].inuse) {
+                    if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
+                        DEBUG_PRINT_ERROR("Unlocking genlock failed");
+                    }
+                    native_buffer[i].inuse = false;
+                }
             }
-            native_buffer[i].inuse = false;
-          }
-        }
 #endif
         }
 #ifdef _ANDROID_ICS_
@@ -6369,38 +5665,32 @@
     }
 
     /*Check if the input buffers have to be cleaned up*/
-    if(m_inp_mem_ptr || m_inp_heap_ptr)
-    {
+    if (m_inp_mem_ptr || m_inp_heap_ptr) {
         DEBUG_PRINT_LOW("Freeing the Input Memory\n");
-        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ )
-        {
-          if (m_inp_mem_ptr)
-            free_input_buffer (i,&m_inp_mem_ptr[i]);
-          else
-            free_input_buffer (i,NULL);
+        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
+            if (m_inp_mem_ptr)
+                free_input_buffer (i,&m_inp_mem_ptr[i]);
+            else
+                free_input_buffer (i,NULL);
         }
     }
     free_input_buffer_header();
     free_output_buffer_header();
-    if(h264_scratch.pBuffer)
-    {
+    if (h264_scratch.pBuffer) {
         free(h264_scratch.pBuffer);
         h264_scratch.pBuffer = NULL;
     }
 
-    if (h264_parser)
-    {
+    if (h264_parser) {
         delete h264_parser;
-	h264_parser = NULL;
+        h264_parser = NULL;
     }
 
-    if(m_platform_list)
-    {
+    if (m_platform_list) {
         free(m_platform_list);
         m_platform_list = NULL;
     }
-    if(m_vendor_config.pData)
-    {
+    if (m_vendor_config.pData) {
         free(m_vendor_config.pData);
         m_vendor_config.pData = NULL;
     }
@@ -6413,17 +5703,16 @@
     m_cmd_q.m_read = m_cmd_q.m_write =0;
     m_etb_q.m_read = m_etb_q.m_write =0;
 #ifdef _ANDROID_
-    if (m_debug_timestamp)
-    {
-      m_timestamp_list.reset_ts_list();
+    if (m_debug_timestamp) {
+        m_timestamp_list.reset_ts_list();
     }
 #endif
 
     DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
     //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
-       // NULL);
+    // NULL);
     DEBUG_PRINT_HIGH("\n Close the driver instance");
-   
+
 #ifdef INPUT_BUFFER_LOG
     if (inputBufferFile1)
         fclose (inputBufferFile1);
@@ -6436,54 +5725,54 @@
     if (outputExtradataFile)
         fclose (outputExtradataFile);
 #endif
-  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
-  return OMX_ErrorNone;
+    DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::UseEGLImage
+   FUNCTION
+   omx_vdec::UseEGLImage
 
-DESCRIPTION
-  OMX Use EGL Image method implementation <TBD>.
+   DESCRIPTION
+   OMX Use EGL Image method implementation <TBD>.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Not Implemented error.
+   RETURN VALUE
+   Not Implemented error.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
-                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                          OMX_IN OMX_U32                        port,
-                                          OMX_IN OMX_PTR                     appData,
-                                          OMX_IN void*                      eglImage)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN void*                      eglImage)
 {
-  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
-  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
+    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
+    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
 
 #ifdef USE_EGL_IMAGE_GPU
-   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
-   EGLint fd = -1, offset = 0,pmemPtr = 0;
+    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
+    EGLint fd = -1, offset = 0,pmemPtr = 0;
 #else
-   int fd = -1, offset = 0;
+    int fd = -1, offset = 0;
 #endif
-   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
-   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
-     DEBUG_PRINT_ERROR("\n ");
-   }
+    DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
+    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
+        DEBUG_PRINT_ERROR("\n ");
+    }
 #ifdef USE_EGL_IMAGE_GPU
-   if(m_display_id == NULL) {
+    if (m_display_id == NULL) {
         DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
         return OMX_ErrorInsufficientResources;
-   }
-   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
-                    eglGetProcAddress("eglQueryImageKHR");
-   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
-   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
-   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
+    }
+    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
+        eglGetProcAddress("eglQueryImageKHR");
+    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
+    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
+    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
 #else //with OMX test app
     struct temp_egl {
         int pmem_fd;
@@ -6492,8 +5781,7 @@
     struct temp_egl *temp_egl_id = NULL;
     void * pmemPtr = (void *) eglImage;
     temp_egl_id = (struct temp_egl *)eglImage;
-    if (temp_egl_id != NULL)
-    {
+    if (temp_egl_id != NULL) {
         fd = temp_egl_id->pmem_fd;
         offset = temp_egl_id->offset;
     }
@@ -6501,650 +5789,559 @@
     if (fd < 0) {
         DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
         return OMX_ErrorInsufficientResources;
-   }
-   pmem_info.pmem_fd = (OMX_U32) fd;
-   pmem_info.offset = (OMX_U32) offset;
-   pmem_entry.entry = (void *) &pmem_info;
-   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-   pmem_list.entryList = &pmem_entry;
-   pmem_list.nEntries = 1;
-   ouput_egl_buffers = true;
-   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
-       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
-        (OMX_U8 *)pmemPtr)) {
-     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
-     return OMX_ErrorInsufficientResources;
-   }
-   return OMX_ErrorNone;
+    }
+    pmem_info.pmem_fd = (OMX_U32) fd;
+    pmem_info.offset = (OMX_U32) offset;
+    pmem_entry.entry = (void *) &pmem_info;
+    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+    pmem_list.entryList = &pmem_entry;
+    pmem_list.nEntries = 1;
+    ouput_egl_buffers = true;
+    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
+                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
+                (OMX_U8 *)pmemPtr)) {
+        DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
+        return OMX_ErrorInsufficientResources;
+    }
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ComponentRoleEnum
+   FUNCTION
+   omx_vdec::ComponentRoleEnum
 
-DESCRIPTION
-  OMX Component Role Enum method implementation.
+   DESCRIPTION
+   OMX Component Role Enum method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   OMX Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
-                                                OMX_OUT OMX_U8*        role,
-                                                OMX_IN OMX_U32        index)
+        OMX_OUT OMX_U8*        role,
+        OMX_IN OMX_U32        index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
     }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
+    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
     }
-  }
-  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
 
-  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
-          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
-          )
+    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+        )
 
-  {
-    if((0 == index) && role)
     {
-      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+          ) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_LOW("\n No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
     }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
-           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
-           )
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
-    eRet = OMX_ErrorInvalidComponentName;
-  }
-  return eRet;
+    return eRet;
 }
 
 
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::AllocateDone
+   FUNCTION
+   omx_vdec::AllocateDone
 
-DESCRIPTION
-  Checks if entire buffer pool is allocated by IL Client or not.
-  Need this to move to IDLE state.
+   DESCRIPTION
+   Checks if entire buffer pool is allocated by IL Client or not.
+   Need this to move to IDLE state.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false.
+   RETURN VALUE
+   true/false.
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::allocate_done(void)
 {
-  bool bRet = false;
-  bool bRet_In = false;
-  bool bRet_Out = false;
+    bool bRet = false;
+    bool bRet_In = false;
+    bool bRet_Out = false;
 
-  bRet_In = allocate_input_done();
-  bRet_Out = allocate_output_done();
+    bRet_In = allocate_input_done();
+    bRet_Out = allocate_output_done();
 
-  if(bRet_In && bRet_Out)
-  {
-      bRet = true;
-  }
-
-  return bRet;
-}
-/* ======================================================================
-FUNCTION
-  omx_vdec::AllocateInputDone
-
-DESCRIPTION
-  Checks if I/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_input_done(void)
-{
-  bool bRet = false;
-  unsigned i=0;
-
-  if (m_inp_mem_ptr == NULL)
-  {
-      return bRet;
-  }
-  if(m_inp_mem_ptr )
-  {
-    for(;i<drv_ctx.ip_buf.actualcount;i++)
-    {
-      if(BITMASK_ABSENT(&m_inp_bm_count,i))
-      {
-        break;
-      }
-    }
-  }
-  if(i == drv_ctx.ip_buf.actualcount)
-  {
-    bRet = true;
-    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
-  }
-  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
-  {
-     m_inp_bPopulated = OMX_TRUE;
-  }
-  return bRet;
-}
-/* ======================================================================
-FUNCTION
-  omx_vdec::AllocateOutputDone
-
-DESCRIPTION
-  Checks if entire O/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_output_done(void)
-{
-  bool bRet = false;
-  unsigned j=0;
-
-  if (m_out_mem_ptr == NULL)
-  {
-      return bRet;
-  }
-
-  if (m_out_mem_ptr)
-  {
-    for(;j < drv_ctx.op_buf.actualcount;j++)
-    {
-      if(BITMASK_ABSENT(&m_out_bm_count,j))
-      {
-        break;
-      }
-    }
-  }
-
-  if(j == drv_ctx.op_buf.actualcount)
-  {
-    bRet = true;
-    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
-    if(m_out_bEnabled)
-       m_out_bPopulated = OMX_TRUE;
-  }
-
-  return bRet;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseDone
-
-DESCRIPTION
-  Checks if IL client has released all the buffers.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false
-
-========================================================================== */
-bool omx_vdec::release_done(void)
-{
-  bool bRet = false;
-
-  if(release_input_done())
-  {
-    if(release_output_done())
-    {
+    if (bRet_In && bRet_Out) {
         bRet = true;
     }
-  }
-  return bRet;
+
+    return bRet;
+}
+/* ======================================================================
+   FUNCTION
+   omx_vdec::AllocateInputDone
+
+   DESCRIPTION
+   Checks if I/P buffer pool is allocated by IL Client or not.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false.
+
+   ========================================================================== */
+bool omx_vdec::allocate_input_done(void)
+{
+    bool bRet = false;
+    unsigned i=0;
+
+    if (m_inp_mem_ptr == NULL) {
+        return bRet;
+    }
+    if (m_inp_mem_ptr ) {
+        for (; i<drv_ctx.ip_buf.actualcount; i++) {
+            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+                break;
+            }
+        }
+    }
+    if (i == drv_ctx.ip_buf.actualcount) {
+        bRet = true;
+        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
+    }
+    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
+        m_inp_bPopulated = OMX_TRUE;
+    }
+    return bRet;
+}
+/* ======================================================================
+   FUNCTION
+   omx_vdec::AllocateOutputDone
+
+   DESCRIPTION
+   Checks if entire O/P buffer pool is allocated by IL Client or not.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false.
+
+   ========================================================================== */
+bool omx_vdec::allocate_output_done(void)
+{
+    bool bRet = false;
+    unsigned j=0;
+
+    if (m_out_mem_ptr == NULL) {
+        return bRet;
+    }
+
+    if (m_out_mem_ptr) {
+        for (; j < drv_ctx.op_buf.actualcount; j++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
+                break;
+            }
+        }
+    }
+
+    if (j == drv_ctx.op_buf.actualcount) {
+        bRet = true;
+        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
+        if (m_out_bEnabled)
+            m_out_bPopulated = OMX_TRUE;
+    }
+
+    return bRet;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_vdec::ReleaseDone
+
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   true/false
+
+   ========================================================================== */
+bool omx_vdec::release_done(void)
+{
+    bool bRet = false;
+
+    if (release_input_done()) {
+        if (release_output_done()) {
+            bRet = true;
+        }
+    }
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseOutputDone
+   FUNCTION
+   omx_vdec::ReleaseOutputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::release_output_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
-  if(m_out_mem_ptr)
-  {
-      for(;j < drv_ctx.op_buf.actualcount ; j++)
-      {
-        if(BITMASK_PRESENT(&m_out_bm_count,j))
-        {
-          break;
+    DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
+    if (m_out_mem_ptr) {
+        for (; j < drv_ctx.op_buf.actualcount ; j++) {
+            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
+                break;
+            }
         }
-      }
-    if(j == drv_ctx.op_buf.actualcount)
-    {
-      m_out_bm_count = 0;
-      bRet = true;
+        if (j == drv_ctx.op_buf.actualcount) {
+            m_out_bm_count = 0;
+            bRet = true;
+        }
+    } else {
+        m_out_bm_count = 0;
+        bRet = true;
     }
-  }
-  else
-  {
-    m_out_bm_count = 0;
-    bRet = true;
-  }
-  return bRet;
+    return bRet;
 }
 /* ======================================================================
-FUNCTION
-  omx_vdec::ReleaseInputDone
+   FUNCTION
+   omx_vdec::ReleaseInputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_vdec::release_input_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
-  if(m_inp_mem_ptr)
-  {
-      for(;j<drv_ctx.ip_buf.actualcount;j++)
-      {
-        if( BITMASK_PRESENT(&m_inp_bm_count,j))
-        {
-          break;
+    DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
+    if (m_inp_mem_ptr) {
+        for (; j<drv_ctx.ip_buf.actualcount; j++) {
+            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
+                break;
+            }
         }
-      }
-    if(j==drv_ctx.ip_buf.actualcount)
-    {
-      bRet = true;
+        if (j==drv_ctx.ip_buf.actualcount) {
+            bRet = true;
+        }
+    } else {
+        bRet = true;
     }
-  }
-  else
-  {
-    bRet = true;
-  }
-  return bRet;
+    return bRet;
 }
 
 OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
-                               OMX_BUFFERHEADERTYPE * buffer)
+        OMX_BUFFERHEADERTYPE * buffer)
 {
-  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
-  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
-    return OMX_ErrorBadParameter;
-  }
-  else if (output_flush_progress)
-  {
-    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
-    buffer->nFilledLen = 0;
-    buffer->nTimeStamp = 0;
-    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
-  }
-
-  if (m_debug_extradata)
-  {
-    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
-    {
-      DEBUG_PRINT_HIGH("\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
-      DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
+    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
+        return OMX_ErrorBadParameter;
+    } else if (output_flush_progress) {
+        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
+        buffer->nFilledLen = 0;
+        buffer->nTimeStamp = 0;
+        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
     }
 
-    if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
-    {
-      DEBUG_PRINT_HIGH("\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
-      DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
-      DEBUG_PRINT_HIGH("***************************************************\n");
+    if (m_debug_extradata) {
+        if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+            DEBUG_PRINT_HIGH("\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+            DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+        }
+
+        if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
+            DEBUG_PRINT_HIGH("\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+            DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+            DEBUG_PRINT_HIGH("***************************************************\n");
+        }
     }
-  }
 
 
-  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
-      buffer, buffer->pBuffer);
-  pending_output_buffers --;
-  
-  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-  {
-    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
-    if (!output_flush_progress)
-      post_event((unsigned)NULL, (unsigned)NULL,
-              OMX_COMPONENT_GENERATE_EOS_DONE);
+    DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
+            buffer, buffer->pBuffer);
+    pending_output_buffers --;
 
-    if (psource_frame)
-    {
-      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
-      psource_frame = NULL;
+    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+        DEBUG_PRINT_HIGH("\n Output EOS has been reached");
+        if (!output_flush_progress)
+            post_event((unsigned)NULL, (unsigned)NULL,
+                    OMX_COMPONENT_GENERATE_EOS_DONE);
+
+        if (psource_frame) {
+            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
+            psource_frame = NULL;
+        }
+        if (pdest_frame) {
+            pdest_frame->nFilledLen = 0;
+            m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
+                    (unsigned)NULL);
+            pdest_frame = NULL;
+        }
     }
-    if (pdest_frame)
-    {
-      pdest_frame->nFilledLen = 0;
-      m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
-              (unsigned)NULL);
-      pdest_frame = NULL;
-    }
-  }
 
-  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
+    DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
 #ifdef OUTPUT_BUFFER_LOG
-  if (outputBufferFile1 && buffer->nFilledLen)
-  {
-	  int buf_index = buffer - m_out_mem_ptr;
-      int stride = drv_ctx.video_resolution.stride;
-      int scanlines = drv_ctx.video_resolution.scan_lines;
-      char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
-	  unsigned i;
-	  int bytes_written = 0;
-	  for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
-		  bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
-		  temp += stride;
-	  }
-	  temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
-      int stride_c = stride;
-	  for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
-		  bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
-		  temp += stride_c;
-	  }
-  }
+    if (outputBufferFile1 && buffer->nFilledLen) {
+        int buf_index = buffer - m_out_mem_ptr;
+        int stride = drv_ctx.video_resolution.stride;
+        int scanlines = drv_ctx.video_resolution.scan_lines;
+        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
+        unsigned i;
+        int bytes_written = 0;
+        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
+            bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
+            temp += stride;
+        }
+        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
+        int stride_c = stride;
+        for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
+            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
+            temp += stride_c;
+        }
+    }
 #endif
 
-  /* For use buffer we need to copy the data */
-  if (!output_flush_progress)
-  {
-    /* This is the error check for non-recoverable errros */
-    bool is_duplicate_ts_valid = true;
-    bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
+    /* For use buffer we need to copy the data */
+    if (!output_flush_progress) {
+        /* This is the error check for non-recoverable errros */
+        bool is_duplicate_ts_valid = true;
+        bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
 
-    if (output_capability == V4L2_PIX_FMT_MPEG4 ||
-      output_capability == V4L2_PIX_FMT_MPEG2 ||
-      output_capability == V4L2_PIX_FMT_DIVX ||
-      output_capability == V4L2_PIX_FMT_DIVX_311)
-      is_duplicate_ts_valid = false;
+        if (output_capability == V4L2_PIX_FMT_MPEG4 ||
+                output_capability == V4L2_PIX_FMT_MPEG2 ||
+                output_capability == V4L2_PIX_FMT_DIVX ||
+                output_capability == V4L2_PIX_FMT_DIVX_311)
+            is_duplicate_ts_valid = false;
 
-    if (output_capability == V4L2_PIX_FMT_H264 && is_interlaced) {
-      bool mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
-      if (mbaff) {
-        is_interlaced = false;
-      }
-    }
-
-    if (buffer->nFilledLen > 0) {
-      time_stamp_dts.get_next_timestamp(buffer,
-        is_interlaced && is_duplicate_ts_valid);
-        if (m_debug_timestamp)
-        {
-          {
-            OMX_TICKS expected_ts = 0;
-            m_timestamp_list.pop_min_ts(expected_ts);
-            if (is_interlaced && is_duplicate_ts_valid) {
-              m_timestamp_list.pop_min_ts(expected_ts);
+        if (output_capability == V4L2_PIX_FMT_H264 && is_interlaced) {
+            bool mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+            if (mbaff) {
+                is_interlaced = false;
             }
-            DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
-                           buffer->nTimeStamp, expected_ts);
+        }
 
-            if (buffer->nTimeStamp != expected_ts) {
-              DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+        if (buffer->nFilledLen > 0) {
+            time_stamp_dts.get_next_timestamp(buffer,
+                    is_interlaced && is_duplicate_ts_valid);
+            if (m_debug_timestamp) {
+                {
+                    OMX_TICKS expected_ts = 0;
+                    m_timestamp_list.pop_min_ts(expected_ts);
+                    if (is_interlaced && is_duplicate_ts_valid) {
+                        m_timestamp_list.pop_min_ts(expected_ts);
+                    }
+                    DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
+                            buffer->nTimeStamp, expected_ts);
+
+                    if (buffer->nTimeStamp != expected_ts) {
+                        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+                    }
+                }
             }
-          }
+        } else {
+            m_inp_err_count++;
+            time_stamp_dts.remove_time_stamp(
+                    buffer->nTimeStamp,
+                    is_interlaced && is_duplicate_ts_valid);
         }
-    } else {
-      m_inp_err_count++;
-      time_stamp_dts.remove_time_stamp(
-              buffer->nTimeStamp,
-                is_interlaced && is_duplicate_ts_valid);
+
+
     }
-
-
-  }
-  if (m_cb.FillBufferDone)
-  {
-    if (buffer->nFilledLen > 0)
-    {
-      handle_extradata(buffer);
-      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-        set_frame_rate(buffer->nTimeStamp);
-      else if (arbitrary_bytes)
-        adjust_timestamp(buffer->nTimeStamp);
-      if (perf_flag)
-      {
-        if (!proc_frms)
-        {
-          dec_time.stop();
-          latency = dec_time.processing_time_us() - latency;
-          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
-          dec_time.start();
-          fps_metrics.start();
-        }
-        proc_frms++;
-        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-        {
-          OMX_U64 proc_time = 0;
-          fps_metrics.stop();
-          proc_time = fps_metrics.processing_time_us();
-          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
+    if (m_cb.FillBufferDone) {
+        if (buffer->nFilledLen > 0) {
+            handle_extradata(buffer);
+            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+                set_frame_rate(buffer->nTimeStamp);
+            else if (arbitrary_bytes)
+                adjust_timestamp(buffer->nTimeStamp);
+            if (perf_flag) {
+                if (!proc_frms) {
+                    dec_time.stop();
+                    latency = dec_time.processing_time_us() - latency;
+                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
+                    dec_time.start();
+                    fps_metrics.start();
+                }
+                proc_frms++;
+                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+                    OMX_U64 proc_time = 0;
+                    fps_metrics.stop();
+                    proc_time = fps_metrics.processing_time_us();
+                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
                             proc_frms, (float)proc_time / 1e6,
                             (float)(1e6 * proc_frms) / proc_time);
-          proc_frms = 0;
-        }
-      }
+                    proc_frms = 0;
+                }
+            }
 
 #ifdef OUTPUT_EXTRADATA_LOG
-  if (outputExtradataFile)
-  {
+            if (outputExtradataFile) {
 
-    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
-    p_extra = (OMX_OTHER_EXTRADATATYPE *)
-           ((unsigned)(buffer->pBuffer + buffer->nOffset +
-            buffer->nFilledLen + 3)&(~3));
-    while(p_extra &&
-          (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) )
-    {
-      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
-      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
-      if (p_extra->eType == OMX_ExtraDataNone)
-      {
-        break;
-      }
-      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-    }
-  }
+                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
+                p_extra = (OMX_OTHER_EXTRADATATYPE *)
+                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
+                        buffer->nFilledLen + 3)&(~3));
+                while (p_extra &&
+                        (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
+                    DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
+                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
+                    if (p_extra->eType == OMX_ExtraDataNone) {
+                        break;
+                    }
+                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                }
+            }
 #endif
-    }
-    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
-      prev_ts = LLONG_MAX;
-      rst_prev_ts = true;
-      }
+        }
+        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+            prev_ts = LLONG_MAX;
+            rst_prev_ts = true;
+        }
 
-    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
-                buffer->pPlatformPrivate)->entryList->entry;
-    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
+        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+             buffer->pPlatformPrivate)->entryList->entry;
+        DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
 #ifdef _ANDROID_ICS_
-    if (m_enable_android_native_buffers)
-    {
-     if (native_buffer[buffer - m_out_mem_ptr].inuse) {
-      if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
-        DEBUG_PRINT_ERROR("Unlocking genlock failed");
-        return OMX_ErrorInsufficientResources;
-      }
-      else {
-        native_buffer[buffer - m_out_mem_ptr].inuse = false;
-      }
-     }
-    }
+        if (m_enable_android_native_buffers) {
+            if (native_buffer[buffer - m_out_mem_ptr].inuse) {
+                if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+                    DEBUG_PRINT_ERROR("Unlocking genlock failed");
+                    return OMX_ErrorInsufficientResources;
+                } else {
+                    native_buffer[buffer - m_out_mem_ptr].inuse = false;
+                }
+            }
+        }
 #endif
-    OMX_BUFFERHEADERTYPE *il_buffer;
-    il_buffer = client_buffers.get_il_buf_hdr(buffer);
-    if (il_buffer)
-      m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
-    else {
-      DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
-      return OMX_ErrorBadParameter;
+        OMX_BUFFERHEADERTYPE *il_buffer;
+        il_buffer = client_buffers.get_il_buf_hdr(buffer);
+        if (il_buffer)
+            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
+        else {
+            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
+            return OMX_ErrorBadParameter;
+        }
+        DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
+    } else {
+        return OMX_ErrorBadParameter;
     }
-    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
-                                          OMX_BUFFERHEADERTYPE* buffer)
+        OMX_BUFFERHEADERTYPE* buffer)
 {
 
-    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
-    {
+    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
         DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
-       return OMX_ErrorBadParameter;
+        return OMX_ErrorBadParameter;
     }
 
     DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
-        buffer, buffer->pBuffer);
+            buffer, buffer->pBuffer);
     pending_input_buffers--;
 
-    if (arbitrary_bytes)
-    {
-      if (pdest_frame == NULL && input_flush_progress == false)
-      {
-        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
-        pdest_frame = buffer;
-        buffer->nFilledLen = 0;
-        buffer->nTimeStamp = LLONG_MAX;
-        push_input_buffer (hComp);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
-        buffer->nFilledLen = 0;
-        if (!m_input_free_q.insert_entry((unsigned)buffer,
-                   (unsigned)NULL, (unsigned)NULL))
-        {
-          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+    if (arbitrary_bytes) {
+        if (pdest_frame == NULL && input_flush_progress == false) {
+            DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
+            pdest_frame = buffer;
+            buffer->nFilledLen = 0;
+            buffer->nTimeStamp = LLONG_MAX;
+            push_input_buffer (hComp);
+        } else {
+            DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
+            buffer->nFilledLen = 0;
+            if (!m_input_free_q.insert_entry((unsigned)buffer,
+                        (unsigned)NULL, (unsigned)NULL)) {
+                DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+            }
         }
-      }
-    }
-    else if(m_cb.EmptyBufferDone)
-    {
+    } else if (m_cb.EmptyBufferDone) {
         buffer->nFilledLen = 0;
-        if (input_use_buffer == true){
+        if (input_use_buffer == true) {
             buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
         }
         m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
@@ -7154,743 +6351,641 @@
 
 int omx_vdec::async_message_process (void *context, void* message)
 {
-  omx_vdec* omx = NULL;
-  struct vdec_msginfo *vdec_msg = NULL;
-  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
-  struct v4l2_buffer *v4l2_buf_ptr = NULL;
-  struct vdec_output_frameinfo *output_respbuf = NULL;
-	int rc=1;
-  if (context == NULL || message == NULL)
-  {
-    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
-    return -1;
-  }
-  vdec_msg = (struct vdec_msginfo *)message;
-
-  omx = reinterpret_cast<omx_vdec*>(context);
-
-  switch (vdec_msg->msgcode)
-  {
-
-  case VDEC_MSG_EVT_HW_ERROR:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
-  break;
-
-  case VDEC_MSG_RESP_START_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_START_DONE);
-  break;
-
-  case VDEC_MSG_RESP_STOP_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_STOP_DONE);
-  break;
-
-  case VDEC_MSG_RESP_RESUME_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_RESUME_DONE);
-  break;
-
-  case VDEC_MSG_RESP_PAUSE_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
-  break;
-
-  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
-    break;
-  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
-    omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
-                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
-    break;
-  case VDEC_MSG_RESP_INPUT_FLUSHED:
-  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
-
-    /* omxhdr = (OMX_BUFFERHEADERTYPE* )
-              vdec_msg->msgdata.input_frame_clientdata; */
-
-    v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
-    omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
-    if (omxhdr == NULL ||
-       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
-    {
-       omxhdr = NULL;
-       vdec_msg->status_code = VDEC_S_EFATAL;
+    omx_vdec* omx = NULL;
+    struct vdec_msginfo *vdec_msg = NULL;
+    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+    struct v4l2_buffer *v4l2_buf_ptr = NULL;
+    struct vdec_output_frameinfo *output_respbuf = NULL;
+    int rc=1;
+    if (context == NULL || message == NULL) {
+        DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
+        return -1;
     }
-    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED)
-    {
-      DEBUG_PRINT_HIGH("Unsupported input");
-      omx->omx_report_error ();
-    }
-    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT)
-    {
-      vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
-    }
-    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
-                     OMX_COMPONENT_GENERATE_EBD);
-    break;
-    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
-      int64_t *timestamp;
-      timestamp = (int64_t *) malloc(sizeof(int64_t));
-      if (timestamp) {
-        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
-        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
-                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
-        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
-             vdec_msg->msgdata.output_frame.time_stamp);
-      }
-      break;
-  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
-    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+    vdec_msg = (struct vdec_msginfo *)message;
 
-      v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
-      omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
-      DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
-		      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
-		      vdec_msg->msgdata.output_frame.pic_type);
-      
-    if (omxhdr && omxhdr->pOutputPortPrivate &&
-        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
-         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
-            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
-    {
-      if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
-      {
-	omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
-	omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
-    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
-    omxhdr->nFlags = 0;
-	
-	if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)
-	{
-	  omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
-	  //rc = -1;
-	}
-  if (omxhdr->nFilledLen)
-  {
-    omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
-  }
-  if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME)
-  {
-    omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
-  }
-  else
-  {
-    omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
-  }
-  if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ)
-  {
-    omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-  }
-  if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY)
-  {
-    omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
-  }
-  if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
-       !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
-       !(v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS))
-  {
-      omx->post_event ((unsigned)NULL,(unsigned int)omxhdr,
-        OMX_COMPONENT_GENERATE_FTB);
-      break;
-  }
-  if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT)
-  {
-    omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
-  }
-  vdec_msg->msgdata.output_frame.bufferaddr =
-      omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
-  int format_notably_changed = 0;
-  if (omxhdr->nFilledLen &&
-	  (omxhdr->nFilledLen != omx->prev_n_filled_len))
-  {
-	  if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
-			  (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
-		  DEBUG_PRINT_HIGH("\n Height/Width information has changed\n");
-		  omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
-		  omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
-		  format_notably_changed = 1;
-	  }
-  }
-  if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
-                      vdec_msg->msgdata.output_frame.framesize.left)
-        || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
-        || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
-        || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
-	  if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
-				  (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
-			  omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
-			  omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
-			  DEBUG_PRINT_HIGH("\n Height/Width information has changed. W: %d --> %d, H: %d --> %d\n",
-					  omx->drv_ctx.video_resolution.frame_width, vdec_msg->msgdata.output_frame.framesize.right,
-					  omx->drv_ctx.video_resolution.frame_height, vdec_msg->msgdata.output_frame.framesize.bottom);
-	  }
-    DEBUG_PRINT_HIGH("\n Crop information changed. W: %d --> %d, H: %d -> %d\n",
-		omx->rectangle.nWidth, vdec_msg->msgdata.output_frame.framesize.right,
-		omx->rectangle.nHeight, vdec_msg->msgdata.output_frame.framesize.bottom);
-    omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
-    omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
-    omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
-    omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
-	format_notably_changed = 1;
-  }
-  if (format_notably_changed) {
-	  if(omx->is_video_session_supported()) {
-		  omx->post_event (NULL, vdec_msg->status_code,
-				  OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
-	  } else {
-                  if (!omx->client_buffers.update_buffer_req()) {
-                     DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
-                  }
-		  omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
-				  OMX_COMPONENT_GENERATE_PORT_RECONFIG);
-	  }
-  }
-  if (omxhdr->nFilledLen)
-	  omx->prev_n_filled_len = omxhdr->nFilledLen;
+    omx = reinterpret_cast<omx_vdec*>(context);
 
-        output_respbuf = (struct vdec_output_frameinfo *)\
-                          omxhdr->pOutputPortPrivate;
-        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
-        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
-        if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME)
-        {
-          output_respbuf->pic_type = PICTURE_TYPE_I;
-        }
-        if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME)
-        {
-          output_respbuf->pic_type = PICTURE_TYPE_P;
-        }
-        if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
-          output_respbuf->pic_type = PICTURE_TYPE_B;
-        }
+    switch (vdec_msg->msgcode) {
 
-        if (omx->output_use_buffer)
-          memcpy ( omxhdr->pBuffer, (void *)
-                   ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
-                    (unsigned long)vdec_msg->msgdata.output_frame.offset),
-                    vdec_msg->msgdata.output_frame.len);
-      }
-      else
-        omxhdr->nFilledLen = 0;
-      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_FBD);
+        case VDEC_MSG_EVT_HW_ERROR:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+            break;
+
+        case VDEC_MSG_RESP_START_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_START_DONE);
+            break;
+
+        case VDEC_MSG_RESP_STOP_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_STOP_DONE);
+            break;
+
+        case VDEC_MSG_RESP_RESUME_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_RESUME_DONE);
+            break;
+
+        case VDEC_MSG_RESP_PAUSE_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
+            break;
+
+        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
+            break;
+        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
+            break;
+        case VDEC_MSG_RESP_INPUT_FLUSHED:
+        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
+
+            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
+               vdec_msg->msgdata.input_frame_clientdata; */
+
+            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
+            omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
+            if (omxhdr == NULL ||
+                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
+                omxhdr = NULL;
+                vdec_msg->status_code = VDEC_S_EFATAL;
+            }
+            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
+                DEBUG_PRINT_HIGH("Unsupported input");
+                omx->omx_report_error ();
+            }
+            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
+                vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
+            }
+            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+                    OMX_COMPONENT_GENERATE_EBD);
+            break;
+        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
+            int64_t *timestamp;
+            timestamp = (int64_t *) malloc(sizeof(int64_t));
+            if (timestamp) {
+                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
+                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
+                DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
+                        vdec_msg->msgdata.output_frame.time_stamp);
+            }
+            break;
+        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
+        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+
+            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
+            omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
+            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
+                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
+                    vdec_msg->msgdata.output_frame.pic_type);
+
+            if (omxhdr && omxhdr->pOutputPortPrivate &&
+                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
+                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
+                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
+                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
+                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
+                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
+                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
+                    omxhdr->nFlags = 0;
+
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS) {
+                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
+                        //rc = -1;
+                    }
+                    if (omxhdr->nFilledLen) {
+                        omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
+                        omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
+                    } else {
+                        omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
+                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
+                        omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
+                    }
+                    if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
+                            !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
+                            !(v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)) {
+                        omx->post_event ((unsigned)NULL,(unsigned int)omxhdr,
+                                OMX_COMPONENT_GENERATE_FTB);
+                        break;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
+                        omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
+                    }
+                    vdec_msg->msgdata.output_frame.bufferaddr =
+                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
+                    int format_notably_changed = 0;
+                    if (omxhdr->nFilledLen &&
+                            (omxhdr->nFilledLen != omx->prev_n_filled_len)) {
+                        if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
+                                (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
+                            DEBUG_PRINT_HIGH("\n Height/Width information has changed\n");
+                            omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
+                            omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
+                            format_notably_changed = 1;
+                        }
+                    }
+                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
+                                    vdec_msg->msgdata.output_frame.framesize.left)
+                                || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
+                                || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
+                                || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
+                        if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
+                                (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
+                            omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
+                            omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
+                            DEBUG_PRINT_HIGH("\n Height/Width information has changed. W: %d --> %d, H: %d --> %d\n",
+                                    omx->drv_ctx.video_resolution.frame_width, vdec_msg->msgdata.output_frame.framesize.right,
+                                    omx->drv_ctx.video_resolution.frame_height, vdec_msg->msgdata.output_frame.framesize.bottom);
+                        }
+                        DEBUG_PRINT_HIGH("\n Crop information changed. W: %d --> %d, H: %d -> %d\n",
+                                omx->rectangle.nWidth, vdec_msg->msgdata.output_frame.framesize.right,
+                                omx->rectangle.nHeight, vdec_msg->msgdata.output_frame.framesize.bottom);
+                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
+                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
+                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
+                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
+                        format_notably_changed = 1;
+                    }
+                    if (format_notably_changed) {
+                        if (omx->is_video_session_supported()) {
+                            omx->post_event (NULL, vdec_msg->status_code,
+                                    OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
+                        } else {
+                            if (!omx->client_buffers.update_buffer_req()) {
+                                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
+                            }
+                            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
+                                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+                        }
+                    }
+                    if (omxhdr->nFilledLen)
+                        omx->prev_n_filled_len = omxhdr->nFilledLen;
+
+                    output_respbuf = (struct vdec_output_frameinfo *)\
+                             omxhdr->pOutputPortPrivate;
+                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
+                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
+                        output_respbuf->pic_type = PICTURE_TYPE_I;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
+                        output_respbuf->pic_type = PICTURE_TYPE_P;
+                    }
+                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
+                        output_respbuf->pic_type = PICTURE_TYPE_B;
+                    }
+
+                    if (omx->output_use_buffer)
+                        memcpy ( omxhdr->pBuffer, (void *)
+                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
+                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
+                                vdec_msg->msgdata.output_frame.len);
+                } else
+                    omxhdr->nFilledLen = 0;
+                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_FBD);
+            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
+                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_EOS_DONE);
+            else
+                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
+                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+            break;
+        case VDEC_MSG_EVT_CONFIG_CHANGED:
+            DEBUG_PRINT_HIGH("\n Port settings changed");
+            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
+                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+            break;
+        default:
+            break;
     }
-    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
-      omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_EOS_DONE);
-    else
-      omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
-                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
-    break;
-  case VDEC_MSG_EVT_CONFIG_CHANGED:
-    DEBUG_PRINT_HIGH("\n Port settings changed");
-    omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
-        OMX_COMPONENT_GENERATE_PORT_RECONFIG);
-    break;
-  default:
-    break;
-  }
-  return rc;
+    return rc;
 }
 
 OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
-                                                   OMX_HANDLETYPE hComp,
-                                                   OMX_BUFFERHEADERTYPE *buffer
-                                                           )
+        OMX_HANDLETYPE hComp,
+        OMX_BUFFERHEADERTYPE *buffer
+        )
 {
-  unsigned address,p2,id;
-  DEBUG_PRINT_LOW("\n Empty this arbitrary");
+    unsigned address,p2,id;
+    DEBUG_PRINT_LOW("\n Empty this arbitrary");
 
-  if (buffer == NULL)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
-  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %lu, flags %lu, timestamp %lld",
-        buffer->nFilledLen, buffer->nFlags, buffer->nTimeStamp);
-
-  /* return zero length and not an EOS buffer */
-  /* return buffer if input flush in progress */
-  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
-     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
-  {
-    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
-    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
-    return OMX_ErrorNone;
-  }
-
-  if (psource_frame == NULL)
-  {
-    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
-    psource_frame = buffer;
-    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
-    push_input_buffer (hComp);
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
-    if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
-                (unsigned)NULL))
-    {
-      return OMX_ErrorBadParameter;
+    if (buffer == NULL) {
+        return OMX_ErrorBadParameter;
     }
-  }
+    DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+    DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %lu, flags %lu, timestamp %lld",
+            buffer->nFilledLen, buffer->nFlags, buffer->nTimeStamp);
+
+    /* return zero length and not an EOS buffer */
+    /* return buffer if input flush in progress */
+    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
+                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
+        DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
+        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
+
+    if (psource_frame == NULL) {
+        DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
+        psource_frame = buffer;
+        DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
+        push_input_buffer (hComp);
+    } else {
+        DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
+        if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
+                    (unsigned)NULL)) {
+            return OMX_ErrorBadParameter;
+        }
+    }
 
 
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
 {
-  unsigned address,p2,id;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
+    unsigned address,p2,id;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
 
-  if (pdest_frame == NULL || psource_frame == NULL)
-  {
-    /*Check if we have a destination buffer*/
-    if (pdest_frame == NULL)
-    {
-      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
-      if (m_input_free_q.m_size)
-      {
-        m_input_free_q.pop_entry(&address,&p2,&id);
-        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
-        pdest_frame->nFilledLen = 0;
-        pdest_frame->nTimeStamp = LLONG_MAX;
-        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
-      }
+    if (pdest_frame == NULL || psource_frame == NULL) {
+        /*Check if we have a destination buffer*/
+        if (pdest_frame == NULL) {
+            DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
+            if (m_input_free_q.m_size) {
+                m_input_free_q.pop_entry(&address,&p2,&id);
+                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
+                pdest_frame->nFilledLen = 0;
+                pdest_frame->nTimeStamp = LLONG_MAX;
+                DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
+            }
+        }
+
+        /*Check if we have a destination buffer*/
+        if (psource_frame == NULL) {
+            DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
+            if (m_input_pending_q.m_size) {
+                m_input_pending_q.pop_entry(&address,&p2,&id);
+                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
+                DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
+                        psource_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
+                        psource_frame->nFlags,psource_frame->nFilledLen);
+
+            }
+        }
+
     }
 
-    /*Check if we have a destination buffer*/
-    if (psource_frame == NULL)
-    {
-      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
-      if (m_input_pending_q.m_size)
-      {
-        m_input_pending_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
-        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
-                psource_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
-        psource_frame->nFlags,psource_frame->nFilledLen);
-
-      }
+    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
+        switch (codec_type_parse) {
+            case CODEC_TYPE_MPEG4:
+            case CODEC_TYPE_H263:
+            case CODEC_TYPE_MPEG2:
+                ret =  push_input_sc_codec(hComp);
+                break;
+            case CODEC_TYPE_H264:
+                ret = push_input_h264(hComp);
+                break;
+            case CODEC_TYPE_VC1:
+                ret = push_input_vc1(hComp);
+                break;
+            default:
+                break;
+        }
+        if (ret != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
+            omx_report_error ();
+            break;
+        }
     }
 
-  }
-
-  while ((pdest_frame != NULL) && (psource_frame != NULL))
-  {
-    switch (codec_type_parse)
-    {
-      case CODEC_TYPE_MPEG4:
-      case CODEC_TYPE_H263:
-      case CODEC_TYPE_MPEG2:
-        ret =  push_input_sc_codec(hComp);
-      break;
-      case CODEC_TYPE_H264:
-        ret = push_input_h264(hComp);
-      break;
-      case CODEC_TYPE_VC1:
-        ret = push_input_vc1(hComp);
-      break;
-      default:
-      break;
-    }
-    if (ret != OMX_ErrorNone)
-    {
-      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
-      omx_report_error ();
-      break;
-    }
-  }
-
-  return ret;
+    return ret;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  OMX_BOOL generate_ebd = OMX_TRUE;
-  unsigned address = 0, p2 = 0, id = 0;
+    OMX_U32 partial_frame = 1;
+    OMX_BOOL generate_ebd = OMX_TRUE;
+    unsigned address = 0, p2 = 0, id = 0;
 
-  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %lld",
-        psource_frame,psource_frame->nTimeStamp);
-  if (m_frame_parser.parse_sc_frame(psource_frame,
-                                       pdest_frame,&partial_frame) == -1)
-  {
-    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-    return OMX_ErrorBadParameter;
-  }
-
-  if (partial_frame == 0)
-  {
-    DEBUG_PRINT_LOW("\n Frame size %lu source %p frame count %d",
-          pdest_frame->nFilledLen,psource_frame,frame_count);
-
-
-    DEBUG_PRINT_LOW("\n TimeStamp updated %lld", pdest_frame->nTimeStamp);
-    /*First Parsed buffer will have only header Hence skip*/
-    if (frame_count == 0)
-    {
-      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
-
-      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
-         codec_type_parse == CODEC_TYPE_DIVX) {
-        mp4StreamType psBits;
-        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
-        psBits.numBytes = pdest_frame->nFilledLen;
-        mp4_headerparser.parseHeader(&psBits);
-      }
-
-      frame_count++;
+    DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %lld",
+            psource_frame,psource_frame->nTimeStamp);
+    if (m_frame_parser.parse_sc_frame(psource_frame,
+                pdest_frame,&partial_frame) == -1) {
+        DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
+        return OMX_ErrorBadParameter;
     }
-    else
-    {
-      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-      if(pdest_frame->nFilledLen)
-      {
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+
+    if (partial_frame == 0) {
+        DEBUG_PRINT_LOW("\n Frame size %lu source %p frame count %d",
+                pdest_frame->nFilledLen,psource_frame,frame_count);
+
+
+        DEBUG_PRINT_LOW("\n TimeStamp updated %lld", pdest_frame->nTimeStamp);
+        /*First Parsed buffer will have only header Hence skip*/
+        if (frame_count == 0) {
+            DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
+
+            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
+                    codec_type_parse == CODEC_TYPE_DIVX) {
+                mp4StreamType psBits;
+                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
+                psBits.numBytes = pdest_frame->nFilledLen;
+                mp4_headerparser.parseHeader(&psBits);
+            }
+
+            frame_count++;
+        } else {
+            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+            if (pdest_frame->nFilledLen) {
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+
+                if (m_input_free_q.m_size) {
+                    m_input_free_q.pop_entry(&address,&p2,&id);
+                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                    pdest_frame->nFilledLen = 0;
+                }
+            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
+                DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
+                m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
+                        (unsigned)NULL);
+                pdest_frame = NULL;
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-
-        if (m_input_free_q.m_size)
-        {
-          m_input_free_q.pop_entry(&address,&p2,&id);
-          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-          pdest_frame->nFilledLen = 0;
+    } else {
+        DEBUG_PRINT_LOW("\n Not a Complete Frame %lu",pdest_frame->nFilledLen);
+        /*Check if Destination Buffer is full*/
+        if (pdest_frame->nAllocLen ==
+                pdest_frame->nFilledLen + pdest_frame->nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
         }
-      }
-      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
-      {
-        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
-        m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
-                (unsigned)NULL);
-        pdest_frame = NULL;
-      }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Not a Complete Frame %lu",pdest_frame->nFilledLen);
-    /*Check if Destination Buffer is full*/
-    if (pdest_frame->nAllocLen ==
-        pdest_frame->nFilledLen + pdest_frame->nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
 
-  if (psource_frame->nFilledLen == 0)
-  {
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        pdest_frame->nFlags |= psource_frame->nFlags;
-        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %lld",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
-                     pdest_frame->nFilledLen,frame_count++);
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+    if (psource_frame->nFilledLen == 0) {
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                pdest_frame->nFlags |= psource_frame->nFlags;
+                DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %lld",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
+                        pdest_frame->nFilledLen,frame_count++);
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
+                generate_ebd = OMX_FALSE;
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
-        generate_ebd = OMX_FALSE;
-      }
-   }
-    if(generate_ebd)
-    {
-      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
-      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-      psource_frame = NULL;
+        if (generate_ebd) {
+            DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
+            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+            psource_frame = NULL;
 
-      if (m_input_pending_q.m_size)
-      {
-        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
-        m_input_pending_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
-                psource_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
-        psource_frame->nFlags,psource_frame->nFilledLen);
-      }
+            if (m_input_pending_q.m_size) {
+                DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
+                m_input_pending_q.pop_entry(&address,&p2,&id);
+                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+                DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
+                        psource_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
+                        psource_frame->nFlags,psource_frame->nFilledLen);
+            }
+        }
     }
-   }
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
 {
-  OMX_U32 partial_frame = 1;
-  unsigned address = 0, p2 = 0, id = 0;
-  OMX_BOOL isNewFrame = OMX_FALSE;
-  OMX_BOOL generate_ebd = OMX_TRUE;
+    OMX_U32 partial_frame = 1;
+    unsigned address = 0, p2 = 0, id = 0;
+    OMX_BOOL isNewFrame = OMX_FALSE;
+    OMX_BOOL generate_ebd = OMX_TRUE;
 
-  if (h264_scratch.pBuffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %lu "
-      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
-  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
-  if (h264_scratch.nFilledLen && look_ahead_nal)
-  {
-    look_ahead_nal = false;
-    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-         h264_scratch.nFilledLen)
-    {
-      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-              h264_scratch.pBuffer,h264_scratch.nFilledLen);
-      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
-      h264_scratch.nFilledLen = 0;
+    if (h264_scratch.pBuffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
+        return OMX_ErrorBadParameter;
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  if (nal_length == 0)
-  {
-    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
-    if (m_frame_parser.parse_sc_frame(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
-    if (m_frame_parser.parse_h264_nallength(psource_frame,
-        &h264_scratch,&partial_frame) == -1)
-    {
-      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
-      return OMX_ErrorBadParameter;
-    }
-  }
-
-  if (partial_frame == 0)
-  {
-    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
-    {
-      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
-      nal_count++;
-      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
-      h264_scratch.nFlags = psource_frame->nFlags;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %lu",h264_scratch.nFilledLen);
-      if(h264_scratch.nFilledLen)
-      {
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
-                                 NALU_TYPE_SPS);
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
-                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
-        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-          // If timeinfo is present frame info from SEI is already processed
-          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
-                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
-#endif
-        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
-        nal_count++;
-        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
-          pdest_frame->nTimeStamp = h264_last_au_ts;
-          pdest_frame->nFlags = h264_last_au_flags;
-#ifdef PANSCAN_HDLR
-          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-            h264_parser->update_panscan_data(h264_last_au_ts);
-#endif
-        }
-        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
-           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
-          h264_last_au_ts = h264_scratch.nTimeStamp;
-          h264_last_au_flags = h264_scratch.nFlags;
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-          {
-            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
-            if (!VALID_TS(h264_last_au_ts))
-              h264_last_au_ts = ts_in_sei;
-          }
-#endif
-        } else
-          h264_last_au_ts = LLONG_MAX;
-      }
-
-      if (!isNewFrame)
-      {
-        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-            h264_scratch.nFilledLen)
-        {
-          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %lu",
-              h264_scratch.nFilledLen);
-          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-              h264_scratch.pBuffer,h264_scratch.nFilledLen);
-          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
-            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
-          h264_scratch.nFilledLen = 0;
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
-          return OMX_ErrorBadParameter;
-        }
-      }
-      else
-      {
-        look_ahead_nal = true;
-        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %llx",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
-                     pdest_frame->nFilledLen,frame_count++);
-
-        if (pdest_frame->nFilledLen == 0)
-        {
-          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
-          look_ahead_nal = false;
-          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-               h264_scratch.nFilledLen)
-          {
+    DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %lu "
+            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
+    DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
+    if (h264_scratch.nFilledLen && look_ahead_nal) {
+        look_ahead_nal = false;
+        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                h264_scratch.nFilledLen) {
             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+            DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
             h264_scratch.nFilledLen = 0;
-          }
-          else
-          {
-            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+        } else {
+            DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
             return OMX_ErrorBadParameter;
-          }
         }
-        else
-        {
-          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
-          {
-            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
-            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
-          }
-          /*Push the frame to the Decoder*/
-          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-          {
+    }
+    if (nal_length == 0) {
+        DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
+        if (m_frame_parser.parse_sc_frame(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
             return OMX_ErrorBadParameter;
-          }
-          //frame_count++;
-          pdest_frame = NULL;
-          if (m_input_free_q.m_size)
-          {
-            m_input_free_q.pop_entry(&address,&p2,&id);
-            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
-            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
-            pdest_frame->nFilledLen = 0;
-            pdest_frame->nFlags = 0;
-            pdest_frame->nTimeStamp = LLONG_MAX;
-          }
         }
-      }
+    } else {
+        DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
+        if (m_frame_parser.parse_h264_nallength(psource_frame,
+                    &h264_scratch,&partial_frame) == -1) {
+            DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
+            return OMX_ErrorBadParameter;
+        }
     }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
-    /*Check if Destination Buffer is full*/
-    if (h264_scratch.nAllocLen ==
-        h264_scratch.nFilledLen + h264_scratch.nOffset)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
-      return OMX_ErrorStreamCorrupt;
-    }
-  }
 
-  if (!psource_frame->nFilledLen)
-  {
-    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
-
-    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
-    {
-      if (pdest_frame)
-      {
-        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
-        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
-             h264_scratch.nFilledLen)
-        {
-          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
-                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
-          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
-          h264_scratch.nFilledLen = 0;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
-          return OMX_ErrorBadParameter;
-        }
-        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
-        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
-
-        DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%lu TimeStamp = %llx",
-                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
-        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
+    if (partial_frame == 0) {
+        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
+            DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
+            nal_count++;
+            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
+            h264_scratch.nFlags = psource_frame->nFlags;
+        } else {
+            DEBUG_PRINT_LOW("\n Parsed New NAL Length = %lu",h264_scratch.nFilledLen);
+            if (h264_scratch.nFilledLen) {
+                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
+                        NALU_TYPE_SPS);
 #ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
-        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-        {
-          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
-          if (!VALID_TS(pdest_frame->nTimeStamp))
-            pdest_frame->nTimeStamp = ts_in_sei;
-        }
+                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
+                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                    // If timeinfo is present frame info from SEI is already processed
+                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
 #endif
-        /*Push the frame to the Decoder*/
-        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
-        {
-          return OMX_ErrorBadParameter;
+                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
+                nal_count++;
+                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
+                    pdest_frame->nTimeStamp = h264_last_au_ts;
+                    pdest_frame->nFlags = h264_last_au_flags;
+#ifdef PANSCAN_HDLR
+                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+                        h264_parser->update_panscan_data(h264_last_au_ts);
+#endif
+                }
+                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
+                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
+                    h264_last_au_ts = h264_scratch.nTimeStamp;
+                    h264_last_au_flags = h264_scratch.nFlags;
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
+                        if (!VALID_TS(h264_last_au_ts))
+                            h264_last_au_ts = ts_in_sei;
+                    }
+#endif
+                } else
+                    h264_last_au_ts = LLONG_MAX;
+            }
+
+            if (!isNewFrame) {
+                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                        h264_scratch.nFilledLen) {
+                    DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %lu",
+                            h264_scratch.nFilledLen);
+                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
+                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+                    h264_scratch.nFilledLen = 0;
+                } else {
+                    DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
+                    return OMX_ErrorBadParameter;
+                }
+            } else {
+                look_ahead_nal = true;
+                DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %llx",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
+                        pdest_frame->nFilledLen,frame_count++);
+
+                if (pdest_frame->nFilledLen == 0) {
+                    DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
+                    look_ahead_nal = false;
+                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                            h264_scratch.nFilledLen) {
+                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                        h264_scratch.nFilledLen = 0;
+                    } else {
+                        DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+                        return OMX_ErrorBadParameter;
+                    }
+                } else {
+                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
+                        DEBUG_PRINT_LOW("\n Reset the EOS Flag");
+                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+                    }
+                    /*Push the frame to the Decoder*/
+                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                        return OMX_ErrorBadParameter;
+                    }
+                    //frame_count++;
+                    pdest_frame = NULL;
+                    if (m_input_free_q.m_size) {
+                        m_input_free_q.pop_entry(&address,&p2,&id);
+                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+                        DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
+                        pdest_frame->nFilledLen = 0;
+                        pdest_frame->nFlags = 0;
+                        pdest_frame->nTimeStamp = LLONG_MAX;
+                    }
+                }
+            }
         }
-        frame_count++;
-        pdest_frame = NULL;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %lu",
-                     pdest_frame,h264_scratch.nFilledLen);
-        generate_ebd = OMX_FALSE;
-      }
+    } else {
+        DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
+        /*Check if Destination Buffer is full*/
+        if (h264_scratch.nAllocLen ==
+                h264_scratch.nFilledLen + h264_scratch.nOffset) {
+            DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
+            return OMX_ErrorStreamCorrupt;
+        }
     }
-  }
-  if(generate_ebd && !psource_frame->nFilledLen)
-  {
-    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
-    psource_frame = NULL;
-    if (m_input_pending_q.m_size)
-    {
-      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
-      m_input_pending_q.pop_entry(&address,&p2,&id);
-      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
-      DEBUG_PRINT_LOW("\nNext source Buffer flag %lu src length %lu",
-      psource_frame->nFlags,psource_frame->nFilledLen);
+
+    if (!psource_frame->nFilledLen) {
+        DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
+
+        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+            if (pdest_frame) {
+                DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
+                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+                        h264_scratch.nFilledLen) {
+                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
+                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+                    h264_scratch.nFilledLen = 0;
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
+                    return OMX_ErrorBadParameter;
+                }
+                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
+                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+
+                DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%lu TimeStamp = %llx",
+                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+                DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
+                    if (!VALID_TS(pdest_frame->nTimeStamp))
+                        pdest_frame->nTimeStamp = ts_in_sei;
+                }
+#endif
+                /*Push the frame to the Decoder*/
+                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+                    return OMX_ErrorBadParameter;
+                }
+                frame_count++;
+                pdest_frame = NULL;
+            } else {
+                DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %lu",
+                        pdest_frame,h264_scratch.nFilledLen);
+                generate_ebd = OMX_FALSE;
+            }
+        }
     }
-  }
-  return OMX_ErrorNone;
+    if (generate_ebd && !psource_frame->nFilledLen) {
+        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+        psource_frame = NULL;
+        if (m_input_pending_q.m_size) {
+            DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
+            m_input_pending_q.pop_entry(&address,&p2,&id);
+            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+            DEBUG_PRINT_LOW("\nNext source Buffer flag %lu src length %lu",
+                    psource_frame->nFlags,psource_frame->nFilledLen);
+        }
+    }
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
@@ -7899,61 +6994,47 @@
     OMX_U32 partial_frame = 1;
     OMX_U32 buf_len, dest_len;
 
-    if(first_frame == 0)
-    {
+    if (first_frame == 0) {
         first_frame = 1;
         DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
-        if(!m_vendor_config.pData)
-        {
+        if (!m_vendor_config.pData) {
             DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
             buf = psource_frame->pBuffer;
             buf_len = psource_frame->nFilledLen;
 
             if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
-                VC1_SP_MP_START_CODE)
-            {
+                    VC1_SP_MP_START_CODE) {
                 m_vc1_profile = VC1_SP_MP_RCV;
-            }
-            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
-            {
+            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
                 m_vc1_profile = VC1_AP;
-            }
-            else
-            {
+            } else {
                 DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
                 return OMX_ErrorStreamCorrupt;
             }
-        }
-        else
-        {
+        } else {
             pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
                 pdest_frame->nOffset;
             dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
-                pdest_frame->nOffset);
+                    pdest_frame->nOffset);
 
-            if(dest_len < m_vendor_config.nDataSize)
-            {
+            if (dest_len < m_vendor_config.nDataSize) {
                 DEBUG_PRINT_ERROR("\nDestination buffer full\n");
                 return OMX_ErrorBadParameter;
-            }
-            else
-            {
+            } else {
                 memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
                 pdest_frame->nFilledLen += m_vendor_config.nDataSize;
             }
         }
     }
 
-    switch(m_vc1_profile)
-    {
+    switch (m_vc1_profile) {
         case VC1_AP:
             DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
-            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
-            {
+            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
                 DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
                 return OMX_ErrorBadParameter;
             }
-        break;
+            break;
 
         case VC1_SP_MP_RCV:
         default:
@@ -7965,132 +7046,125 @@
 
 #ifndef USE_ION
 bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                                  OMX_U32 alignment)
+        OMX_U32 alignment)
 {
-  struct pmem_allocation allocation;
-  allocation.size = buffer_size;
-  allocation.align = clip2(alignment);
-  if (allocation.align < 4096)
-  {
-    allocation.align = 4096;
-  }
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
-      allocation.align, allocation.size);
-    return false;
-  }
-  return true;
+    struct pmem_allocation allocation;
+    allocation.size = buffer_size;
+    allocation.align = clip2(alignment);
+    if (allocation.align < 4096) {
+        allocation.align = 4096;
+    }
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+                allocation.align, allocation.size);
+        return false;
+    }
+    return true;
 }
 #endif
 #ifdef USE_ION
 int omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
-              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
-	      struct ion_fd_data *fd_data, int flag)
+        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
+        struct ion_fd_data *fd_data, int flag)
 {
-  int fd = -EINVAL;
-  int rc = -EINVAL;
-  int ion_dev_flag;
-  struct vdec_ion ion_buf_info;
-  if (!alloc_data || buffer_size <= 0 || !fd_data) {
-     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
-     return -EINVAL;
-  }
-  ion_dev_flag = O_RDONLY;
-  fd = open (MEM_DEVICE, ion_dev_flag);
-  if (fd < 0) {
-    DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
-    return fd;
-  }
-  alloc_data->flags = 0;
-  if(!secure_mode && (flag & ION_FLAG_CACHED))
-  {
-    alloc_data->flags |= ION_FLAG_CACHED;
-  }
-  alloc_data->len = buffer_size;
-  alloc_data->align = clip2(alignment);
-  if (alloc_data->align < 4096)
-  {
-    alloc_data->align = 4096;
-  }
-  if ((secure_mode) && (flag & ION_SECURE))
-      alloc_data->flags |= ION_SECURE;
+    int fd = -EINVAL;
+    int rc = -EINVAL;
+    int ion_dev_flag;
+    struct vdec_ion ion_buf_info;
+    if (!alloc_data || buffer_size <= 0 || !fd_data) {
+        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
+        return -EINVAL;
+    }
+    ion_dev_flag = O_RDONLY;
+    fd = open (MEM_DEVICE, ion_dev_flag);
+    if (fd < 0) {
+        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
+        return fd;
+    }
+    alloc_data->flags = 0;
+    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
+        alloc_data->flags |= ION_FLAG_CACHED;
+    }
+    alloc_data->len = buffer_size;
+    alloc_data->align = clip2(alignment);
+    if (alloc_data->align < 4096) {
+        alloc_data->align = 4096;
+    }
+    if ((secure_mode) && (flag & ION_SECURE))
+        alloc_data->flags |= ION_SECURE;
 
-  alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
-  if (secure_mode)
-	  alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
-  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
-  if (rc || !alloc_data->handle) {
-    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
-    alloc_data->handle = NULL;
-    close(fd);
-    fd = -ENOMEM;
-    return fd;
-  }
-  fd_data->handle = alloc_data->handle;
-  rc = ioctl(fd,ION_IOC_MAP,fd_data);
-  if (rc) {
-    DEBUG_PRINT_ERROR("\n ION MAP failed ");
-    ion_buf_info.ion_alloc_data = *alloc_data;
-    ion_buf_info.ion_device_fd = fd;
-    ion_buf_info.fd_ion_data = *fd_data;
-    free_ion_memory(&ion_buf_info);
-    fd_data->fd =-1;
-    close(fd);
-    fd = -ENOMEM;
-  }
+    alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
+    if (secure_mode)
+        alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
+    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
+    if (rc || !alloc_data->handle) {
+        DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+        alloc_data->handle = NULL;
+        close(fd);
+        fd = -ENOMEM;
+        return fd;
+    }
+    fd_data->handle = alloc_data->handle;
+    rc = ioctl(fd,ION_IOC_MAP,fd_data);
+    if (rc) {
+        DEBUG_PRINT_ERROR("\n ION MAP failed ");
+        ion_buf_info.ion_alloc_data = *alloc_data;
+        ion_buf_info.ion_device_fd = fd;
+        ion_buf_info.fd_ion_data = *fd_data;
+        free_ion_memory(&ion_buf_info);
+        fd_data->fd =-1;
+        close(fd);
+        fd = -ENOMEM;
+    }
 
-  return fd;
+    return fd;
 }
 
-void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
+void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
+{
 
-     if(!buf_ion_info) {
-       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
-       return;
-     }
-     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
-             &buf_ion_info->ion_alloc_data.handle)) {
-       DEBUG_PRINT_ERROR("\n ION: free failed" );
-     }
-     close(buf_ion_info->ion_device_fd);
-     buf_ion_info->ion_device_fd = -1;
-     buf_ion_info->ion_alloc_data.handle = NULL;
-     buf_ion_info->fd_ion_data.fd = -1;
+    if (!buf_ion_info) {
+        DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
+        return;
+    }
+    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
+                &buf_ion_info->ion_alloc_data.handle)) {
+        DEBUG_PRINT_ERROR("\n ION: free failed" );
+    }
+    close(buf_ion_info->ion_device_fd);
+    buf_ion_info->ion_device_fd = -1;
+    buf_ion_info->ion_alloc_data.handle = NULL;
+    buf_ion_info->fd_ion_data.fd = -1;
 }
 #endif
 void omx_vdec::free_output_buffer_header()
 {
-  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
-  output_use_buffer = false;
-  ouput_egl_buffers = false;
+    DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
+    output_use_buffer = false;
+    ouput_egl_buffers = false;
 
-  if (m_out_mem_ptr)
-  {
-    free (m_out_mem_ptr);
-    m_out_mem_ptr = NULL;
-  }
+    if (m_out_mem_ptr) {
+        free (m_out_mem_ptr);
+        m_out_mem_ptr = NULL;
+    }
 
-  if(m_platform_list)
-  {
-    free(m_platform_list);
-    m_platform_list = NULL;
-  }
+    if (m_platform_list) {
+        free(m_platform_list);
+        m_platform_list = NULL;
+    }
 
-  if (drv_ctx.ptr_respbuffer)
-  {
-    free (drv_ctx.ptr_respbuffer);
-    drv_ctx.ptr_respbuffer = NULL;
-  }
-  if (drv_ctx.ptr_outputbuffer)
-  {
-    free (drv_ctx.ptr_outputbuffer);
-    drv_ctx.ptr_outputbuffer = NULL;
-  }
+    if (drv_ctx.ptr_respbuffer) {
+        free (drv_ctx.ptr_respbuffer);
+        drv_ctx.ptr_respbuffer = NULL;
+    }
+    if (drv_ctx.ptr_outputbuffer) {
+        free (drv_ctx.ptr_outputbuffer);
+        drv_ctx.ptr_outputbuffer = NULL;
+    }
 #ifdef USE_ION
     if (drv_ctx.op_buf_ion_info) {
         DEBUG_PRINT_LOW("\n Free o/p ion context");
-	free(drv_ctx.op_buf_ion_info);
+        free(drv_ctx.op_buf_ion_info);
         drv_ctx.op_buf_ion_info = NULL;
     }
 #endif
@@ -8099,45 +7173,39 @@
 void omx_vdec::free_input_buffer_header()
 {
     input_use_buffer = false;
-    if (arbitrary_bytes)
-    {
-      if (m_frame_parser.mutils)
-      {
-        DEBUG_PRINT_LOW("\n Free utils parser");
-        delete (m_frame_parser.mutils);
-        m_frame_parser.mutils = NULL;
-      }
+    if (arbitrary_bytes) {
+        if (m_frame_parser.mutils) {
+            DEBUG_PRINT_LOW("\n Free utils parser");
+            delete (m_frame_parser.mutils);
+            m_frame_parser.mutils = NULL;
+        }
 
-      if (m_inp_heap_ptr)
-      {
-        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
-        free (m_inp_heap_ptr);
-        m_inp_heap_ptr = NULL;
-      }
+        if (m_inp_heap_ptr) {
+            DEBUG_PRINT_LOW("\n Free input Heap Pointer");
+            free (m_inp_heap_ptr);
+            m_inp_heap_ptr = NULL;
+        }
 
-      if (m_phdr_pmem_ptr)
-      {
-        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
-        free (m_phdr_pmem_ptr);
-        m_phdr_pmem_ptr = NULL;
-      }
+        if (m_phdr_pmem_ptr) {
+            DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
+            free (m_phdr_pmem_ptr);
+            m_phdr_pmem_ptr = NULL;
+        }
     }
-    if (m_inp_mem_ptr)
-    {
-      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
-      free (m_inp_mem_ptr);
-      m_inp_mem_ptr = NULL;
+    if (m_inp_mem_ptr) {
+        DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
+        free (m_inp_mem_ptr);
+        m_inp_mem_ptr = NULL;
     }
-    if (drv_ctx.ptr_inputbuffer)
-    {
-      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
-      free (drv_ctx.ptr_inputbuffer);
-      drv_ctx.ptr_inputbuffer = NULL;
+    if (drv_ctx.ptr_inputbuffer) {
+        DEBUG_PRINT_LOW("\n Free Driver Context pointer");
+        free (drv_ctx.ptr_inputbuffer);
+        drv_ctx.ptr_inputbuffer = NULL;
     }
 #ifdef USE_ION
     if (drv_ctx.ip_buf_ion_info) {
         DEBUG_PRINT_LOW("\n Free ion context");
-	free(drv_ctx.ip_buf_ion_info);
+        free(drv_ctx.ip_buf_ion_info);
         drv_ctx.ip_buf_ion_info = NULL;
     }
 #endif
@@ -8145,1560 +7213,1473 @@
 
 int omx_vdec::stream_off(OMX_U32 port)
 {
-	enum v4l2_buf_type btype;
-	int rc = 0;
-	enum v4l2_ports v4l2_port = OUTPUT_PORT;
+    enum v4l2_buf_type btype;
+    int rc = 0;
+    enum v4l2_ports v4l2_port = OUTPUT_PORT;
 
-	if (port == OMX_CORE_INPUT_PORT_INDEX) {
-		btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		v4l2_port = OUTPUT_PORT;
-	} else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
-		btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		v4l2_port = CAPTURE_PORT;
-	} else if (port == OMX_ALL) {
-		int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
-		int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
+    if (port == OMX_CORE_INPUT_PORT_INDEX) {
+        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        v4l2_port = OUTPUT_PORT;
+    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
+        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        v4l2_port = CAPTURE_PORT;
+    } else if (port == OMX_ALL) {
+        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
+        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
 
-		if (!rc_input)
-			return rc_input;
-		else
-			return rc_output;
-	}
+        if (!rc_input)
+            return rc_input;
+        else
+            return rc_output;
+    }
 
-	if (!streaming[v4l2_port]) {
-		// already streamed off, warn and move on
-		DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
-				" which is already streamed off", v4l2_port);
-		return 0;
-	}
+    if (!streaming[v4l2_port]) {
+        // already streamed off, warn and move on
+        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
+                " which is already streamed off", v4l2_port);
+        return 0;
+    }
 
-	DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
+    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
 
-	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
-	if (rc) {
-		/*TODO: How to handle this case */
-		DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
-	} else {
-		streaming[v4l2_port] = false;
-	}
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+    if (rc) {
+        /*TODO: How to handle this case */
+        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
+    } else {
+        streaming[v4l2_port] = false;
+    }
 
-	return rc;
+    return rc;
 }
 
 OMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  struct v4l2_requestbuffers bufreq;
-  unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
-  struct v4l2_format fmt;
-  int ret = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_requestbuffers bufreq;
+    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
+    struct v4l2_format fmt;
+    int ret = 0;
     DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-	bufreq.memory = V4L2_MEMORY_USERPTR;
-	bufreq.count = 1;
-   if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
-    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    fmt.fmt.pix_mp.pixelformat = output_capability;
-  }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
-    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    fmt.fmt.pix_mp.pixelformat = capture_capability;
-  }else {eRet = OMX_ErrorBadParameter;}
-  if(eRet==OMX_ErrorNone){
-  ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
-  }
-  if(ret)
-  {
-    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
-	/*TODO: How to handle this case */
-    eRet = OMX_ErrorInsufficientResources;
-	return eRet;
-  }
-  else
-  {
-  buffer_prop->actualcount = bufreq.count;
-  buffer_prop->mincount = bufreq.count;
-  DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
-  }
-  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-
-  fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-  fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-
-  ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
-
-  update_resolution(fmt.fmt.pix_mp.width,
-		fmt.fmt.pix_mp.height,
-		fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
-		fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
-  if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
-      drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
-  DEBUG_PRINT_HIGH("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
-
-  if(ret)
-  {
-	/*TODO: How to handle this case */
-    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
-    eRet = OMX_ErrorInsufficientResources;
-  }
-  else
-  {
-    int extra_idx = 0;
-
-    eRet = is_video_session_supported();
-    if (eRet)
-      return eRet;
-
-    buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-    buf_size = buffer_prop->buffer_size;
-    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
-    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-      extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
-    } else if (extra_idx >= VIDEO_MAX_PLANES) {
-      DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
-      return OMX_ErrorBadParameter;
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    bufreq.memory = V4L2_MEMORY_USERPTR;
+    bufreq.count = 1;
+    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.fmt.pix_mp.pixelformat = output_capability;
+    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.fmt.pix_mp.pixelformat = capture_capability;
+    } else {
+        eRet = OMX_ErrorBadParameter;
     }
-    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
-    {
-      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
-      client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+    if (eRet==OMX_ErrorNone) {
+        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
     }
-    if (client_extradata & OMX_INTERLACE_EXTRADATA)
-    {
-      client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+    if (ret) {
+        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+        /*TODO: How to handle this case */
+        eRet = OMX_ErrorInsufficientResources;
+        return eRet;
+    } else {
+        buffer_prop->actualcount = bufreq.count;
+        buffer_prop->mincount = bufreq.count;
+        DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
     }
-    if (client_extradata & OMX_PORTDEF_EXTRADATA)
-    {
-      client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
-      DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
-         client_extra_data_size);
+    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+
+    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+
+    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+
+    update_resolution(fmt.fmt.pix_mp.width,
+            fmt.fmt.pix_mp.height,
+            fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
+            fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
+    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
+    DEBUG_PRINT_HIGH("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
+
+    if (ret) {
+        /*TODO: How to handle this case */
+        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+        eRet = OMX_ErrorInsufficientResources;
+    } else {
+        int extra_idx = 0;
+
+        eRet = is_video_session_supported();
+        if (eRet)
+            return eRet;
+
+        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+        buf_size = buffer_prop->buffer_size;
+        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
+        } else if (extra_idx >= VIDEO_MAX_PLANES) {
+            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
+            return OMX_ErrorBadParameter;
+        }
+        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
+            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+        }
+        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
+            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+        }
+        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
+            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
+                    client_extra_data_size);
+        }
+        if (client_extra_data_size) {
+            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
+        }
+        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
+        drv_ctx.extradata_info.count = buffer_prop->actualcount;
+        drv_ctx.extradata_info.buffer_size = extra_data_size;
+        buf_size += client_extra_data_size;
+        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+        DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
+                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
+        if (in_reconfig) // BufReq will be set to driver when port is disabled
+            buffer_prop->buffer_size = buf_size;
+        else if (buf_size != buffer_prop->buffer_size) {
+            buffer_prop->buffer_size = buf_size;
+            eRet = set_buffer_req(buffer_prop);
+        }
     }
-    if (client_extra_data_size)
-    {
-      client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
-      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
-    }
-    drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
-    drv_ctx.extradata_info.count = buffer_prop->actualcount;
-    drv_ctx.extradata_info.buffer_size = extra_data_size;
-    buf_size += client_extra_data_size;
-    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
-    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
-        buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
-    if (in_reconfig) // BufReq will be set to driver when port is disabled
-      buffer_prop->buffer_size = buf_size;
-    else if (buf_size != buffer_prop->buffer_size)
-    {
-      buffer_prop->buffer_size = buf_size;
-      eRet = set_buffer_req(buffer_prop);
-    }
-  }
-  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-  return eRet;
+    DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned buf_size = 0;
-  struct v4l2_format fmt;
-  struct v4l2_requestbuffers bufreq;
-  int ret;
-  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
-    buffer_prop->actualcount, buffer_prop->buffer_size);
-  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
-  if (buf_size != buffer_prop->buffer_size)
-  {
-    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
-      buffer_prop->buffer_size, buf_size);
-    eRet = OMX_ErrorBadParameter;
-  }
-  else
-  {
-    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
-	fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned buf_size = 0;
+    struct v4l2_format fmt;
+    struct v4l2_requestbuffers bufreq;
+    int ret;
+    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
+            buffer_prop->actualcount, buffer_prop->buffer_size);
+    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+    if (buf_size != buffer_prop->buffer_size) {
+        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
+                buffer_prop->buffer_size, buf_size);
+        eRet = OMX_ErrorBadParameter;
+    } else {
+        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
 
-	if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
-		fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fmt.fmt.pix_mp.pixelformat = output_capability;
-	} else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
-		fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.pixelformat = capture_capability;
-	} else {eRet = OMX_ErrorBadParameter;}
+        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+            fmt.fmt.pix_mp.pixelformat = output_capability;
+        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            fmt.fmt.pix_mp.pixelformat = capture_capability;
+        } else {
+            eRet = OMX_ErrorBadParameter;
+        }
 
-	ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
-    if (ret)
-    {
-	  /*TODO: How to handle this case */
-      DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
-      eRet = OMX_ErrorInsufficientResources;
+        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+        if (ret) {
+            /*TODO: How to handle this case */
+            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
+            eRet = OMX_ErrorInsufficientResources;
+        }
+
+        bufreq.memory = V4L2_MEMORY_USERPTR;
+        bufreq.count = buffer_prop->actualcount;
+        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        } else {
+            eRet = OMX_ErrorBadParameter;
+        }
+
+        if (eRet==OMX_ErrorNone) {
+            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+        }
+
+        if (ret) {
+            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
+            /*TODO: How to handle this case */
+            eRet = OMX_ErrorInsufficientResources;
+        } else if (bufreq.count < buffer_prop->actualcount) {
+            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
+                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
+                    buffer_prop->actualcount, bufreq.count);
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            if (!client_buffers.update_buffer_req()) {
+                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
+                eRet = OMX_ErrorInsufficientResources;
+            }
+        }
     }
-
-	bufreq.memory = V4L2_MEMORY_USERPTR;
-	bufreq.count = buffer_prop->actualcount;
-	if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	} else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	} else {eRet = OMX_ErrorBadParameter;}
-
-	if (eRet==OMX_ErrorNone) {
-		ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
-	}
-
-	if (ret)
-	{
-		DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
-		/*TODO: How to handle this case */
-		eRet = OMX_ErrorInsufficientResources;
-	} else if (bufreq.count < buffer_prop->actualcount) {
-		DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
-						" on v4l2 port %d to %d (prefers %d)", bufreq.type,
-						buffer_prop->actualcount, bufreq.count);
-		eRet = OMX_ErrorInsufficientResources;
-	} else {
-        if (!client_buffers.update_buffer_req()) {
-        DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
-        eRet = OMX_ErrorInsufficientResources;
-      }
-    }
-  }
-  return eRet;
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::update_picture_resolution()
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  return eRet;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (!portDefn)
-  {
-    return OMX_ErrorBadParameter;
-  }
-  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
-  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
-  portDefn->nSize = sizeof(portDefn);
-  portDefn->eDomain    = OMX_PortDomainVideo;
-  if (drv_ctx.frame_rate.fps_denominator > 0)
-    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
-                                        drv_ctx.frame_rate.fps_denominator;
-  else {
-    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
-    return OMX_ErrorBadParameter;
-  }
-  if (0 == portDefn->nPortIndex)
-  {
-    portDefn->eDir =  OMX_DirInput;
-    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
-    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
-    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
-    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
-    portDefn->format.video.eCompressionFormat = eCompressionFormat;
-    portDefn->bEnabled   = m_inp_bEnabled;
-    portDefn->bPopulated = m_inp_bPopulated;
-  }
-  else if (1 == portDefn->nPortIndex)
-  {
-    unsigned int buf_size = 0;
-    if (!client_buffers.update_buffer_req()) {
-      DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
-      return OMX_ErrorHardware;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!portDefn) {
+        return OMX_ErrorBadParameter;
     }
-    if (!client_buffers.get_buffer_req(buf_size)) {
-      DEBUG_PRINT_ERROR("\n update buffer requirements");
-      return OMX_ErrorHardware;
+    DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
+    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
+    portDefn->nSize = sizeof(portDefn);
+    portDefn->eDomain    = OMX_PortDomainVideo;
+    if (drv_ctx.frame_rate.fps_denominator > 0)
+        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
+            drv_ctx.frame_rate.fps_denominator;
+    else {
+        DEBUG_PRINT_ERROR("Error: Divide by zero \n");
+        return OMX_ErrorBadParameter;
     }
-    portDefn->nBufferSize = buf_size;
-    portDefn->eDir =  OMX_DirOutput;
-	portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
-	portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
-    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
-    portDefn->bEnabled   = m_out_bEnabled;
-    portDefn->bPopulated = m_out_bPopulated;
-    if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
-        DEBUG_PRINT_ERROR("\n Error in getting color format");
-        return OMX_ErrorHardware;
+    if (0 == portDefn->nPortIndex) {
+        portDefn->eDir =  OMX_DirInput;
+        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
+        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
+        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
+        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
+        portDefn->format.video.eCompressionFormat = eCompressionFormat;
+        portDefn->bEnabled   = m_inp_bEnabled;
+        portDefn->bPopulated = m_inp_bPopulated;
+    } else if (1 == portDefn->nPortIndex) {
+        unsigned int buf_size = 0;
+        if (!client_buffers.update_buffer_req()) {
+            DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
+            return OMX_ErrorHardware;
+        }
+        if (!client_buffers.get_buffer_req(buf_size)) {
+            DEBUG_PRINT_ERROR("\n update buffer requirements");
+            return OMX_ErrorHardware;
+        }
+        portDefn->nBufferSize = buf_size;
+        portDefn->eDir =  OMX_DirOutput;
+        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
+        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
+        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+        portDefn->bEnabled   = m_out_bEnabled;
+        portDefn->bPopulated = m_out_bPopulated;
+        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
+            DEBUG_PRINT_ERROR("\n Error in getting color format");
+            return OMX_ErrorHardware;
+        }
+    } else {
+        portDefn->eDir = OMX_DirMax;
+        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
+                (int)portDefn->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-  }
-  else
-  {
-      portDefn->eDir = OMX_DirMax;
-    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
-             (int)portDefn->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
-  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
-  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
-  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
-  DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
-    " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
-    portDefn->format.video.nFrameHeight,
-    portDefn->format.video.nStride,
-    portDefn->format.video.nSliceHeight);
-  return eRet;
+    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
+    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
+    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
+    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
+    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
+            " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
+            portDefn->format.video.nFrameHeight,
+            portDefn->format.video.nStride,
+            portDefn->format.video.nSliceHeight);
+    return eRet;
 
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_output_headers()
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
-  unsigned i= 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
+    unsigned i= 0;
 
-  if(!m_out_mem_ptr) {
-    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
-    int nBufHdrSize        = 0;
-    int nPlatformEntrySize = 0;
-    int nPlatformListSize  = 0;
-    int nPMEMInfoSize = 0;
-    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
-    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
-    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+    if (!m_out_mem_ptr) {
+        DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
+        int nBufHdrSize        = 0;
+        int nPlatformEntrySize = 0;
+        int nPlatformListSize  = 0;
+        int nPMEMInfoSize = 0;
+        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
+        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
+        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
 
-    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
-      drv_ctx.op_buf.actualcount);
-    nBufHdrSize        = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_BUFFERHEADERTYPE);
+        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
+                drv_ctx.op_buf.actualcount);
+        nBufHdrSize        = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_BUFFERHEADERTYPE);
 
-    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
-    nPlatformListSize  = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
-    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
-                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+        nPlatformListSize  = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
 
-    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
-                         sizeof(OMX_BUFFERHEADERTYPE),
-                         nPMEMInfoSize,
-                         nPlatformListSize);
-    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
-                         m_out_bm_count);
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    // Alloc mem for platform specific info
-    char *pPtr=NULL;
-    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
-                                     nPMEMInfoSize,1);
-    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
-      calloc (sizeof(struct vdec_bufferpayload),
-      drv_ctx.op_buf.actualcount);
-    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
-      calloc (sizeof (struct vdec_output_frameinfo),
-      drv_ctx.op_buf.actualcount);
+        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
+                sizeof(OMX_BUFFERHEADERTYPE),
+                nPMEMInfoSize,
+                nPlatformListSize);
+        DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
+                m_out_bm_count);
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        // Alloc mem for platform specific info
+        char *pPtr=NULL;
+        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+                nPMEMInfoSize,1);
+        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
+                       calloc (sizeof(struct vdec_bufferpayload),
+                               drv_ctx.op_buf.actualcount);
+        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
+                     calloc (sizeof (struct vdec_output_frameinfo),
+                             drv_ctx.op_buf.actualcount);
 #ifdef USE_ION
-    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
-      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
+        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
+                      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
 #endif
 
-    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
-       && drv_ctx.ptr_respbuffer)
-    {
-      bufHdr          =  m_out_mem_ptr;
-      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
-      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
-                        (((char *) m_platform_list)  + nPlatformListSize);
-      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                        (((char *) m_platform_entry) + nPlatformEntrySize);
-      pPlatformList   = m_platform_list;
-      pPlatformEntry  = m_platform_entry;
-      pPMEMInfo       = m_pmem_info;
+        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+                && drv_ctx.ptr_respbuffer) {
+            bufHdr          =  m_out_mem_ptr;
+            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+                (((char *) m_platform_list)  + nPlatformListSize);
+            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+                (((char *) m_platform_entry) + nPlatformEntrySize);
+            pPlatformList   = m_platform_list;
+            pPlatformEntry  = m_platform_entry;
+            pPMEMInfo       = m_pmem_info;
 
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
 
-      // Settting the entire storage nicely
-      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
-                      m_out_mem_ptr,pPlatformEntry);
-      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
-      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = 0;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = NULL;
-        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
-        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-        pPlatformEntry->entry      = pPMEMInfo;
-        // Initialize the Platform List
-        pPlatformList->nEntries    = 1;
-        pPlatformList->entryList   = pPlatformEntry;
-        // Keep pBuffer NULL till vdec is opened
-        bufHdr->pBuffer            = NULL;
-        pPMEMInfo->offset          =  0;
-        pPMEMInfo->pmem_fd = 0;
-        bufHdr->pPlatformPrivate = pPlatformList;
-        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
+            // Settting the entire storage nicely
+            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
+                    m_out_mem_ptr,pPlatformEntry);
+            DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
+            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = 0;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = NULL;
+                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
+                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+                pPlatformEntry->entry      = pPMEMInfo;
+                // Initialize the Platform List
+                pPlatformList->nEntries    = 1;
+                pPlatformList->entryList   = pPlatformEntry;
+                // Keep pBuffer NULL till vdec is opened
+                bufHdr->pBuffer            = NULL;
+                pPMEMInfo->offset          =  0;
+                pPMEMInfo->pmem_fd = 0;
+                bufHdr->pPlatformPrivate = pPlatformList;
+                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
 #ifdef USE_ION
-        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
+                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
 #endif
-        /*Create a mapping between buffers*/
-        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
-        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
-                                            &drv_ctx.ptr_outputbuffer[i];
-        // Move the buffer and buffer header pointers
-        bufHdr++;
-        pPMEMInfo++;
-        pPlatformEntry++;
-        pPlatformList++;
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
-                                        m_out_mem_ptr, pPtr);
-      if(m_out_mem_ptr)
-      {
-        free(m_out_mem_ptr);
-        m_out_mem_ptr = NULL;
-      }
-      if(pPtr)
-      {
-        free(pPtr);
-        pPtr = NULL;
-      }
-      if(drv_ctx.ptr_outputbuffer)
-      {
-        free(drv_ctx.ptr_outputbuffer);
-        drv_ctx.ptr_outputbuffer = NULL;
-      }
-      if(drv_ctx.ptr_respbuffer)
-      {
-        free(drv_ctx.ptr_respbuffer);
-        drv_ctx.ptr_respbuffer = NULL;
-      }
+                /*Create a mapping between buffers*/
+                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
+                                    &drv_ctx.ptr_outputbuffer[i];
+                // Move the buffer and buffer header pointers
+                bufHdr++;
+                pPMEMInfo++;
+                pPlatformEntry++;
+                pPlatformList++;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
+                    m_out_mem_ptr, pPtr);
+            if (m_out_mem_ptr) {
+                free(m_out_mem_ptr);
+                m_out_mem_ptr = NULL;
+            }
+            if (pPtr) {
+                free(pPtr);
+                pPtr = NULL;
+            }
+            if (drv_ctx.ptr_outputbuffer) {
+                free(drv_ctx.ptr_outputbuffer);
+                drv_ctx.ptr_outputbuffer = NULL;
+            }
+            if (drv_ctx.ptr_respbuffer) {
+                free(drv_ctx.ptr_respbuffer);
+                drv_ctx.ptr_respbuffer = NULL;
+            }
 #ifdef USE_ION
-    if (drv_ctx.op_buf_ion_info) {
-        DEBUG_PRINT_LOW("\n Free o/p ion context");
-	free(drv_ctx.op_buf_ion_info);
-        drv_ctx.op_buf_ion_info = NULL;
-    }
+            if (drv_ctx.op_buf_ion_info) {
+                DEBUG_PRINT_LOW("\n Free o/p ion context");
+                free(drv_ctx.op_buf_ion_info);
+                drv_ctx.op_buf_ion_info = NULL;
+            }
 #endif
-      eRet =  OMX_ErrorInsufficientResources;
+            eRet =  OMX_ErrorInsufficientResources;
+        }
+    } else {
+        eRet =  OMX_ErrorInsufficientResources;
     }
-  } else {
-    eRet =  OMX_ErrorInsufficientResources;
-  }
-  return eRet;
+    return eRet;
 }
 
 void omx_vdec::complete_pending_buffer_done_cbs()
 {
-  unsigned p1;
-  unsigned p2;
-  unsigned ident;
-  omx_cmd_queue tmp_q, pending_bd_q;
-  pthread_mutex_lock(&m_lock);
-  // pop all pending GENERATE FDB from ftb queue
-  while (m_ftb_q.m_size)
-  {
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to ftb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_ftb_q.insert_entry(p1,p2,ident);
-  }
-  // pop all pending GENERATE EDB from etb queue
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to etb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_etb_q.insert_entry(p1,p2,ident);
-  }
-  pthread_mutex_unlock(&m_lock);
-  // process all pending buffer dones
-  while(pending_bd_q.m_size)
-  {
-    pending_bd_q.pop_entry(&p1,&p2,&ident);
-    switch(ident)
-    {
-      case OMX_COMPONENT_GENERATE_EBD:
-        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
-          omx_report_error ();
+    unsigned p1;
+    unsigned p2;
+    unsigned ident;
+    omx_cmd_queue tmp_q, pending_bd_q;
+    pthread_mutex_lock(&m_lock);
+    // pop all pending GENERATE FDB from ftb queue
+    while (m_ftb_q.m_size) {
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
         }
-        break;
+    }
+    //return all non GENERATE FDB to ftb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_ftb_q.insert_entry(p1,p2,ident);
+    }
+    // pop all pending GENERATE EDB from etb queue
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
+        }
+    }
+    //return all non GENERATE FDB to etb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_etb_q.insert_entry(p1,p2,ident);
+    }
+    pthread_mutex_unlock(&m_lock);
+    // process all pending buffer dones
+    while (pending_bd_q.m_size) {
+        pending_bd_q.pop_entry(&p1,&p2,&ident);
+        switch (ident) {
+            case OMX_COMPONENT_GENERATE_EBD:
+                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                    DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+                break;
 
-      case OMX_COMPONENT_GENERATE_FBD:
-        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
-          omx_report_error ();
+            case OMX_COMPONENT_GENERATE_FBD:
+                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                    DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+                break;
         }
-        break;
     }
-  }
 }
 
 void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
 {
-  OMX_U32 new_frame_interval = 0;
-  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
-     && llabs(act_timestamp - prev_ts) > 2000)
-  {
-    new_frame_interval = client_set_fps ? frm_int :
-        llabs(act_timestamp - prev_ts);
-    if (new_frame_interval < frm_int || frm_int == 0)
-    {
-      frm_int = new_frame_interval;
-      if(frm_int)
-      {
-        drv_ctx.frame_rate.fps_numerator = 1e6;
-        drv_ctx.frame_rate.fps_denominator = frm_int;
-        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)",
-                         frm_int, drv_ctx.frame_rate.fps_numerator /
-                         (float)drv_ctx.frame_rate.fps_denominator);
+    OMX_U32 new_frame_interval = 0;
+    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
+            && llabs(act_timestamp - prev_ts) > 2000) {
+        new_frame_interval = client_set_fps ? frm_int :
+            llabs(act_timestamp - prev_ts);
+        if (new_frame_interval < frm_int || frm_int == 0) {
+            frm_int = new_frame_interval;
+            if (frm_int) {
+                drv_ctx.frame_rate.fps_numerator = 1e6;
+                drv_ctx.frame_rate.fps_denominator = frm_int;
+                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)",
+                        frm_int, drv_ctx.frame_rate.fps_numerator /
+                        (float)drv_ctx.frame_rate.fps_denominator);
 
-        /* We need to report the difference between this FBD and the previous FBD
-         * back to the driver for clock scaling purposes. */
-        struct v4l2_outputparm oparm;
-        /*XXX: we're providing timing info as seconds per frame rather than frames
-         * per second.*/
-        oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
-        oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
+                /* We need to report the difference between this FBD and the previous FBD
+                 * back to the driver for clock scaling purposes. */
+                struct v4l2_outputparm oparm;
+                /*XXX: we're providing timing info as seconds per frame rather than frames
+                 * per second.*/
+                oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
+                oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
 
-        struct v4l2_streamparm sparm;
-        sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-        sparm.parm.output = oparm;
-        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm))
-        {
-            DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
-                    performance might be affected");
+                struct v4l2_streamparm sparm;
+                sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+                sparm.parm.output = oparm;
+                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
+                    DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
+                            performance might be affected");
+                }
+
+            }
         }
-
-      }
     }
-  }
-  prev_ts = act_timestamp;
+    prev_ts = act_timestamp;
 }
 
 void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
 {
-  if (rst_prev_ts && VALID_TS(act_timestamp))
-  {
-    prev_ts = act_timestamp;
-    rst_prev_ts = false;
-  }
-  else if (VALID_TS(prev_ts))
-  {
-    bool codec_cond = (drv_ctx.timestamp_adjust)?
-                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
-                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
-                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
-    if(frm_int > 0 && codec_cond)
-    {
-      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
-      act_timestamp = prev_ts + frm_int;
-      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
-      prev_ts = act_timestamp;
+    if (rst_prev_ts && VALID_TS(act_timestamp)) {
+        prev_ts = act_timestamp;
+        rst_prev_ts = false;
+    } else if (VALID_TS(prev_ts)) {
+        bool codec_cond = (drv_ctx.timestamp_adjust)?
+            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
+                               (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
+            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
+        if (frm_int > 0 && codec_cond) {
+            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
+            act_timestamp = prev_ts + frm_int;
+            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
+            prev_ts = act_timestamp;
+        } else
+            set_frame_rate(act_timestamp);
+    } else if (frm_int > 0)          // In this case the frame rate was set along
+    {                               // with the port definition, start ts with 0
+        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
+        rst_prev_ts = true;
     }
-    else
-      set_frame_rate(act_timestamp);
-  }
-  else if (frm_int > 0)           // In this case the frame rate was set along
-  {                               // with the port definition, start ts with 0
-    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
-    rst_prev_ts = true;
-  }
 }
 
 void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
-  OMX_U32 num_conceal_MB = 0;
-  OMX_U32 frame_rate = 0;
-  int consumed_len = 0;
-  OMX_U32 num_MB_in_frame;
-  OMX_U32 recovery_sei_flags = 1;
-  int enable = 0;
-  OMX_U32 mbaff = 0;
-  int buf_index = p_buf_hdr - m_out_mem_ptr;
-  struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
-  OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
-      p_buf_hdr->nOffset;
-  if (!drv_ctx.extradata_info.uaddr) {
-    return;
-  }
-  p_extra = (OMX_OTHER_EXTRADATATYPE *)
-    ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
-  char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
-  if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
-    p_extra = NULL;
-  OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
-  if (data) {
-    while((consumed_len < drv_ctx.extradata_info.buffer_size)
-        && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
-      if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
-        DEBUG_PRINT_LOW("Invalid extra data size");
-        break;
-      }
-      switch((unsigned long)data->eType) {
-      case EXTRADATA_INTERLACE_VIDEO:
-        struct msm_vidc_interlace_payload *payload;
-        payload = (struct msm_vidc_interlace_payload *)data->data;
-        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
-        if (payload && (payload->format == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
-          drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-        else {
-          drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
-          enable = 1;
-        }
-        if(m_enable_android_native_buffers)
-          setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
-            PP_PARAM_INTERLACED, (void*)&enable);
-        if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
-          append_interlace_extradata(p_extra, payload->format);
-          p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
-        }
-        break;
-      case EXTRADATA_FRAME_RATE:
-        struct msm_vidc_framerate_payload *frame_rate_payload;
-        frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
-        frame_rate = frame_rate_payload->frame_rate;
-      break;
-      case EXTRADATA_TIMESTAMP:
-        struct msm_vidc_ts_payload *time_stamp_payload;
-        time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
-        p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
-        p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
-      break;
-      case EXTRADATA_NUM_CONCEALED_MB:
-        struct msm_vidc_concealmb_payload *conceal_mb_payload;
-        conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
-        num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
-                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
-        num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
-      break;
-      case EXTRADATA_INDEX:
-	int *etype;
-	etype  = (int *)(data->data);
-	if (etype && *etype == EXTRADATA_ASPECT_RATIO) {
-        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
-        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
-        if (aspect_ratio_payload) {
-          ((struct vdec_output_frameinfo *)
-              p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
-          ((struct vdec_output_frameinfo *)
-              p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
-          }
-	}
-      break;
-      case EXTRADATA_RECOVERY_POINT_SEI:
-        struct msm_vidc_recoverysei_payload *recovery_sei_payload;
-        recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
-        recovery_sei_flags = recovery_sei_payload->flags;
-       if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
-         p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
-         DEBUG_PRINT_HIGH("\n");
-         DEBUG_PRINT_HIGH("***************************************************\n");
-         DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
-         DEBUG_PRINT_HIGH("***************************************************\n");
-      }
-      break;
-      case EXTRADATA_PANSCAN_WINDOW:
-        panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
-        break;
-      case EXTRADATA_MPEG2_SEQDISP:
-        struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
-        seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data->data;
-        if (seqdisp_payload) {
-          m_disp_hor_size = seqdisp_payload->disp_width;
-          m_disp_vert_size = seqdisp_payload->disp_height;
-        }
-        break;
-      default:
-        goto unrecognized_extradata;
-      }
-      consumed_len += data->nSize;
-      data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
+    OMX_U32 num_conceal_MB = 0;
+    OMX_U32 frame_rate = 0;
+    int consumed_len = 0;
+    OMX_U32 num_MB_in_frame;
+    OMX_U32 recovery_sei_flags = 1;
+    int enable = 0;
+    OMX_U32 mbaff = 0;
+    int buf_index = p_buf_hdr - m_out_mem_ptr;
+    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
+    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
+        p_buf_hdr->nOffset;
+    if (!drv_ctx.extradata_info.uaddr) {
+        return;
     }
-    if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
-      p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
-      append_frame_info_extradata(p_extra,
-        num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
-        panscan_payload,&((struct vdec_output_frameinfo *)
-        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);}
-  }
+    p_extra = (OMX_OTHER_EXTRADATATYPE *)
+        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
+    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
+    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
+        p_extra = NULL;
+    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
+    if (data) {
+        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
+                && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
+            if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
+                DEBUG_PRINT_LOW("Invalid extra data size");
+                break;
+            }
+            switch ((unsigned long)data->eType) {
+                case EXTRADATA_INTERLACE_VIDEO:
+                    struct msm_vidc_interlace_payload *payload;
+                    payload = (struct msm_vidc_interlace_payload *)data->data;
+                    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+                    if (payload && (payload->format == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
+                        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+                    else {
+                        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+                        enable = 1;
+                    }
+                    if (m_enable_android_native_buffers)
+                        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
+                                PP_PARAM_INTERLACED, (void*)&enable);
+                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
+                        append_interlace_extradata(p_extra, payload->format);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                    }
+                    break;
+                case EXTRADATA_FRAME_RATE:
+                    struct msm_vidc_framerate_payload *frame_rate_payload;
+                    frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
+                    frame_rate = frame_rate_payload->frame_rate;
+                    break;
+                case EXTRADATA_TIMESTAMP:
+                    struct msm_vidc_ts_payload *time_stamp_payload;
+                    time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
+                    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
+                    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
+                    break;
+                case EXTRADATA_NUM_CONCEALED_MB:
+                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
+                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
+                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
+                    break;
+                case EXTRADATA_INDEX:
+                    int *etype;
+                    etype  = (int *)(data->data);
+                    if (etype && *etype == EXTRADATA_ASPECT_RATIO) {
+                        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
+                        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
+                        if (aspect_ratio_payload) {
+                            ((struct vdec_output_frameinfo *)
+                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
+                            ((struct vdec_output_frameinfo *)
+                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
+                        }
+                    }
+                    break;
+                case EXTRADATA_RECOVERY_POINT_SEI:
+                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
+                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
+                    recovery_sei_flags = recovery_sei_payload->flags;
+                    if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
+                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
+                        DEBUG_PRINT_HIGH("\n");
+                        DEBUG_PRINT_HIGH("***************************************************\n");
+                        DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+                        DEBUG_PRINT_HIGH("***************************************************\n");
+                    }
+                    break;
+                case EXTRADATA_PANSCAN_WINDOW:
+                    panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
+                    break;
+                case EXTRADATA_MPEG2_SEQDISP:
+                    struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
+                    seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data->data;
+                    if (seqdisp_payload) {
+                        m_disp_hor_size = seqdisp_payload->disp_width;
+                        m_disp_vert_size = seqdisp_payload->disp_height;
+                    }
+                    break;
+                default:
+                    goto unrecognized_extradata;
+            }
+            consumed_len += data->nSize;
+            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+        }
+        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+            append_frame_info_extradata(p_extra,
+                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
+                    panscan_payload,&((struct vdec_output_frameinfo *)
+                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+        }
+    }
 unrecognized_extradata:
-  if(!secure_mode && client_extradata)
-    append_terminator_extradata(p_extra);
-  return;
+    if (!secure_mode && client_extradata)
+        append_terminator_extradata(p_extra);
+    return;
 }
 
 OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
-	 bool is_internal, bool enable)
+        bool is_internal, bool enable)
 {
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  struct v4l2_control control;
-  if(m_state != OMX_StateLoaded)
-  {
-     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
-     return OMX_ErrorIncorrectStateOperation;
-  }
-  DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
-    client_extradata, requested_extradata, enable, is_internal);
-
-  if (!is_internal) {
-	  if (enable)
-		  client_extradata |= requested_extradata;
-	  else
-		  client_extradata = client_extradata & ~requested_extradata;
-  }
-
-  if (enable) {
-    if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
-            " Quality of interlaced clips might be impacted.\n");
-      }
-    } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
-      {
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
-      }
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-        DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
-      }
-      if (output_capability == V4L2_PIX_FMT_MPEG2)
-      {
-        control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-        control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
-        if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-          DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
-        }
-      }
-    } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA)
-    {
-      control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-      control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
-      if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
-      DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
-      }
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    struct v4l2_control control;
+    if (m_state != OMX_StateLoaded) {
+        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
+        return OMX_ErrorIncorrectStateOperation;
     }
-  }
-  ret = get_buffer_req(&drv_ctx.op_buf);
-  return ret;
+    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
+            client_extradata, requested_extradata, enable, is_internal);
+
+    if (!is_internal) {
+        if (enable)
+            client_extradata |= requested_extradata;
+        else
+            client_extradata = client_extradata & ~requested_extradata;
+    }
+
+    if (enable) {
+        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
+                        " Quality of interlaced clips might be impacted.\n");
+            }
+        } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+            }
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+            }
+            if (output_capability == V4L2_PIX_FMT_MPEG2) {
+                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+                control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
+                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                    DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+                }
+            }
+        } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
+            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
+            }
+        }
+    }
+    ret = get_buffer_req(&drv_ctx.op_buf);
+    return ret;
 }
 
 OMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
-  OMX_U8 *data_ptr = extra->data, data = 0;
-  while (byte_count < extra->nDataSize)
-  {
-    data = *data_ptr;
-    while (data)
-    {
-      num_MB += (data&0x01);
-      data >>= 1;
+    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
+    OMX_U8 *data_ptr = extra->data, data = 0;
+    while (byte_count < extra->nDataSize) {
+        data = *data_ptr;
+        while (data) {
+            num_MB += (data&0x01);
+            data >>= 1;
+        }
+        data_ptr++;
+        byte_count++;
     }
-    data_ptr++;
-    byte_count++;
-  }
-  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
-                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
-  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
+    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
 }
 
 void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  if (!m_debug_extradata)
-     return;
-
-  DEBUG_PRINT_HIGH(
-    "============== Extra Data ==============\n"
-    "           Size: %lu \n"
-    "        Version: %lu \n"
-    "      PortIndex: %lu \n"
-    "           Type: %x \n"
-    "       DataSize: %lu \n",
-    extra->nSize, extra->nVersion.nVersion,
-    extra->nPortIndex, extra->eType, extra->nDataSize);
-
-  if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat)
-  {
-    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
-    DEBUG_PRINT_HIGH(
-      "------ Interlace Format ------\n"
-      "                Size: %lu \n"
-      "             Version: %lu \n"
-      "           PortIndex: %lu \n"
-      " Is Interlace Format: %d \n"
-      "   Interlace Formats: %lu \n"
-      "=========== End of Interlace ===========\n",
-      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
-      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
-  }
-  else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo)
-  {
-    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+    if (!m_debug_extradata)
+        return;
 
     DEBUG_PRINT_HIGH(
-      "-------- Frame Format --------\n"
-      "             Picture Type: %d \n"
-      "           Interlace Type: %d \n"
-      " Pan Scan Total Frame Num: %lu \n"
-      "   Concealed Macro Blocks: %lu \n"
-      "               frame rate: %lu \n"
-      "           Aspect Ratio X: %lu \n"
-      "           Aspect Ratio Y: %lu \n",
-      fminfo->ePicType,
-      fminfo->interlaceType,
-      fminfo->panScan.numWindows,
-      fminfo->nConcealedMacroblocks,
-      fminfo->nFrameRate,
-      fminfo->aspectRatio.aspectRatioX,
-      fminfo->aspectRatio.aspectRatioY);
+            "============== Extra Data ==============\n"
+            "           Size: %lu \n"
+            "        Version: %lu \n"
+            "      PortIndex: %lu \n"
+            "           Type: %x \n"
+            "       DataSize: %lu \n",
+            extra->nSize, extra->nVersion.nVersion,
+            extra->nPortIndex, extra->eType, extra->nDataSize);
 
-    for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++)
-    {
-      DEBUG_PRINT_HIGH(
-        "------------------------------\n"
-        "     Pan Scan Frame Num: %lu \n"
-        "            Rectangle x: %ld \n"
-        "            Rectangle y: %ld \n"
-        "           Rectangle dx: %ld \n"
-        "           Rectangle dy: %ld \n",
-        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
-        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
+        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+        DEBUG_PRINT_HIGH(
+                "------ Interlace Format ------\n"
+                "                Size: %lu \n"
+                "             Version: %lu \n"
+                "           PortIndex: %lu \n"
+                " Is Interlace Format: %d \n"
+                "   Interlace Formats: %lu \n"
+                "=========== End of Interlace ===========\n",
+                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
+                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
+    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
+        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+
+        DEBUG_PRINT_HIGH(
+                "-------- Frame Format --------\n"
+                "             Picture Type: %d \n"
+                "           Interlace Type: %d \n"
+                " Pan Scan Total Frame Num: %lu \n"
+                "   Concealed Macro Blocks: %lu \n"
+                "               frame rate: %lu \n"
+                "           Aspect Ratio X: %lu \n"
+                "           Aspect Ratio Y: %lu \n",
+                fminfo->ePicType,
+                fminfo->interlaceType,
+                fminfo->panScan.numWindows,
+                fminfo->nConcealedMacroblocks,
+                fminfo->nFrameRate,
+                fminfo->aspectRatio.aspectRatioX,
+                fminfo->aspectRatio.aspectRatioY);
+
+        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
+            DEBUG_PRINT_HIGH(
+                    "------------------------------\n"
+                    "     Pan Scan Frame Num: %lu \n"
+                    "            Rectangle x: %ld \n"
+                    "            Rectangle y: %ld \n"
+                    "           Rectangle dx: %ld \n"
+                    "           Rectangle dy: %ld \n",
+                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
+                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+        }
+
+        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
+    } else if (extra->eType == OMX_ExtraDataNone) {
+        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
+    } else {
+        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
     }
-
-    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
-  }
-  else if (extra->eType == OMX_ExtraDataNone)
-  {
-    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
-  }
-  else
-  {
-    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
-  }
 }
 
 void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-                                          OMX_U32 interlaced_format_type)
+        OMX_U32 interlaced_format_type)
 {
-  OMX_STREAMINTERLACEFORMAT *interlace_format;
-  OMX_U32 mbaff = 0;
-  if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
-	return;
-  }
-  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
-  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
-  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
-  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
-  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
-  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
-  if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
-  {
-    interlace_format->bInterlaceFormat = OMX_FALSE;
-    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
-    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-  }
-  else
-  {
-    interlace_format->bInterlaceFormat = OMX_TRUE;
-    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
-    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
-  }
-  print_debug_extradata(extra);
+    OMX_STREAMINTERLACEFORMAT *interlace_format;
+    OMX_U32 mbaff = 0;
+    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
+        return;
+    }
+    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
+    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
+    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+    if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff) {
+        interlace_format->bInterlaceFormat = OMX_FALSE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+    } else {
+        interlace_format->bInterlaceFormat = OMX_TRUE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
+        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+    }
+    print_debug_extradata(extra);
 }
 
 void omx_vdec::fill_aspect_ratio_info(
-                       struct vdec_aspectratioinfo *aspect_ratio_info,
-                       OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
+        struct vdec_aspectratioinfo *aspect_ratio_info,
+        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
 {
-  m_extradata = frame_info;
-  m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
-  m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
-  DEBUG_PRINT_LOW("aspectRatioX %lu aspectRatioX %lu", m_extradata->aspectRatio.aspectRatioX,
-                                                     m_extradata->aspectRatio.aspectRatioY);
+    m_extradata = frame_info;
+    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
+    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
+    DEBUG_PRINT_LOW("aspectRatioX %lu aspectRatioX %lu", m_extradata->aspectRatio.aspectRatioX,
+            m_extradata->aspectRatio.aspectRatioY);
 }
 
 void omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
-    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
+        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
         struct msm_vidc_panscan_window_payload *panscan_payload,
         struct vdec_aspectratioinfo *aspect_ratio_info)
 {
-  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
-  struct msm_vidc_panscan_window *panscan_window;
-  if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
+    struct msm_vidc_panscan_window *panscan_window;
+    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
         return;
-  }
-  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
-  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
-  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
-  switch (picture_type)
-  {
-    case PICTURE_TYPE_I:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
-    break;
-    case PICTURE_TYPE_P:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
-    break;
-    case PICTURE_TYPE_B:
-      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
-    break;
-    default:
-       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
-  }
-  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
-    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
-  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
-    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
-  else
-    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
-  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
-  frame_info->nConcealedMacroblocks = num_conceal_mb;
-  frame_info->nFrameRate = frame_rate;
-  frame_info->panScan.numWindows = 0;
-  if (output_capability == V4L2_PIX_FMT_MPEG2)
-  {
-    if (m_disp_hor_size && m_disp_vert_size)
-    {
-      frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
-      frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
     }
-  }
+    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
+    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
+    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+    switch (picture_type) {
+        case PICTURE_TYPE_I:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
+            break;
+        case PICTURE_TYPE_P:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
+            break;
+        case PICTURE_TYPE_B:
+            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
+            break;
+        default:
+            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
+    }
+    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+    else
+        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
+    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
+    frame_info->nConcealedMacroblocks = num_conceal_mb;
+    frame_info->nFrameRate = frame_rate;
+    frame_info->panScan.numWindows = 0;
+    if (output_capability == V4L2_PIX_FMT_MPEG2) {
+        if (m_disp_hor_size && m_disp_vert_size) {
+            frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
+            frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
+        }
+    }
 
-  if(panscan_payload) {
-  frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
-  panscan_window = &panscan_payload->wnd[0];
-  for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++)
-    {
-      frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
-      frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
-      frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
-      frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
-      panscan_window++;
+    if (panscan_payload) {
+        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
+        panscan_window = &panscan_payload->wnd[0];
+        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
+            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
+            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
+            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
+            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
+            panscan_window++;
+        }
     }
-  }
-  fill_aspect_ratio_info(aspect_ratio_info, frame_info);
-  print_debug_extradata(extra);
+    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
+    print_debug_extradata(extra);
 }
 
 void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
-  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
-  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
-  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
-  *portDefn = m_port_def;
-  DEBUG_PRINT_LOW("append_portdef_extradata height = %lu width = %lu "
-     "stride = %lu sliceheight = %lu \n",portDefn->format.video.nFrameHeight,
-     portDefn->format.video.nFrameWidth,
-     portDefn->format.video.nStride,
-     portDefn->format.video.nSliceHeight);
+    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
+    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
+    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
+    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
+    *portDefn = m_port_def;
+    DEBUG_PRINT_LOW("append_portdef_extradata height = %lu width = %lu "
+            "stride = %lu sliceheight = %lu \n",portDefn->format.video.nFrameHeight,
+            portDefn->format.video.nFrameWidth,
+            portDefn->format.video.nStride,
+            portDefn->format.video.nSliceHeight);
 }
 
 void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
-  if (!client_extradata) {
-	return;
-  }
-  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
-  extra->nVersion.nVersion = OMX_SPEC_VERSION;
-  extra->eType = OMX_ExtraDataNone;
-  extra->nDataSize = 0;
-  extra->data[0] = 0;
+    if (!client_extradata) {
+        return;
+    }
+    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
+    extra->nVersion.nVersion = OMX_SPEC_VERSION;
+    extra->eType = OMX_ExtraDataNone;
+    extra->nDataSize = 0;
+    extra->data[0] = 0;
 
-  print_debug_extradata(extra);
+    print_debug_extradata(extra);
 }
 
 OMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (index >= drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
-    return OMX_ErrorInsufficientResources;
-  }
-  if (m_desc_buffer_ptr == NULL)
-  {
-    m_desc_buffer_ptr = (desc_buffer_hdr*) \
-                     calloc( (sizeof(desc_buffer_hdr)),
-                     drv_ctx.ip_buf.actualcount);
-    if (m_desc_buffer_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
-      return OMX_ErrorInsufficientResources;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (index >= drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
+        return OMX_ErrorInsufficientResources;
     }
-  }
+    if (m_desc_buffer_ptr == NULL) {
+        m_desc_buffer_ptr = (desc_buffer_hdr*) \
+                    calloc( (sizeof(desc_buffer_hdr)),
+                            drv_ctx.ip_buf.actualcount);
+        if (m_desc_buffer_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
+    }
 
-  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
-  if (m_desc_buffer_ptr[index].buf_addr == NULL)
-  {
-    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
-    return OMX_ErrorInsufficientResources;
-  }
+    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
+    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
+        DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
+        return OMX_ErrorInsufficientResources;
+    }
 
-  return eRet;
+    return eRet;
 }
 
 void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
 {
-  DEBUG_PRINT_LOW("Inserting address offset (%lu) at idx (%lu)", address_offset,m_demux_entries);
-  if (m_demux_entries < 8192)
-  {
-    m_demux_offsets[m_demux_entries++] = address_offset;
-  }
-  return;
+    DEBUG_PRINT_LOW("Inserting address offset (%lu) at idx (%lu)", address_offset,m_demux_entries);
+    if (m_demux_entries < 8192) {
+        m_demux_offsets[m_demux_entries++] = address_offset;
+    }
+    return;
 }
 
 void omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
 {
-  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
-  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
-  OMX_U32 index = 0;
+    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
+    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
+    OMX_U32 index = 0;
 
-  m_demux_entries = 0;
+    m_demux_entries = 0;
 
-  while (index < bytes_to_parse)
-  {
-    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
-          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
-         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
-          (buf[index+2] == 0x01)) )
-    {
-      //Found start code, insert address offset
-      insert_demux_addr_offset(index);
-      if (buf[index+2] == 0x01) // 3 byte start code
-        index += 3;
-      else                      //4 byte start code
-        index += 4;
+    while (index < bytes_to_parse) {
+        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
+                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+                 (buf[index+2] == 0x01)) ) {
+            //Found start code, insert address offset
+            insert_demux_addr_offset(index);
+            if (buf[index+2] == 0x01) // 3 byte start code
+                index += 3;
+            else                      //4 byte start code
+                index += 4;
+        } else
+            index++;
     }
-    else
-      index++;
-  }
-  DEBUG_PRINT_LOW("Extracted (%lu) demux entry offsets",m_demux_entries);
-  return;
+    DEBUG_PRINT_LOW("Extracted (%lu) demux entry offsets",m_demux_entries);
+    return;
 }
 
 OMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-  //fix this, handle 3 byte start code, vc1 terminator entry
-  OMX_U8 *p_demux_data = NULL;
-  OMX_U32 desc_data = 0;
-  OMX_U32 start_addr = 0;
-  OMX_U32 nal_size = 0;
-  OMX_U32 suffix_byte = 0;
-  OMX_U32 demux_index = 0;
-  OMX_U32 buffer_index = 0;
+    //fix this, handle 3 byte start code, vc1 terminator entry
+    OMX_U8 *p_demux_data = NULL;
+    OMX_U32 desc_data = 0;
+    OMX_U32 start_addr = 0;
+    OMX_U32 nal_size = 0;
+    OMX_U32 suffix_byte = 0;
+    OMX_U32 demux_index = 0;
+    OMX_U32 buffer_index = 0;
 
-  if (m_desc_buffer_ptr == NULL)
-  {
-    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
-    return OMX_ErrorBadParameter;
-  }
-
-  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
-  if (buffer_index > drv_ctx.ip_buf.actualcount)
-  {
-    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
-    return OMX_ErrorBadParameter;
-  }
-
-  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
-
-  if ( ((OMX_U8*)p_demux_data == NULL) ||
-      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
-  {
-    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
-    return OMX_ErrorBadParameter;
-  }
-  else
-  {
-    for (; demux_index < m_demux_entries; demux_index++)
-    {
-      desc_data = 0;
-      start_addr = m_demux_offsets[demux_index];
-      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
-      {
-        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
-      }
-      else
-      {
-        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
-      }
-      if (demux_index < (m_demux_entries - 1))
-      {
-        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
-      }
-      else
-      {
-        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
-      }
-      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%lx),nal_size(%lu),demux_index(%lu)",
-                        (void *)start_addr,
-                        suffix_byte,
-                        nal_size,
-                        demux_index);
-      desc_data = (start_addr >> 3) << 1;
-      desc_data |= (start_addr & 7) << 21;
-      desc_data |= suffix_byte << 24;
-
-      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
-      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
-      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-
-      p_demux_data += 16;
+    if (m_desc_buffer_ptr == NULL) {
+        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
+        return OMX_ErrorBadParameter;
     }
-    if (codec_type_parse == CODEC_TYPE_VC1)
-    {
-      DEBUG_PRINT_LOW("VC1 terminator entry");
-      desc_data = 0;
-      desc_data = 0x82 << 24;
-      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
-      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
-      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-      p_demux_data += 16;
-      m_demux_entries++;
-    }
-    //Add zero word to indicate end of descriptors
-    memset(p_demux_data, 0, sizeof(OMX_U32));
 
-    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
-    DEBUG_PRINT_LOW("desc table data size=%lu", m_desc_buffer_ptr[buffer_index].desc_data_size);
-  }
-  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
-  m_demux_entries = 0;
-  DEBUG_PRINT_LOW("Demux table complete!");
-  return OMX_ErrorNone;
+    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+    if (buffer_index > drv_ctx.ip_buf.actualcount) {
+        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
+        return OMX_ErrorBadParameter;
+    }
+
+    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
+
+    if ( ((OMX_U8*)p_demux_data == NULL) ||
+            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
+        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
+        return OMX_ErrorBadParameter;
+    } else {
+        for (; demux_index < m_demux_entries; demux_index++) {
+            desc_data = 0;
+            start_addr = m_demux_offsets[demux_index];
+            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
+                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
+            } else {
+                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
+            }
+            if (demux_index < (m_demux_entries - 1)) {
+                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
+            } else {
+                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
+            }
+            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%lx),nal_size(%lu),demux_index(%lu)",
+                    (void *)start_addr,
+                    suffix_byte,
+                    nal_size,
+                    demux_index);
+            desc_data = (start_addr >> 3) << 1;
+            desc_data |= (start_addr & 7) << 21;
+            desc_data |= suffix_byte << 24;
+
+            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
+            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+
+            p_demux_data += 16;
+        }
+        if (codec_type_parse == CODEC_TYPE_VC1) {
+            DEBUG_PRINT_LOW("VC1 terminator entry");
+            desc_data = 0;
+            desc_data = 0x82 << 24;
+            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+            p_demux_data += 16;
+            m_demux_entries++;
+        }
+        //Add zero word to indicate end of descriptors
+        memset(p_demux_data, 0, sizeof(OMX_U32));
+
+        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
+        DEBUG_PRINT_LOW("desc table data size=%lu", m_desc_buffer_ptr[buffer_index].desc_data_size);
+    }
+    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+    m_demux_entries = 0;
+    DEBUG_PRINT_LOW("Demux table complete!");
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_vdec::createDivxDrmContext()
 {
-     OMX_ERRORTYPE err = OMX_ErrorNone;
-     iDivXDrmDecrypt = DivXDrmDecrypt::Create();
-     if (iDivXDrmDecrypt) {
-          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
-          if(err!=OMX_ErrorNone) {
+    OMX_ERRORTYPE err = OMX_ErrorNone;
+    iDivXDrmDecrypt = DivXDrmDecrypt::Create();
+    if (iDivXDrmDecrypt) {
+        OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
+        if (err!=OMX_ErrorNone) {
             DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
             delete iDivXDrmDecrypt;
             iDivXDrmDecrypt = NULL;
-          }
-     }
-     else {
-          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
-          err = OMX_ErrorUndefined;
-     }
-     return err;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
+        err = OMX_ErrorUndefined;
+    }
+    return err;
 }
 
 omx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
 {
-  enabled = false;
-  omx = NULL;
-  init_members();
-  ColorFormat = OMX_COLOR_FormatMax;
+    enabled = false;
+    omx = NULL;
+    init_members();
+    ColorFormat = OMX_COLOR_FormatMax;
 }
 
 void omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
 {
-  omx = reinterpret_cast<omx_vdec*>(client);
+    omx = reinterpret_cast<omx_vdec*>(client);
 }
 
-void omx_vdec::allocate_color_convert_buf::init_members() {
-  allocated_count = 0;
-  buffer_size_req = 0;
-  buffer_alignment_req = 0;
-  memset(m_platform_list_client,0,sizeof(m_platform_list_client));
-  memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
-  memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
-  memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
+void omx_vdec::allocate_color_convert_buf::init_members()
+{
+    allocated_count = 0;
+    buffer_size_req = 0;
+    buffer_alignment_req = 0;
+    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
+    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
+    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
+    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
 #ifdef USE_ION
-  memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
+    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
 #endif
-  for (int i = 0; i < MAX_COUNT;i++)
-    pmem_fd[i] = -1;
+    for (int i = 0; i < MAX_COUNT; i++)
+        pmem_fd[i] = -1;
 }
 
-omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
-  c2d.destroy();
+omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
+{
+    c2d.destroy();
 }
 
 bool omx_vdec::allocate_color_convert_buf::update_buffer_req()
 {
-  bool status = true;
-  unsigned int src_size = 0, destination_size = 0;
-  OMX_COLOR_FORMATTYPE drv_color_format;
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
-    return false;
-  }
-  if (!enabled){
-    DEBUG_PRINT_HIGH("\n No color conversion required");
-    return status;
-  }
-  pthread_mutex_lock(&omx->c_lock);
-  if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
-      ColorFormat != OMX_COLOR_FormatYUV420Planar) {
-    DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
-    status = false;
-    goto fail_update_buf_req;
-  }
-  c2d.close();
-  status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
-                    omx->drv_ctx.video_resolution.frame_width,
-                    NV12_128m,YCbCr420P);
-  if (status) {
-    status = c2d.get_buffer_size(C2D_INPUT,src_size);
-    if (status)
-      status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
-  }
-  if (status) {
-    if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
-        !destination_size) {
-      DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
-            "driver size %d destination size %d",
-             src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
-      status = false;
-      c2d.close();
-      buffer_size_req = 0;
-    } else {
-      buffer_size_req = destination_size;
-      if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
-	     buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
-      if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
-            buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+    bool status = true;
+    unsigned int src_size = 0, destination_size = 0;
+    OMX_COLOR_FORMATTYPE drv_color_format;
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+        return false;
     }
-  }
+    if (!enabled) {
+        DEBUG_PRINT_HIGH("\n No color conversion required");
+        return status;
+    }
+    pthread_mutex_lock(&omx->c_lock);
+    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
+            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+        DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
+        status = false;
+        goto fail_update_buf_req;
+    }
+    c2d.close();
+    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
+            omx->drv_ctx.video_resolution.frame_width,
+            NV12_128m,YCbCr420P);
+    if (status) {
+        status = c2d.get_buffer_size(C2D_INPUT,src_size);
+        if (status)
+            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
+    }
+    if (status) {
+        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
+                !destination_size) {
+            DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
+                    "driver size %d destination size %d",
+                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
+            status = false;
+            c2d.close();
+            buffer_size_req = 0;
+        } else {
+            buffer_size_req = destination_size;
+            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
+                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
+            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+        }
+    }
 fail_update_buf_req:
-  pthread_mutex_unlock(&omx->c_lock);
-  return status;
+    pthread_mutex_unlock(&omx->c_lock);
+    return status;
 }
 
 bool omx_vdec::allocate_color_convert_buf::set_color_format(
-  OMX_COLOR_FORMATTYPE dest_color_format)
+        OMX_COLOR_FORMATTYPE dest_color_format)
 {
-  bool status = true;
-  OMX_COLOR_FORMATTYPE drv_color_format;
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
-    return false;
-  }
-  pthread_mutex_lock(&omx->c_lock);
-  if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
-    drv_color_format = (OMX_COLOR_FORMATTYPE)
-    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
-  else {
-    DEBUG_PRINT_ERROR("\n Incorrect color format");
-    status = false;
-  }
-  if (status && (drv_color_format != dest_color_format)) {
-    DEBUG_PRINT_LOW("Enabling C2D\n");
-    if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
-      DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
-      status = false;
-    } else {
-      ColorFormat = OMX_COLOR_FormatYUV420Planar;
-      if (enabled)
-        c2d.destroy();
-      enabled = false;
-      if (!c2d.init()) {
-        DEBUG_PRINT_ERROR("\n open failed for c2d");
-        status = false;
-      } else
-        enabled = true;
+    bool status = true;
+    OMX_COLOR_FORMATTYPE drv_color_format;
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+        return false;
     }
-  } else {
-    if (enabled)
-      c2d.destroy();
-    enabled = false;
-  }
-  pthread_mutex_unlock(&omx->c_lock);
-  return status;
+    pthread_mutex_lock(&omx->c_lock);
+    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+        drv_color_format = (OMX_COLOR_FORMATTYPE)
+            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+    else {
+        DEBUG_PRINT_ERROR("\n Incorrect color format");
+        status = false;
+    }
+    if (status && (drv_color_format != dest_color_format)) {
+        DEBUG_PRINT_LOW("Enabling C2D\n");
+        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
+            DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
+            status = false;
+        } else {
+            ColorFormat = OMX_COLOR_FormatYUV420Planar;
+            if (enabled)
+                c2d.destroy();
+            enabled = false;
+            if (!c2d.init()) {
+                DEBUG_PRINT_ERROR("\n open failed for c2d");
+                status = false;
+            } else
+                enabled = true;
+        }
+    } else {
+        if (enabled)
+            c2d.destroy();
+        enabled = false;
+    }
+    pthread_mutex_unlock(&omx->c_lock);
+    return status;
 }
 
 OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
 {
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return omx->m_out_mem_ptr;
-  return m_out_mem_ptr_client;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
-       (OMX_BUFFERHEADERTYPE *bufadd)
-{
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return bufadd;
-
-  unsigned index = 0;
-  index = bufadd - omx->m_out_mem_ptr;
-  if (index < omx->drv_ctx.op_buf.actualcount) {
-    m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
-    m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
-    bool status;
-    if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
-       pthread_mutex_lock(&omx->c_lock);
-      status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
-                           omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
-                           pmem_baseaddress[index], pmem_baseaddress[index]);
-       pthread_mutex_unlock(&omx->c_lock);
-      m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
-      if (!status){
-        DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
-        m_out_mem_ptr_client[index].nFilledLen = 0;
-        return &m_out_mem_ptr_client[index];
-      }
-    } else
-      m_out_mem_ptr_client[index].nFilledLen = 0;
-    return &m_out_mem_ptr_client[index];
-  }
-  DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
-  return NULL;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
-                                              (OMX_BUFFERHEADERTYPE *bufadd)
-{
-  if (!omx){
-    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
-    return NULL;
-  }
-  if (!enabled)
-    return bufadd;
-  unsigned index = 0;
-  index = bufadd - m_out_mem_ptr_client;
-  if (index < omx->drv_ctx.op_buf.actualcount) {
-    return &omx->m_out_mem_ptr[index];
-  }
-  DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
-  return NULL;
-}
-bool omx_vdec::allocate_color_convert_buf::get_buffer_req
-          (unsigned int &buffer_size)
-{
-  bool status = true;
-  pthread_mutex_lock(&omx->c_lock);
-  if (!enabled)
-    buffer_size = omx->drv_ctx.op_buf.buffer_size;
-  else {
-    if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
-      DEBUG_PRINT_ERROR("\n Get buffer size failed");
-      status = false;
-      goto fail_get_buffer_size;
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
     }
-  }
-  if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+    if (!enabled)
+        return omx->m_out_mem_ptr;
+    return m_out_mem_ptr_client;
+}
+
+    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
+{
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
+    }
+    if (!enabled)
+        return bufadd;
+
+    unsigned index = 0;
+    index = bufadd - omx->m_out_mem_ptr;
+    if (index < omx->drv_ctx.op_buf.actualcount) {
+        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
+        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
+        bool status;
+        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
+            pthread_mutex_lock(&omx->c_lock);
+            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
+                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
+                    pmem_baseaddress[index], pmem_baseaddress[index]);
+            pthread_mutex_unlock(&omx->c_lock);
+            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
+            if (!status) {
+                DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
+                m_out_mem_ptr_client[index].nFilledLen = 0;
+                return &m_out_mem_ptr_client[index];
+            }
+        } else
+            m_out_mem_ptr_client[index].nFilledLen = 0;
+        return &m_out_mem_ptr_client[index];
+    }
+    DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
+    return NULL;
+}
+
+    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
+{
+    if (!omx) {
+        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+        return NULL;
+    }
+    if (!enabled)
+        return bufadd;
+    unsigned index = 0;
+    index = bufadd - m_out_mem_ptr_client;
+    if (index < omx->drv_ctx.op_buf.actualcount) {
+        return &omx->m_out_mem_ptr[index];
+    }
+    DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
+    return NULL;
+}
+    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
+(unsigned int &buffer_size)
+{
+    bool status = true;
+    pthread_mutex_lock(&omx->c_lock);
+    if (!enabled)
         buffer_size = omx->drv_ctx.op_buf.buffer_size;
-  if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
-	  buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+    else {
+        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
+            DEBUG_PRINT_ERROR("\n Get buffer size failed");
+            status = false;
+            goto fail_get_buffer_size;
+        }
+    }
+    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+        buffer_size = omx->drv_ctx.op_buf.buffer_size;
+    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
 fail_get_buffer_size:
-  pthread_mutex_unlock(&omx->c_lock);
-  return status;
+    pthread_mutex_unlock(&omx->c_lock);
+    return status;
 }
 OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
-  OMX_BUFFERHEADERTYPE *bufhdr) {
-  unsigned int index = 0;
+        OMX_BUFFERHEADERTYPE *bufhdr)
+{
+    unsigned int index = 0;
 
-  if (!enabled)
-    return omx->free_output_buffer(bufhdr);
-  if (enabled && omx->is_component_secure())
-    return OMX_ErrorNone;
-  if (!allocated_count || !bufhdr) {
-    DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
-    return OMX_ErrorBadParameter;
-  }
-  index = bufhdr - m_out_mem_ptr_client;
-  if (index >= omx->drv_ctx.op_buf.actualcount){
-    DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
-    return OMX_ErrorBadParameter;
-  }
-  if (pmem_fd[index] > 0) {
-    munmap(pmem_baseaddress[index], buffer_size_req);
-    close(pmem_fd[index]);
-  }
-  pmem_fd[index] = -1;
+    if (!enabled)
+        return omx->free_output_buffer(bufhdr);
+    if (enabled && omx->is_component_secure())
+        return OMX_ErrorNone;
+    if (!allocated_count || !bufhdr) {
+        DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
+        return OMX_ErrorBadParameter;
+    }
+    index = bufhdr - m_out_mem_ptr_client;
+    if (index >= omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
+        return OMX_ErrorBadParameter;
+    }
+    if (pmem_fd[index] > 0) {
+        munmap(pmem_baseaddress[index], buffer_size_req);
+        close(pmem_fd[index]);
+    }
+    pmem_fd[index] = -1;
 #ifdef USE_ION
-  omx->free_ion_memory(&op_buf_ion_info[index]);
+    omx->free_ion_memory(&op_buf_ion_info[index]);
 #endif
-  m_heap_ptr[index].video_heap_ptr = NULL;
-  if (allocated_count > 0)
-    allocated_count--;
-  else
-    allocated_count = 0;
-  if (!allocated_count) {
-    pthread_mutex_lock(&omx->c_lock);
-    c2d.close();
-    init_members();
-    pthread_mutex_unlock(&omx->c_lock);
-  }
-  return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
+    m_heap_ptr[index].video_heap_ptr = NULL;
+    if (allocated_count > 0)
+        allocated_count--;
+    else
+        allocated_count = 0;
+    if (!allocated_count) {
+        pthread_mutex_lock(&omx->c_lock);
+        c2d.close();
+        init_members();
+        pthread_mutex_unlock(&omx->c_lock);
+    }
+    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
 }
 
 OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
-  OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
+        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if (!enabled){
-    eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
-    return eRet;
-  }
-  if (enabled && omx->is_component_secure()) {
-    DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
-                      omx->is_component_secure());
-    return OMX_ErrorUnsupportedSetting;
-  }
-  if (!bufferHdr || bytes > buffer_size_req) {
-    DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
-    DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
-                      buffer_size_req,bytes);
-    return OMX_ErrorBadParameter;
-  }
-  if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
-    return OMX_ErrorInsufficientResources;
-  }
-  OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
-  eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
-         port,appData,omx->drv_ctx.op_buf.buffer_size);
-  if (eRet != OMX_ErrorNone || !temp_bufferHdr){
-    DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
-    return eRet;
-  }
-  if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
-      omx->drv_ctx.op_buf.actualcount) {
-    DEBUG_PRINT_ERROR("\n Invalid header index %d",
-             (temp_bufferHdr - omx->m_out_mem_ptr));
-    return OMX_ErrorUndefined;
-  }
-  unsigned int i = allocated_count;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!enabled) {
+        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+        return eRet;
+    }
+    if (enabled && omx->is_component_secure()) {
+        DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
+                omx->is_component_secure());
+        return OMX_ErrorUnsupportedSetting;
+    }
+    if (!bufferHdr || bytes > buffer_size_req) {
+        DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
+        DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
+                buffer_size_req,bytes);
+        return OMX_ErrorBadParameter;
+    }
+    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
+        return OMX_ErrorInsufficientResources;
+    }
+    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
+    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
+            port,appData,omx->drv_ctx.op_buf.buffer_size);
+    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
+        DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
+        return eRet;
+    }
+    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
+            omx->drv_ctx.op_buf.actualcount) {
+        DEBUG_PRINT_ERROR("\n Invalid header index %d",
+                (temp_bufferHdr - omx->m_out_mem_ptr));
+        return OMX_ErrorUndefined;
+    }
+    unsigned int i = allocated_count;
 #ifdef USE_ION
-  op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
-    buffer_size_req,buffer_alignment_req,
-    &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
-    0);
-  pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
-  if (op_buf_ion_info[i].ion_device_fd < 0) {
-    DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
-    return OMX_ErrorInsufficientResources;
-  }
-  pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
-                     PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
+    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
+            buffer_size_req,buffer_alignment_req,
+            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
+            0);
+    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
+    if (op_buf_ion_info[i].ion_device_fd < 0) {
+        DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
+        return OMX_ErrorInsufficientResources;
+    }
+    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
+            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
 
-  if (pmem_baseaddress[i] == MAP_FAILED) {
-    DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
-    close(pmem_fd[i]);
-    omx->free_ion_memory(&op_buf_ion_info[i]);
-    return OMX_ErrorInsufficientResources;
-  }
-  m_heap_ptr[i].video_heap_ptr = new VideoHeap (
-    op_buf_ion_info[i].ion_device_fd,buffer_size_req,
-    pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
+    if (pmem_baseaddress[i] == MAP_FAILED) {
+        DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
+        close(pmem_fd[i]);
+        omx->free_ion_memory(&op_buf_ion_info[i]);
+        return OMX_ErrorInsufficientResources;
+    }
+    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
+            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
+            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
 #endif
-  m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
-  m_pmem_info_client[i].offset = 0;
-  m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
-  m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-  m_platform_list_client[i].nEntries = 1;
-  m_platform_list_client[i].entryList = &m_platform_entry_client[i];
-  m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
-  m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
-  m_out_mem_ptr_client[i].nFilledLen = 0;
-  m_out_mem_ptr_client[i].nFlags = 0;
-  m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
-  m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
-  m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
-  m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
-  m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
-  m_out_mem_ptr_client[i].pAppPrivate = appData;
-  *bufferHdr = &m_out_mem_ptr_client[i];
-  DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
-  allocated_count++;
-  return eRet;
+    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
+    m_pmem_info_client[i].offset = 0;
+    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
+    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+    m_platform_list_client[i].nEntries = 1;
+    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
+    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
+    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
+    m_out_mem_ptr_client[i].nFilledLen = 0;
+    m_out_mem_ptr_client[i].nFlags = 0;
+    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
+    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
+    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
+    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
+    m_out_mem_ptr_client[i].pAppPrivate = appData;
+    *bufferHdr = &m_out_mem_ptr_client[i];
+    DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
+    allocated_count++;
+    return eRet;
 }
 
 bool omx_vdec::is_component_secure()
 {
-  return secure_mode;
+    return secure_mode;
 }
 
 bool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
 {
-  bool status = true;
-  if (!enabled) {
-    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
-     dest_color_format =  (OMX_COLOR_FORMATTYPE)
-            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
-    else
-      status = false;
-  } else {
-    if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
-      status = false;
-    } else
-      dest_color_format = OMX_COLOR_FormatYUV420Planar;
-  }
-  return status;
+    bool status = true;
+    if (!enabled) {
+        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+            dest_color_format =  (OMX_COLOR_FORMATTYPE)
+                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+        else
+            status = false;
+    } else {
+        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+            status = false;
+        } else
+            dest_color_format = OMX_COLOR_FormatYUV420Planar;
+    }
+    return status;
 }
diff --git a/mm-video-v4l2/vidc/vdec/src/power_module.cpp b/mm-video-v4l2/vidc/vdec/src/power_module.cpp
index 3849218..6be9aa0 100644
--- a/mm-video-v4l2/vidc/vdec/src/power_module.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/power_module.cpp
@@ -1,5 +1,5 @@
 /*-------------------------------------------------------------------------
-Copyright (c) 2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
 
   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
@@ -34,21 +34,21 @@
 
 PowerModule *PowerModule::getInstance()
 {
-  if (mPowerModuleInstance == NULL) {
-    mPowerModuleInstance = new PowerModule;
+    if (mPowerModuleInstance == NULL) {
+        mPowerModuleInstance = new PowerModule;
 
-    if (mPowerModuleInstance) {
-      mPowerModuleInstance->mPowerModuleHandle = NULL;
+        if (mPowerModuleInstance) {
+            mPowerModuleInstance->mPowerModuleHandle = NULL;
 
-      hw_get_module(POWER_HARDWARE_MODULE_ID,
-          (const hw_module_t **)&(mPowerModuleInstance->mPowerModuleHandle));
+            hw_get_module(POWER_HARDWARE_MODULE_ID,
+                    (const hw_module_t **)&(mPowerModuleInstance->mPowerModuleHandle));
+        }
     }
-  }
 
-  return mPowerModuleInstance;
+    return mPowerModuleInstance;
 }
 
 power_module_t *PowerModule::getPowerModuleHandle()
 {
-  return mPowerModuleHandle;
+    return mPowerModuleHandle;
 }
diff --git a/mm-video-v4l2/vidc/vdec/src/queue.c b/mm-video-v4l2/vidc/vdec/src/queue.c
old mode 100755
new mode 100644
index 368d7c4..d91f499
--- a/mm-video-v4l2/vidc/vdec/src/queue.c
+++ b/mm-video-v4l2/vidc/vdec/src/queue.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -26,103 +26,95 @@
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 --------------------------------------------------------------------------*/
 /*
-	Queue with Linked list
-*/
+   Queue with Linked list
+ */
 
 #include "queue.h"
 #include <stdio.h>
 #include <stdlib.h>
 
 
-typedef struct Node
-{
-  void *element;
-  struct Node *next;
+typedef struct Node {
+    void *element;
+    struct Node *next;
 } Node;
 
-struct Queue
-{
-  Node *head;
-  Node *tail;
-  int  current_size;
+struct Queue {
+    Node *head;
+    Node *tail;
+    int  current_size;
 };
 
 Queue *alloc_queue()
 {
-  Queue *q = (Queue *) malloc(sizeof(Queue));
-  if (q)
-  {
-    q->head = q->tail = NULL;
-    q->current_size = 0;
-  }
-  return q;
+    Queue *q = (Queue *) malloc(sizeof(Queue));
+
+    if (q) {
+        q->head = q->tail = NULL;
+        q->current_size = 0;
+    }
+
+    return q;
 }
 
 void free_queue(Queue *q)
 {
-  while (q->current_size)
-  {
-    pop(q);
-  }
+    while (q->current_size) {
+        pop(q);
+    }
 }
 
 void free_queue_and_qelement(Queue *q)
 {
-  while (q->current_size)
-  {
-    void *element = pop(q);
-    if (element)
-      free(element);
-  }
+    while (q->current_size) {
+        void *element = pop(q);
+
+        if (element)
+            free(element);
+    }
 }
 
 int push(Queue *q, void * element)
 {
-  Node *new_node = (Node *) malloc(sizeof(Node));
+    Node *new_node = (Node *) malloc(sizeof(Node));
 
-  if (new_node == NULL)
-    return -1;
+    if (new_node == NULL)
+        return -1;
 
-  new_node->element = element;
-  new_node->next = NULL;
+    new_node->element = element;
+    new_node->next = NULL;
 
-  if (q->current_size == 0)
-  {
-    q->head = new_node;
-  }
-  else
-  {
-    q->tail->next = new_node;
-  }
+    if (q->current_size == 0) {
+        q->head = new_node;
+    } else {
+        q->tail->next = new_node;
+    }
 
-  q->tail = new_node;
-  q->current_size++;
+    q->tail = new_node;
+    q->current_size++;
 
-  return 0;
+    return 0;
 }
 
 void *pop(Queue *q)
 {
-  Node *temp;
-  void *element;
+    Node *temp;
+    void *element;
 
-  if (q->current_size == 0)
-    return NULL;
+    if (q->current_size == 0)
+        return NULL;
 
-  temp = q->head;
-  element = temp->element;
+    temp = q->head;
+    element = temp->element;
 
-  if (q->current_size == 1)
-  {
-    q->head = q->tail = NULL;
-  }
-  else
-  {
-    q->head = q->head->next;
-  }
+    if (q->current_size == 1) {
+        q->head = q->tail = NULL;
+    } else {
+        q->head = q->head->next;
+    }
 
-  free(temp);
-  q->current_size--;
-  return element;
+    free(temp);
+    q->current_size--;
+    return element;
 }
 
diff --git a/mm-video-v4l2/vidc/vdec/src/ts_parser.cpp b/mm-video-v4l2/vidc/vdec/src/ts_parser.cpp
index 44aa200..9825348 100644
--- a/mm-video-v4l2/vidc/vdec/src/ts_parser.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/ts_parser.cpp
@@ -1,268 +1,315 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "ts_parser.h"
-
-#define DEBUG ALOGE
-void omx_time_stamp_reorder::set_timestamp_reorder_mode(bool mode)
-{
-	reorder_ts = mode;
-}
-
-void omx_time_stamp_reorder::enable_debug_print(bool flag)
-{
-        print_debug = flag;
-}
-
-omx_time_stamp_reorder::~omx_time_stamp_reorder()
-{
-	delete_list();
-}
-
-omx_time_stamp_reorder::omx_time_stamp_reorder()
-{
-	reorder_ts = false;
-	phead = pcurrent = NULL;
-	error = false;
-        print_debug = false;
-}
-
-void omx_time_stamp_reorder::delete_list()
-{
-	time_stamp_list *ptemp;
-	if (!phead) return;
-	while(phead->next != phead) {
-		ptemp = phead;
-		phead = phead->next;
-		phead->prev = ptemp->prev;
-		ptemp->prev->next = phead;
-		delete ptemp;
-	}
-	delete phead;
-	phead = NULL;
-}
-
-bool omx_time_stamp_reorder::get_current_list()
-{
-	if (!phead) {
-		if(!add_new_list()) {
-			handle_error();
-			return false;
-		}
-	}
-	pcurrent = phead->prev;
-	return true;
-}
-
-bool omx_time_stamp_reorder::update_head()
-{
-	time_stamp_list *ptemp;
-	if(!phead) return false;
-	if (phead->next != phead) {
-		ptemp = phead;
-		phead = ptemp->next;
-		phead->prev = ptemp->prev;
-		ptemp->prev->next = phead;
-		delete ptemp;
-	}
-	return true;
-}
-
-bool omx_time_stamp_reorder::add_new_list()
-{
-	bool status = true;
-	time_stamp_list *ptemp = NULL;
-	if (!phead) {
-		ptemp = phead = new time_stamp_list;
-		if (!phead) {
-			handle_error();
-			status = false;
-			return status;
-		}
-		phead->prev = phead->next = phead;
-	} else {
-		ptemp = new time_stamp_list;
-		if (!ptemp) {
-			handle_error();
-			status = false;
-			return status;
-		}
-		ptemp->prev = phead->prev;
-		ptemp->next = phead;
-		phead->prev->next = ptemp;
-		phead->prev = ptemp;
-	}
-	ptemp->entries_filled = 0;
-	for(int i=0; i < TIME_SZ; i++) {
-		ptemp->input_timestamps[i].in_use = false;
-		ptemp->input_timestamps[i].timestamps = -1;
-	}
-	return status;
-}
-
-bool omx_time_stamp_reorder::insert_timestamp(OMX_BUFFERHEADERTYPE *header)
-{
-	OMX_TICKS *table_entry = NULL;
-	if (!reorder_ts || error || !header) {
-		if (error || !header)
-			DEBUG("\n Invalid condition in insert_timestamp %p", header);
-		return false;
-	}
-	if(!get_current_list()) {
-		handle_error();
-		return false;
-	}
-	if (pcurrent->entries_filled > (TIME_SZ - 1)) {
-		DEBUG("\n Table full return error");
-		handle_error();
-		return false;
-	}
-	if (header->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
-		return true;
-	}
-	if ((header->nFlags & OMX_BUFFERFLAG_EOS) && !header->nFilledLen)
-	{
-		DEBUG("\n EOS with zero length recieved");
-		if (!add_new_list()) {
-			handle_error();
-			return false;
-		}
-		return true;
-	}
-	for(int i = 0; i < TIME_SZ && !table_entry; i++) {
-		if (!pcurrent->input_timestamps[i].in_use) {
-			table_entry = &pcurrent->input_timestamps[i].timestamps;
-			pcurrent->input_timestamps[i].in_use = true;
-			pcurrent->entries_filled++;
-		}
-	}
-	if (!table_entry) {
-		DEBUG("\n All entries in use");
-		handle_error();
-		return false;
-	}
-	*table_entry = header->nTimeStamp;
-        if (print_debug)
-	        DEBUG("Time stamp inserted %lld", header->nTimeStamp);
-	if (header->nFlags & OMX_BUFFERFLAG_EOS) {
-		if (!add_new_list()) {
-			handle_error();
-			return false;
-		}
-	}
-	return true;
-}
-
-bool omx_time_stamp_reorder::remove_time_stamp(OMX_TICKS ts, bool is_interlaced = false)
-{
-	unsigned int num_ent_remove = (is_interlaced)?2:1;
-	if (!reorder_ts || error) {
-		DEBUG("\n not in avi mode");
-		return false;
-	}
-	if (!phead || !phead->entries_filled) return false;
-	for(int i=0; i < TIME_SZ && num_ent_remove; i++) {
-		if (phead->input_timestamps[i].in_use && phead->input_timestamps[i].timestamps == ts) {
-				phead->input_timestamps[i].in_use = false;
-				phead->entries_filled--;
-				num_ent_remove--;
-                                if (print_debug)
-		                       DEBUG("Removed TS %lld", ts);
-		}
-	}
-	if (!phead->entries_filled) {
-		if (!update_head()) {
-			handle_error();
-			return false;
-		}
-	}
-	return true;
-}
-
-void omx_time_stamp_reorder::flush_timestamp()
-{
-	delete_list();
-}
-
-bool omx_time_stamp_reorder::get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced)
-{
-	timestamp *element = NULL,*duplicate = NULL;
-	bool status = false;
-	if (!reorder_ts || error || !header) {
-		if (error || !header)
-			DEBUG("\n Invalid condition in insert_timestamp %p", header);
-		return false;
-	}
-	if(!phead || !phead->entries_filled) return false;
-	for(int i=0; i < TIME_SZ; i++) {
-		if (phead->input_timestamps[i].in_use) {
-			status = true;
-			if (!element)
-				element = &phead->input_timestamps[i];
-			else {
-				if (element->timestamps > phead->input_timestamps[i].timestamps){
-					element = &phead->input_timestamps[i];
-					duplicate = NULL;
-				} else if(element->timestamps == phead->input_timestamps[i].timestamps)
-					duplicate = &phead->input_timestamps[i];
-			}
-		}
-	}
-	if (element) {
-		phead->entries_filled--;
-		header->nTimeStamp = element->timestamps;
-                if (print_debug)
-		     DEBUG("Getnext Time stamp %lld", header->nTimeStamp);
-		element->in_use = false;
-	}
-	if(is_interlaced && duplicate) {
-		phead->entries_filled--;
-		duplicate->in_use = false;
-	} else if (is_interlaced && !duplicate) {
-		element = NULL;
-		for(int i=0; i < TIME_SZ; i++) {
-			if (phead->input_timestamps[i].in_use) {
-				if (!element)
-					element = &phead->input_timestamps[i];
-				else if (element->timestamps > phead->input_timestamps[i].timestamps)
-						element = &phead->input_timestamps[i];
-			}
-		}
-		if (element) {
-			phead->entries_filled--;
-			header->nTimeStamp = element->timestamps;
-			element->in_use = false;
-		}
-	}
-	if (!phead->entries_filled) {
-		if (!update_head()) {
-			handle_error();
-			return false;
-		}
-	}
-	return status;
-}
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "ts_parser.h"
+
+#define DEBUG ALOGE
+void omx_time_stamp_reorder::set_timestamp_reorder_mode(bool mode)
+{
+    reorder_ts = mode;
+}
+
+void omx_time_stamp_reorder::enable_debug_print(bool flag)
+{
+    print_debug = flag;
+}
+
+omx_time_stamp_reorder::~omx_time_stamp_reorder()
+{
+    delete_list();
+}
+
+omx_time_stamp_reorder::omx_time_stamp_reorder()
+{
+    reorder_ts = false;
+    phead = pcurrent = NULL;
+    error = false;
+    print_debug = false;
+}
+
+void omx_time_stamp_reorder::delete_list()
+{
+    time_stamp_list *ptemp;
+
+    if (!phead) return;
+
+    while (phead->next != phead) {
+        ptemp = phead;
+        phead = phead->next;
+        phead->prev = ptemp->prev;
+        ptemp->prev->next = phead;
+        delete ptemp;
+    }
+
+    delete phead;
+    phead = NULL;
+}
+
+bool omx_time_stamp_reorder::get_current_list()
+{
+    if (!phead) {
+        if (!add_new_list()) {
+            handle_error();
+            return false;
+        }
+    }
+
+    pcurrent = phead->prev;
+    return true;
+}
+
+bool omx_time_stamp_reorder::update_head()
+{
+    time_stamp_list *ptemp;
+
+    if (!phead) return false;
+
+    if (phead->next != phead) {
+        ptemp = phead;
+        phead = ptemp->next;
+        phead->prev = ptemp->prev;
+        ptemp->prev->next = phead;
+        delete ptemp;
+    }
+
+    return true;
+}
+
+bool omx_time_stamp_reorder::add_new_list()
+{
+    bool status = true;
+    time_stamp_list *ptemp = NULL;
+
+    if (!phead) {
+        ptemp = phead = new time_stamp_list;
+
+        if (!phead) {
+            handle_error();
+            status = false;
+            return status;
+        }
+
+        phead->prev = phead->next = phead;
+    } else {
+        ptemp = new time_stamp_list;
+
+        if (!ptemp) {
+            handle_error();
+            status = false;
+            return status;
+        }
+
+        ptemp->prev = phead->prev;
+        ptemp->next = phead;
+        phead->prev->next = ptemp;
+        phead->prev = ptemp;
+    }
+
+    ptemp->entries_filled = 0;
+
+    for (int i=0; i < TIME_SZ; i++) {
+        ptemp->input_timestamps[i].in_use = false;
+        ptemp->input_timestamps[i].timestamps = -1;
+    }
+
+    return status;
+}
+
+bool omx_time_stamp_reorder::insert_timestamp(OMX_BUFFERHEADERTYPE *header)
+{
+    OMX_TICKS *table_entry = NULL;
+
+    if (!reorder_ts || error || !header) {
+        if (error || !header)
+            DEBUG("\n Invalid condition in insert_timestamp %p", header);
+
+        return false;
+    }
+
+    if (!get_current_list()) {
+        handle_error();
+        return false;
+    }
+
+    if (pcurrent->entries_filled > (TIME_SZ - 1)) {
+        DEBUG("\n Table full return error");
+        handle_error();
+        return false;
+    }
+
+    if (header->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+        return true;
+    }
+
+    if ((header->nFlags & OMX_BUFFERFLAG_EOS) && !header->nFilledLen) {
+        DEBUG("\n EOS with zero length recieved");
+
+        if (!add_new_list()) {
+            handle_error();
+            return false;
+        }
+
+        return true;
+    }
+
+    for (int i = 0; i < TIME_SZ && !table_entry; i++) {
+        if (!pcurrent->input_timestamps[i].in_use) {
+            table_entry = &pcurrent->input_timestamps[i].timestamps;
+            pcurrent->input_timestamps[i].in_use = true;
+            pcurrent->entries_filled++;
+        }
+    }
+
+    if (!table_entry) {
+        DEBUG("\n All entries in use");
+        handle_error();
+        return false;
+    }
+
+    *table_entry = header->nTimeStamp;
+
+    if (print_debug)
+        DEBUG("Time stamp inserted %lld", header->nTimeStamp);
+
+    if (header->nFlags & OMX_BUFFERFLAG_EOS) {
+        if (!add_new_list()) {
+            handle_error();
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool omx_time_stamp_reorder::remove_time_stamp(OMX_TICKS ts, bool is_interlaced = false)
+{
+    unsigned int num_ent_remove = (is_interlaced)?2:1;
+
+    if (!reorder_ts || error) {
+        DEBUG("\n not in avi mode");
+        return false;
+    }
+
+    if (!phead || !phead->entries_filled) return false;
+
+    for (int i=0; i < TIME_SZ && num_ent_remove; i++) {
+        if (phead->input_timestamps[i].in_use && phead->input_timestamps[i].timestamps == ts) {
+            phead->input_timestamps[i].in_use = false;
+            phead->entries_filled--;
+            num_ent_remove--;
+
+            if (print_debug)
+                DEBUG("Removed TS %lld", ts);
+        }
+    }
+
+    if (!phead->entries_filled) {
+        if (!update_head()) {
+            handle_error();
+            return false;
+        }
+    }
+
+    return true;
+}
+
+void omx_time_stamp_reorder::flush_timestamp()
+{
+    delete_list();
+}
+
+bool omx_time_stamp_reorder::get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced)
+{
+    timestamp *element = NULL,*duplicate = NULL;
+    bool status = false;
+
+    if (!reorder_ts || error || !header) {
+        if (error || !header)
+            DEBUG("\n Invalid condition in insert_timestamp %p", header);
+
+        return false;
+    }
+
+    if (!phead || !phead->entries_filled) return false;
+
+    for (int i=0; i < TIME_SZ; i++) {
+        if (phead->input_timestamps[i].in_use) {
+            status = true;
+
+            if (!element)
+                element = &phead->input_timestamps[i];
+            else {
+                if (element->timestamps > phead->input_timestamps[i].timestamps) {
+                    element = &phead->input_timestamps[i];
+                    duplicate = NULL;
+                } else if (element->timestamps == phead->input_timestamps[i].timestamps)
+                    duplicate = &phead->input_timestamps[i];
+            }
+        }
+    }
+
+    if (element) {
+        phead->entries_filled--;
+        header->nTimeStamp = element->timestamps;
+
+        if (print_debug)
+            DEBUG("Getnext Time stamp %lld", header->nTimeStamp);
+
+        element->in_use = false;
+    }
+
+    if (is_interlaced && duplicate) {
+        phead->entries_filled--;
+        duplicate->in_use = false;
+    } else if (is_interlaced && !duplicate) {
+        element = NULL;
+
+        for (int i=0; i < TIME_SZ; i++) {
+            if (phead->input_timestamps[i].in_use) {
+                if (!element)
+                    element = &phead->input_timestamps[i];
+                else if (element->timestamps > phead->input_timestamps[i].timestamps)
+                    element = &phead->input_timestamps[i];
+            }
+        }
+
+        if (element) {
+            phead->entries_filled--;
+            header->nTimeStamp = element->timestamps;
+            element->in_use = false;
+        }
+    }
+
+    if (!phead->entries_filled) {
+        if (!update_head()) {
+            handle_error();
+            return false;
+        }
+    }
+
+    return status;
+}
diff --git a/mm-video-v4l2/vidc/vdec/test/decoder_driver_test.c b/mm-video-v4l2/vidc/vdec/test/decoder_driver_test.c
old mode 100755
new mode 100644
index fe870f8..27b3934
--- a/mm-video-v4l2/vidc/vdec/test/decoder_driver_test.c
+++ b/mm-video-v4l2/vidc/vdec/test/decoder_driver_test.c
@@ -1,1198 +1,1132 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "decoder_driver_test.h"
-
-#define DEBUG_PRINT printf
-/************************************************************************/
-/*        #DEFINES                          */
-/************************************************************************/
-
-#define VOP_START_CODE 0x000001B6
-#define SHORT_HEADER_START_CODE 0x00008000
-#define H264_START_CODE         0x00000001
-
-/************************************************************************/
-/*        STATIC VARIABLES                          */
-/************************************************************************/
-
-static int Code_type;
-static int total_frames = 0;
-static unsigned int header_code = 0;
-static pthread_mutex_t read_lock;
-
-static unsigned int read_frame ( unsigned char *dataptr,unsigned int length,
-                                 FILE * inputBufferFile
-                                );
-static int Read_Buffer_From_DAT_File( unsigned char *dataptr, unsigned int length,
-                                      FILE * inputBufferFile
-                                     );
-
-static unsigned clp2(unsigned x)
-{
-        x = x - 1;
-        x = x | (x >> 1);
-        x = x | (x >> 2);
-        x = x | (x >> 4);
-        x = x | (x >> 8);
-        x = x | (x >>16);
-        return x + 1;
-}
-
-static void* video_thread (void *);
-static void* async_thread (void *);
-
-int main (int argc, char **argv)
-{
-  struct video_decoder_context *decoder_context = NULL;
-  char *file_name = NULL;
-  FILE *file_ptr = NULL;
-  int temp1 =0,temp2 =0;
-  int error = 1;
-  unsigned int i = 0;
-
-  file_name = argv [1];
-  file_ptr = fopen (file_name,"rb");
-
-  if (file_ptr == NULL)
-  {
-    DEBUG_PRINT("\n File is not located ");
-    return -1;
-  }
-
-
-  decoder_context = (struct video_decoder_context *) \
-                   calloc (sizeof (struct video_decoder_context),1);
-  if (decoder_context == NULL)
-  {
-    return -1;
-  }
-  decoder_context->outputBufferFile = NULL;
-  decoder_context->inputBufferFile = NULL;
-  decoder_context->video_driver_fd = -1;
-  decoder_context->inputBufferFile = file_ptr;
-
-  file_ptr = fopen ("/data/output.yuv","wb");
-  if (file_ptr == NULL)
-  {
-    DEBUG_PRINT("\n File can't be created");
-    free (decoder_context);
-    return -1;
-  }
-  decoder_context->outputBufferFile = file_ptr;
-
-   switch (atoi(argv[2]))
-   {
-   case 0:
-     DEBUG_PRINT("\n MPEG4 codec selected");
-     decoder_context->decoder_format = VDEC_CODECTYPE_MPEG4;
-     Code_type = 0;
-     break;
-   case 1:
-     DEBUG_PRINT("\n H.263");
-     decoder_context->decoder_format = VDEC_CODECTYPE_H263;
-     Code_type = 0;
-     break;
-   case 2:
-     DEBUG_PRINT("\n H.264");
-     decoder_context->decoder_format = VDEC_CODECTYPE_H264;
-     Code_type = 1;
-     break;
-   default:
-     DEBUG_PRINT("\n Wrong codec type");
-     error = -1;
-     break;
-   }
-
-   if (error != -1)
-   {
-     temp1 = atoi(argv[3]);
-     temp2 = atoi(argv[4]);
-
-     if (((temp1%16) != 0) || ((temp2%16) != 0))
-     {
-       error = -1;
-     }
-     else
-     {
-      decoder_context->video_resoultion.frame_height = temp1;
-            decoder_context->video_resoultion.frame_width = temp2;
-     }
-   }
-
-   switch (atoi(argv[5]))
-   {
-   case 0:
-     DEBUG_PRINT("\n No Sink");
-     decoder_context->outputBufferFile = NULL;
-     break;
-   }
-
-   if ( error != -1 && (init_decoder (decoder_context) == -1 ))
-   {
-      DEBUG_PRINT("\n Init decoder fails ");
-      error = -1;
-   }
-   DEBUG_PRINT("\n Decoder open successfull");
-
-
-   /*Allocate input and output buffers*/
-   if (error != -1 && (allocate_buffer (VDEC_BUFFER_TYPE_INPUT,
-                      decoder_context)== -1))
-   {
-     DEBUG_PRINT("\n Error in input Buffer allocation");
-     error = -1;
-   }
-
-   if (error != -1 && (allocate_buffer (VDEC_BUFFER_TYPE_OUTPUT,
-                      decoder_context)== -1))
-   {
-     DEBUG_PRINT("\n Error in output Buffer allocation");
-     error = -1;
-   }
-
-
-   if (error != -1 && (start_decoding (decoder_context) == -1))
-   {
-     DEBUG_PRINT("\n Error in start decoding call");
-     error = -1;
-   }
-
-   if (error != -1 && (stop_decoding (decoder_context) == -1))
-   {
-     DEBUG_PRINT("\n Error in stop decoding call");
-     error = -1;
-   }
-
-   DEBUG_PRINT("\n De-init the decoder");
-   if ((deinit_decoder (decoder_context) == -1))
-   {
-      error = -1;
-   }
-
-
-  (void)free_buffer (VDEC_BUFFER_TYPE_INPUT,decoder_context);
-  (void)free_buffer (VDEC_BUFFER_TYPE_OUTPUT,decoder_context);
-
-  if (decoder_context->inputBufferFile != NULL)
-  {
-   fclose (decoder_context->inputBufferFile);
-  }
-  if (decoder_context->outputBufferFile != NULL)
-  {
-    fclose (decoder_context->outputBufferFile);
-  }
-  DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames);
-  DEBUG_PRINT("\n closing the driver");
-  free (decoder_context);
-
-  return error;
-}
-
-int init_decoder ( struct video_decoder_context *init_decode )
-{
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct video_queue_context *queue_ptr = NULL;
-#ifdef MAX_RES_720P
-  enum vdec_output_fromat output_format = VDEC_YUV_FORMAT_NV12;
-#endif
-#ifdef MAX_RES_1080P
-  enum vdec_output_fromat output_format  = VDEC_YUV_FORMAT_TILE_4x2;
-#endif
-
-  pthread_mutexattr_t init_values;
-
-  DEBUG_PRINT("\n Before calling the open");
-
-  init_decode->video_driver_fd = open ("/dev/msm_vidc_dec", \
-                     O_RDWR | O_NONBLOCK);
-
-
-
-  if (init_decode->video_driver_fd < 0)
-  {
-    DEBUG_PRINT("\n Open failed");
-    return -1;
-  }
-
-
-  /*Initialize Decoder with codec type and resolution*/
-  ioctl_msg.in = &init_decode->decoder_format;
-  ioctl_msg.out = NULL;
-
-  if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_CODEC,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set codec type failed");
-    return -1;
-  }
-
-  /*Set the output format*/
-  ioctl_msg.in = &output_format;
-  ioctl_msg.out = NULL;
-
-  if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set output format failed");
-    return -1;
-  }
-
-  ioctl_msg.in = &init_decode->video_resoultion;
-  ioctl_msg.out = NULL;
-
-  if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_PICRES,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set Resolution failed");
-    return -1;
-  }
-  DEBUG_PRINT("\n After Set Resolution");
-
-  DEBUG_PRINT("\n Query Input bufffer requirements");
-  /*Get the Buffer requirements for input and output ports*/
-
-  init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = &init_decode->input_buffer;
-
-  if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Requesting for input buffer requirements failed");
-    return -1;
-  }
-
-  DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \
-              init_decode->input_buffer.buffer_size,\
-              init_decode->input_buffer.mincount,\
-              init_decode->input_buffer.actualcount);
-
-
-  init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
-  ioctl_msg.in = &init_decode->input_buffer;
-  ioctl_msg.out = NULL;
-  init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
-
-  if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set Buffer Requirements Failed");
-    return -1;
-  }
-
-
-  DEBUG_PRINT("\n Query output bufffer requirements");
-  init_decode->output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = &init_decode->output_buffer;
-
-  if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Requesting for output buffer requirements failed");
-    return -1;
-  }
-
-  DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \
-              init_decode->output_buffer.buffer_size,\
-              init_decode->output_buffer.mincount,\
-              init_decode->output_buffer.actualcount);
-
-  /*Create Queue related data structures*/
-  queue_ptr = &init_decode->queue_context;
-  queue_ptr->commandq_size = 50;
-  queue_ptr->dataq_size = 50;
-
-  sem_init(&queue_ptr->sem_message,0, 0);
-  sem_init(&init_decode->sem_synchronize,0, 0);
-
-  pthread_mutexattr_init (&init_values);
-  pthread_mutex_init (&queue_ptr->mutex,&init_values);
-  pthread_mutex_init (&read_lock,&init_values);
-  DEBUG_PRINT("\n create Queues");
-  queue_ptr->ptr_cmdq = (struct video_msgq*) \
-                        calloc (sizeof (struct video_msgq),
-                  queue_ptr->commandq_size);
-  queue_ptr->ptr_dataq = (struct video_msgq*) \
-              calloc (sizeof (struct video_msgq),
-                  queue_ptr->dataq_size
-                  );
-
-  if ( queue_ptr->ptr_cmdq == NULL ||
-     queue_ptr->ptr_dataq == NULL
-    )
-  {
-    return -1;
-  }
-  DEBUG_PRINT("\n create Threads");
-  /*Create two threads*/
-    if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread,
-            init_decode) < 0) ||
-         (pthread_create (&init_decode->asyncthread_id,NULL,async_thread,
-            init_decode) < 0)
-    )
-  {
-    return -1;
-  }
-
-  return 1;
-}
-
-
-
-int free_buffer ( enum vdec_buffer buffer_dir,
-                  struct video_decoder_context *decode_context
-                 )
-{
-  unsigned int buffercount = 0,i=0;
-  struct vdec_bufferpayload **ptemp = NULL;
-
-  if (decode_context == NULL)
-  {
-    return -1;
-  }
-
-  if (buffer_dir == VDEC_BUFFER_TYPE_INPUT && decode_context->ptr_inputbuffer)
-  {
-      buffercount = decode_context->input_buffer.actualcount;
-      ptemp = decode_context->ptr_inputbuffer;
-
-    for (i=0;i<buffercount;i++)
-    {
-          if (ptemp [i])
-      {
-            if (ptemp [i]->pmem_fd != -1)
-      {
-        munmap ( ptemp [i]->bufferaddr,ptemp [i]->mmaped_size);
-        ptemp [i]->bufferaddr = NULL;
-        close (ptemp [i]->pmem_fd);
-      }
-      free (ptemp [i]);
-      ptemp [i] = NULL;
-      }
-    }
-    free (decode_context->ptr_inputbuffer);
-    decode_context->ptr_inputbuffer = NULL;
-  }
-  else if ( buffer_dir == VDEC_BUFFER_TYPE_OUTPUT )
-  {
-    buffercount = decode_context->output_buffer.actualcount;
-    ptemp = decode_context->ptr_outputbuffer;
-
-        if (decode_context->ptr_respbuffer)
-    {
-      for (i=0;i<buffercount;i++)
-      {
-        if (decode_context->ptr_respbuffer [i])
-        {
-          free (decode_context->ptr_respbuffer[i]);
-          decode_context->ptr_respbuffer [i] = NULL;
-        }
-      }
-      free (decode_context->ptr_respbuffer);
-      decode_context->ptr_respbuffer = NULL;
-    }
-
-    if (ptemp)
-    {
-      for (i=0;i<buffercount;i++)
-      {
-        if (ptemp [i])
-        {
-          if (ptemp [i]->pmem_fd != -1)
-          {
-            munmap ( ptemp [i]->bufferaddr,ptemp [i]->mmaped_size);
-            ptemp [i]->bufferaddr = NULL;
-            close (ptemp [i]->pmem_fd);
-          }
-          free (ptemp [i]);
-          ptemp [i] = NULL;
-        }
-      }
-      free (ptemp);
-      decode_context->ptr_outputbuffer = NULL;
-    }
-  }
-
-  return 1;
-}
-
-int allocate_buffer ( enum vdec_buffer buffer_dir,
-                      struct video_decoder_context *decode_context
-                    )
-{
-  struct vdec_setbuffer_cmd setbuffers;
-  struct vdec_bufferpayload **ptemp = NULL;
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  unsigned int buffercount = 0,i=0,alignedsize=0;
-  unsigned int buffersize = 0;
-
-  if ( decode_context == NULL)
-  {
-    DEBUG_PRINT ("\nallocate_buffer: context is NULL");
-    return -1;
-  }
-
-  if ( buffer_dir == VDEC_BUFFER_TYPE_INPUT )
-  {
-        /*Check if buffers are allocated*/
-    if (decode_context->ptr_inputbuffer != NULL)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: decode_context->ptr_inputbuffer is set");
-      return -1;
-    }
-
-    buffercount = decode_context->input_buffer.actualcount;
-    alignedsize = decode_context->input_buffer.alignment;
-    buffersize = decode_context->input_buffer.buffer_size;
-    buffersize = (buffersize + alignedsize) & (~alignedsize);
-  }
-  else if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT)
-  {
-    /*Check if buffers are allocated*/
-    if (decode_context->ptr_outputbuffer != NULL)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: Double allcoate output");
-      return -1;
-    }
-
-    buffercount = decode_context->output_buffer.actualcount;
-    alignedsize = decode_context->output_buffer.alignment;
-    buffersize = decode_context->output_buffer.buffer_size;
-    buffersize = (buffersize + alignedsize) & (~alignedsize);
-
-    decode_context->ptr_respbuffer = (struct vdec_output_frameinfo  **)\
-    calloc (sizeof (struct vdec_output_frameinfo *),buffercount);
-
-    if (decode_context->ptr_respbuffer == NULL)
-    {
-      DEBUG_PRINT ("\n Allocate failure ptr_respbuffer");
-      return -1;
-    }
-
-    for (i=0; i< buffercount; i++)
-    {
-      decode_context->ptr_respbuffer [i] = (struct vdec_output_frameinfo *)\
-      calloc (sizeof (struct vdec_output_frameinfo),buffercount);
-      if (decode_context->ptr_respbuffer [i] == NULL)
-      {
-        DEBUG_PRINT ("\nfailed to allocate vdec_output_frameinfo");
-        return -1;
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions");
-    return -1;
-  }
-
-  ptemp = (struct vdec_bufferpayload **)\
-  calloc (sizeof (struct vdec_bufferpayload *),buffercount);
-
-  if (ptemp == NULL)
-  {
-    DEBUG_PRINT ("\nallocate_buffer: vdec_bufferpayload failure");
-    return -1;
-  }
-
-
-  if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT)
-  {
-    DEBUG_PRINT ("\nallocate_buffer: OUT");
-    decode_context->ptr_outputbuffer = ptemp;
-  }
-  else
-  {
-    DEBUG_PRINT ("\nallocate_buffer: IN");
-    decode_context->ptr_inputbuffer = ptemp;
-  }
-
-  /*Allocate buffer headers*/
-  for (i=0; i< buffercount; i++)
-  {
-    ptemp [i] = (struct vdec_bufferpayload*)\
-    calloc (sizeof (struct vdec_bufferpayload),1);
-
-    if (ptemp [i] == NULL)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure");
-      return -1;
-    }
-
-    if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT)
-    {
-         decode_context->ptr_respbuffer [i]->client_data = \
-         (void *) ptemp [i];
-    }
-    ptemp [i]->pmem_fd = -1;
-
-  }
-
-  for (i=0; i< buffercount; i++)
-  {
-    ptemp [i]->pmem_fd = open ("/dev/pmem_adsp",O_RDWR);
-
-    if (ptemp [i]->pmem_fd < 0)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
-      return -1;
-    }
-
-    ptemp [i]->bufferaddr = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE,
-                                 MAP_SHARED,ptemp [i]->pmem_fd,0);
-    DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->pmem_fd,\
-                  ptemp [i]->bufferaddr);
-    if (ptemp [i]->bufferaddr == MAP_FAILED)
-    {
-      ptemp [i]->bufferaddr = NULL;
-      DEBUG_PRINT ("\nallocate_buffer: MMAP failed");
-      return -1;
-    }
-    ptemp [i]->buffer_len = buffersize;
-    ptemp [i]->mmaped_size = clp2 (buffersize);
-
-    setbuffers.buffer_type = buffer_dir;
-    memcpy (&setbuffers.buffer,ptemp [i],sizeof (struct vdec_bufferpayload));
-
-    ioctl_msg.in  = &setbuffers;
-    ioctl_msg.out = NULL;
-
-    if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_SET_BUFFER,
-         &ioctl_msg) < 0)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: Set Buffer IOCTL failed");
-      return -1;
-    }
-
-  }
-  DEBUG_PRINT ("\nallocate_buffer: Success");
-  return 1;
-}
-
-
-
-int start_decoding (struct video_decoder_context *decode_context)
-{
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct vdec_input_frameinfo frameinfo;
-  struct vdec_fillbuffer_cmd fillbuffer;
-  unsigned int i = 0;
-  unsigned int data_len =0;
-
-  memset ((unsigned char*)&frameinfo,0,sizeof (struct vdec_input_frameinfo));
-  memset ((unsigned char*)&fillbuffer,0,sizeof (struct vdec_fillbuffer_cmd));
-
-  if (decode_context == NULL)
-  {
-    return -1;
-  }
-
-  if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_CMD_START,
-         NULL) < 0)
-  {
-    DEBUG_PRINT("\n Start failed");
-    return -1;
-  }
-
-  DEBUG_PRINT("\n Start Issued successfully waiting for Start Done");
-  /*Wait for Start command response*/
-    sem_wait (&decode_context->sem_synchronize);
-
-  /*Push output Buffers*/
-  i = 0;
-  while (i < decode_context->output_buffer.mincount)
-  {
-    fillbuffer.buffer.buffer_len =
-                               decode_context->ptr_outputbuffer [i]->buffer_len;
-    fillbuffer.buffer.bufferaddr =
-                               decode_context->ptr_outputbuffer [i]->bufferaddr;
-    fillbuffer.buffer.offset =
-                               decode_context->ptr_outputbuffer [i]->offset;
-    fillbuffer.buffer.pmem_fd =
-                               decode_context->ptr_outputbuffer [i]->pmem_fd;
-    fillbuffer.client_data = (void *)decode_context->ptr_respbuffer [i];
-    DEBUG_PRINT ("\n Client Data on output = %p",fillbuffer.client_data);
-    ioctl_msg.in = &fillbuffer;
-    ioctl_msg.out = NULL;
-
-    if (ioctl (decode_context->video_driver_fd,
-           VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Decoder frame failed");
-      return -1;
-    }
-    i++;
-  }
-
-
-  /*push input buffers*/
-  i = 0;
-  while (i < decode_context->input_buffer.mincount)
-  {
-    DEBUG_PRINT("\n Read  Frame from File");
-    data_len = read_frame ( decode_context->ptr_inputbuffer [i]->bufferaddr,
-                       decode_context->ptr_inputbuffer [i]->buffer_len,
-             decode_context->inputBufferFile);
-    if (data_len == 0)
-    {
-      DEBUG_PRINT("\n Length is zero error");
-      return -1;
-    }
-    DEBUG_PRINT("\n Read  Frame from File szie = %u",data_len);
-    frameinfo.bufferaddr =
-    decode_context->ptr_inputbuffer [i]->bufferaddr;
-    frameinfo.offset = 0;
-    frameinfo.pmem_fd = decode_context->ptr_inputbuffer [i]->pmem_fd;
-    frameinfo.pmem_offset = decode_context->ptr_inputbuffer [i]->offset;
-    frameinfo.datalen = data_len;
-    frameinfo.client_data = (struct vdec_bufferpayload *)\
-                           decode_context->ptr_inputbuffer [i];
-    /*TODO: Time stamp needs to be updated*/
-    ioctl_msg.in = &frameinfo;
-    ioctl_msg.out = NULL;
-
-    if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
-         &ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Decoder frame failed");
-      return -1;
-    }
-    total_frames++;
-    i++;
-  }
-  DEBUG_PRINT ("\n Wait for EOS");
-  /*Wait for EOS or Error condition*/
-  sem_wait (&decode_context->sem_synchronize);
-  DEBUG_PRINT ("\n Reached EOS");
-
-  return 1;
-}
-
-int stop_decoding  (struct video_decoder_context *decode_context)
-{
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  enum vdec_bufferflush flush_dir = VDEC_FLUSH_TYPE_INPUT;
-
-  if (decode_context == NULL)
-  {
-    return -1;
-  }
-
-  ioctl_msg.in = &flush_dir;
-  ioctl_msg.out = NULL;
-
-  if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH,
-         &ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Flush input failed");
-  }
-  else
-  {
-       sem_wait (&decode_context->sem_synchronize);
-  }
-
-  flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
-  ioctl_msg.in = &flush_dir;
-  ioctl_msg.out = NULL;
-
-  if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH,
-         &ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Flush output failed");
-  }
-  else
-  {
-     sem_wait (&decode_context->sem_synchronize);
-  }
-
-  DEBUG_PRINT("\n Stop VDEC_IOCTL_CMD_STOP");
-  if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_STOP,
-         NULL) < 0)
-  {
-    DEBUG_PRINT("\n Stop failed");
-  }
-  else
-  {
-     sem_wait (&decode_context->sem_synchronize);
-  }
-  return 1;
-}
-
-int deinit_decoder (struct video_decoder_context *init_decode)
-{
-  if (init_decode == NULL)
-  {
-    return -1;
-  }
-
-  /*Close the driver*/
-  if (init_decode->video_driver_fd != -1)
-  {
-    close (init_decode->video_driver_fd);
-  }
-
-  if (init_decode->queue_context.ptr_cmdq)
-  {
-    free (init_decode->queue_context.ptr_cmdq);
-    init_decode->queue_context.ptr_cmdq = NULL;
-  }
-
-  if (init_decode->queue_context.ptr_dataq)
-  {
-    free (init_decode->queue_context.ptr_dataq);
-    init_decode->queue_context.ptr_dataq = NULL;
-  }
-
-  sem_destroy (&init_decode->queue_context.sem_message);
-  sem_destroy (&init_decode->sem_synchronize);
-
-  pthread_mutex_destroy(&init_decode->queue_context.mutex);
-  pthread_mutex_destroy (&read_lock);
-
-  return 1;
-}
-
-static void* video_thread (void *context)
-{
-   struct video_decoder_context *decode_context = NULL;
-   struct video_msgq *queueitem = NULL;
-   struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-   struct vdec_input_frameinfo frameinfo;
-   struct vdec_fillbuffer_cmd fillbuffer;
-   struct vdec_output_frameinfo *outputbuffer = NULL;
-   struct vdec_bufferpayload *tempbuffer = NULL;
-   unsigned int data_len =0;
-
-
-   if (context == NULL)
-   {
-     DEBUG_PRINT("\n video thread recieved NULL context");
-     return NULL;
-   }
-   decode_context = (struct video_decoder_context *) context;
-
-   /* Thread function which will accept commands from async thread
-    * or main thread
-   */
-   while (1)
-   {
-      queueitem = queue_get_cmd (&decode_context ->queue_context);
-      if (queueitem != NULL)
-      {
-        switch (queueitem->cmd)
-        {
-        case VDEC_MSG_EVT_HW_ERROR:
-          DEBUG_PRINT("\n FATAL ERROR ");
-          break;
-        case VDEC_MSG_RESP_INPUT_FLUSHED:
-          DEBUG_PRINT("\n Input Buffer Flushed");
-          break;
-        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
-          DEBUG_PRINT("\n Output buffer Flushed");
-          break;
-        case VDEC_MSG_RESP_START_DONE:
-          DEBUG_PRINT("\n recived start done command");
-            sem_post (&decode_context->sem_synchronize);
-          break;
-
-        case VDEC_MSG_RESP_STOP_DONE:
-          DEBUG_PRINT("\n recieved stop done");
-          sem_post (&decode_context->sem_synchronize);
-          break;
-
-        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
-
-          tempbuffer = (struct vdec_bufferpayload *)queueitem->clientdata;
-          if (tempbuffer == NULL)
-          {
-            DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
-            sem_post (&decode_context->sem_synchronize);
-            break;
-          }
-          data_len = read_frame ( tempbuffer->bufferaddr,
-                        tempbuffer->buffer_len,
-                        decode_context->inputBufferFile
-                     );
-
-          if (data_len == 0)
-          {
-            DEBUG_PRINT ("\n End of stream reached");
-            sem_post (&decode_context->sem_synchronize);
-            break;
-          }
-
-          frameinfo.bufferaddr = tempbuffer->bufferaddr;
-          frameinfo.offset = 0;
-          frameinfo.pmem_fd = tempbuffer->pmem_fd;
-          frameinfo.pmem_offset = tempbuffer->offset;
-          frameinfo.datalen = data_len;
-          frameinfo.client_data = (struct vdec_bufferpayload *)\
-                       tempbuffer;
-          /*TODO: Time stamp needs to be updated*/
-          ioctl_msg.in = &frameinfo;
-          ioctl_msg.out = NULL;
-          total_frames++;
-          if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
-               &ioctl_msg) < 0)
-          {
-            DEBUG_PRINT("\n Decoder frame failed");
-            sem_post (&decode_context->sem_synchronize);
-          }
-          DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\
-                      total_frames);
-          break;
-
-        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
-
-         outputbuffer = (struct vdec_output_frameinfo *)\
-                              queueitem->clientdata;
-         DEBUG_PRINT("\n Value of client Data in VT %p",queueitem->clientdata);
-         if (outputbuffer == NULL || outputbuffer->bufferaddr == NULL ||
-                   outputbuffer->client_data == NULL
-           )
-         {
-           DEBUG_PRINT("\n FATAL ERROR output buffer is bad");
-           DEBUG_PRINT("\nValues outputbuffer = %p",outputbuffer);
-           if (outputbuffer != NULL)
-           {
-           DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
-                       outputbuffer->bufferaddr);
-           DEBUG_PRINT("\nValues outputbuffer->client_data = %p",\
-                       outputbuffer->client_data);
-           }
-           sem_post (&decode_context->sem_synchronize);
-           break;
-         }
-
-
-         if (outputbuffer->len == 0)
-         {
-           DEBUG_PRINT("\n Filled Length is zero Close decoding");
-           sem_post (&decode_context->sem_synchronize);
-           break;
-         }
-
-         if (decode_context->outputBufferFile != NULL)
-         {
-           fwrite (outputbuffer->bufferaddr,1,outputbuffer->len,
-                decode_context->outputBufferFile);
-         }
-
-         tempbuffer = (struct vdec_bufferpayload *)\
-                     outputbuffer->client_data;
-
-         DEBUG_PRINT("\n recieved output buffer consume outbuffer");
-         DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
-                     outputbuffer->bufferaddr);
-         DEBUG_PRINT ("\n Vir address of allocated buffer %p",\
-                      tempbuffer->bufferaddr);
-         fillbuffer.buffer.buffer_len = tempbuffer->buffer_len;
-         fillbuffer.buffer.bufferaddr = tempbuffer->bufferaddr;
-         fillbuffer.buffer.offset = tempbuffer->offset;
-         fillbuffer.buffer.pmem_fd = tempbuffer->pmem_fd;
-         fillbuffer.client_data = (void *)outputbuffer;
-
-         ioctl_msg.in = &fillbuffer;
-         ioctl_msg.out = NULL;
-
-         if (ioctl (decode_context->video_driver_fd,
-              VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
-         {
-           DEBUG_PRINT("\n Decoder frame failed");
-           return NULL;
-         }
-
-         break;
-
-        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
-            DEBUG_PRINT("\n Flush input complete");
-          sem_post (&decode_context->sem_synchronize);
-          break;
-
-        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
-          DEBUG_PRINT("\n Flush output complete");
-                sem_post (&decode_context->sem_synchronize);
-          break;
-        }
-
-        if (queueitem->cmd == VDEC_MSG_RESP_STOP_DONE)
-        {
-          DEBUG_PRINT("\n Playback has ended thread will exit");
-          return NULL;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT("\n Error condition recieved NULL from Queue");
-      }
-
-   }
-}
-
-static void* async_thread (void *context)
-{
-  struct video_decoder_context *decode_context = NULL;
-  struct vdec_output_frameinfo *outputframe = NULL;
-  struct video_msgq queueitem ;
-  struct vdec_msginfo vdec_msg;
-  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
-  int result = -1;
-
-  if (context == NULL)
-  {
-    DEBUG_PRINT("\n aynsc thread recieved NULL context");
-    return NULL;
-  }
-  decode_context = (struct video_decoder_context *) context;
-  DEBUG_PRINT("\n Entering the async thread");
-
-  while (1)
-  {
-    ioctl_msg.in = NULL;
-
-    ioctl_msg.out = (void*)&vdec_msg;
-    DEBUG_PRINT ("\n Sizeof vdec_msginfo = %d ",sizeof (vdec_msg));
-    DEBUG_PRINT("\n Address of Vdec msg in async thread %p",\
-                ioctl_msg.out);
-    if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,\
-         (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Error in ioctl read next msg");
-    }
-    else
-    {
-      switch (vdec_msg.msgcode)
-      {
-      case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
-      case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
-      case VDEC_MSG_RESP_START_DONE:
-      case VDEC_MSG_RESP_STOP_DONE:
-      case VDEC_MSG_EVT_HW_ERROR:
-        DEBUG_PRINT("\nioctl read next msg");
-        queueitem.cmd = vdec_msg.msgcode;
-        queueitem.status = vdec_msg.status_code;
-        queueitem.clientdata = NULL;
-        break;
-
-      case VDEC_MSG_RESP_INPUT_FLUSHED:
-      case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
-
-        queueitem.cmd = vdec_msg.msgcode;
-        queueitem.status = vdec_msg.status_code;
-        queueitem.clientdata = (void *)\
-            vdec_msg.msgdata.input_frame_clientdata;
-        break;
-
-      case VDEC_MSG_RESP_OUTPUT_FLUSHED:
-      case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
-        queueitem.cmd = vdec_msg.msgcode;
-        queueitem.status = vdec_msg.status_code;
-        outputframe = (struct vdec_output_frameinfo *)\
-        vdec_msg.msgdata.output_frame.client_data;
-        DEBUG_PRINT ("\n Client Data value in %p", \
-                     vdec_msg.msgdata.output_frame.client_data);
-        outputframe->bufferaddr = vdec_msg.msgdata.output_frame.bufferaddr;
-        outputframe->framesize.bottom = \
-        vdec_msg.msgdata.output_frame.framesize.bottom;
-        outputframe->framesize.left = \
-        vdec_msg.msgdata.output_frame.framesize.left;
-        outputframe->framesize.right = \
-        vdec_msg.msgdata.output_frame.framesize.right;
-        outputframe->framesize.top = \
-        vdec_msg.msgdata.output_frame.framesize.top;
-        outputframe->framesize = vdec_msg.msgdata.output_frame.framesize;
-        outputframe->len = vdec_msg.msgdata.output_frame.len;
-        outputframe->time_stamp = vdec_msg.msgdata.output_frame.time_stamp;
-        queueitem.clientdata = (void *)outputframe;
-        DEBUG_PRINT ("\n Client Data value Copy %p",queueitem.clientdata);
-       break;
-
-      default:
-        DEBUG_PRINT("\nIn Default of get next message %d",vdec_msg.msgcode);
-        queueitem.cmd = vdec_msg.msgcode;
-        queueitem.status = vdec_msg.status_code;
-        queueitem.clientdata = NULL;
-        break;
-      }
-      result = queue_post_cmdq (&decode_context->queue_context,&queueitem);
-      while (result == 0)
-      {
-         result = queue_post_cmdq (&decode_context->queue_context,
-                 &queueitem);
-      }
-
-      if (result == -1)
-      {
-        DEBUG_PRINT("\n FATAL ERROR WITH Queue");
-      }
-    }
-    if (vdec_msg.msgcode == VDEC_MSG_RESP_STOP_DONE)
-    {
-      /*Thread can exit at this point*/
-      return NULL;
-    }
-  }
-}
-
-
-static unsigned int read_frame (unsigned char *dataptr, unsigned int length,
-                                FILE * inputBufferFile)
-{
-
-  unsigned int readOffset = 0;
-  int bytes_read = 0;
-  unsigned int code = 0;
-  int found = 0;
-
-  DEBUG_PRINT ("\n Inside the readframe");
-
-  if (dataptr == NULL || length == 0)
-  {
-    DEBUG_PRINT ("\n dataptr = %p length = %u",dataptr,length);
-    return 0;
-  }
-
-  if (!Code_type)
-  {
-    /* Start of Critical Section*/
-    pthread_mutex_lock(&read_lock);
-    do
-    {
-      //Start codes are always byte aligned.
-      bytes_read = fread(&dataptr[readOffset],1, 1,inputBufferFile);
-      if( !bytes_read)
-      {
-        DEBUG_PRINT("\n Bytes read Zero \n");
-        break;
-      }
-      code <<= 8;
-      code |= (0x000000FF & dataptr[readOffset]);
-      //VOP start code comparision
-      if (readOffset>3)
-      {
-        if(!header_code )
-        {
-          if( VOP_START_CODE == code)
-          {
-          DEBUG_PRINT ("\n Found VOP Code");
-          header_code = VOP_START_CODE;
-          }
-          else if ( (0xFFFFFC00 & code) == SHORT_HEADER_START_CODE )
-          {
-          header_code = SHORT_HEADER_START_CODE;
-          }
-        }
-        if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE))
-        {
-          //Seek backwards by 4
-          fseek(inputBufferFile, -4, SEEK_CUR);
-          readOffset-=4;
-          found = 1;
-          break;
-
-        }
-        else if (( header_code == SHORT_HEADER_START_CODE ) &&
-        ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00)))
-        {
-          //Seek backwards by 4
-          fseek(inputBufferFile, -4, SEEK_CUR);
-          readOffset-=4;
-          found = 1;
-          break;
-        }
-      }
-      readOffset++;
-    }while (readOffset < length);
-    pthread_mutex_unlock(&read_lock);
-    /* End of Critical Section*/
-    if (found == 1)
-    {
-      //DEBUG_PRINT ("Found a Frame");
-      return (readOffset+1);
-    }
-    else
-    {
-      //DEBUG_PRINT ("No Frames detected");
-      return 0;
-    }
-  }
-  else
-  {
-
-    readOffset = Read_Buffer_From_DAT_File(dataptr,length,inputBufferFile);
-    if (total_frames == 0)
-    {
-      bytes_read = Read_Buffer_From_DAT_File(&dataptr[readOffset],
-                                             (length-readOffset),
-                                             inputBufferFile);
-      readOffset += bytes_read;
-    }
-    return (readOffset);
-  }
-
-}
-
-static int Read_Buffer_From_DAT_File(unsigned char *dataptr, unsigned int length,
-                                     FILE * inputBufferFile)
-{
-
-
-  long frameSize=0;
-  char temp_buffer[10];
-  char temp_byte;
-  int bytes_read=0;
-  int i=0;
-  unsigned char *read_buffer=NULL;
-  char c = '1'; //initialize to anything except '\0'(0)
-  char inputFrameSize[12];
-  int count =0; char cnt =0;
-  memset(temp_buffer, 0, sizeof(temp_buffer));
-
-  while (cnt < 10)
-  /* Check the input file format, may result in infinite loop */
-  {
-      count  = fread(&inputFrameSize[cnt],1,1,inputBufferFile);
-      if(inputFrameSize[cnt] == '\0' )
-        break;
-      cnt++;
-  }
-  inputFrameSize[cnt]='\0';
-  frameSize = atoi(inputFrameSize);
-  //length = 0;
-  DEBUG_PRINT ("\n Frame Size is %d",frameSize);
-
-  /* get the frame length */
-  fseek(inputBufferFile, -1, SEEK_CUR);
-  bytes_read = fread(dataptr, 1, frameSize,  inputBufferFile);
-
-  if(bytes_read == 0 || bytes_read < frameSize ) {
-      return 0;
-  }
-  return bytes_read;
-}
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "decoder_driver_test.h"
+
+#define DEBUG_PRINT printf
+/************************************************************************/
+/*        #DEFINES                          */
+/************************************************************************/
+
+#define VOP_START_CODE 0x000001B6
+#define SHORT_HEADER_START_CODE 0x00008000
+#define H264_START_CODE         0x00000001
+
+/************************************************************************/
+/*        STATIC VARIABLES                          */
+/************************************************************************/
+
+static int Code_type;
+static int total_frames = 0;
+static unsigned int header_code = 0;
+static pthread_mutex_t read_lock;
+
+static unsigned int read_frame ( unsigned char *dataptr,unsigned int length,
+        FILE * inputBufferFile
+        );
+static int Read_Buffer_From_DAT_File( unsigned char *dataptr, unsigned int length,
+        FILE * inputBufferFile
+        );
+
+static unsigned clp2(unsigned x)
+{
+    x = x - 1;
+    x = x | (x >> 1);
+    x = x | (x >> 2);
+    x = x | (x >> 4);
+    x = x | (x >> 8);
+    x = x | (x >>16);
+    return x + 1;
+}
+
+static void* video_thread (void *);
+static void* async_thread (void *);
+
+int main (int argc, char **argv)
+{
+    struct video_decoder_context *decoder_context = NULL;
+    char *file_name = NULL;
+    FILE *file_ptr = NULL;
+    int temp1 =0,temp2 =0;
+    int error = 1;
+    unsigned int i = 0;
+
+    file_name = argv [1];
+    file_ptr = fopen (file_name,"rb");
+
+    if (file_ptr == NULL) {
+        DEBUG_PRINT("\n File is not located ");
+        return -1;
+    }
+
+
+    decoder_context = (struct video_decoder_context *) \
+              calloc (sizeof (struct video_decoder_context),1);
+
+    if (decoder_context == NULL) {
+        return -1;
+    }
+
+    decoder_context->outputBufferFile = NULL;
+    decoder_context->inputBufferFile = NULL;
+    decoder_context->video_driver_fd = -1;
+    decoder_context->inputBufferFile = file_ptr;
+
+    file_ptr = fopen ("/data/output.yuv","wb");
+
+    if (file_ptr == NULL) {
+        DEBUG_PRINT("\n File can't be created");
+        free (decoder_context);
+        return -1;
+    }
+
+    decoder_context->outputBufferFile = file_ptr;
+
+    switch (atoi(argv[2])) {
+        case 0:
+            DEBUG_PRINT("\n MPEG4 codec selected");
+            decoder_context->decoder_format = VDEC_CODECTYPE_MPEG4;
+            Code_type = 0;
+            break;
+        case 1:
+            DEBUG_PRINT("\n H.263");
+            decoder_context->decoder_format = VDEC_CODECTYPE_H263;
+            Code_type = 0;
+            break;
+        case 2:
+            DEBUG_PRINT("\n H.264");
+            decoder_context->decoder_format = VDEC_CODECTYPE_H264;
+            Code_type = 1;
+            break;
+        default:
+            DEBUG_PRINT("\n Wrong codec type");
+            error = -1;
+            break;
+    }
+
+    if (error != -1) {
+        temp1 = atoi(argv[3]);
+        temp2 = atoi(argv[4]);
+
+        if (((temp1%16) != 0) || ((temp2%16) != 0)) {
+            error = -1;
+        } else {
+            decoder_context->video_resoultion.frame_height = temp1;
+            decoder_context->video_resoultion.frame_width = temp2;
+        }
+    }
+
+    switch (atoi(argv[5])) {
+        case 0:
+            DEBUG_PRINT("\n No Sink");
+            decoder_context->outputBufferFile = NULL;
+            break;
+    }
+
+    if ( error != -1 && (init_decoder (decoder_context) == -1 )) {
+        DEBUG_PRINT("\n Init decoder fails ");
+        error = -1;
+    }
+
+    DEBUG_PRINT("\n Decoder open successfull");
+
+
+    /*Allocate input and output buffers*/
+    if (error != -1 && (allocate_buffer (VDEC_BUFFER_TYPE_INPUT,
+                    decoder_context)== -1)) {
+        DEBUG_PRINT("\n Error in input Buffer allocation");
+        error = -1;
+    }
+
+    if (error != -1 && (allocate_buffer (VDEC_BUFFER_TYPE_OUTPUT,
+                    decoder_context)== -1)) {
+        DEBUG_PRINT("\n Error in output Buffer allocation");
+        error = -1;
+    }
+
+
+    if (error != -1 && (start_decoding (decoder_context) == -1)) {
+        DEBUG_PRINT("\n Error in start decoding call");
+        error = -1;
+    }
+
+    if (error != -1 && (stop_decoding (decoder_context) == -1)) {
+        DEBUG_PRINT("\n Error in stop decoding call");
+        error = -1;
+    }
+
+    DEBUG_PRINT("\n De-init the decoder");
+
+    if ((deinit_decoder (decoder_context) == -1)) {
+        error = -1;
+    }
+
+
+    (void)free_buffer (VDEC_BUFFER_TYPE_INPUT,decoder_context);
+    (void)free_buffer (VDEC_BUFFER_TYPE_OUTPUT,decoder_context);
+
+    if (decoder_context->inputBufferFile != NULL) {
+        fclose (decoder_context->inputBufferFile);
+    }
+
+    if (decoder_context->outputBufferFile != NULL) {
+        fclose (decoder_context->outputBufferFile);
+    }
+
+    DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames);
+    DEBUG_PRINT("\n closing the driver");
+    free (decoder_context);
+
+    return error;
+}
+
+int init_decoder ( struct video_decoder_context *init_decode )
+{
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct video_queue_context *queue_ptr = NULL;
+#ifdef MAX_RES_720P
+    enum vdec_output_fromat output_format = VDEC_YUV_FORMAT_NV12;
+#endif
+#ifdef MAX_RES_1080P
+    enum vdec_output_fromat output_format  = VDEC_YUV_FORMAT_TILE_4x2;
+#endif
+
+    pthread_mutexattr_t init_values;
+
+    DEBUG_PRINT("\n Before calling the open");
+
+    init_decode->video_driver_fd = open ("/dev/msm_vidc_dec", \
+            O_RDWR | O_NONBLOCK);
+
+
+
+    if (init_decode->video_driver_fd < 0) {
+        DEBUG_PRINT("\n Open failed");
+        return -1;
+    }
+
+
+    /*Initialize Decoder with codec type and resolution*/
+    ioctl_msg.in = &init_decode->decoder_format;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_CODEC,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set codec type failed");
+        return -1;
+    }
+
+    /*Set the output format*/
+    ioctl_msg.in = &output_format;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set output format failed");
+        return -1;
+    }
+
+    ioctl_msg.in = &init_decode->video_resoultion;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_PICRES,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set Resolution failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n After Set Resolution");
+
+    DEBUG_PRINT("\n Query Input bufffer requirements");
+    /*Get the Buffer requirements for input and output ports*/
+
+    init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = &init_decode->input_buffer;
+
+    if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Requesting for input buffer requirements failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \
+            init_decode->input_buffer.buffer_size,\
+            init_decode->input_buffer.mincount,\
+            init_decode->input_buffer.actualcount);
+
+
+    init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+    ioctl_msg.in = &init_decode->input_buffer;
+    ioctl_msg.out = NULL;
+    init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
+
+    if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set Buffer Requirements Failed");
+        return -1;
+    }
+
+
+    DEBUG_PRINT("\n Query output bufffer requirements");
+    init_decode->output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = &init_decode->output_buffer;
+
+    if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Requesting for output buffer requirements failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \
+            init_decode->output_buffer.buffer_size,\
+            init_decode->output_buffer.mincount,\
+            init_decode->output_buffer.actualcount);
+
+    /*Create Queue related data structures*/
+    queue_ptr = &init_decode->queue_context;
+    queue_ptr->commandq_size = 50;
+    queue_ptr->dataq_size = 50;
+
+    sem_init(&queue_ptr->sem_message,0, 0);
+    sem_init(&init_decode->sem_synchronize,0, 0);
+
+    pthread_mutexattr_init (&init_values);
+    pthread_mutex_init (&queue_ptr->mutex,&init_values);
+    pthread_mutex_init (&read_lock,&init_values);
+    DEBUG_PRINT("\n create Queues");
+    queue_ptr->ptr_cmdq = (struct video_msgq*) \
+                  calloc (sizeof (struct video_msgq),
+                          queue_ptr->commandq_size);
+    queue_ptr->ptr_dataq = (struct video_msgq*) \
+                   calloc (sizeof (struct video_msgq),
+                           queue_ptr->dataq_size
+                      );
+
+    if ( queue_ptr->ptr_cmdq == NULL ||
+            queue_ptr->ptr_dataq == NULL
+       ) {
+        return -1;
+    }
+
+    DEBUG_PRINT("\n create Threads");
+
+    /*Create two threads*/
+    if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread,
+                    init_decode) < 0) ||
+            (pthread_create (&init_decode->asyncthread_id,NULL,async_thread,
+                     init_decode) < 0)
+       ) {
+        return -1;
+    }
+
+    return 1;
+}
+
+
+
+int free_buffer ( enum vdec_buffer buffer_dir,
+        struct video_decoder_context *decode_context
+        )
+{
+    unsigned int buffercount = 0,i=0;
+    struct vdec_bufferpayload **ptemp = NULL;
+
+    if (decode_context == NULL) {
+        return -1;
+    }
+
+    if (buffer_dir == VDEC_BUFFER_TYPE_INPUT && decode_context->ptr_inputbuffer) {
+        buffercount = decode_context->input_buffer.actualcount;
+        ptemp = decode_context->ptr_inputbuffer;
+
+        for (i=0; i<buffercount; i++) {
+            if (ptemp [i]) {
+                if (ptemp [i]->pmem_fd != -1) {
+                    munmap ( ptemp [i]->bufferaddr,ptemp [i]->mmaped_size);
+                    ptemp [i]->bufferaddr = NULL;
+                    close (ptemp [i]->pmem_fd);
+                }
+
+                free (ptemp [i]);
+                ptemp [i] = NULL;
+            }
+        }
+
+        free (decode_context->ptr_inputbuffer);
+        decode_context->ptr_inputbuffer = NULL;
+    } else if ( buffer_dir == VDEC_BUFFER_TYPE_OUTPUT ) {
+        buffercount = decode_context->output_buffer.actualcount;
+        ptemp = decode_context->ptr_outputbuffer;
+
+        if (decode_context->ptr_respbuffer) {
+            for (i=0; i<buffercount; i++) {
+                if (decode_context->ptr_respbuffer [i]) {
+                    free (decode_context->ptr_respbuffer[i]);
+                    decode_context->ptr_respbuffer [i] = NULL;
+                }
+            }
+
+            free (decode_context->ptr_respbuffer);
+            decode_context->ptr_respbuffer = NULL;
+        }
+
+        if (ptemp) {
+            for (i=0; i<buffercount; i++) {
+                if (ptemp [i]) {
+                    if (ptemp [i]->pmem_fd != -1) {
+                        munmap ( ptemp [i]->bufferaddr,ptemp [i]->mmaped_size);
+                        ptemp [i]->bufferaddr = NULL;
+                        close (ptemp [i]->pmem_fd);
+                    }
+
+                    free (ptemp [i]);
+                    ptemp [i] = NULL;
+                }
+            }
+
+            free (ptemp);
+            decode_context->ptr_outputbuffer = NULL;
+        }
+    }
+
+    return 1;
+}
+
+int allocate_buffer ( enum vdec_buffer buffer_dir,
+        struct video_decoder_context *decode_context
+        )
+{
+    struct vdec_setbuffer_cmd setbuffers;
+    struct vdec_bufferpayload **ptemp = NULL;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    unsigned int buffercount = 0,i=0,alignedsize=0;
+    unsigned int buffersize = 0;
+
+    if ( decode_context == NULL) {
+        DEBUG_PRINT ("\nallocate_buffer: context is NULL");
+        return -1;
+    }
+
+    if ( buffer_dir == VDEC_BUFFER_TYPE_INPUT ) {
+        /*Check if buffers are allocated*/
+        if (decode_context->ptr_inputbuffer != NULL) {
+            DEBUG_PRINT ("\nallocate_buffer: decode_context->ptr_inputbuffer is set");
+            return -1;
+        }
+
+        buffercount = decode_context->input_buffer.actualcount;
+        alignedsize = decode_context->input_buffer.alignment;
+        buffersize = decode_context->input_buffer.buffer_size;
+        buffersize = (buffersize + alignedsize) & (~alignedsize);
+    } else if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT) {
+        /*Check if buffers are allocated*/
+        if (decode_context->ptr_outputbuffer != NULL) {
+            DEBUG_PRINT ("\nallocate_buffer: Double allcoate output");
+            return -1;
+        }
+
+        buffercount = decode_context->output_buffer.actualcount;
+        alignedsize = decode_context->output_buffer.alignment;
+        buffersize = decode_context->output_buffer.buffer_size;
+        buffersize = (buffersize + alignedsize) & (~alignedsize);
+
+        decode_context->ptr_respbuffer = (struct vdec_output_frameinfo  **)\
+                         calloc (sizeof (struct vdec_output_frameinfo *),buffercount);
+
+        if (decode_context->ptr_respbuffer == NULL) {
+            DEBUG_PRINT ("\n Allocate failure ptr_respbuffer");
+            return -1;
+        }
+
+        for (i=0; i< buffercount; i++) {
+            decode_context->ptr_respbuffer [i] = (struct vdec_output_frameinfo *)\
+                                 calloc (sizeof (struct vdec_output_frameinfo),buffercount);
+
+            if (decode_context->ptr_respbuffer [i] == NULL) {
+                DEBUG_PRINT ("\nfailed to allocate vdec_output_frameinfo");
+                return -1;
+            }
+        }
+    } else {
+        DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions");
+        return -1;
+    }
+
+    ptemp = (struct vdec_bufferpayload **)\
+        calloc (sizeof (struct vdec_bufferpayload *),buffercount);
+
+    if (ptemp == NULL) {
+        DEBUG_PRINT ("\nallocate_buffer: vdec_bufferpayload failure");
+        return -1;
+    }
+
+
+    if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT) {
+        DEBUG_PRINT ("\nallocate_buffer: OUT");
+        decode_context->ptr_outputbuffer = ptemp;
+    } else {
+        DEBUG_PRINT ("\nallocate_buffer: IN");
+        decode_context->ptr_inputbuffer = ptemp;
+    }
+
+    /*Allocate buffer headers*/
+    for (i=0; i< buffercount; i++) {
+        ptemp [i] = (struct vdec_bufferpayload*)\
+                calloc (sizeof (struct vdec_bufferpayload),1);
+
+        if (ptemp [i] == NULL) {
+            DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure");
+            return -1;
+        }
+
+        if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT) {
+            decode_context->ptr_respbuffer [i]->client_data = \
+                                      (void *) ptemp [i];
+        }
+
+        ptemp [i]->pmem_fd = -1;
+
+    }
+
+    for (i=0; i< buffercount; i++) {
+        ptemp [i]->pmem_fd = open ("/dev/pmem_adsp",O_RDWR);
+
+        if (ptemp [i]->pmem_fd < 0) {
+            DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
+            return -1;
+        }
+
+        ptemp [i]->bufferaddr = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE,
+                MAP_SHARED,ptemp [i]->pmem_fd,0);
+        DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->pmem_fd,\
+                ptemp [i]->bufferaddr);
+
+        if (ptemp [i]->bufferaddr == MAP_FAILED) {
+            ptemp [i]->bufferaddr = NULL;
+            DEBUG_PRINT ("\nallocate_buffer: MMAP failed");
+            return -1;
+        }
+
+        ptemp [i]->buffer_len = buffersize;
+        ptemp [i]->mmaped_size = clp2 (buffersize);
+
+        setbuffers.buffer_type = buffer_dir;
+        memcpy (&setbuffers.buffer,ptemp [i],sizeof (struct vdec_bufferpayload));
+
+        ioctl_msg.in  = &setbuffers;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+                    &ioctl_msg) < 0) {
+            DEBUG_PRINT ("\nallocate_buffer: Set Buffer IOCTL failed");
+            return -1;
+        }
+
+    }
+
+    DEBUG_PRINT ("\nallocate_buffer: Success");
+    return 1;
+}
+
+
+
+int start_decoding (struct video_decoder_context *decode_context)
+{
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct vdec_input_frameinfo frameinfo;
+    struct vdec_fillbuffer_cmd fillbuffer;
+    unsigned int i = 0;
+    unsigned int data_len =0;
+
+    memset ((unsigned char*)&frameinfo,0,sizeof (struct vdec_input_frameinfo));
+    memset ((unsigned char*)&fillbuffer,0,sizeof (struct vdec_fillbuffer_cmd));
+
+    if (decode_context == NULL) {
+        return -1;
+    }
+
+    if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_CMD_START,
+                NULL) < 0) {
+        DEBUG_PRINT("\n Start failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n Start Issued successfully waiting for Start Done");
+    /*Wait for Start command response*/
+    sem_wait (&decode_context->sem_synchronize);
+
+    /*Push output Buffers*/
+    i = 0;
+
+    while (i < decode_context->output_buffer.mincount) {
+        fillbuffer.buffer.buffer_len =
+            decode_context->ptr_outputbuffer [i]->buffer_len;
+        fillbuffer.buffer.bufferaddr =
+            decode_context->ptr_outputbuffer [i]->bufferaddr;
+        fillbuffer.buffer.offset =
+            decode_context->ptr_outputbuffer [i]->offset;
+        fillbuffer.buffer.pmem_fd =
+            decode_context->ptr_outputbuffer [i]->pmem_fd;
+        fillbuffer.client_data = (void *)decode_context->ptr_respbuffer [i];
+        DEBUG_PRINT ("\n Client Data on output = %p",fillbuffer.client_data);
+        ioctl_msg.in = &fillbuffer;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (decode_context->video_driver_fd,
+                    VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Decoder frame failed");
+            return -1;
+        }
+
+        i++;
+    }
+
+
+    /*push input buffers*/
+    i = 0;
+
+    while (i < decode_context->input_buffer.mincount) {
+        DEBUG_PRINT("\n Read  Frame from File");
+        data_len = read_frame ( decode_context->ptr_inputbuffer [i]->bufferaddr,
+                decode_context->ptr_inputbuffer [i]->buffer_len,
+                decode_context->inputBufferFile);
+
+        if (data_len == 0) {
+            DEBUG_PRINT("\n Length is zero error");
+            return -1;
+        }
+
+        DEBUG_PRINT("\n Read  Frame from File szie = %u",data_len);
+        frameinfo.bufferaddr =
+            decode_context->ptr_inputbuffer [i]->bufferaddr;
+        frameinfo.offset = 0;
+        frameinfo.pmem_fd = decode_context->ptr_inputbuffer [i]->pmem_fd;
+        frameinfo.pmem_offset = decode_context->ptr_inputbuffer [i]->offset;
+        frameinfo.datalen = data_len;
+        frameinfo.client_data = (struct vdec_bufferpayload *)\
+                    decode_context->ptr_inputbuffer [i];
+        /*TODO: Time stamp needs to be updated*/
+        ioctl_msg.in = &frameinfo;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
+                    &ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Decoder frame failed");
+            return -1;
+        }
+
+        total_frames++;
+        i++;
+    }
+
+    DEBUG_PRINT ("\n Wait for EOS");
+    /*Wait for EOS or Error condition*/
+    sem_wait (&decode_context->sem_synchronize);
+    DEBUG_PRINT ("\n Reached EOS");
+
+    return 1;
+}
+
+int stop_decoding  (struct video_decoder_context *decode_context)
+{
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    enum vdec_bufferflush flush_dir = VDEC_FLUSH_TYPE_INPUT;
+
+    if (decode_context == NULL) {
+        return -1;
+    }
+
+    ioctl_msg.in = &flush_dir;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH,
+                &ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Flush input failed");
+    } else {
+        sem_wait (&decode_context->sem_synchronize);
+    }
+
+    flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
+    ioctl_msg.in = &flush_dir;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH,
+                &ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Flush output failed");
+    } else {
+        sem_wait (&decode_context->sem_synchronize);
+    }
+
+    DEBUG_PRINT("\n Stop VDEC_IOCTL_CMD_STOP");
+
+    if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_STOP,
+                NULL) < 0) {
+        DEBUG_PRINT("\n Stop failed");
+    } else {
+        sem_wait (&decode_context->sem_synchronize);
+    }
+
+    return 1;
+}
+
+int deinit_decoder (struct video_decoder_context *init_decode)
+{
+    if (init_decode == NULL) {
+        return -1;
+    }
+
+    /*Close the driver*/
+    if (init_decode->video_driver_fd != -1) {
+        close (init_decode->video_driver_fd);
+    }
+
+    if (init_decode->queue_context.ptr_cmdq) {
+        free (init_decode->queue_context.ptr_cmdq);
+        init_decode->queue_context.ptr_cmdq = NULL;
+    }
+
+    if (init_decode->queue_context.ptr_dataq) {
+        free (init_decode->queue_context.ptr_dataq);
+        init_decode->queue_context.ptr_dataq = NULL;
+    }
+
+    sem_destroy (&init_decode->queue_context.sem_message);
+    sem_destroy (&init_decode->sem_synchronize);
+
+    pthread_mutex_destroy(&init_decode->queue_context.mutex);
+    pthread_mutex_destroy (&read_lock);
+
+    return 1;
+}
+
+static void* video_thread (void *context)
+{
+    struct video_decoder_context *decode_context = NULL;
+    struct video_msgq *queueitem = NULL;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct vdec_input_frameinfo frameinfo;
+    struct vdec_fillbuffer_cmd fillbuffer;
+    struct vdec_output_frameinfo *outputbuffer = NULL;
+    struct vdec_bufferpayload *tempbuffer = NULL;
+    unsigned int data_len =0;
+
+
+    if (context == NULL) {
+        DEBUG_PRINT("\n video thread recieved NULL context");
+        return NULL;
+    }
+
+    decode_context = (struct video_decoder_context *) context;
+
+    /* Thread function which will accept commands from async thread
+     * or main thread
+     */
+    while (1) {
+        queueitem = queue_get_cmd (&decode_context ->queue_context);
+
+        if (queueitem != NULL) {
+            switch (queueitem->cmd) {
+                case VDEC_MSG_EVT_HW_ERROR:
+                    DEBUG_PRINT("\n FATAL ERROR ");
+                    break;
+                case VDEC_MSG_RESP_INPUT_FLUSHED:
+                    DEBUG_PRINT("\n Input Buffer Flushed");
+                    break;
+                case VDEC_MSG_RESP_OUTPUT_FLUSHED:
+                    DEBUG_PRINT("\n Output buffer Flushed");
+                    break;
+                case VDEC_MSG_RESP_START_DONE:
+                    DEBUG_PRINT("\n recived start done command");
+                    sem_post (&decode_context->sem_synchronize);
+                    break;
+
+                case VDEC_MSG_RESP_STOP_DONE:
+                    DEBUG_PRINT("\n recieved stop done");
+                    sem_post (&decode_context->sem_synchronize);
+                    break;
+
+                case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
+
+                    tempbuffer = (struct vdec_bufferpayload *)queueitem->clientdata;
+
+                    if (tempbuffer == NULL) {
+                        DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
+                        sem_post (&decode_context->sem_synchronize);
+                        break;
+                    }
+
+                    data_len = read_frame ( tempbuffer->bufferaddr,
+                            tempbuffer->buffer_len,
+                            decode_context->inputBufferFile
+                            );
+
+                    if (data_len == 0) {
+                        DEBUG_PRINT ("\n End of stream reached");
+                        sem_post (&decode_context->sem_synchronize);
+                        break;
+                    }
+
+                    frameinfo.bufferaddr = tempbuffer->bufferaddr;
+                    frameinfo.offset = 0;
+                    frameinfo.pmem_fd = tempbuffer->pmem_fd;
+                    frameinfo.pmem_offset = tempbuffer->offset;
+                    frameinfo.datalen = data_len;
+                    frameinfo.client_data = (struct vdec_bufferpayload *)\
+                                tempbuffer;
+                    /*TODO: Time stamp needs to be updated*/
+                    ioctl_msg.in = &frameinfo;
+                    ioctl_msg.out = NULL;
+                    total_frames++;
+
+                    if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
+                                &ioctl_msg) < 0) {
+                        DEBUG_PRINT("\n Decoder frame failed");
+                        sem_post (&decode_context->sem_synchronize);
+                    }
+
+                    DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\
+                            total_frames);
+                    break;
+
+                case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+
+                    outputbuffer = (struct vdec_output_frameinfo *)\
+                               queueitem->clientdata;
+                    DEBUG_PRINT("\n Value of client Data in VT %p",queueitem->clientdata);
+
+                    if (outputbuffer == NULL || outputbuffer->bufferaddr == NULL ||
+                            outputbuffer->client_data == NULL
+                       ) {
+                        DEBUG_PRINT("\n FATAL ERROR output buffer is bad");
+                        DEBUG_PRINT("\nValues outputbuffer = %p",outputbuffer);
+
+                        if (outputbuffer != NULL) {
+                            DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
+                                    outputbuffer->bufferaddr);
+                            DEBUG_PRINT("\nValues outputbuffer->client_data = %p",\
+                                    outputbuffer->client_data);
+                        }
+
+                        sem_post (&decode_context->sem_synchronize);
+                        break;
+                    }
+
+
+                    if (outputbuffer->len == 0) {
+                        DEBUG_PRINT("\n Filled Length is zero Close decoding");
+                        sem_post (&decode_context->sem_synchronize);
+                        break;
+                    }
+
+                    if (decode_context->outputBufferFile != NULL) {
+                        fwrite (outputbuffer->bufferaddr,1,outputbuffer->len,
+                                decode_context->outputBufferFile);
+                    }
+
+                    tempbuffer = (struct vdec_bufferpayload *)\
+                             outputbuffer->client_data;
+
+                    DEBUG_PRINT("\n recieved output buffer consume outbuffer");
+                    DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
+                            outputbuffer->bufferaddr);
+                    DEBUG_PRINT ("\n Vir address of allocated buffer %p",\
+                            tempbuffer->bufferaddr);
+                    fillbuffer.buffer.buffer_len = tempbuffer->buffer_len;
+                    fillbuffer.buffer.bufferaddr = tempbuffer->bufferaddr;
+                    fillbuffer.buffer.offset = tempbuffer->offset;
+                    fillbuffer.buffer.pmem_fd = tempbuffer->pmem_fd;
+                    fillbuffer.client_data = (void *)outputbuffer;
+
+                    ioctl_msg.in = &fillbuffer;
+                    ioctl_msg.out = NULL;
+
+                    if (ioctl (decode_context->video_driver_fd,
+                                VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+                        DEBUG_PRINT("\n Decoder frame failed");
+                        return NULL;
+                    }
+
+                    break;
+
+                case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+                    DEBUG_PRINT("\n Flush input complete");
+                    sem_post (&decode_context->sem_synchronize);
+                    break;
+
+                case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+                    DEBUG_PRINT("\n Flush output complete");
+                    sem_post (&decode_context->sem_synchronize);
+                    break;
+            }
+
+            if (queueitem->cmd == VDEC_MSG_RESP_STOP_DONE) {
+                DEBUG_PRINT("\n Playback has ended thread will exit");
+                return NULL;
+            }
+        } else {
+            DEBUG_PRINT("\n Error condition recieved NULL from Queue");
+        }
+
+    }
+}
+
+static void* async_thread (void *context)
+{
+    struct video_decoder_context *decode_context = NULL;
+    struct vdec_output_frameinfo *outputframe = NULL;
+    struct video_msgq queueitem ;
+    struct vdec_msginfo vdec_msg;
+    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+    int result = -1;
+
+    if (context == NULL) {
+        DEBUG_PRINT("\n aynsc thread recieved NULL context");
+        return NULL;
+    }
+
+    decode_context = (struct video_decoder_context *) context;
+    DEBUG_PRINT("\n Entering the async thread");
+
+    while (1) {
+        ioctl_msg.in = NULL;
+
+        ioctl_msg.out = (void*)&vdec_msg;
+        DEBUG_PRINT ("\n Sizeof vdec_msginfo = %d ",sizeof (vdec_msg));
+        DEBUG_PRINT("\n Address of Vdec msg in async thread %p",\
+                ioctl_msg.out);
+
+        if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,\
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Error in ioctl read next msg");
+        } else {
+            switch (vdec_msg.msgcode) {
+                case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+                case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+                case VDEC_MSG_RESP_START_DONE:
+                case VDEC_MSG_RESP_STOP_DONE:
+                case VDEC_MSG_EVT_HW_ERROR:
+                    DEBUG_PRINT("\nioctl read next msg");
+                    queueitem.cmd = vdec_msg.msgcode;
+                    queueitem.status = vdec_msg.status_code;
+                    queueitem.clientdata = NULL;
+                    break;
+
+                case VDEC_MSG_RESP_INPUT_FLUSHED:
+                case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
+
+                    queueitem.cmd = vdec_msg.msgcode;
+                    queueitem.status = vdec_msg.status_code;
+                    queueitem.clientdata = (void *)\
+                                   vdec_msg.msgdata.input_frame_clientdata;
+                    break;
+
+                case VDEC_MSG_RESP_OUTPUT_FLUSHED:
+                case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+                    queueitem.cmd = vdec_msg.msgcode;
+                    queueitem.status = vdec_msg.status_code;
+                    outputframe = (struct vdec_output_frameinfo *)\
+                              vdec_msg.msgdata.output_frame.client_data;
+                    DEBUG_PRINT ("\n Client Data value in %p", \
+                            vdec_msg.msgdata.output_frame.client_data);
+                    outputframe->bufferaddr = vdec_msg.msgdata.output_frame.bufferaddr;
+                    outputframe->framesize.bottom = \
+                                    vdec_msg.msgdata.output_frame.framesize.bottom;
+                    outputframe->framesize.left = \
+                                      vdec_msg.msgdata.output_frame.framesize.left;
+                    outputframe->framesize.right = \
+                                       vdec_msg.msgdata.output_frame.framesize.right;
+                    outputframe->framesize.top = \
+                                     vdec_msg.msgdata.output_frame.framesize.top;
+                    outputframe->framesize = vdec_msg.msgdata.output_frame.framesize;
+                    outputframe->len = vdec_msg.msgdata.output_frame.len;
+                    outputframe->time_stamp = vdec_msg.msgdata.output_frame.time_stamp;
+                    queueitem.clientdata = (void *)outputframe;
+                    DEBUG_PRINT ("\n Client Data value Copy %p",queueitem.clientdata);
+                    break;
+
+                default:
+                    DEBUG_PRINT("\nIn Default of get next message %d",vdec_msg.msgcode);
+                    queueitem.cmd = vdec_msg.msgcode;
+                    queueitem.status = vdec_msg.status_code;
+                    queueitem.clientdata = NULL;
+                    break;
+            }
+
+            result = queue_post_cmdq (&decode_context->queue_context,&queueitem);
+
+            while (result == 0) {
+                result = queue_post_cmdq (&decode_context->queue_context,
+                        &queueitem);
+            }
+
+            if (result == -1) {
+                DEBUG_PRINT("\n FATAL ERROR WITH Queue");
+            }
+        }
+
+        if (vdec_msg.msgcode == VDEC_MSG_RESP_STOP_DONE) {
+            /*Thread can exit at this point*/
+            return NULL;
+        }
+    }
+}
+
+
+static unsigned int read_frame (unsigned char *dataptr, unsigned int length,
+        FILE * inputBufferFile)
+{
+
+    unsigned int readOffset = 0;
+    int bytes_read = 0;
+    unsigned int code = 0;
+    int found = 0;
+
+    DEBUG_PRINT ("\n Inside the readframe");
+
+    if (dataptr == NULL || length == 0) {
+        DEBUG_PRINT ("\n dataptr = %p length = %u",dataptr,length);
+        return 0;
+    }
+
+    if (!Code_type) {
+        /* Start of Critical Section*/
+        pthread_mutex_lock(&read_lock);
+
+        do {
+            //Start codes are always byte aligned.
+            bytes_read = fread(&dataptr[readOffset],1, 1,inputBufferFile);
+
+            if ( !bytes_read) {
+                DEBUG_PRINT("\n Bytes read Zero \n");
+                break;
+            }
+
+            code <<= 8;
+            code |= (0x000000FF & dataptr[readOffset]);
+
+            //VOP start code comparision
+            if (readOffset>3) {
+                if (!header_code ) {
+                    if ( VOP_START_CODE == code) {
+                        DEBUG_PRINT ("\n Found VOP Code");
+                        header_code = VOP_START_CODE;
+                    } else if ( (0xFFFFFC00 & code) == SHORT_HEADER_START_CODE ) {
+                        header_code = SHORT_HEADER_START_CODE;
+                    }
+                }
+
+                if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE)) {
+                    //Seek backwards by 4
+                    fseek(inputBufferFile, -4, SEEK_CUR);
+                    readOffset-=4;
+                    found = 1;
+                    break;
+
+                } else if (( header_code == SHORT_HEADER_START_CODE ) &&
+                        ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00))) {
+                    //Seek backwards by 4
+                    fseek(inputBufferFile, -4, SEEK_CUR);
+                    readOffset-=4;
+                    found = 1;
+                    break;
+                }
+            }
+
+            readOffset++;
+        } while (readOffset < length);
+
+        pthread_mutex_unlock(&read_lock);
+
+        /* End of Critical Section*/
+        if (found == 1) {
+            //DEBUG_PRINT ("Found a Frame");
+            return (readOffset+1);
+        } else {
+            //DEBUG_PRINT ("No Frames detected");
+            return 0;
+        }
+    } else {
+
+        readOffset = Read_Buffer_From_DAT_File(dataptr,length,inputBufferFile);
+
+        if (total_frames == 0) {
+            bytes_read = Read_Buffer_From_DAT_File(&dataptr[readOffset],
+                    (length-readOffset),
+                    inputBufferFile);
+            readOffset += bytes_read;
+        }
+
+        return (readOffset);
+    }
+
+}
+
+static int Read_Buffer_From_DAT_File(unsigned char *dataptr, unsigned int length,
+        FILE * inputBufferFile)
+{
+
+
+    long frameSize=0;
+    char temp_buffer[10];
+    char temp_byte;
+    int bytes_read=0;
+    int i=0;
+    unsigned char *read_buffer=NULL;
+    char c = '1'; //initialize to anything except '\0'(0)
+    char inputFrameSize[12];
+    int count =0;
+    char cnt =0;
+    memset(temp_buffer, 0, sizeof(temp_buffer));
+
+    while (cnt < 10)
+        /* Check the input file format, may result in infinite loop */
+    {
+        count  = fread(&inputFrameSize[cnt],1,1,inputBufferFile);
+
+        if (inputFrameSize[cnt] == '\0' )
+            break;
+
+        cnt++;
+    }
+
+    inputFrameSize[cnt]='\0';
+    frameSize = atoi(inputFrameSize);
+    //length = 0;
+    DEBUG_PRINT ("\n Frame Size is %d",frameSize);
+
+    /* get the frame length */
+    fseek(inputBufferFile, -1, SEEK_CUR);
+    bytes_read = fread(dataptr, 1, frameSize,  inputBufferFile);
+
+    if (bytes_read == 0 || bytes_read < frameSize ) {
+        return 0;
+    }
+
+    return bytes_read;
+}
diff --git a/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp b/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp
index a191ee2..974bee1 100644
--- a/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp
+++ b/mm-video-v4l2/vidc/vdec/test/omx_vdec_test.cpp
@@ -54,18 +54,18 @@
 #ifdef _ANDROID_
 #include <binder/MemoryHeapBase.h>
 
-extern "C"{
+extern "C" {
 #include<utils/Log.h>
 }
 #define DEBUG_PRINT
 #define DEBUG_PRINT_ERROR ALOGE
 
 //#define __DEBUG_DIVX__ // Define this macro to print (through logcat)
-                         // the kind of frames packed per buffer and
-                         // timestamps adjustments for divx.
+// the kind of frames packed per buffer and
+// timestamps adjustments for divx.
 
 //#define TEST_TS_FROM_SEI // Define this macro to calculate the timestamps
-                           // from the SEI and VUI data for H264
+// from the SEI and VUI data for H264
 
 #else
 #include <glib.h>
@@ -109,7 +109,7 @@
 static int previous_vc1_au = 0;
 #define CONFIG_VERSION_SIZE(param) \
     param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\
-    param.nSize = sizeof(param);
+param.nSize = sizeof(param);
 
 #define FAILED(result) (result != OMX_ErrorNone)
 
@@ -142,135 +142,136 @@
 const uint16 CRC_INIT = 0xFFFF ;
 
 const uint16 crc_16_l_table[ 256 ] = {
-  0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
-  0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
-  0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
-  0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
-  0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
-  0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
-  0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
-  0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
-  0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
-  0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
-  0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
-  0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
-  0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
-  0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
-  0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
-  0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
-  0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
-  0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
-  0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
-  0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
-  0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
-  0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
-  0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
-  0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
-  0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
-  0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
-  0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
-  0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
-  0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
-  0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
-  0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
-  0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+    0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+    0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+    0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+    0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+    0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+    0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+    0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+    0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+    0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+    0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+    0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+    0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+    0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+    0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+    0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+    0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+    0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+    0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+    0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+    0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+    0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+    0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+    0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+    0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+    0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+    0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+    0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+    0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+    0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+    0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+    0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+    0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
 };
 
 #ifdef ANDROID_JELLYBEAN_MR1
 //Since this is unavailable on Android 4.2.2, defining it in terms of base 10
-static inline float log2f(const float& x) {
+static inline float log2f(const float& x)
+{
     return log(x) / log(2);
 }
 #endif
 
 uint16 crc_16_l_step_nv12 (uint16 seed, const void *buf_ptr,
-	unsigned int byte_len, unsigned int height, unsigned int width)
+        unsigned int byte_len, unsigned int height, unsigned int width)
 {
-  uint16 crc_16 = ~seed;
-  char *buf = (char *)buf_ptr;
-  char *byte_ptr = buf;
-  int i, j;
-  const unsigned int width_align = 32;
-  const unsigned int height_align = 32;
-  unsigned int stride = (width + width_align -1) & (~(width_align-1));
-  unsigned int scan_lines = (height + height_align -1) & (~(height_align-1));
-  for (i = 0; i < height; i++) {
-	  for (j = 0; j < stride; j++) {
-		  if (j < width) {
-			  crc_16 = crc_16_l_table[ (crc_16 ^ *byte_ptr) & 0x00ff ] ^ (crc_16 >> 8);
-		  }
-		  byte_ptr++;
-	  }
-  }
-  byte_ptr = buf + (scan_lines * stride);
-  for (i = scan_lines; i < scan_lines + height/2;i++) {
-	  for (j = 0; j < stride; j++) {
-		  if (j < width) {
-			  crc_16 = crc_16_l_table[ (crc_16 ^ *byte_ptr) & 0x00ff ] ^ (crc_16 >> 8);
-		  }
-		  byte_ptr++;
-	  }
-  }
-  return( ~crc_16 );
+    uint16 crc_16 = ~seed;
+    char *buf = (char *)buf_ptr;
+    char *byte_ptr = buf;
+    int i, j;
+    const unsigned int width_align = 32;
+    const unsigned int height_align = 32;
+    unsigned int stride = (width + width_align -1) & (~(width_align-1));
+    unsigned int scan_lines = (height + height_align -1) & (~(height_align-1));
+    for (i = 0; i < height; i++) {
+        for (j = 0; j < stride; j++) {
+            if (j < width) {
+                crc_16 = crc_16_l_table[ (crc_16 ^ *byte_ptr) & 0x00ff ] ^ (crc_16 >> 8);
+            }
+            byte_ptr++;
+        }
+    }
+    byte_ptr = buf + (scan_lines * stride);
+    for (i = scan_lines; i < scan_lines + height/2; i++) {
+        for (j = 0; j < stride; j++) {
+            if (j < width) {
+                crc_16 = crc_16_l_table[ (crc_16 ^ *byte_ptr) & 0x00ff ] ^ (crc_16 >> 8);
+            }
+            byte_ptr++;
+        }
+    }
+    return( ~crc_16 );
 }
 #endif
 
 typedef enum {
-  CODEC_FORMAT_H264 = 1,
-  CODEC_FORMAT_MP4,
-  CODEC_FORMAT_H263,
-  CODEC_FORMAT_VC1,
-  CODEC_FORMAT_DIVX,
-  CODEC_FORMAT_MPEG2,
+    CODEC_FORMAT_H264 = 1,
+    CODEC_FORMAT_MP4,
+    CODEC_FORMAT_H263,
+    CODEC_FORMAT_VC1,
+    CODEC_FORMAT_DIVX,
+    CODEC_FORMAT_MPEG2,
 #ifdef _MSM8974_
-  CODEC_FORMAT_VP8,
-  CODEC_FORMAT_HEVC,
+    CODEC_FORMAT_VP8,
+    CODEC_FORMAT_HEVC,
 #endif
-  CODEC_FORMAT_MAX
+    CODEC_FORMAT_MAX
 } codec_format;
 
 typedef enum {
-  FILE_TYPE_DAT_PER_AU = 1,
-  FILE_TYPE_ARBITRARY_BYTES,
-  FILE_TYPE_COMMON_CODEC_MAX,
+    FILE_TYPE_DAT_PER_AU = 1,
+    FILE_TYPE_ARBITRARY_BYTES,
+    FILE_TYPE_COMMON_CODEC_MAX,
 
-  FILE_TYPE_START_OF_H264_SPECIFIC = 10,
-  FILE_TYPE_264_NAL_SIZE_LENGTH = FILE_TYPE_START_OF_H264_SPECIFIC,
-  FILE_TYPE_264_START_CODE_BASED,
+    FILE_TYPE_START_OF_H264_SPECIFIC = 10,
+    FILE_TYPE_264_NAL_SIZE_LENGTH = FILE_TYPE_START_OF_H264_SPECIFIC,
+    FILE_TYPE_264_START_CODE_BASED,
 
-  FILE_TYPE_START_OF_MP4_SPECIFIC = 20,
-  FILE_TYPE_PICTURE_START_CODE = FILE_TYPE_START_OF_MP4_SPECIFIC,
+    FILE_TYPE_START_OF_MP4_SPECIFIC = 20,
+    FILE_TYPE_PICTURE_START_CODE = FILE_TYPE_START_OF_MP4_SPECIFIC,
 
-  FILE_TYPE_START_OF_VC1_SPECIFIC = 30,
-  FILE_TYPE_RCV = FILE_TYPE_START_OF_VC1_SPECIFIC,
-  FILE_TYPE_VC1,
+    FILE_TYPE_START_OF_VC1_SPECIFIC = 30,
+    FILE_TYPE_RCV = FILE_TYPE_START_OF_VC1_SPECIFIC,
+    FILE_TYPE_VC1,
 
-  FILE_TYPE_START_OF_DIVX_SPECIFIC = 40,
-  FILE_TYPE_DIVX_4_5_6 = FILE_TYPE_START_OF_DIVX_SPECIFIC,
-  FILE_TYPE_DIVX_311,
+    FILE_TYPE_START_OF_DIVX_SPECIFIC = 40,
+    FILE_TYPE_DIVX_4_5_6 = FILE_TYPE_START_OF_DIVX_SPECIFIC,
+    FILE_TYPE_DIVX_311,
 
-  FILE_TYPE_START_OF_MPEG2_SPECIFIC = 50,
-  FILE_TYPE_MPEG2_START_CODE = FILE_TYPE_START_OF_MPEG2_SPECIFIC,
+    FILE_TYPE_START_OF_MPEG2_SPECIFIC = 50,
+    FILE_TYPE_MPEG2_START_CODE = FILE_TYPE_START_OF_MPEG2_SPECIFIC,
 
 #ifdef _MSM8974_
-  FILE_TYPE_START_OF_VP8_SPECIFIC = 60,
-  FILE_TYPE_VP8_START_CODE = FILE_TYPE_START_OF_VP8_SPECIFIC,
-  FILE_TYPE_VP8
+    FILE_TYPE_START_OF_VP8_SPECIFIC = 60,
+    FILE_TYPE_VP8_START_CODE = FILE_TYPE_START_OF_VP8_SPECIFIC,
+    FILE_TYPE_VP8
 #endif
 
 } file_type;
 
 typedef enum {
-  GOOD_STATE = 0,
-  PORT_SETTING_CHANGE_STATE,
-  ERROR_STATE
+    GOOD_STATE = 0,
+    PORT_SETTING_CHANGE_STATE,
+    ERROR_STATE
 } test_status;
 
 typedef enum {
-  FREE_HANDLE_AT_LOADED = 1,
-  FREE_HANDLE_AT_IDLE,
-  FREE_HANDLE_AT_EXECUTING,
-  FREE_HANDLE_AT_PAUSE
+    FREE_HANDLE_AT_LOADED = 1,
+    FREE_HANDLE_AT_IDLE,
+    FREE_HANDLE_AT_EXECUTING,
+    FREE_HANDLE_AT_PAUSE
 } freeHandle_test;
 
 struct temp_egl {
@@ -436,59 +437,59 @@
 static int Read_Buffer_From_DivX_311_File(OMX_BUFFERHEADERTYPE  *pBufHdr);
 
 static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *dec_handle,
-                                       OMX_BUFFERHEADERTYPE  ***pBufHdrs,
-                                       OMX_U32 nPortIndex,
-                                       long bufCntMin, long bufSize);
+        OMX_BUFFERHEADERTYPE  ***pBufHdrs,
+        OMX_U32 nPortIndex,
+        long bufCntMin, long bufSize);
 
 static OMX_ERRORTYPE use_input_buffer(OMX_COMPONENTTYPE      *dec_handle,
-                                OMX_BUFFERHEADERTYPE ***bufferHdr,
-                                OMX_U32              nPortIndex,
-                                OMX_U32              bufSize,
-                                long                 bufcnt);
+        OMX_BUFFERHEADERTYPE ***bufferHdr,
+        OMX_U32              nPortIndex,
+        OMX_U32              bufSize,
+        long                 bufcnt);
 
 static OMX_ERRORTYPE use_output_buffer(OMX_COMPONENTTYPE      *dec_handle,
-                                OMX_BUFFERHEADERTYPE ***bufferHdr,
-                                OMX_U32              nPortIndex,
-                                OMX_U32              bufSize,
-                                long                 bufcnt);
+        OMX_BUFFERHEADERTYPE ***bufferHdr,
+        OMX_U32              nPortIndex,
+        OMX_U32              bufSize,
+        long                 bufcnt);
 
 static OMX_ERRORTYPE use_output_buffer_multiple_fd(OMX_COMPONENTTYPE      *dec_handle,
-                                                   OMX_BUFFERHEADERTYPE ***bufferHdr,
-                                                   OMX_U32              nPortIndex,
-                                                   OMX_U32              bufSize,
-                                                   long                 bufcnt);
+        OMX_BUFFERHEADERTYPE ***bufferHdr,
+        OMX_U32              nPortIndex,
+        OMX_U32              bufSize,
+        long                 bufcnt);
 
 static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
-                                  OMX_IN OMX_PTR pAppData,
-                                  OMX_IN OMX_EVENTTYPE eEvent,
-                                  OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
-                                  OMX_IN OMX_PTR pEventData);
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_EVENTTYPE eEvent,
+        OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
+        OMX_IN OMX_PTR pEventData);
 static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
-                                     OMX_IN OMX_PTR pAppData,
-                                     OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
 static OMX_ERRORTYPE FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
-                                    OMX_OUT OMX_PTR pAppData,
-                                    OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
+        OMX_OUT OMX_PTR pAppData,
+        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
 
 static void do_freeHandle_and_clean_up(bool isDueToError);
 
 #ifndef USE_ION
 static bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                                  OMX_U32 alignment);
+        OMX_U32 alignment);
 #endif
 void getFreePmem();
 static int overlay_vsync_ctrl(int enable);
 
 static  int clip2(int x)
-    {
-        x = x -1;
-        x = x | x >> 1;
-        x = x | x >> 2;
-        x = x | x >> 4;
-        x = x | x >> 16;
-        x = x + 1;
-        return x;
-    }
+{
+    x = x -1;
+    x = x | x >> 1;
+    x = x | x >> 2;
+    x = x | x >> 4;
+    x = x | x >> 16;
+    x = x + 1;
+    return x;
+}
 void wait_for_event(void)
 {
     DEBUG_PRINT("Waiting for event\n");
@@ -513,11 +514,11 @@
 int get_next_command(FILE *seq_file)
 {
     int i = -1;
-    do{
+    do {
         i++;
-        if(fread(&curr_seq_command[i], 1, 1, seq_file) != 1)
+        if (fread(&curr_seq_command[i], 1, 1, seq_file) != 1)
             return -1;
-    }while(curr_seq_command[i] != '\n');
+    } while (curr_seq_command[i] != '\n');
     curr_seq_command[i] = 0;
     printf("\n cmd_str = %s", curr_seq_command);
     return 0;
@@ -529,56 +530,45 @@
     unsigned int data = 0, bufCnt = 0, i = 0;
     int frameSize;
 
-    if(strstr(seq_command, "pause") == seq_command)
-    {
+    if (strstr(seq_command, "pause") == seq_command) {
         printf("\n\n $$$$$   PAUSE    $$$$$");
         data_str = (char*)seq_command + strlen("pause") + 1;
         data = atoi(data_str);
         printf("\n After frame number %u", data);
         cmd_data = data;
         sem_wait(&seq_sem);
-        if (!bOutputEosReached && !bInputEosReached)
-        {
+        if (!bOutputEosReached && !bInputEosReached) {
             printf("\n Sending PAUSE cmd to OMX compt");
             OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
             wait_for_event();
             printf("\n EventHandler for PAUSE DONE");
-        }
-        else
+        } else
             seq_enabled = 0;
-    }
-    else if(strstr(seq_command, "sleep") == seq_command)
-    {
+    } else if (strstr(seq_command, "sleep") == seq_command) {
         printf("\n\n $$$$$   SLEEP    $$$$$");
         data_str = (char*)seq_command + strlen("sleep") + 1;
         data = atoi(data_str);
         printf("\n Sleep Time = %u ms", data);
         usleep(data*1000);
-    }
-    else if(strstr(seq_command, "resume") == seq_command)
-    {
+    } else if (strstr(seq_command, "resume") == seq_command) {
         printf("\n\n $$$$$   RESUME    $$$$$");
         printf("\n Immediate effect");
         printf("\n Sending RESUME cmd to OMX compt");
         OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
         wait_for_event();
         printf("\n EventHandler for RESUME DONE");
-    }
-    else if(strstr(seq_command, "flush") == seq_command)
-    {
+    } else if (strstr(seq_command, "flush") == seq_command) {
         printf("\n\n $$$$$   FLUSH    $$$$$");
         data_str = (char*)seq_command + strlen("flush") + 1;
         data = atoi(data_str);
         printf("\n After frame number %u", data);
-        if (previous_vc1_au)
-        {
+        if (previous_vc1_au) {
             printf("\n Flush not allowed on Field boundary");
             return 0;
         }
         cmd_data = data;
         sem_wait(&seq_sem);
-        if (!bOutputEosReached && !bInputEosReached)
-        {
+        if (!bOutputEosReached && !bInputEosReached) {
             printf("\n Sending FLUSH cmd to OMX compt");
             flush_input_progress = 1;
             flush_output_progress = 1;
@@ -589,12 +579,9 @@
             sem_post(&in_flush_sem);
             printf("\n Post FBD_thread flush sem");
             sem_post(&out_flush_sem);
-        }
-        else
+        } else
             seq_enabled = 0;
-    }
-    else if(strstr(seq_command, "disable_op") == seq_command)
-    {
+    } else if (strstr(seq_command, "disable_op") == seq_command) {
         printf("\n\n $$$$$   DISABLE OP PORT    $$$$$");
         data_str = (char*)seq_command + strlen("disable_op") + 1;
         data = atoi(data_str);
@@ -602,31 +589,23 @@
         cmd_data = data;
         sem_wait(&seq_sem);
         printf("\n Sending DISABLE OP cmd to OMX compt");
-        if (disable_output_port() != 0)
-        {
+        if (disable_output_port() != 0) {
             printf("\n ERROR: While DISABLE OP...");
             do_freeHandle_and_clean_up(true);
             return -1;
-        }
-        else
+        } else
             printf("\n EventHandler for DISABLE OP");
-    }
-    else if(strstr(seq_command, "enable_op") == seq_command)
-    {
+    } else if (strstr(seq_command, "enable_op") == seq_command) {
         printf("\n\n $$$$$   ENABLE OP PORT    $$$$$");
         data_str = (char*)seq_command + strlen("enable_op") + 1;
         printf("\n Sending ENABLE OP cmd to OMX compt");
-        if (enable_output_port() != 0)
-        {
+        if (enable_output_port() != 0) {
             printf("\n ERROR: While ENABLE OP...");
             do_freeHandle_and_clean_up(true);
             return -1;
-        }
-        else
+        } else
             printf("\n EventHandler for ENABLE OP");
-    }
-    else
-    {
+    } else {
         printf("\n\n $$$$$   INVALID CMD    $$$$$");
         printf("\n seq_command[%s] is invalid", seq_command);
         seq_enabled = 0;
@@ -636,508 +615,457 @@
 
 void PrintFramePackArrangement(OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement)
 {
-   printf("id (%d)\n",
-          framePackingArrangement.id);
-   printf("cancel_flag (%d)\n",
-          framePackingArrangement.cancel_flag);
-   printf("type (%d)\n",
-          framePackingArrangement.type);
-   printf("quincunx_sampling_flag (%d)\n",
-          framePackingArrangement.quincunx_sampling_flag);
-   printf("content_interpretation_type (%d)\n",
-          framePackingArrangement.content_interpretation_type);
-   printf("spatial_flipping_flag (%d)\n",
-          framePackingArrangement.spatial_flipping_flag);
-   printf("frame0_flipped_flag (%d)\n",
-          framePackingArrangement.frame0_flipped_flag);
-   printf("field_views_flag (%d)\n",
-          framePackingArrangement.field_views_flag);
-   printf("current_frame_is_frame0_flag (%d)\n",
-          framePackingArrangement.current_frame_is_frame0_flag);
-   printf("frame0_self_contained_flag (%d)\n",
-          framePackingArrangement.frame0_self_contained_flag);
-   printf("frame1_self_contained_flag (%d)\n",
-          framePackingArrangement.frame1_self_contained_flag);
-   printf("frame0_grid_position_x (%d)\n",
-          framePackingArrangement.frame0_grid_position_x);
-   printf("frame0_grid_position_y (%d)\n",
-          framePackingArrangement.frame0_grid_position_y);
-   printf("frame1_grid_position_x (%d)\n",
-          framePackingArrangement.frame1_grid_position_x);
-   printf("frame1_grid_position_y (%d)\n",
-          framePackingArrangement.frame1_grid_position_y);
-   printf("reserved_byte (%d)\n",
-          framePackingArrangement.reserved_byte);
-   printf("repetition_period (%d)\n",
-          framePackingArrangement.repetition_period);
-   printf("extension_flag (%d)\n",
-          framePackingArrangement.extension_flag);
+    printf("id (%d)\n",
+            framePackingArrangement.id);
+    printf("cancel_flag (%d)\n",
+            framePackingArrangement.cancel_flag);
+    printf("type (%d)\n",
+            framePackingArrangement.type);
+    printf("quincunx_sampling_flag (%d)\n",
+            framePackingArrangement.quincunx_sampling_flag);
+    printf("content_interpretation_type (%d)\n",
+            framePackingArrangement.content_interpretation_type);
+    printf("spatial_flipping_flag (%d)\n",
+            framePackingArrangement.spatial_flipping_flag);
+    printf("frame0_flipped_flag (%d)\n",
+            framePackingArrangement.frame0_flipped_flag);
+    printf("field_views_flag (%d)\n",
+            framePackingArrangement.field_views_flag);
+    printf("current_frame_is_frame0_flag (%d)\n",
+            framePackingArrangement.current_frame_is_frame0_flag);
+    printf("frame0_self_contained_flag (%d)\n",
+            framePackingArrangement.frame0_self_contained_flag);
+    printf("frame1_self_contained_flag (%d)\n",
+            framePackingArrangement.frame1_self_contained_flag);
+    printf("frame0_grid_position_x (%d)\n",
+            framePackingArrangement.frame0_grid_position_x);
+    printf("frame0_grid_position_y (%d)\n",
+            framePackingArrangement.frame0_grid_position_y);
+    printf("frame1_grid_position_x (%d)\n",
+            framePackingArrangement.frame1_grid_position_x);
+    printf("frame1_grid_position_y (%d)\n",
+            framePackingArrangement.frame1_grid_position_y);
+    printf("reserved_byte (%d)\n",
+            framePackingArrangement.reserved_byte);
+    printf("repetition_period (%d)\n",
+            framePackingArrangement.repetition_period);
+    printf("extension_flag (%d)\n",
+            framePackingArrangement.extension_flag);
 }
 void* ebd_thread(void* pArg)
 {
-  int signal_eos = 0;
-  while(currentStatus != ERROR_STATE)
-  {
-    int readBytes =0;
-    OMX_BUFFERHEADERTYPE* pBuffer = NULL;
+    int signal_eos = 0;
+    while (currentStatus != ERROR_STATE) {
+        int readBytes =0;
+        OMX_BUFFERHEADERTYPE* pBuffer = NULL;
 
-    if(flush_input_progress)
-    {
-        DEBUG_PRINT("\n EBD_thread flush wait start");
-        sem_wait(&in_flush_sem);
-        DEBUG_PRINT("\n EBD_thread flush wait complete");
-    }
+        if (flush_input_progress) {
+            DEBUG_PRINT("\n EBD_thread flush wait start");
+            sem_wait(&in_flush_sem);
+            DEBUG_PRINT("\n EBD_thread flush wait complete");
+        }
 
-    sem_wait(&etb_sem);
-    pthread_mutex_lock(&etb_lock);
-    pBuffer = (OMX_BUFFERHEADERTYPE *) pop(etb_queue);
-    pthread_mutex_unlock(&etb_lock);
-    if(pBuffer == NULL)
-    {
-      DEBUG_PRINT_ERROR("Error - No etb pBuffer to dequeue\n");
-      continue;
-    }
+        sem_wait(&etb_sem);
+        pthread_mutex_lock(&etb_lock);
+        pBuffer = (OMX_BUFFERHEADERTYPE *) pop(etb_queue);
+        pthread_mutex_unlock(&etb_lock);
+        if (pBuffer == NULL) {
+            DEBUG_PRINT_ERROR("Error - No etb pBuffer to dequeue\n");
+            continue;
+        }
 
-    if (num_frames_to_decode && (etb_count >= num_frames_to_decode)) {
-        printf("\n Signal EOS %d frames decoded \n", num_frames_to_decode);
-       signal_eos = 1;
-    }
+        if (num_frames_to_decode && (etb_count >= num_frames_to_decode)) {
+            printf("\n Signal EOS %d frames decoded \n", num_frames_to_decode);
+            signal_eos = 1;
+        }
 
-    pBuffer->nOffset = 0;
-    if(((readBytes = Read_Buffer(pBuffer)) > 0) && !signal_eos) {
-        pBuffer->nFilledLen = readBytes;
-        DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
-        OMX_EmptyThisBuffer(dec_handle,pBuffer);
-        etb_count++;
+        pBuffer->nOffset = 0;
+        if (((readBytes = Read_Buffer(pBuffer)) > 0) && !signal_eos) {
+            pBuffer->nFilledLen = readBytes;
+            DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
+            OMX_EmptyThisBuffer(dec_handle,pBuffer);
+            etb_count++;
+        } else {
+            pBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
+            bInputEosReached = true;
+            pBuffer->nFilledLen = readBytes;
+            DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
+            OMX_EmptyThisBuffer(dec_handle,pBuffer);
+            DEBUG_PRINT("EBD::Either EOS or Some Error while reading file\n");
+            etb_count++;
+            break;
+        }
     }
-    else
-    {
-        pBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
-        bInputEosReached = true;
-        pBuffer->nFilledLen = readBytes;
-        DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
-        OMX_EmptyThisBuffer(dec_handle,pBuffer);
-        DEBUG_PRINT("EBD::Either EOS or Some Error while reading file\n");
-        etb_count++;
-        break;
-    }
-  }
-  return NULL;
+    return NULL;
 }
 
 void* fbd_thread(void* pArg)
 {
-  long unsigned act_time = 0, display_time = 0, render_time = 5e3, lipsync = 15e3;
-  struct timeval t_avsync = {0, 0}, base_avsync = {0, 0};
-  float total_time = 0;
-  int canDisplay = 1, contigous_drop_frame = 0, bytes_written = 0, ret = 0;
-  OMX_S64 base_timestamp = 0, lastTimestamp = 0;
-  OMX_BUFFERHEADERTYPE *pBuffer = NULL, *pPrevBuff = NULL;
-  char value[PROPERTY_VALUE_MAX] = {0};
-  OMX_U32 aspectratio_prop = 0;
-  pthread_mutex_lock(&eos_lock);
-#ifdef _MSM8974_
-  int stride,scanlines,stride_c,i;
-#endif
-  DEBUG_PRINT("First Inside %s\n", __FUNCTION__);
-  property_get("vidc.vdec.debug.aspectratio", value, "0");
-  aspectratio_prop = atoi(value);
-  while(currentStatus != ERROR_STATE && !bOutputEosReached)
-  {
-    pthread_mutex_unlock(&eos_lock);
-    DEBUG_PRINT("Inside %s\n", __FUNCTION__);
-    if(flush_output_progress)
-    {
-        DEBUG_PRINT("\n FBD_thread flush wait start");
-        sem_wait(&out_flush_sem);
-        DEBUG_PRINT("\n FBD_thread flush wait complete");
-    }
-    sem_wait(&fbd_sem);
-    pthread_mutex_lock(&enable_lock);
-    if (sent_disabled)
-    {
-      pthread_mutex_unlock(&enable_lock);
-      pthread_mutex_lock(&fbd_lock);
-      if (pPrevBuff != NULL ) {
-        if(push(fbd_queue, (void *)pBuffer))
-            DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
-        else
-            sem_post(&fbd_sem);
-        pPrevBuff = NULL;
-      }
-      if (free_op_buf_cnt == portFmt.nBufferCountActual)
-        free_output_buffers();
-      pthread_mutex_unlock(&fbd_lock);
-      pthread_mutex_lock(&eos_lock);
-      continue;
-    }
-    pthread_mutex_unlock(&enable_lock);
-    if (anti_flickering)
-      pPrevBuff = pBuffer;
-    pthread_mutex_lock(&fbd_lock);
-    pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
-    pthread_mutex_unlock(&fbd_lock);
-    if (pBuffer == NULL)
-    {
-      if (anti_flickering)
-        pBuffer = pPrevBuff;
-      DEBUG_PRINT("Error - No pBuffer to dequeue\n");
-      pthread_mutex_lock(&eos_lock);
-      continue;
-    }
-    else if (pBuffer->nFilledLen > 0)
-    {
-        if (!fbd_cnt)
-        {
-            gettimeofday(&t_start, NULL);
-        }
-      fbd_cnt++;
-      DEBUG_PRINT("%s: fbd_cnt(%d) Buf(%p) Timestamp(%lld)",
-        __FUNCTION__, fbd_cnt, pBuffer, pBuffer->nTimeStamp);
-      canDisplay = 1;
-      if (realtime_display)
-      {
-        if (pBuffer->nTimeStamp != (lastTimestamp + timestampInterval))
-        {
-            DEBUG_PRINT("Unexpected timestamp[%lld]! Expected[%lld]\n",
-                pBuffer->nTimeStamp, lastTimestamp + timestampInterval);
-        }
-        lastTimestamp = pBuffer->nTimeStamp;
-        gettimeofday(&t_avsync, NULL);
-        if (!base_avsync.tv_sec && !base_avsync.tv_usec)
-        {
-          display_time = 0;
-          base_avsync = t_avsync;
-          base_timestamp = pBuffer->nTimeStamp;
-          DEBUG_PRINT("base_avsync Sec(%lu) uSec(%lu) base_timestamp(%lld)",
-              base_avsync.tv_sec, base_avsync.tv_usec, base_timestamp);
-        }
-        else
-        {
-          act_time = (t_avsync.tv_sec - base_avsync.tv_sec) * 1e6
-                     + t_avsync.tv_usec - base_avsync.tv_usec;
-          display_time = pBuffer->nTimeStamp - base_timestamp;
-          DEBUG_PRINT("%s: act_time(%lu) display_time(%lu)",
-              __FUNCTION__, act_time, display_time);
-               //Frame rcvd on time
-          if (((act_time + render_time) >= (display_time - lipsync) &&
-               (act_time + render_time) <= (display_time + lipsync)) ||
-               //Display late frame
-               (contigous_drop_frame > 5))
-              display_time = 0;
-          else if ((act_time + render_time) < (display_time - lipsync))
-              //Delaying early frame
-              display_time -= (lipsync + act_time + render_time);
-          else
-          {
-              //Dropping late frame
-              canDisplay = 0;
-              contigous_drop_frame++;
-          }
-        }
-      }
-      if (displayYuv && canDisplay)
-      {
-          if (display_time)
-              usleep(display_time);
-          ret = overlay_fb(pBuffer);
-          if (ret != 0)
-          {
-            printf("\nERROR in overlay_fb, disabling display!");
-            close_display();
-            displayYuv = 0;
-          }
-          usleep(render_time);
-          contigous_drop_frame = 0;
-      }
-
-      if (takeYuvLog)
-      {
-          if (color_fmt == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m)
-          {
-             printf("\n width: %d height: %d\n", crop_rect.nWidth, crop_rect.nHeight);
-             unsigned int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portFmt.format.video.nFrameWidth);
-             unsigned int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portFmt.format.video.nFrameHeight);
-             char *temp = (char *) pBuffer->pBuffer;
-             int i = 0;
-
-             temp += (stride * (int)crop_rect.nTop) +  (int)crop_rect.nLeft;
-             for (i = 0; i < crop_rect.nHeight; i++) {
-                bytes_written = fwrite(temp, crop_rect.nWidth, 1, outputBufferFile);
-                temp += stride;
-             }
-
-             temp = (char *)pBuffer->pBuffer + stride * scanlines;
-             temp += (stride * (int)crop_rect.nTop) +  (int)crop_rect.nLeft;
-             for(i = 0; i < crop_rect.nHeight/2; i++) {
-                 bytes_written += fwrite(temp, crop_rect.nWidth, 1, outputBufferFile);
-                 temp += stride;
-             }
-         }
-         else
-         {
-             bytes_written = fwrite((const char *)pBuffer->pBuffer,
-                       pBuffer->nFilledLen,1,outputBufferFile);
-         }
-          if (bytes_written < 0) {
-              DEBUG_PRINT("\nFillBufferDone: Failed to write to the file\n");
-          }
-          else {
-              DEBUG_PRINT("\nFillBufferDone: Wrote %d YUV bytes to the file\n",
-                            bytes_written);
-          }
-      }
-#ifdef _MSM8974_
-      if (crcFile) {
-	      uint16 crc_val;
-	      crc_val = crc_16_l_step_nv12(CRC_INIT, pBuffer->pBuffer,
-			      pBuffer->nFilledLen, height, width);
-	      int num_bytes = fwrite(&crc_val, 1, sizeof(crc_val), crcFile);
-	      if (num_bytes < sizeof(crc_val)) {
-		      printf("Failed to write CRC value into file\n");
-	      }
-      }
-#endif
-      if (pBuffer->nFlags & OMX_BUFFERFLAG_EXTRADATA)
-      {
-        OMX_OTHER_EXTRADATATYPE *pExtra;
-        DEBUG_PRINT(">> BUFFER WITH EXTRA DATA RCVD <<<");
-        pExtra = (OMX_OTHER_EXTRADATATYPE *)
-                 ((unsigned)(pBuffer->pBuffer + pBuffer->nOffset +
-                  pBuffer->nFilledLen + 3)&(~3));
-        while(pExtra &&
-              (OMX_U8*)pExtra < (pBuffer->pBuffer + pBuffer->nAllocLen) &&
-              pExtra->eType != OMX_ExtraDataNone )
-        {
-          DEBUG_PRINT("ExtraData : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
-               pBuffer, pBuffer->nTimeStamp, pExtra->eType, pExtra->nDataSize);
-          switch (pExtra->eType)
-          {
-            case OMX_ExtraDataInterlaceFormat:
-            {
-              OMX_STREAMINTERLACEFORMAT *pInterlaceFormat = (OMX_STREAMINTERLACEFORMAT *)pExtra->data;
-              DEBUG_PRINT("OMX_ExtraDataInterlaceFormat: Buf(%p) TSmp(%lld) IntPtr(%p) Fmt(%x)",
-                pBuffer->pBuffer, pBuffer->nTimeStamp,
-                pInterlaceFormat, pInterlaceFormat->nInterlaceFormats);
-              break;
-            }
-            case OMX_ExtraDataFrameInfo:
-            {
-              OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtra->data;
-              DEBUG_PRINT("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
-                pBuffer->pBuffer, pBuffer->nTimeStamp, frame_info->ePicType,
-                frame_info->interlaceType, frame_info->nConcealedMacroblocks);
-              if (aspectratio_prop)
-                DEBUG_PRINT_ERROR(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) DispWidth(%u) DispHeight(%u)",
-                frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
-                frame_info->aspectRatio.aspectRatioY, frame_info->displayAspectRatio.displayHorizontalSize,
-                frame_info->displayAspectRatio.displayVerticalSize);
-              else
-                DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) DispWidth(%u) DispHeight(%u)",
-                frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
-                frame_info->aspectRatio.aspectRatioY, frame_info->displayAspectRatio.displayHorizontalSize,
-                frame_info->displayAspectRatio.displayVerticalSize);
-              DEBUG_PRINT("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
-              for (int i = 0; i < frame_info->panScan.numWindows; i++)
-              {
-                DEBUG_PRINT("WINDOW Lft(%d) Tp(%d) Rgt(%d) Bttm(%d)",
-                  frame_info->panScan.window[i].x,
-                  frame_info->panScan.window[i].y,
-                  frame_info->panScan.window[i].dx,
-                  frame_info->panScan.window[i].dy);
-              }
-              break;
-            }
-            break;
-            case OMX_ExtraDataConcealMB:
-            {
-              OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
-              OMX_U32 concealMBnum = 0, bytes_cnt = 0;
-              while (bytes_cnt < pExtra->nDataSize)
-              {
-                data = *data_ptr;
-                while (data)
-                {
-                  concealMBnum += (data&0x01);
-                  data >>= 1;
-                }
-                data_ptr++;
-                bytes_cnt++;
-              }
-              DEBUG_PRINT("OMX_ExtraDataConcealMB: Buf(%p) TSmp(%lld) ConcealMB(%u)",
-                pBuffer->pBuffer, pBuffer->nTimeStamp, concealMBnum);
-            }
-            break;
-            case OMX_ExtraDataMP2ExtnData:
-            {
-              DEBUG_PRINT("\nOMX_ExtraDataMP2ExtnData");
-              OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
-              OMX_U32 bytes_cnt = 0;
-              while (bytes_cnt < pExtra->nDataSize)
-              {
-                DEBUG_PRINT("\n MPEG-2 Extension Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
-                data_ptr++;
-                bytes_cnt++;
-              }
-            }
-            break;
-            case OMX_ExtraDataMP2UserData:
-            {
-              DEBUG_PRINT("\nOMX_ExtraDataMP2UserData");
-              OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
-              OMX_U32 bytes_cnt = 0;
-              while (bytes_cnt < pExtra->nDataSize)
-              {
-                DEBUG_PRINT("\n MPEG-2 User Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
-                data_ptr++;
-                bytes_cnt++;
-              }
-            }
-            break;
-            default:
-              DEBUG_PRINT_ERROR("Unknown Extrata!");
-          }
-          if (pExtra->nSize < (pBuffer->nAllocLen - (OMX_U32)pExtra))
-            pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) pExtra) + pExtra->nSize);
-          else
-          {
-            DEBUG_PRINT_ERROR("ERROR: Extradata pointer overflow buffer(%p) extra(%p)",
-              pBuffer, pExtra);
-            pExtra = NULL;
-          }
-        }
-      }
-    }
-    if(pBuffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
-    {
-        DEBUG_PRINT("\n");
-        DEBUG_PRINT("***************************************************\n");
-        DEBUG_PRINT("FillBufferDone: End Of Sequence Received\n");
-        DEBUG_PRINT("***************************************************\n");
-    }
-    if(pBuffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
-    {
-      DEBUG_PRINT("\n");
-      DEBUG_PRINT("***************************************************\n");
-      DEBUG_PRINT("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
-      DEBUG_PRINT("***************************************************\n");
-    }
-    /********************************************************************/
-    /* De-Initializing the open max and relasing the buffers and */
-    /* closing the files.*/
-    /********************************************************************/
-    if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS )
-    {
-      OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
-      OMX_GetConfig(dec_handle,
-                   (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
-                    &framePackingArrangement);
-      PrintFramePackArrangement(framePackingArrangement);
-
-      gettimeofday(&t_end, NULL);
-      total_time = ((float) ((t_end.tv_sec - t_start.tv_sec) * 1e6
-                     + t_end.tv_usec - t_start.tv_usec))/ 1e6;
-      //total frames is fbd_cnt - 1 since the start time is
-      //recorded after the first frame is decoded.
-      printf("\nAvg decoding frame rate=%f\n", (fbd_cnt - 1)/total_time);
-
-      DEBUG_PRINT("***************************************************\n");
-      DEBUG_PRINT("FillBufferDone: End Of Stream Reached\n");
-      DEBUG_PRINT("***************************************************\n");
-      pthread_mutex_lock(&eos_lock);
-      bOutputEosReached = true;
-      break;
-    }
-
-    pthread_mutex_lock(&enable_lock);
-    if (flush_output_progress || sent_disabled)
-    {
-        pBuffer->nFilledLen = 0;
-        pBuffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
-        pthread_mutex_lock(&fbd_lock);
-        if ( pPrevBuff != NULL ) {
-            if(push(fbd_queue, (void *)pPrevBuff))
-                DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
-            else
-               sem_post(&fbd_sem);
-            pPrevBuff = NULL;
-        }
-        if(push(fbd_queue, (void *)pBuffer) < 0)
-        {
-          DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
-        }
-        else
-          sem_post(&fbd_sem);
-        pthread_mutex_unlock(&fbd_lock);
-    }
-    else
-    {
-        if (!anti_flickering)
-          pPrevBuff = pBuffer;
-        if (pPrevBuff)
-        {
-          pthread_mutex_lock(&fbd_lock);
-          pthread_mutex_lock(&eos_lock);
-          if (!bOutputEosReached)
-          {
-              if ( OMX_FillThisBuffer(dec_handle, pPrevBuff) == OMX_ErrorNone ) {
-                  free_op_buf_cnt--;
-              }
-          }
-          pthread_mutex_unlock(&eos_lock);
-          pthread_mutex_unlock(&fbd_lock);
-        }
-    }
-    pthread_mutex_unlock(&enable_lock);
-    if(cmd_data <= fbd_cnt)
-    {
-      sem_post(&seq_sem);
-      printf("\n Posted seq_sem Frm(%d) Req(%d)", fbd_cnt, cmd_data);
-      cmd_data = ~(unsigned)0;
-    }
+    long unsigned act_time = 0, display_time = 0, render_time = 5e3, lipsync = 15e3;
+    struct timeval t_avsync = {0, 0}, base_avsync = {0, 0};
+    float total_time = 0;
+    int canDisplay = 1, contigous_drop_frame = 0, bytes_written = 0, ret = 0;
+    OMX_S64 base_timestamp = 0, lastTimestamp = 0;
+    OMX_BUFFERHEADERTYPE *pBuffer = NULL, *pPrevBuff = NULL;
+    char value[PROPERTY_VALUE_MAX] = {0};
+    OMX_U32 aspectratio_prop = 0;
     pthread_mutex_lock(&eos_lock);
-  }
-  if(seq_enabled)
-  {
-      seq_enabled = 0;
-      sem_post(&seq_sem);
-      printf("\n Posted seq_sem in EOS \n");
-  }
-  pthread_cond_broadcast(&eos_cond);
-  pthread_mutex_unlock(&eos_lock);
-  return NULL;
+#ifdef _MSM8974_
+    int stride,scanlines,stride_c,i;
+#endif
+    DEBUG_PRINT("First Inside %s\n", __FUNCTION__);
+    property_get("vidc.vdec.debug.aspectratio", value, "0");
+    aspectratio_prop = atoi(value);
+    while (currentStatus != ERROR_STATE && !bOutputEosReached) {
+        pthread_mutex_unlock(&eos_lock);
+        DEBUG_PRINT("Inside %s\n", __FUNCTION__);
+        if (flush_output_progress) {
+            DEBUG_PRINT("\n FBD_thread flush wait start");
+            sem_wait(&out_flush_sem);
+            DEBUG_PRINT("\n FBD_thread flush wait complete");
+        }
+        sem_wait(&fbd_sem);
+        pthread_mutex_lock(&enable_lock);
+        if (sent_disabled) {
+            pthread_mutex_unlock(&enable_lock);
+            pthread_mutex_lock(&fbd_lock);
+            if (pPrevBuff != NULL ) {
+                if (push(fbd_queue, (void *)pBuffer))
+                    DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
+                else
+                    sem_post(&fbd_sem);
+                pPrevBuff = NULL;
+            }
+            if (free_op_buf_cnt == portFmt.nBufferCountActual)
+                free_output_buffers();
+            pthread_mutex_unlock(&fbd_lock);
+            pthread_mutex_lock(&eos_lock);
+            continue;
+        }
+        pthread_mutex_unlock(&enable_lock);
+        if (anti_flickering)
+            pPrevBuff = pBuffer;
+        pthread_mutex_lock(&fbd_lock);
+        pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
+        pthread_mutex_unlock(&fbd_lock);
+        if (pBuffer == NULL) {
+            if (anti_flickering)
+                pBuffer = pPrevBuff;
+            DEBUG_PRINT("Error - No pBuffer to dequeue\n");
+            pthread_mutex_lock(&eos_lock);
+            continue;
+        } else if (pBuffer->nFilledLen > 0) {
+            if (!fbd_cnt) {
+                gettimeofday(&t_start, NULL);
+            }
+            fbd_cnt++;
+            DEBUG_PRINT("%s: fbd_cnt(%d) Buf(%p) Timestamp(%lld)",
+                    __FUNCTION__, fbd_cnt, pBuffer, pBuffer->nTimeStamp);
+            canDisplay = 1;
+            if (realtime_display) {
+                if (pBuffer->nTimeStamp != (lastTimestamp + timestampInterval)) {
+                    DEBUG_PRINT("Unexpected timestamp[%lld]! Expected[%lld]\n",
+                            pBuffer->nTimeStamp, lastTimestamp + timestampInterval);
+                }
+                lastTimestamp = pBuffer->nTimeStamp;
+                gettimeofday(&t_avsync, NULL);
+                if (!base_avsync.tv_sec && !base_avsync.tv_usec) {
+                    display_time = 0;
+                    base_avsync = t_avsync;
+                    base_timestamp = pBuffer->nTimeStamp;
+                    DEBUG_PRINT("base_avsync Sec(%lu) uSec(%lu) base_timestamp(%lld)",
+                            base_avsync.tv_sec, base_avsync.tv_usec, base_timestamp);
+                } else {
+                    act_time = (t_avsync.tv_sec - base_avsync.tv_sec) * 1e6
+                        + t_avsync.tv_usec - base_avsync.tv_usec;
+                    display_time = pBuffer->nTimeStamp - base_timestamp;
+                    DEBUG_PRINT("%s: act_time(%lu) display_time(%lu)",
+                            __FUNCTION__, act_time, display_time);
+                    //Frame rcvd on time
+                    if (((act_time + render_time) >= (display_time - lipsync) &&
+                                (act_time + render_time) <= (display_time + lipsync)) ||
+                            //Display late frame
+                            (contigous_drop_frame > 5))
+                        display_time = 0;
+                    else if ((act_time + render_time) < (display_time - lipsync))
+                        //Delaying early frame
+                        display_time -= (lipsync + act_time + render_time);
+                    else {
+                        //Dropping late frame
+                        canDisplay = 0;
+                        contigous_drop_frame++;
+                    }
+                }
+            }
+            if (displayYuv && canDisplay) {
+                if (display_time)
+                    usleep(display_time);
+                ret = overlay_fb(pBuffer);
+                if (ret != 0) {
+                    printf("\nERROR in overlay_fb, disabling display!");
+                    close_display();
+                    displayYuv = 0;
+                }
+                usleep(render_time);
+                contigous_drop_frame = 0;
+            }
+
+            if (takeYuvLog) {
+                if (color_fmt == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
+                    printf("\n width: %d height: %d\n", crop_rect.nWidth, crop_rect.nHeight);
+                    unsigned int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portFmt.format.video.nFrameWidth);
+                    unsigned int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portFmt.format.video.nFrameHeight);
+                    char *temp = (char *) pBuffer->pBuffer;
+                    int i = 0;
+
+                    temp += (stride * (int)crop_rect.nTop) +  (int)crop_rect.nLeft;
+                    for (i = 0; i < crop_rect.nHeight; i++) {
+                        bytes_written = fwrite(temp, crop_rect.nWidth, 1, outputBufferFile);
+                        temp += stride;
+                    }
+
+                    temp = (char *)pBuffer->pBuffer + stride * scanlines;
+                    temp += (stride * (int)crop_rect.nTop) +  (int)crop_rect.nLeft;
+                    for (i = 0; i < crop_rect.nHeight/2; i++) {
+                        bytes_written += fwrite(temp, crop_rect.nWidth, 1, outputBufferFile);
+                        temp += stride;
+                    }
+                } else {
+                    bytes_written = fwrite((const char *)pBuffer->pBuffer,
+                            pBuffer->nFilledLen,1,outputBufferFile);
+                }
+                if (bytes_written < 0) {
+                    DEBUG_PRINT("\nFillBufferDone: Failed to write to the file\n");
+                } else {
+                    DEBUG_PRINT("\nFillBufferDone: Wrote %d YUV bytes to the file\n",
+                            bytes_written);
+                }
+            }
+#ifdef _MSM8974_
+            if (crcFile) {
+                uint16 crc_val;
+                crc_val = crc_16_l_step_nv12(CRC_INIT, pBuffer->pBuffer,
+                        pBuffer->nFilledLen, height, width);
+                int num_bytes = fwrite(&crc_val, 1, sizeof(crc_val), crcFile);
+                if (num_bytes < sizeof(crc_val)) {
+                    printf("Failed to write CRC value into file\n");
+                }
+            }
+#endif
+            if (pBuffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
+                OMX_OTHER_EXTRADATATYPE *pExtra;
+                DEBUG_PRINT(">> BUFFER WITH EXTRA DATA RCVD <<<");
+                pExtra = (OMX_OTHER_EXTRADATATYPE *)
+                    ((unsigned)(pBuffer->pBuffer + pBuffer->nOffset +
+                        pBuffer->nFilledLen + 3)&(~3));
+                while (pExtra &&
+                        (OMX_U8*)pExtra < (pBuffer->pBuffer + pBuffer->nAllocLen) &&
+                        pExtra->eType != OMX_ExtraDataNone ) {
+                    DEBUG_PRINT("ExtraData : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
+                            pBuffer, pBuffer->nTimeStamp, pExtra->eType, pExtra->nDataSize);
+                    switch (pExtra->eType) {
+                        case OMX_ExtraDataInterlaceFormat:
+                            {
+                                OMX_STREAMINTERLACEFORMAT *pInterlaceFormat = (OMX_STREAMINTERLACEFORMAT *)pExtra->data;
+                                DEBUG_PRINT("OMX_ExtraDataInterlaceFormat: Buf(%p) TSmp(%lld) IntPtr(%p) Fmt(%x)",
+                                        pBuffer->pBuffer, pBuffer->nTimeStamp,
+                                        pInterlaceFormat, pInterlaceFormat->nInterlaceFormats);
+                                break;
+                            }
+                        case OMX_ExtraDataFrameInfo:
+                            {
+                                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtra->data;
+                                DEBUG_PRINT("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
+                                        pBuffer->pBuffer, pBuffer->nTimeStamp, frame_info->ePicType,
+                                        frame_info->interlaceType, frame_info->nConcealedMacroblocks);
+                                if (aspectratio_prop)
+                                    DEBUG_PRINT_ERROR(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) DispWidth(%u) DispHeight(%u)",
+                                            frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
+                                            frame_info->aspectRatio.aspectRatioY, frame_info->displayAspectRatio.displayHorizontalSize,
+                                            frame_info->displayAspectRatio.displayVerticalSize);
+                                else
+                                    DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) DispWidth(%u) DispHeight(%u)",
+                                            frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
+                                            frame_info->aspectRatio.aspectRatioY, frame_info->displayAspectRatio.displayHorizontalSize,
+                                            frame_info->displayAspectRatio.displayVerticalSize);
+                                DEBUG_PRINT("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
+                                for (int i = 0; i < frame_info->panScan.numWindows; i++) {
+                                    DEBUG_PRINT("WINDOW Lft(%d) Tp(%d) Rgt(%d) Bttm(%d)",
+                                            frame_info->panScan.window[i].x,
+                                            frame_info->panScan.window[i].y,
+                                            frame_info->panScan.window[i].dx,
+                                            frame_info->panScan.window[i].dy);
+                                }
+                                break;
+                            }
+                            break;
+                        case OMX_ExtraDataConcealMB:
+                            {
+                                OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
+                                OMX_U32 concealMBnum = 0, bytes_cnt = 0;
+                                while (bytes_cnt < pExtra->nDataSize) {
+                                    data = *data_ptr;
+                                    while (data) {
+                                        concealMBnum += (data&0x01);
+                                        data >>= 1;
+                                    }
+                                    data_ptr++;
+                                    bytes_cnt++;
+                                }
+                                DEBUG_PRINT("OMX_ExtraDataConcealMB: Buf(%p) TSmp(%lld) ConcealMB(%u)",
+                                        pBuffer->pBuffer, pBuffer->nTimeStamp, concealMBnum);
+                            }
+                            break;
+                        case OMX_ExtraDataMP2ExtnData:
+                            {
+                                DEBUG_PRINT("\nOMX_ExtraDataMP2ExtnData");
+                                OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
+                                OMX_U32 bytes_cnt = 0;
+                                while (bytes_cnt < pExtra->nDataSize) {
+                                    DEBUG_PRINT("\n MPEG-2 Extension Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
+                                    data_ptr++;
+                                    bytes_cnt++;
+                                }
+                            }
+                            break;
+                        case OMX_ExtraDataMP2UserData:
+                            {
+                                DEBUG_PRINT("\nOMX_ExtraDataMP2UserData");
+                                OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
+                                OMX_U32 bytes_cnt = 0;
+                                while (bytes_cnt < pExtra->nDataSize) {
+                                    DEBUG_PRINT("\n MPEG-2 User Data Values[%d] = 0x%x", bytes_cnt, *data_ptr);
+                                    data_ptr++;
+                                    bytes_cnt++;
+                                }
+                            }
+                            break;
+                        default:
+                            DEBUG_PRINT_ERROR("Unknown Extrata!");
+                    }
+                    if (pExtra->nSize < (pBuffer->nAllocLen - (OMX_U32)pExtra))
+                        pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) pExtra) + pExtra->nSize);
+                    else {
+                        DEBUG_PRINT_ERROR("ERROR: Extradata pointer overflow buffer(%p) extra(%p)",
+                                pBuffer, pExtra);
+                        pExtra = NULL;
+                    }
+                }
+            }
+        }
+        if (pBuffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+            DEBUG_PRINT("\n");
+            DEBUG_PRINT("***************************************************\n");
+            DEBUG_PRINT("FillBufferDone: End Of Sequence Received\n");
+            DEBUG_PRINT("***************************************************\n");
+        }
+        if (pBuffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
+            DEBUG_PRINT("\n");
+            DEBUG_PRINT("***************************************************\n");
+            DEBUG_PRINT("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+            DEBUG_PRINT("***************************************************\n");
+        }
+        /********************************************************************/
+        /* De-Initializing the open max and relasing the buffers and */
+        /* closing the files.*/
+        /********************************************************************/
+        if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS ) {
+            OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
+            OMX_GetConfig(dec_handle,
+                    (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
+                    &framePackingArrangement);
+            PrintFramePackArrangement(framePackingArrangement);
+
+            gettimeofday(&t_end, NULL);
+            total_time = ((float) ((t_end.tv_sec - t_start.tv_sec) * 1e6
+                        + t_end.tv_usec - t_start.tv_usec))/ 1e6;
+            //total frames is fbd_cnt - 1 since the start time is
+            //recorded after the first frame is decoded.
+            printf("\nAvg decoding frame rate=%f\n", (fbd_cnt - 1)/total_time);
+
+            DEBUG_PRINT("***************************************************\n");
+            DEBUG_PRINT("FillBufferDone: End Of Stream Reached\n");
+            DEBUG_PRINT("***************************************************\n");
+            pthread_mutex_lock(&eos_lock);
+            bOutputEosReached = true;
+            break;
+        }
+
+        pthread_mutex_lock(&enable_lock);
+        if (flush_output_progress || sent_disabled) {
+            pBuffer->nFilledLen = 0;
+            pBuffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+            pthread_mutex_lock(&fbd_lock);
+            if ( pPrevBuff != NULL ) {
+                if (push(fbd_queue, (void *)pPrevBuff))
+                    DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
+                else
+                    sem_post(&fbd_sem);
+                pPrevBuff = NULL;
+            }
+            if (push(fbd_queue, (void *)pBuffer) < 0) {
+                DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
+            } else
+                sem_post(&fbd_sem);
+            pthread_mutex_unlock(&fbd_lock);
+        } else {
+            if (!anti_flickering)
+                pPrevBuff = pBuffer;
+            if (pPrevBuff) {
+                pthread_mutex_lock(&fbd_lock);
+                pthread_mutex_lock(&eos_lock);
+                if (!bOutputEosReached) {
+                    if ( OMX_FillThisBuffer(dec_handle, pPrevBuff) == OMX_ErrorNone ) {
+                        free_op_buf_cnt--;
+                    }
+                }
+                pthread_mutex_unlock(&eos_lock);
+                pthread_mutex_unlock(&fbd_lock);
+            }
+        }
+        pthread_mutex_unlock(&enable_lock);
+        if (cmd_data <= fbd_cnt) {
+            sem_post(&seq_sem);
+            printf("\n Posted seq_sem Frm(%d) Req(%d)", fbd_cnt, cmd_data);
+            cmd_data = ~(unsigned)0;
+        }
+        pthread_mutex_lock(&eos_lock);
+    }
+    if (seq_enabled) {
+        seq_enabled = 0;
+        sem_post(&seq_sem);
+        printf("\n Posted seq_sem in EOS \n");
+    }
+    pthread_cond_broadcast(&eos_cond);
+    pthread_mutex_unlock(&eos_lock);
+    return NULL;
 }
 
 OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
-                           OMX_IN OMX_PTR pAppData,
-                           OMX_IN OMX_EVENTTYPE eEvent,
-                           OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
-                           OMX_IN OMX_PTR pEventData)
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_EVENTTYPE eEvent,
+        OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
+        OMX_IN OMX_PTR pEventData)
 {
     DEBUG_PRINT("Function %s \n", __FUNCTION__);
 
-    switch(eEvent) {
+    switch (eEvent) {
         case OMX_EventCmdComplete:
             DEBUG_PRINT("\n OMX_EventCmdComplete \n");
-            if(OMX_CommandPortDisable == (OMX_COMMANDTYPE)nData1)
-            {
+            if (OMX_CommandPortDisable == (OMX_COMMANDTYPE)nData1) {
                 DEBUG_PRINT("*********************************************\n");
                 DEBUG_PRINT("Recieved DISABLE Event Command Complete[%d]\n",nData2);
                 DEBUG_PRINT("*********************************************\n");
-            }
-            else if(OMX_CommandPortEnable == (OMX_COMMANDTYPE)nData1)
-            {
+            } else if (OMX_CommandPortEnable == (OMX_COMMANDTYPE)nData1) {
                 DEBUG_PRINT("*********************************************\n");
                 DEBUG_PRINT("Recieved ENABLE Event Command Complete[%d]\n",nData2);
                 DEBUG_PRINT("*********************************************\n");
                 if (currentStatus == PORT_SETTING_CHANGE_STATE)
-                  currentStatus = GOOD_STATE;
+                    currentStatus = GOOD_STATE;
                 pthread_mutex_lock(&enable_lock);
                 sent_disabled = 0;
                 pthread_mutex_unlock(&enable_lock);
-            }
-            else if(OMX_CommandFlush == (OMX_COMMANDTYPE)nData1)
-            {
+            } else if (OMX_CommandFlush == (OMX_COMMANDTYPE)nData1) {
                 DEBUG_PRINT("*********************************************\n");
                 DEBUG_PRINT("Received FLUSH Event Command Complete[%d]\n",nData2);
                 DEBUG_PRINT("*********************************************\n");
@@ -1156,60 +1084,53 @@
             printf("*********************************************\n");
             currentStatus = ERROR_STATE;
             if (OMX_ErrorInvalidState == (OMX_ERRORTYPE)nData1 ||
-                OMX_ErrorHardware == (OMX_ERRORTYPE)nData1)
-            {
-              printf("Invalid State or hardware error \n");
-              if(event_is_done == 0)
-              {
-                DEBUG_PRINT("Event error in the middle of Decode \n");
-                pthread_mutex_lock(&eos_lock);
-                bOutputEosReached = true;
-                pthread_mutex_unlock(&eos_lock);
-                if(seq_enabled)
-                {
-                    seq_enabled = 0;
-                    sem_post(&seq_sem);
-                    printf("\n Posted seq_sem in ERROR");
+                    OMX_ErrorHardware == (OMX_ERRORTYPE)nData1) {
+                printf("Invalid State or hardware error \n");
+                if (event_is_done == 0) {
+                    DEBUG_PRINT("Event error in the middle of Decode \n");
+                    pthread_mutex_lock(&eos_lock);
+                    bOutputEosReached = true;
+                    pthread_mutex_unlock(&eos_lock);
+                    if (seq_enabled) {
+                        seq_enabled = 0;
+                        sem_post(&seq_sem);
+                        printf("\n Posted seq_sem in ERROR");
+                    }
                 }
-              }
             }
-            if (waitForPortSettingsChanged)
-            {
-	            waitForPortSettingsChanged = 0;
-	            event_complete();
+            if (waitForPortSettingsChanged) {
+                waitForPortSettingsChanged = 0;
+                event_complete();
             }
             break;
         case OMX_EventPortSettingsChanged:
             DEBUG_PRINT("OMX_EventPortSettingsChanged port[%d]\n", nData1);
             if (nData2 == OMX_IndexConfigCommonOutputCrop) {
                 OMX_U32 outPortIndex = 1;
-                 if (nData1 == outPortIndex) {
-                     crop_rect.nPortIndex = outPortIndex;
-                     OMX_ERRORTYPE ret = OMX_GetConfig(dec_handle,
-                                                       OMX_IndexConfigCommonOutputCrop, &crop_rect);
-                     if (FAILED(ret)) {
-                         DEBUG_PRINT_ERROR("Failed to get crop rectangle\n");
-                         break;
-                     } else
-                         DEBUG_PRINT("Got Crop Rect: (%d, %d) (%d x %d)\n",
-                             crop_rect.nLeft, crop_rect.nTop, crop_rect.nWidth, crop_rect.nHeight);
-                 }
-                 currentStatus = GOOD_STATE;
-                 break;
+                if (nData1 == outPortIndex) {
+                    crop_rect.nPortIndex = outPortIndex;
+                    OMX_ERRORTYPE ret = OMX_GetConfig(dec_handle,
+                            OMX_IndexConfigCommonOutputCrop, &crop_rect);
+                    if (FAILED(ret)) {
+                        DEBUG_PRINT_ERROR("Failed to get crop rectangle\n");
+                        break;
+                    } else
+                        DEBUG_PRINT("Got Crop Rect: (%d, %d) (%d x %d)\n",
+                                crop_rect.nLeft, crop_rect.nTop, crop_rect.nWidth, crop_rect.nHeight);
+                }
+                currentStatus = GOOD_STATE;
+                break;
             }
 
 #ifdef _MSM8974_
             if (nData2 != OMX_IndexParamPortDefinition)
-              break;
+                break;
 #endif
             currentStatus = PORT_SETTING_CHANGE_STATE;
-            if (waitForPortSettingsChanged)
-            {
-	            waitForPortSettingsChanged = 0;
-	            event_complete();
-            }
-            else
-            {
+            if (waitForPortSettingsChanged) {
+                waitForPortSettingsChanged = 0;
+                event_complete();
+            } else {
                 pthread_mutex_lock(&eos_lock);
                 pthread_cond_broadcast(&eos_cond);
                 pthread_mutex_unlock(&eos_lock);
@@ -1225,15 +1146,12 @@
                 pthread_mutex_lock(&eos_lock);
                 bOutputEosReached = true;
                 pthread_mutex_unlock(&eos_lock);
-                if(seq_enabled)
-                {
+                if (seq_enabled) {
                     seq_enabled = 0;
                     sem_post(&seq_sem);
                     printf("\n Posted seq_sem in OMX_EventBufferFlag");
                 }
-            }
-            else
-            {
+            } else {
                 DEBUG_PRINT_ERROR("OMX_EventBufferFlag Event not handled\n");
             }
 #endif
@@ -1249,26 +1167,26 @@
 }
 
 OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
-                              OMX_IN OMX_PTR pAppData,
-                              OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
 {
-    int readBytes =0; int bufCnt=0;
+    int readBytes =0;
+    int bufCnt=0;
     OMX_ERRORTYPE result;
 
     DEBUG_PRINT("Function %s cnt[%d]\n", __FUNCTION__, ebd_cnt);
     ebd_cnt++;
 
 
-    if(bInputEosReached) {
+    if (bInputEosReached) {
         DEBUG_PRINT("*****EBD:Input EoS Reached************\n");
         return OMX_ErrorNone;
     }
 
     pthread_mutex_lock(&etb_lock);
-    if(push(etb_queue, (void *) pBuffer) < 0)
-    {
-       DEBUG_PRINT_ERROR("Error in enqueue  ebd data\n");
-       return OMX_ErrorUndefined;
+    if (push(etb_queue, (void *) pBuffer) < 0) {
+        DEBUG_PRINT_ERROR("Error in enqueue  ebd data\n");
+        return OMX_ErrorUndefined;
     }
     pthread_mutex_unlock(&etb_lock);
     sem_post(&etb_sem);
@@ -1277,8 +1195,8 @@
 }
 
 OMX_ERRORTYPE FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
-                             OMX_OUT OMX_PTR pAppData,
-                             OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
+        OMX_OUT OMX_PTR pAppData,
+        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
 {
     DEBUG_PRINT("Inside %s callback_count[%d] \n", __FUNCTION__, fbd_cnt);
 
@@ -1286,21 +1204,19 @@
      * In case that there is no dynamic port setting, OMX will not call event cb,
      * instead OMX will send empty this buffer directly and we need to clear an event here
      */
-    if(waitForPortSettingsChanged)
-    {
-      waitForPortSettingsChanged = 0;
-      if(displayYuv)
-        overlay_set();
-      event_complete();
+    if (waitForPortSettingsChanged) {
+        waitForPortSettingsChanged = 0;
+        if (displayYuv)
+            overlay_set();
+        event_complete();
     }
 
     pthread_mutex_lock(&fbd_lock);
     free_op_buf_cnt++;
-    if(push(fbd_queue, (void *)pBuffer) < 0)
-    {
-      pthread_mutex_unlock(&fbd_lock);
-      DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
-      return OMX_ErrorUndefined;
+    if (push(fbd_queue, (void *)pBuffer) < 0) {
+        pthread_mutex_unlock(&fbd_lock);
+        DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
+        return OMX_ErrorUndefined;
     }
     pthread_mutex_unlock(&fbd_lock);
     sem_post(&fbd_sem);
@@ -1326,11 +1242,10 @@
     crop_rect.nHeight = height;
 
 
-    if (argc < 2)
-    {
-      printf("To use it: ./mm-vdec-omx-test <clip location> \n");
-      printf("Command line argument is also available\n");
-      return -1;
+    if (argc < 2) {
+        printf("To use it: ./mm-vdec-omx-test <clip location> \n");
+        printf("Command line argument is also available\n");
+        return -1;
     }
 
     strlcpy(in_filename, argv[1], strlen(argv[1])+1);
@@ -1338,325 +1253,283 @@
     strlcpy(crclogname, argv[1], strlen(argv[1])+1);
     strcat(crclogname, ".crc");
 #endif
-    if(argc > 2)
-    {
-      codec_format_option = (codec_format)atoi(argv[2]);
-      // file_type, out_op, tst_op, nal_sz, disp_win, rt_dis, (fps), color, pic_order, num_frames_to_decode
-      int param[10] = {2, 1, 1, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF};
-      int next_arg = 3, idx = 0;
-      while (argc > next_arg && idx < 10)
-      {
-        if (strlen(argv[next_arg]) > 2)
-        {
-          strlcpy(seq_file_name, argv[next_arg],strlen(argv[next_arg]) + 1);
-          next_arg = argc;
+    if (argc > 2) {
+        codec_format_option = (codec_format)atoi(argv[2]);
+        // file_type, out_op, tst_op, nal_sz, disp_win, rt_dis, (fps), color, pic_order, num_frames_to_decode
+        int param[10] = {2, 1, 1, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF};
+        int next_arg = 3, idx = 0;
+        while (argc > next_arg && idx < 10) {
+            if (strlen(argv[next_arg]) > 2) {
+                strlcpy(seq_file_name, argv[next_arg],strlen(argv[next_arg]) + 1);
+                next_arg = argc;
+            } else
+                param[idx++] = atoi(argv[next_arg++]);
         }
-        else
-          param[idx++] = atoi(argv[next_arg++]);
-      }
-      idx = 0;
-      file_type_option = (file_type)param[idx++];
-      if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3)
-      {
-        nalSize = param[idx++];
-        if (nalSize != 2 && nalSize != 4)
-        {
-          printf("Error - Can't pass NAL length size = %d\n", nalSize);
-          return -1;
+        idx = 0;
+        file_type_option = (file_type)param[idx++];
+        if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3) {
+            nalSize = param[idx++];
+            if (nalSize != 2 && nalSize != 4) {
+                printf("Error - Can't pass NAL length size = %d\n", nalSize);
+                return -1;
+            }
         }
-      }
-      outputOption = param[idx++];
-      test_option = param[idx++];
-      if ((outputOption == 1 || outputOption ==3) && test_option != 3) {
-          displayWindow = param[idx++];
-          if (displayWindow > 0)
-              printf("Only entire display window supported! Ignoring value\n");
-          realtime_display = param[idx++];
-      }
-      if (realtime_display)
-      {
-        takeYuvLog = 0;
-        if(param[idx] != 0xFF)
-        {
-          fps = param[idx++];
-          timestampInterval = 1e6 / fps;
+        outputOption = param[idx++];
+        test_option = param[idx++];
+        if ((outputOption == 1 || outputOption ==3) && test_option != 3) {
+            displayWindow = param[idx++];
+            if (displayWindow > 0)
+                printf("Only entire display window supported! Ignoring value\n");
+            realtime_display = param[idx++];
         }
-      }
-      color_fmt_type = (param[idx] != 0xFF)? param[idx++] : color_fmt_type;
-      if (test_option != 3) {
-          pic_order = (param[idx] != 0xFF)? param[idx++] : 0;
-          num_frames_to_decode = param[idx++];
-      }
-      printf("Executing DynPortReconfig QCIF 144 x 176 \n");
-    }
-    else
-    {
-      printf("Command line argument is available\n");
-      printf("To use it: ./mm-vdec-omx-test <clip location> <codec_type> \n");
-      printf("           <input_type: 1. per AU(.dat), 2. arbitrary, 3.per NAL/frame>\n");
-      printf("           <output_type> <test_case> <size_nal if H264>\n\n\n");
-      printf(" *********************************************\n");
-      printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
-      printf(" *********************************************\n");
-      printf(" 1--> H264\n");
-      printf(" 2--> MP4\n");
-      printf(" 3--> H263\n");
-      printf(" 4--> VC1\n");
-      printf(" 5--> DivX\n");
-      printf(" 6--> MPEG2\n");
+        if (realtime_display) {
+            takeYuvLog = 0;
+            if (param[idx] != 0xFF) {
+                fps = param[idx++];
+                timestampInterval = 1e6 / fps;
+            }
+        }
+        color_fmt_type = (param[idx] != 0xFF)? param[idx++] : color_fmt_type;
+        if (test_option != 3) {
+            pic_order = (param[idx] != 0xFF)? param[idx++] : 0;
+            num_frames_to_decode = param[idx++];
+        }
+        printf("Executing DynPortReconfig QCIF 144 x 176 \n");
+    } else {
+        printf("Command line argument is available\n");
+        printf("To use it: ./mm-vdec-omx-test <clip location> <codec_type> \n");
+        printf("           <input_type: 1. per AU(.dat), 2. arbitrary, 3.per NAL/frame>\n");
+        printf("           <output_type> <test_case> <size_nal if H264>\n\n\n");
+        printf(" *********************************************\n");
+        printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
+        printf(" *********************************************\n");
+        printf(" 1--> H264\n");
+        printf(" 2--> MP4\n");
+        printf(" 3--> H263\n");
+        printf(" 4--> VC1\n");
+        printf(" 5--> DivX\n");
+        printf(" 6--> MPEG2\n");
 #ifdef _MSM8974_
-      printf(" 7--> VP8\n");
-      printf(" 8--> HEVC\n");
+        printf(" 7--> VP8\n");
+        printf(" 8--> HEVC\n");
 #endif
-      fflush(stdin);
-      fgets(tempbuf,sizeof(tempbuf),stdin);
-      sscanf(tempbuf,"%d",&codec_format_option);
-      fflush(stdin);
-      if (codec_format_option > CODEC_FORMAT_MAX)
-      {
-          printf(" Wrong test case...[%d] \n", codec_format_option);
-          return -1;
-      }
-      printf(" *********************************************\n");
-      printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
-      printf(" *********************************************\n");
-      printf(" 1--> PER ACCESS UNIT CLIP (.dat). Clip only available for H264 and Mpeg4\n");
-      printf(" 2--> ARBITRARY BYTES (need .264/.264c/.m4v/.263/.rcv/.vc1/.m2v)\n");
-      if (codec_format_option == CODEC_FORMAT_H264)
-      {
-        printf(" 3--> NAL LENGTH SIZE CLIP (.264c)\n");
-        printf(" 4--> START CODE BASED CLIP (.264/.h264)\n");
-      }
-      else if ( (codec_format_option == CODEC_FORMAT_MP4) || (codec_format_option == CODEC_FORMAT_H263) )
-      {
-        printf(" 3--> MP4 VOP or H263 P0 SHORT HEADER START CODE CLIP (.m4v or .263)\n");
-      }
-      else if (codec_format_option == CODEC_FORMAT_VC1)
-      {
-        printf(" 3--> VC1 clip Simple/Main Profile (.rcv)\n");
-        printf(" 4--> VC1 clip Advance Profile (.vc1)\n");
-      }
-      else if (codec_format_option == CODEC_FORMAT_DIVX)
-      {
-          printf(" 3--> DivX 4, 5, 6 clip (.cmp)\n");
-#ifdef MAX_RES_1080P
-          printf(" 4--> DivX 3.11 clip \n");
-#endif
-      }
-      else if (codec_format_option == CODEC_FORMAT_MPEG2)
-      {
-        printf(" 3--> MPEG2 START CODE CLIP (.m2v)\n");
-      }
-#ifdef _MSM8974_
-      else if (codec_format_option == CODEC_FORMAT_VP8)
-      {
-        printf(" 61--> VP8 START CODE CLIP (.ivf)\n");
-      }
-#endif
-      fflush(stdin);
-      fgets(tempbuf,sizeof(tempbuf),stdin);
-      sscanf(tempbuf,"%d",&file_type_option);
-#ifdef _MSM8974_
-      if (codec_format_option == CODEC_FORMAT_VP8)
-      {
-        file_type_option = FILE_TYPE_VP8;
-      }
-#endif
-      fflush(stdin);
-      if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3)
-      {
-        printf(" Enter Nal length size [2 or 4] \n");
+        fflush(stdin);
         fgets(tempbuf,sizeof(tempbuf),stdin);
-        sscanf(tempbuf,"%d",&nalSize);
-        if (nalSize != 2 && nalSize != 4)
-        {
-          printf("Error - Can't pass NAL length size = %d\n", nalSize);
-          return -1;
+        sscanf(tempbuf,"%d",&codec_format_option);
+        fflush(stdin);
+        if (codec_format_option > CODEC_FORMAT_MAX) {
+            printf(" Wrong test case...[%d] \n", codec_format_option);
+            return -1;
         }
-      }
-
-      printf(" *********************************************\n");
-      printf(" Output buffer option:\n");
-      printf(" *********************************************\n");
-      printf(" 0 --> No display and no YUV log\n");
-      printf(" 1 --> Diplay YUV\n");
-      printf(" 2 --> Take YUV log\n");
-      printf(" 3 --> Display YUV and take YUV log\n");
-      fflush(stdin);
-      fgets(tempbuf,sizeof(tempbuf),stdin);
-      sscanf(tempbuf,"%d",&outputOption);
-      fflush(stdin);
-
-      printf(" *********************************************\n");
-      printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
-      printf(" *********************************************\n");
-      printf(" 1 --> Play the clip till the end\n");
-      printf(" 2 --> Run compliance test. Do NOT expect any display for most option. \n");
-      printf("       Please only see \"TEST SUCCESSFULL\" to indicate test pass\n");
-      printf(" 3 --> Thumbnail decode mode\n");
-      fflush(stdin);
-      fgets(tempbuf,sizeof(tempbuf),stdin);
-      sscanf(tempbuf,"%d",&test_option);
-      fflush(stdin);
-      if (test_option == 3)
-          thumbnailMode = 1;
-
-      if ((outputOption == 1 || outputOption == 3) && thumbnailMode == 0)
-      {
-          printf(" *********************************************\n");
-          printf(" ENTER THE PORTION OF DISPLAY TO USE\n");
-          printf(" *********************************************\n");
-          printf(" 0 --> Entire Screen\n");
-          printf(" 1 --> 1/4 th of the screen starting from top left corner to middle \n");
-          printf(" 2 --> 1/4 th of the screen starting from middle to top right corner \n");
-          printf(" 3 --> 1/4 th of the screen starting from middle to bottom left \n");
-          printf(" 4 --> 1/4 th of the screen starting from middle to bottom right \n");
-          printf("       Please only see \"TEST SUCCESSFULL\" to indidcate test pass\n");
-          fflush(stdin);
-          fgets(tempbuf,sizeof(tempbuf),stdin);
-          sscanf(tempbuf,"%d",&displayWindow);
-          fflush(stdin);
-          if(displayWindow > 0)
-          {
-              printf(" Curently display window 0 only supported; ignoring other values\n");
-              displayWindow = 0;
-          }
-      }
-
-      if ((outputOption == 1 || outputOption == 3) && thumbnailMode == 0)
-      {
-          printf(" *********************************************\n");
-          printf(" DO YOU WANT TEST APP TO RENDER in Real time \n");
-          printf(" 0 --> NO\n 1 --> YES\n");
-          printf(" Warning: For H264, it require one NAL per frame clip.\n");
-          printf("          For Arbitrary bytes option, Real time display is not recommended\n");
-          printf(" *********************************************\n");
-          fflush(stdin);
-          fgets(tempbuf,sizeof(tempbuf),stdin);
-          sscanf(tempbuf,"%d",&realtime_display);
-          fflush(stdin);
-      }
-
-
-      if (realtime_display)
-      {
-          printf(" *********************************************\n");
-          printf(" ENTER THE CLIP FPS\n");
-          printf(" Exception: Timestamp extracted from clips will be used.\n");
-          printf(" *********************************************\n");
-          fflush(stdin);
-          fgets(tempbuf,sizeof(tempbuf),stdin);
-          sscanf(tempbuf,"%d",&fps);
-          fflush(stdin);
-          timestampInterval = 1000000/fps;
-      }
-
-      printf(" *********************************************\n");
-      printf(" ENTER THE COLOR FORMAT \n");
-      printf(" 0 --> Semiplanar \n 1 --> Tile Mode\n");
-      printf(" *********************************************\n");
-      fflush(stdin);
-      fgets(tempbuf,sizeof(tempbuf),stdin);
-      sscanf(tempbuf,"%d",&color_fmt_type);
-      fflush(stdin);
-
-      if (thumbnailMode != 1) {
-          printf(" *********************************************\n");
-          printf(" Output picture order option: \n");
-          printf(" *********************************************\n");
-          printf(" 0 --> Display order\n 1 --> Decode order\n");
-          fflush(stdin);
-          fgets(tempbuf,sizeof(tempbuf),stdin);
-          sscanf(tempbuf,"%d",&pic_order);
-          fflush(stdin);
-
-          printf(" *********************************************\n");
-          printf(" Number of frames to decode: \n");
-          printf(" 0 ---> decode all frames: \n");
-          printf(" *********************************************\n");
-          fflush(stdin);
-          fgets(tempbuf,sizeof(tempbuf),stdin);
-          sscanf(tempbuf,"%d",&num_frames_to_decode);
-          fflush(stdin);
-      }
-    }
-    if (file_type_option >= FILE_TYPE_COMMON_CODEC_MAX)
-    {
-      switch (codec_format_option)
-      {
-        case CODEC_FORMAT_H264:
-          file_type_option = (file_type)(FILE_TYPE_START_OF_H264_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
-          break;
-        case CODEC_FORMAT_DIVX:
-          file_type_option = (file_type)(FILE_TYPE_START_OF_DIVX_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
-          break;
-        case CODEC_FORMAT_MP4:
-        case CODEC_FORMAT_H263:
-          file_type_option = (file_type)(FILE_TYPE_START_OF_MP4_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
-          break;
-        case CODEC_FORMAT_VC1:
-          file_type_option = (file_type)(FILE_TYPE_START_OF_VC1_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
-          break;
-        case CODEC_FORMAT_MPEG2:
-          file_type_option = (file_type)(FILE_TYPE_START_OF_MPEG2_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
-          break;
-#ifdef _MSM8974_
-	case CODEC_FORMAT_VP8:
-	break;
+        printf(" *********************************************\n");
+        printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
+        printf(" *********************************************\n");
+        printf(" 1--> PER ACCESS UNIT CLIP (.dat). Clip only available for H264 and Mpeg4\n");
+        printf(" 2--> ARBITRARY BYTES (need .264/.264c/.m4v/.263/.rcv/.vc1/.m2v)\n");
+        if (codec_format_option == CODEC_FORMAT_H264) {
+            printf(" 3--> NAL LENGTH SIZE CLIP (.264c)\n");
+            printf(" 4--> START CODE BASED CLIP (.264/.h264)\n");
+        } else if ( (codec_format_option == CODEC_FORMAT_MP4) || (codec_format_option == CODEC_FORMAT_H263) ) {
+            printf(" 3--> MP4 VOP or H263 P0 SHORT HEADER START CODE CLIP (.m4v or .263)\n");
+        } else if (codec_format_option == CODEC_FORMAT_VC1) {
+            printf(" 3--> VC1 clip Simple/Main Profile (.rcv)\n");
+            printf(" 4--> VC1 clip Advance Profile (.vc1)\n");
+        } else if (codec_format_option == CODEC_FORMAT_DIVX) {
+            printf(" 3--> DivX 4, 5, 6 clip (.cmp)\n");
+#ifdef MAX_RES_1080P
+            printf(" 4--> DivX 3.11 clip \n");
 #endif
-        default:
-          printf("Error: Unknown code %d\n", codec_format_option);
-      }
+        } else if (codec_format_option == CODEC_FORMAT_MPEG2) {
+            printf(" 3--> MPEG2 START CODE CLIP (.m2v)\n");
+        }
+#ifdef _MSM8974_
+        else if (codec_format_option == CODEC_FORMAT_VP8) {
+            printf(" 61--> VP8 START CODE CLIP (.ivf)\n");
+        }
+#endif
+        fflush(stdin);
+        fgets(tempbuf,sizeof(tempbuf),stdin);
+        sscanf(tempbuf,"%d",&file_type_option);
+#ifdef _MSM8974_
+        if (codec_format_option == CODEC_FORMAT_VP8) {
+            file_type_option = FILE_TYPE_VP8;
+        }
+#endif
+        fflush(stdin);
+        if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3) {
+            printf(" Enter Nal length size [2 or 4] \n");
+            fgets(tempbuf,sizeof(tempbuf),stdin);
+            sscanf(tempbuf,"%d",&nalSize);
+            if (nalSize != 2 && nalSize != 4) {
+                printf("Error - Can't pass NAL length size = %d\n", nalSize);
+                return -1;
+            }
+        }
+
+        printf(" *********************************************\n");
+        printf(" Output buffer option:\n");
+        printf(" *********************************************\n");
+        printf(" 0 --> No display and no YUV log\n");
+        printf(" 1 --> Diplay YUV\n");
+        printf(" 2 --> Take YUV log\n");
+        printf(" 3 --> Display YUV and take YUV log\n");
+        fflush(stdin);
+        fgets(tempbuf,sizeof(tempbuf),stdin);
+        sscanf(tempbuf,"%d",&outputOption);
+        fflush(stdin);
+
+        printf(" *********************************************\n");
+        printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
+        printf(" *********************************************\n");
+        printf(" 1 --> Play the clip till the end\n");
+        printf(" 2 --> Run compliance test. Do NOT expect any display for most option. \n");
+        printf("       Please only see \"TEST SUCCESSFULL\" to indicate test pass\n");
+        printf(" 3 --> Thumbnail decode mode\n");
+        fflush(stdin);
+        fgets(tempbuf,sizeof(tempbuf),stdin);
+        sscanf(tempbuf,"%d",&test_option);
+        fflush(stdin);
+        if (test_option == 3)
+            thumbnailMode = 1;
+
+        if ((outputOption == 1 || outputOption == 3) && thumbnailMode == 0) {
+            printf(" *********************************************\n");
+            printf(" ENTER THE PORTION OF DISPLAY TO USE\n");
+            printf(" *********************************************\n");
+            printf(" 0 --> Entire Screen\n");
+            printf(" 1 --> 1/4 th of the screen starting from top left corner to middle \n");
+            printf(" 2 --> 1/4 th of the screen starting from middle to top right corner \n");
+            printf(" 3 --> 1/4 th of the screen starting from middle to bottom left \n");
+            printf(" 4 --> 1/4 th of the screen starting from middle to bottom right \n");
+            printf("       Please only see \"TEST SUCCESSFULL\" to indidcate test pass\n");
+            fflush(stdin);
+            fgets(tempbuf,sizeof(tempbuf),stdin);
+            sscanf(tempbuf,"%d",&displayWindow);
+            fflush(stdin);
+            if (displayWindow > 0) {
+                printf(" Curently display window 0 only supported; ignoring other values\n");
+                displayWindow = 0;
+            }
+        }
+
+        if ((outputOption == 1 || outputOption == 3) && thumbnailMode == 0) {
+            printf(" *********************************************\n");
+            printf(" DO YOU WANT TEST APP TO RENDER in Real time \n");
+            printf(" 0 --> NO\n 1 --> YES\n");
+            printf(" Warning: For H264, it require one NAL per frame clip.\n");
+            printf("          For Arbitrary bytes option, Real time display is not recommended\n");
+            printf(" *********************************************\n");
+            fflush(stdin);
+            fgets(tempbuf,sizeof(tempbuf),stdin);
+            sscanf(tempbuf,"%d",&realtime_display);
+            fflush(stdin);
+        }
+
+
+        if (realtime_display) {
+            printf(" *********************************************\n");
+            printf(" ENTER THE CLIP FPS\n");
+            printf(" Exception: Timestamp extracted from clips will be used.\n");
+            printf(" *********************************************\n");
+            fflush(stdin);
+            fgets(tempbuf,sizeof(tempbuf),stdin);
+            sscanf(tempbuf,"%d",&fps);
+            fflush(stdin);
+            timestampInterval = 1000000/fps;
+        }
+
+        printf(" *********************************************\n");
+        printf(" ENTER THE COLOR FORMAT \n");
+        printf(" 0 --> Semiplanar \n 1 --> Tile Mode\n");
+        printf(" *********************************************\n");
+        fflush(stdin);
+        fgets(tempbuf,sizeof(tempbuf),stdin);
+        sscanf(tempbuf,"%d",&color_fmt_type);
+        fflush(stdin);
+
+        if (thumbnailMode != 1) {
+            printf(" *********************************************\n");
+            printf(" Output picture order option: \n");
+            printf(" *********************************************\n");
+            printf(" 0 --> Display order\n 1 --> Decode order\n");
+            fflush(stdin);
+            fgets(tempbuf,sizeof(tempbuf),stdin);
+            sscanf(tempbuf,"%d",&pic_order);
+            fflush(stdin);
+
+            printf(" *********************************************\n");
+            printf(" Number of frames to decode: \n");
+            printf(" 0 ---> decode all frames: \n");
+            printf(" *********************************************\n");
+            fflush(stdin);
+            fgets(tempbuf,sizeof(tempbuf),stdin);
+            sscanf(tempbuf,"%d",&num_frames_to_decode);
+            fflush(stdin);
+        }
+    }
+    if (file_type_option >= FILE_TYPE_COMMON_CODEC_MAX) {
+        switch (codec_format_option) {
+            case CODEC_FORMAT_H264:
+                file_type_option = (file_type)(FILE_TYPE_START_OF_H264_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+                break;
+            case CODEC_FORMAT_DIVX:
+                file_type_option = (file_type)(FILE_TYPE_START_OF_DIVX_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+                break;
+            case CODEC_FORMAT_MP4:
+            case CODEC_FORMAT_H263:
+                file_type_option = (file_type)(FILE_TYPE_START_OF_MP4_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+                break;
+            case CODEC_FORMAT_VC1:
+                file_type_option = (file_type)(FILE_TYPE_START_OF_VC1_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+                break;
+            case CODEC_FORMAT_MPEG2:
+                file_type_option = (file_type)(FILE_TYPE_START_OF_MPEG2_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+                break;
+#ifdef _MSM8974_
+            case CODEC_FORMAT_VP8:
+                break;
+#endif
+            default:
+                printf("Error: Unknown code %d\n", codec_format_option);
+        }
     }
 
     CONFIG_VERSION_SIZE(picture_order);
     picture_order.eOutputPictureOrder = QOMX_VIDEO_DISPLAY_ORDER;
     if (pic_order == 1)
-      picture_order.eOutputPictureOrder = QOMX_VIDEO_DECODE_ORDER;
+        picture_order.eOutputPictureOrder = QOMX_VIDEO_DECODE_ORDER;
 
-    if (outputOption == 0)
-    {
-      displayYuv = 0;
-      takeYuvLog = 0;
-      realtime_display = 0;
-    }
-    else if (outputOption == 1)
-    {
-      displayYuv = 1;
-    }
-    else if (outputOption == 2)
-    {
-      takeYuvLog = 1;
-      realtime_display = 0;
-    }
-    else if (outputOption == 3)
-    {
-      displayYuv = 1;
-      takeYuvLog = !realtime_display;
-    }
-    else
-    {
-      printf("Wrong option. Assume you want to see the YUV display\n");
-      displayYuv = 1;
+    if (outputOption == 0) {
+        displayYuv = 0;
+        takeYuvLog = 0;
+        realtime_display = 0;
+    } else if (outputOption == 1) {
+        displayYuv = 1;
+    } else if (outputOption == 2) {
+        takeYuvLog = 1;
+        realtime_display = 0;
+    } else if (outputOption == 3) {
+        displayYuv = 1;
+        takeYuvLog = !realtime_display;
+    } else {
+        printf("Wrong option. Assume you want to see the YUV display\n");
+        displayYuv = 1;
     }
 
-    if (test_option == 2)
-    {
-      printf(" *********************************************\n");
-      printf(" ENTER THE COMPLIANCE TEST YOU WOULD LIKE TO EXECUTE\n");
-      printf(" *********************************************\n");
-      printf(" 1 --> Call Free Handle at the OMX_StateLoaded\n");
-      printf(" 2 --> Call Free Handle at the OMX_StateIdle\n");
-      printf(" 3 --> Call Free Handle at the OMX_StateExecuting\n");
-      printf(" 4 --> Call Free Handle at the OMX_StatePause\n");
-      fflush(stdin);
-      fgets(tempbuf,sizeof(tempbuf),stdin);
-      sscanf(tempbuf,"%d",&freeHandle_option);
-      fflush(stdin);
-    }
-    else
-    {
-      freeHandle_option = (freeHandle_test)0;
+    if (test_option == 2) {
+        printf(" *********************************************\n");
+        printf(" ENTER THE COMPLIANCE TEST YOU WOULD LIKE TO EXECUTE\n");
+        printf(" *********************************************\n");
+        printf(" 1 --> Call Free Handle at the OMX_StateLoaded\n");
+        printf(" 2 --> Call Free Handle at the OMX_StateIdle\n");
+        printf(" 3 --> Call Free Handle at the OMX_StateExecuting\n");
+        printf(" 4 --> Call Free Handle at the OMX_StatePause\n");
+        fflush(stdin);
+        fgets(tempbuf,sizeof(tempbuf),stdin);
+        sscanf(tempbuf,"%d",&freeHandle_option);
+        fflush(stdin);
+    } else {
+        freeHandle_option = (freeHandle_test)0;
     }
 
     printf("Input values: inputfilename[%s]\n", in_filename);
@@ -1668,56 +1541,46 @@
     pthread_mutex_init(&etb_lock, 0);
     pthread_mutex_init(&fbd_lock, 0);
     pthread_mutex_init(&enable_lock, 0);
-    if (-1 == sem_init(&etb_sem, 0, 0))
-    {
-      printf("Error - sem_init failed %d\n", errno);
+    if (-1 == sem_init(&etb_sem, 0, 0)) {
+        printf("Error - sem_init failed %d\n", errno);
     }
-    if (-1 == sem_init(&fbd_sem, 0, 0))
-    {
-      printf("Error - sem_init failed %d\n", errno);
+    if (-1 == sem_init(&fbd_sem, 0, 0)) {
+        printf("Error - sem_init failed %d\n", errno);
     }
-    if (-1 == sem_init(&seq_sem, 0, 0))
-    {
-      printf("Error - sem_init failed %d\n", errno);
+    if (-1 == sem_init(&seq_sem, 0, 0)) {
+        printf("Error - sem_init failed %d\n", errno);
     }
-    if (-1 == sem_init(&in_flush_sem, 0, 0))
-    {
-      printf("Error - sem_init failed %d\n", errno);
+    if (-1 == sem_init(&in_flush_sem, 0, 0)) {
+        printf("Error - sem_init failed %d\n", errno);
     }
-    if (-1 == sem_init(&out_flush_sem, 0, 0))
-    {
-      printf("Error - sem_init failed %d\n", errno);
+    if (-1 == sem_init(&out_flush_sem, 0, 0)) {
+        printf("Error - sem_init failed %d\n", errno);
     }
     etb_queue = alloc_queue();
-    if (etb_queue == NULL)
-    {
-      printf("\n Error in Creating etb_queue\n");
-      return -1;
+    if (etb_queue == NULL) {
+        printf("\n Error in Creating etb_queue\n");
+        return -1;
     }
 
     fbd_queue = alloc_queue();
-    if (fbd_queue == NULL)
-    {
-      printf("\n Error in Creating fbd_queue\n");
-      free_queue(etb_queue);
-      return -1;
+    if (fbd_queue == NULL) {
+        printf("\n Error in Creating fbd_queue\n");
+        free_queue(etb_queue);
+        return -1;
     }
 
-    if(0 != pthread_create(&fbd_thread_id, NULL, fbd_thread, NULL))
-    {
-      printf("\n Error in Creating fbd_thread \n");
-      free_queue(etb_queue);
-      free_queue(fbd_queue);
-      return -1;
+    if (0 != pthread_create(&fbd_thread_id, NULL, fbd_thread, NULL)) {
+        printf("\n Error in Creating fbd_thread \n");
+        free_queue(etb_queue);
+        free_queue(fbd_queue);
+        return -1;
     }
 
-    if (displayYuv)
-    {
-      if (open_display() != 0)
-      {
-        printf("\n Error opening display! Video won't be displayed...");
-        displayYuv = 0;
-      }
+    if (displayYuv) {
+        if (open_display() != 0) {
+            printf("\n Error opening display! Video won't be displayed...");
+            displayYuv = 0;
+        }
     }
 
     run_tests();
@@ -1728,163 +1591,141 @@
     pthread_mutex_destroy(&enable_lock);
     pthread_cond_destroy(&eos_cond);
     pthread_mutex_destroy(&eos_lock);
-    if (-1 == sem_destroy(&etb_sem))
-    {
-      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
+    if (-1 == sem_destroy(&etb_sem)) {
+        DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
     }
-    if (-1 == sem_destroy(&fbd_sem))
-    {
-      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
+    if (-1 == sem_destroy(&fbd_sem)) {
+        DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
     }
-    if (-1 == sem_destroy(&seq_sem))
-    {
-      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
+    if (-1 == sem_destroy(&seq_sem)) {
+        DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
     }
-    if (-1 == sem_destroy(&in_flush_sem))
-    {
-      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
+    if (-1 == sem_destroy(&in_flush_sem)) {
+        DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
     }
-    if (-1 == sem_destroy(&out_flush_sem))
-    {
-      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
+    if (-1 == sem_destroy(&out_flush_sem)) {
+        DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
     }
     if (displayYuv)
-      close_display();
+        close_display();
     return 0;
 }
 
 int run_tests()
 {
-  int cmd_error = 0;
-  DEBUG_PRINT("Inside %s\n", __FUNCTION__);
-  waitForPortSettingsChanged = 1;
+    int cmd_error = 0;
+    DEBUG_PRINT("Inside %s\n", __FUNCTION__);
+    waitForPortSettingsChanged = 1;
 
-  if(file_type_option == FILE_TYPE_DAT_PER_AU) {
-    Read_Buffer = Read_Buffer_From_DAT_File;
-  }
-  else if(file_type_option == FILE_TYPE_ARBITRARY_BYTES) {
-    Read_Buffer = Read_Buffer_ArbitraryBytes;
-  }
-  else if(codec_format_option == CODEC_FORMAT_H264) {
-    if (file_type_option == FILE_TYPE_264_NAL_SIZE_LENGTH) {
-       Read_Buffer = Read_Buffer_From_Size_Nal;
-    } else if (file_type_option == FILE_TYPE_264_START_CODE_BASED) {
-       Read_Buffer = Read_Buffer_From_H264_Start_Code_File;
-    } else {
-       DEBUG_PRINT_ERROR("Invalid file_type_option(%d) for H264", file_type_option);
-       return -1;
-    }
-  }
-  else if((codec_format_option == CODEC_FORMAT_H263) ||
-          (codec_format_option == CODEC_FORMAT_MP4)) {
-    Read_Buffer = Read_Buffer_From_Vop_Start_Code_File;
-  }
-  else if (codec_format_option == CODEC_FORMAT_MPEG2) {
-    Read_Buffer = Read_Buffer_From_Mpeg2_Start_Code;
-  }
-  else if(file_type_option == FILE_TYPE_DIVX_4_5_6) {
-    Read_Buffer = Read_Buffer_From_DivX_4_5_6_File;
-  }
-#ifdef MAX_RES_1080P
-  else if(file_type_option == FILE_TYPE_DIVX_311) {
-    Read_Buffer = Read_Buffer_From_DivX_311_File;
-  }
-#endif
-  else if(file_type_option == FILE_TYPE_RCV) {
-    Read_Buffer = Read_Buffer_From_RCV_File;
-  }
-#ifdef _MSM8974_
-  else if(file_type_option == FILE_TYPE_VP8) {
-    Read_Buffer = Read_Buffer_From_VP8_File;
-  }
-#endif
-  else if(file_type_option == FILE_TYPE_VC1) {
-    Read_Buffer = Read_Buffer_From_VC1_File;
-  }
-
-  DEBUG_PRINT("file_type_option %d!\n", file_type_option);
-
-  switch(file_type_option)
-  {
-    case FILE_TYPE_DAT_PER_AU:
-    case FILE_TYPE_ARBITRARY_BYTES:
-    case FILE_TYPE_264_START_CODE_BASED:
-    case FILE_TYPE_264_NAL_SIZE_LENGTH:
-    case FILE_TYPE_PICTURE_START_CODE:
-    case FILE_TYPE_MPEG2_START_CODE:
-    case FILE_TYPE_RCV:
-    case FILE_TYPE_VC1:
-#ifdef _MSM8974_
-    case FILE_TYPE_VP8:
-#endif
-    case FILE_TYPE_DIVX_4_5_6:
-#ifdef MAX_RES_1080P
-      case FILE_TYPE_DIVX_311:
-#endif
-      if(Init_Decoder()!= 0x00)
-      {
-        DEBUG_PRINT_ERROR("Error - Decoder Init failed\n");
-        return -1;
-      }
-      if(Play_Decoder() != 0x00)
-      {
-        return -1;
-      }
-      break;
-    default:
-      DEBUG_PRINT_ERROR("Error - Invalid Entry...%d\n",file_type_option);
-      break;
-  }
-
-  anti_flickering = true;
-  if(strlen(seq_file_name))
-  {
-        seqFile = fopen (seq_file_name, "rb");
-        if (seqFile == NULL)
-        {
-            DEBUG_PRINT_ERROR("Error - Seq file %s could NOT be opened\n",
-                              seq_file_name);
+    if (file_type_option == FILE_TYPE_DAT_PER_AU) {
+        Read_Buffer = Read_Buffer_From_DAT_File;
+    } else if (file_type_option == FILE_TYPE_ARBITRARY_BYTES) {
+        Read_Buffer = Read_Buffer_ArbitraryBytes;
+    } else if (codec_format_option == CODEC_FORMAT_H264) {
+        if (file_type_option == FILE_TYPE_264_NAL_SIZE_LENGTH) {
+            Read_Buffer = Read_Buffer_From_Size_Nal;
+        } else if (file_type_option == FILE_TYPE_264_START_CODE_BASED) {
+            Read_Buffer = Read_Buffer_From_H264_Start_Code_File;
+        } else {
+            DEBUG_PRINT_ERROR("Invalid file_type_option(%d) for H264", file_type_option);
             return -1;
         }
-        else
-        {
+    } else if ((codec_format_option == CODEC_FORMAT_H263) ||
+            (codec_format_option == CODEC_FORMAT_MP4)) {
+        Read_Buffer = Read_Buffer_From_Vop_Start_Code_File;
+    } else if (codec_format_option == CODEC_FORMAT_MPEG2) {
+        Read_Buffer = Read_Buffer_From_Mpeg2_Start_Code;
+    } else if (file_type_option == FILE_TYPE_DIVX_4_5_6) {
+        Read_Buffer = Read_Buffer_From_DivX_4_5_6_File;
+    }
+#ifdef MAX_RES_1080P
+    else if (file_type_option == FILE_TYPE_DIVX_311) {
+        Read_Buffer = Read_Buffer_From_DivX_311_File;
+    }
+#endif
+    else if (file_type_option == FILE_TYPE_RCV) {
+        Read_Buffer = Read_Buffer_From_RCV_File;
+    }
+#ifdef _MSM8974_
+    else if (file_type_option == FILE_TYPE_VP8) {
+        Read_Buffer = Read_Buffer_From_VP8_File;
+    }
+#endif
+    else if (file_type_option == FILE_TYPE_VC1) {
+        Read_Buffer = Read_Buffer_From_VC1_File;
+    }
+
+    DEBUG_PRINT("file_type_option %d!\n", file_type_option);
+
+    switch (file_type_option) {
+        case FILE_TYPE_DAT_PER_AU:
+        case FILE_TYPE_ARBITRARY_BYTES:
+        case FILE_TYPE_264_START_CODE_BASED:
+        case FILE_TYPE_264_NAL_SIZE_LENGTH:
+        case FILE_TYPE_PICTURE_START_CODE:
+        case FILE_TYPE_MPEG2_START_CODE:
+        case FILE_TYPE_RCV:
+        case FILE_TYPE_VC1:
+#ifdef _MSM8974_
+        case FILE_TYPE_VP8:
+#endif
+        case FILE_TYPE_DIVX_4_5_6:
+#ifdef MAX_RES_1080P
+        case FILE_TYPE_DIVX_311:
+#endif
+            if (Init_Decoder()!= 0x00) {
+                DEBUG_PRINT_ERROR("Error - Decoder Init failed\n");
+                return -1;
+            }
+            if (Play_Decoder() != 0x00) {
+                return -1;
+            }
+            break;
+        default:
+            DEBUG_PRINT_ERROR("Error - Invalid Entry...%d\n",file_type_option);
+            break;
+    }
+
+    anti_flickering = true;
+    if (strlen(seq_file_name)) {
+        seqFile = fopen (seq_file_name, "rb");
+        if (seqFile == NULL) {
+            DEBUG_PRINT_ERROR("Error - Seq file %s could NOT be opened\n",
+                    seq_file_name);
+            return -1;
+        } else {
             DEBUG_PRINT("Seq file %s is opened \n", seq_file_name);
             seq_enabled = 1;
             anti_flickering = false;
         }
-  }
+    }
 
-  pthread_mutex_lock(&eos_lock);
-  while (bOutputEosReached == false && cmd_error == 0)
-  {
-    if(seq_enabled)
-    {
-        pthread_mutex_unlock(&eos_lock);
-        if(!get_next_command(seqFile))
-            cmd_error = process_current_command(curr_seq_command);
-        else
-        {
-            printf("\n Error in get_next_cmd or EOF");
-            seq_enabled = 0;
+    pthread_mutex_lock(&eos_lock);
+    while (bOutputEosReached == false && cmd_error == 0) {
+        if (seq_enabled) {
+            pthread_mutex_unlock(&eos_lock);
+            if (!get_next_command(seqFile))
+                cmd_error = process_current_command(curr_seq_command);
+            else {
+                printf("\n Error in get_next_cmd or EOF");
+                seq_enabled = 0;
+            }
+            pthread_mutex_lock(&eos_lock);
+        } else
+            pthread_cond_wait(&eos_cond, &eos_lock);
+
+        if (currentStatus == PORT_SETTING_CHANGE_STATE) {
+            pthread_mutex_unlock(&eos_lock);
+            cmd_error = output_port_reconfig();
+            pthread_mutex_lock(&eos_lock);
         }
-        pthread_mutex_lock(&eos_lock);
     }
-    else
-        pthread_cond_wait(&eos_cond, &eos_lock);
+    pthread_mutex_unlock(&eos_lock);
 
-    if (currentStatus == PORT_SETTING_CHANGE_STATE)
-    {
-      pthread_mutex_unlock(&eos_lock);
-      cmd_error = output_port_reconfig();
-      pthread_mutex_lock(&eos_lock);
-    }
-  }
-  pthread_mutex_unlock(&eos_lock);
-
-  // Wait till EOS is reached...
-  if(bOutputEosReached)
-    do_freeHandle_and_clean_up(currentStatus == ERROR_STATE);
-  return 0;
+    // Wait till EOS is reached...
+    if (bOutputEosReached)
+        do_freeHandle_and_clean_up(currentStatus == ERROR_STATE);
+    return 0;
 }
 
 int Init_Decoder()
@@ -1905,11 +1746,10 @@
     DEBUG_PRINT("\nInitializing OpenMAX Core....\n");
     omxresult = OMX_Init();
 
-    if(OMX_ErrorNone != omxresult) {
+    if (OMX_ErrorNone != omxresult) {
         DEBUG_PRINT_ERROR("\n Failed to Init OpenMAX core");
         return -1;
-    }
-    else {
+    } else {
         DEBUG_PRINT_ERROR("\nOpenMAX Core Init Done\n");
     }
 
@@ -1917,8 +1757,7 @@
     OMX_GetComponentsOfRole(role, &total, 0);
     DEBUG_PRINT("\nTotal components of role=%s :%d", role, total);
 
-    if(total)
-    {
+    if (total) {
         /* Allocate memory for pointers to component name */
         OMX_U8** vidCompNames = (OMX_U8**)malloc((sizeof(OMX_U8*))*total);
         if (vidCompNames == NULL) {
@@ -1940,135 +1779,98 @@
             free(vidCompNames[i]);
         }
         free(vidCompNames);
-    }
-    else {
+    } else {
         DEBUG_PRINT_ERROR("No components found with Role:%s", role);
     }
 
-    if (codec_format_option == CODEC_FORMAT_H264)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.avc", 27);
-      //strlcpy(vdecCompNames, "OMX.SEC.qcom.video.decoder.avc", 31);
-    }
-    else if (codec_format_option == CODEC_FORMAT_MP4)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg4", 29);
-    }
-    else if (codec_format_option == CODEC_FORMAT_H263)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.h263", 28);
-    }
-    else if (codec_format_option == CODEC_FORMAT_VC1)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.vc1", 27);
-    }
-    else if (codec_format_option == CODEC_FORMAT_MPEG2)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg2", 29);
-    }
-    else if (file_type_option == FILE_TYPE_RCV)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.wmv", 27);
-    }
-    else if (file_type_option == FILE_TYPE_DIVX_4_5_6)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx", 28);
+    if (codec_format_option == CODEC_FORMAT_H264) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.avc", 27);
+        //strlcpy(vdecCompNames, "OMX.SEC.qcom.video.decoder.avc", 31);
+    } else if (codec_format_option == CODEC_FORMAT_MP4) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg4", 29);
+    } else if (codec_format_option == CODEC_FORMAT_H263) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.h263", 28);
+    } else if (codec_format_option == CODEC_FORMAT_VC1) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.vc1", 27);
+    } else if (codec_format_option == CODEC_FORMAT_MPEG2) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg2", 29);
+    } else if (file_type_option == FILE_TYPE_RCV) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.wmv", 27);
+    } else if (file_type_option == FILE_TYPE_DIVX_4_5_6) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx", 28);
     }
 #ifdef _MSM8974_
-    else if (codec_format_option == CODEC_FORMAT_VP8)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.vp8", 27);
+    else if (codec_format_option == CODEC_FORMAT_VP8) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.vp8", 27);
     }
 #endif
-    else if (codec_format_option == CODEC_FORMAT_HEVC)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.hevc", 28);
+    else if (codec_format_option == CODEC_FORMAT_HEVC) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.hevc", 28);
     }
 #ifdef MAX_RES_1080P
-    else if (file_type_option == FILE_TYPE_DIVX_311)
-    {
-      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx311", 31);
+    else if (file_type_option == FILE_TYPE_DIVX_311) {
+        strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx311", 31);
     }
 #endif
-    else
-    {
-      DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
-      return -1;
+    else {
+        DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
+        return -1;
     }
 
     omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&dec_handle),
-                              (OMX_STRING)vdecCompNames, NULL, &call_back);
+            (OMX_STRING)vdecCompNames, NULL, &call_back);
     if (FAILED(omxresult)) {
         DEBUG_PRINT_ERROR("\nFailed to Load the component:%s\n", vdecCompNames);
         return -1;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT("\nComponent %s is in LOADED state\n", vdecCompNames);
     }
 
     QOMX_VIDEO_QUERY_DECODER_INSTANCES decoder_instances;
     omxresult = OMX_GetConfig(dec_handle,
-                 (OMX_INDEXTYPE)OMX_QcomIndexQueryNumberOfVideoDecInstance,
-                              &decoder_instances);
+            (OMX_INDEXTYPE)OMX_QcomIndexQueryNumberOfVideoDecInstance,
+            &decoder_instances);
     DEBUG_PRINT("\n Number of decoder instances %d",
-                      decoder_instances.nNumOfInstances);
+            decoder_instances.nNumOfInstances);
 
     /* Get the port information */
     CONFIG_VERSION_SIZE(portParam);
     omxresult = OMX_GetParameter(dec_handle, OMX_IndexParamVideoInit,
-                                (OMX_PTR)&portParam);
+            (OMX_PTR)&portParam);
 
-    if(FAILED(omxresult)) {
+    if (FAILED(omxresult)) {
         DEBUG_PRINT_ERROR("ERROR - Failed to get Port Param\n");
         return -1;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT("portParam.nPorts:%d\n", portParam.nPorts);
         DEBUG_PRINT("portParam.nStartPortNumber:%d\n", portParam.nStartPortNumber);
     }
 
     /* Set the compression format on i/p port */
-    if (codec_format_option == CODEC_FORMAT_H264)
-    {
-      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
-    }
-    else if (codec_format_option == CODEC_FORMAT_MP4)
-    {
-      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
-    }
-    else if (codec_format_option == CODEC_FORMAT_H263)
-    {
-      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
-    }
-    else if (codec_format_option == CODEC_FORMAT_VC1)
-    {
-      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingWMV;
-    }
-    else if (codec_format_option == CODEC_FORMAT_DIVX)
-    {
-      portFmt.format.video.eCompressionFormat =
-          (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
-    }
-    else if (codec_format_option == CODEC_FORMAT_MPEG2)
-    {
-      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
-    }
-    else if (codec_format_option == CODEC_FORMAT_HEVC)
-    {
-      portFmt.format.video.eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
+    if (codec_format_option == CODEC_FORMAT_H264) {
+        portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+    } else if (codec_format_option == CODEC_FORMAT_MP4) {
+        portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+    } else if (codec_format_option == CODEC_FORMAT_H263) {
+        portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
+    } else if (codec_format_option == CODEC_FORMAT_VC1) {
+        portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingWMV;
+    } else if (codec_format_option == CODEC_FORMAT_DIVX) {
+        portFmt.format.video.eCompressionFormat =
+            (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+    } else if (codec_format_option == CODEC_FORMAT_MPEG2) {
+        portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
+    } else if (codec_format_option == CODEC_FORMAT_HEVC) {
+        portFmt.format.video.eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
+    } else {
+        DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
     }
 
     if (thumbnailMode == 1) {
         QOMX_ENABLETYPE thumbNailMode;
         thumbNailMode.bEnable = OMX_TRUE;
         OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode,
-                     (OMX_PTR)&thumbNailMode);
+                (OMX_PTR)&thumbNailMode);
         DEBUG_PRINT("Enabled Thumbnail mode\n");
     }
 
@@ -2085,7 +1887,7 @@
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
 
     /* open the i/p and o/p files based on the video file format passed */
-    if(open_video_file()) {
+    if (open_video_file()) {
         DEBUG_PRINT_ERROR("Error in opening video file\n");
         return -1;
     }
@@ -2094,41 +1896,40 @@
     memset(&inputPortFmt, 0, sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE));
     CONFIG_VERSION_SIZE(inputPortFmt);
     inputPortFmt.nPortIndex = 0;  // input port
-    switch (file_type_option)
-    {
-      case FILE_TYPE_DAT_PER_AU:
-      case FILE_TYPE_PICTURE_START_CODE:
-      case FILE_TYPE_MPEG2_START_CODE:
-      case FILE_TYPE_264_START_CODE_BASED:
-      case FILE_TYPE_RCV:
-      case FILE_TYPE_VC1:
+    switch (file_type_option) {
+        case FILE_TYPE_DAT_PER_AU:
+        case FILE_TYPE_PICTURE_START_CODE:
+        case FILE_TYPE_MPEG2_START_CODE:
+        case FILE_TYPE_264_START_CODE_BASED:
+        case FILE_TYPE_RCV:
+        case FILE_TYPE_VC1:
 #ifdef MAX_RES_1080P
-      case FILE_TYPE_DIVX_311:
+        case FILE_TYPE_DIVX_311:
 #endif
-      {
-        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_OnlyOneCompleteFrame;
-        break;
-      }
+            {
+                inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_OnlyOneCompleteFrame;
+                break;
+            }
 
-      case FILE_TYPE_ARBITRARY_BYTES:
-      case FILE_TYPE_264_NAL_SIZE_LENGTH:
-      case FILE_TYPE_DIVX_4_5_6:
-      {
-        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Arbitrary;
-        break;
-      }
+        case FILE_TYPE_ARBITRARY_BYTES:
+        case FILE_TYPE_264_NAL_SIZE_LENGTH:
+        case FILE_TYPE_DIVX_4_5_6:
+            {
+                inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Arbitrary;
+                break;
+            }
 #ifdef _MSM8974_
-      case FILE_TYPE_VP8:
-      {
-        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_OnlyOneCompleteFrame;
-        break;
-      }
+        case FILE_TYPE_VP8:
+            {
+                inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_OnlyOneCompleteFrame;
+                break;
+            }
 #endif
-      default:
-        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Unspecified;
+        default:
+            inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Unspecified;
     }
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
-                     (OMX_PTR)&inputPortFmt);
+            (OMX_PTR)&inputPortFmt);
 #ifdef USE_EXTERN_PMEM_BUF
     OMX_QCOM_PARAM_PORTDEFINITIONTYPE outPortFmt;
     memset(&outPortFmt, 0, sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE));
@@ -2137,7 +1938,7 @@
     outPortFmt.nCacheAttr = OMX_QCOM_CacheAttrNone;
     outPortFmt.nMemRegion = OMX_QCOM_MemRegionSMI;
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
-                     (OMX_PTR)&outPortFmt);
+            (OMX_PTR)&outPortFmt);
 
     OMX_QCOM_PLATFORMPRIVATE_EXTN outPltPvtExtn;
     memset(&outPltPvtExtn, 0, sizeof(OMX_QCOM_PLATFORMPRIVATE_EXTN));
@@ -2145,36 +1946,36 @@
     outPltPvtExtn.nPortIndex = 1;  // output port
     outPltPvtExtn.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPlatformPvt,
-                     (OMX_PTR)&outPltPvtExtn);
+            (OMX_PTR)&outPltPvtExtn);
     use_external_pmem_buf = OMX_TRUE;
 #endif
     QOMX_ENABLETYPE extra_data;
     extra_data.bEnable = OMX_TRUE;
 #if 0
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamInterlaceExtraData,
-                     (OMX_PTR)&extra_data);
+            (OMX_PTR)&extra_data);
 #endif
 #if 0
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
-                     (OMX_PTR)&extra_data);
+            (OMX_PTR)&extra_data);
 #endif
 #if 1
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamFrameInfoExtraData,
-                     (OMX_PTR)&extra_data);
+            (OMX_PTR)&extra_data);
 #endif
 #ifdef TEST_TS_FROM_SEI
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamH264TimeInfo,
-                     (OMX_PTR)&extra_data);
+            (OMX_PTR)&extra_data);
 #endif
 #if 0
     extra_data.bEnable = OMX_FALSE;
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
-                     (OMX_PTR)&extra_data);
+            (OMX_PTR)&extra_data);
 #endif
 #if 0
     extra_data.bEnable = OMX_TRUE;
     OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData,
-                     (OMX_PTR)&extra_data);
+            (OMX_PTR)&extra_data);
 #endif
     /* Query the decoder outport's min buf requirements */
     CONFIG_VERSION_SIZE(portFmt);
@@ -2186,36 +1987,36 @@
     DEBUG_PRINT("\nDec: Min Buffer Count %d\n", portFmt.nBufferCountMin);
     DEBUG_PRINT("\nDec: Buffer Size %d\n", portFmt.nBufferSize);
 
-    if(OMX_DirInput != portFmt.eDir) {
+    if (OMX_DirInput != portFmt.eDir) {
         printf ("\nDec: Expect Input Port\n");
         return -1;
     }
 #ifdef MAX_RES_1080P
-    if( (codec_format_option == CODEC_FORMAT_DIVX) &&
-        (file_type_option == FILE_TYPE_DIVX_311) ) {
+    if ( (codec_format_option == CODEC_FORMAT_DIVX) &&
+            (file_type_option == FILE_TYPE_DIVX_311) ) {
 
-            int off;
+        int off;
 
-            if ( read(inputBufferFileFd, &width, 4 ) == -1 ) {
-                DEBUG_PRINT_ERROR("\nFailed to read width for divx\n");
-                return  -1;
-            }
+        if ( read(inputBufferFileFd, &width, 4 ) == -1 ) {
+            DEBUG_PRINT_ERROR("\nFailed to read width for divx\n");
+            return  -1;
+        }
 
-            DEBUG_PRINT("\nWidth for DIVX = %d\n", width);
+        DEBUG_PRINT("\nWidth for DIVX = %d\n", width);
 
-            if ( read(inputBufferFileFd, &height, 4 ) == -1 ) {
-                DEBUG_PRINT_ERROR("\nFailed to read height for divx\n");
-                return  -1;
-            }
+        if ( read(inputBufferFileFd, &height, 4 ) == -1 ) {
+            DEBUG_PRINT_ERROR("\nFailed to read height for divx\n");
+            return  -1;
+        }
 
-            DEBUG_PRINT("\nHeight for DIVX = %u\n", height);
-            sliceheight = height;
-            stride = width;
+        DEBUG_PRINT("\nHeight for DIVX = %u\n", height);
+        sliceheight = height;
+        stride = width;
     }
 #endif
 #ifdef _MSM8974_
-    if( (codec_format_option == CODEC_FORMAT_VC1) &&
-        (file_type_option == FILE_TYPE_RCV) ) {
+    if ( (codec_format_option == CODEC_FORMAT_VC1) &&
+            (file_type_option == FILE_TYPE_RCV) ) {
         //parse struct_A data to get height and width information
         unsigned int temp;
         lseek64(inputBufferFileFd, 0, SEEK_SET);
@@ -2240,9 +2041,9 @@
             }
             lseek64(inputBufferFileFd, 0, SEEK_SET);
         }
-	if ((temp & 0xFF000000) == 0x85000000) {
-		lseek64(inputBufferFileFd, 0, SEEK_SET);
-	}
+        if ((temp & 0xFF000000) == 0x85000000) {
+            lseek64(inputBufferFileFd, 0, SEEK_SET);
+        }
         DEBUG_PRINT("\n RCV clip width = %u height = %u \n",width, height);
     }
 #endif
@@ -2258,68 +2059,57 @@
     DEBUG_PRINT("\nDec: New Min Buffer Count %d", portFmt.nBufferCountMin);
     CONFIG_VERSION_SIZE(videoportFmt);
 #ifdef MAX_RES_720P
-    if(color_fmt_type == 0)
-    {
+    if (color_fmt_type == 0) {
         color_fmt = OMX_COLOR_FormatYUV420SemiPlanar;
-    }
-    else
-    {
+    } else {
         color_fmt = (OMX_COLOR_FORMATTYPE)
-           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
     }
 #elif _MSM8974_
-        color_fmt = (OMX_COLOR_FORMATTYPE)
-		QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+    color_fmt = (OMX_COLOR_FORMATTYPE)
+        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
 #else
-       color_fmt = (OMX_COLOR_FORMATTYPE)
-           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+    color_fmt = (OMX_COLOR_FORMATTYPE)
+        QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
 #endif
 
-    while (ret == OMX_ErrorNone)
-    {
+    while (ret == OMX_ErrorNone) {
         videoportFmt.nPortIndex = 1;
         videoportFmt.nIndex = index;
         ret = OMX_GetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
-          (OMX_PTR)&videoportFmt);
+                (OMX_PTR)&videoportFmt);
 
-        if((ret == OMX_ErrorNone) && (videoportFmt.eColorFormat ==
-           color_fmt))
-        {
+        if ((ret == OMX_ErrorNone) && (videoportFmt.eColorFormat ==
+                    color_fmt)) {
             DEBUG_PRINT("\n Format[%u] supported by OMX Decoder", color_fmt);
             break;
         }
         index++;
     }
 
-    if(ret == OMX_ErrorNone)
-    {
-        if(OMX_SetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
-            (OMX_PTR)&videoportFmt) != OMX_ErrorNone)
-        {
+    if (ret == OMX_ErrorNone) {
+        if (OMX_SetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
+                    (OMX_PTR)&videoportFmt) != OMX_ErrorNone) {
             DEBUG_PRINT_ERROR("\n Setting Tile format failed");
             return -1;
         }
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT_ERROR("\n Error in retrieving supported color formats");
         return -1;
     }
     picture_order.nPortIndex = 1;
     DEBUG_PRINT("\nSet picture order\n");
-    if(OMX_SetParameter(dec_handle,
-	   (OMX_INDEXTYPE)OMX_QcomIndexParamVideoDecoderPictureOrder,
-       (OMX_PTR)&picture_order) != OMX_ErrorNone)
-    {
+    if (OMX_SetParameter(dec_handle,
+                (OMX_INDEXTYPE)OMX_QcomIndexParamVideoDecoderPictureOrder,
+                (OMX_PTR)&picture_order) != OMX_ErrorNone) {
         printf("\n ERROR: Setting picture order!");
         return -1;
     }
     DEBUG_PRINT("\nVideo format: W x H (%d x %d)",
-      portFmt.format.video.nFrameWidth,
-      portFmt.format.video.nFrameHeight);
-    if(codec_format_option == CODEC_FORMAT_H264 ||
-       codec_format_option == CODEC_FORMAT_HEVC)
-    {
+            portFmt.format.video.nFrameWidth,
+            portFmt.format.video.nFrameHeight);
+    if (codec_format_option == CODEC_FORMAT_H264 ||
+            codec_format_option == CODEC_FORMAT_HEVC) {
         OMX_VIDEO_CONFIG_NALSIZE naluSize;
         naluSize.nNaluBytes = nalSize;
         DEBUG_PRINT("\n Nal length is %d index %d",nalSize,OMX_IndexConfigVideoNalSize);
@@ -2333,40 +2123,38 @@
     DEBUG_PRINT("Transition to Idle State succesful...\n");
 
 #if ALLOCATE_BUFFER
-       // Allocate buffer on decoder's i/p port
-       error = Allocate_Buffer(dec_handle, &pInputBufHdrs, portFmt.nPortIndex,
-                               portFmt.nBufferCountActual, portFmt.nBufferSize);
-       if (error != OMX_ErrorNone) {
-           DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Input buffer error\n");
-           return -1;
-       }
-       else {
-           DEBUG_PRINT("\nOMX_AllocateBuffer Input buffer success\n");
-       }
+    // Allocate buffer on decoder's i/p port
+    error = Allocate_Buffer(dec_handle, &pInputBufHdrs, portFmt.nPortIndex,
+            portFmt.nBufferCountActual, portFmt.nBufferSize);
+    if (error != OMX_ErrorNone) {
+        DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Input buffer error\n");
+        return -1;
+    } else {
+        DEBUG_PRINT("\nOMX_AllocateBuffer Input buffer success\n");
+    }
 #else
-       // Use buffer on decoder's i/p port
-          input_use_buffer = true;
-          DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
-          error =  use_input_buffer(dec_handle,
-                             &pInputBufHdrs,
-                              portFmt.nPortIndex,
-                              portFmt.nBufferSize,
-                              portFmt.nBufferCountActual);
-          if (error != OMX_ErrorNone) {
-             DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
-             return -1;
-          }
-          else {
-             DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
-          }
+    // Use buffer on decoder's i/p port
+    input_use_buffer = true;
+    DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
+    error =  use_input_buffer(dec_handle,
+            &pInputBufHdrs,
+            portFmt.nPortIndex,
+            portFmt.nBufferSize,
+            portFmt.nBufferCountActual);
+    if (error != OMX_ErrorNone) {
+        DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
+        return -1;
+    } else {
+        DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
+    }
 #endif
-       portFmt.nPortIndex = portParam.nStartPortNumber+1;
-       // Port for which the Client needs to obtain info
+    portFmt.nPortIndex = portParam.nStartPortNumber+1;
+    // Port for which the Client needs to obtain info
 
     OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
     DEBUG_PRINT("nMin Buffer Count=%d", portFmt.nBufferCountMin);
     DEBUG_PRINT("nBuffer Size=%d", portFmt.nBufferSize);
-    if(OMX_DirOutput != portFmt.eDir) {
+    if (OMX_DirOutput != portFmt.eDir) {
         DEBUG_PRINT_ERROR("Error - Expect Output Port\n");
         return -1;
     }
@@ -2386,88 +2174,74 @@
     }
 
 #ifndef USE_EGL_IMAGE_TEST_APP
-    if (use_external_pmem_buf)
-    {
+    if (use_external_pmem_buf) {
         DEBUG_PRINT_ERROR("\n Use External pmem buf: OMX_UseBuffer %p", &pInputBufHdrs);
         error =  use_output_buffer_multiple_fd(dec_handle,
-                                               &pOutYUVBufHdrs,
-                                               portFmt.nPortIndex,
-                                               portFmt.nBufferSize,
-                                               portFmt.nBufferCountActual);
-    }
-    else
-    {
+                &pOutYUVBufHdrs,
+                portFmt.nPortIndex,
+                portFmt.nBufferSize,
+                portFmt.nBufferCountActual);
+    } else {
         /* Allocate buffer on decoder's o/p port */
         error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
-                                portFmt.nBufferCountActual, portFmt.nBufferSize);
+                portFmt.nBufferCountActual, portFmt.nBufferSize);
     }
     free_op_buf_cnt = portFmt.nBufferCountActual;
     if (error != OMX_ErrorNone) {
         DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
         return -1;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
     }
 #else
     DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
     error =  use_output_buffer(dec_handle,
-                       &pOutYUVBufHdrs,
-                        portFmt.nPortIndex,
-                        portFmt.nBufferSize,
-                        portFmt.nBufferCountActual);
+            &pOutYUVBufHdrs,
+            portFmt.nPortIndex,
+            portFmt.nBufferSize,
+            portFmt.nBufferCountActual);
     free_op_buf_cnt = portFmt.nBufferCountActual;
     if (error != OMX_ErrorNone) {
-       DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
-       return -1;
-    }
-    else {
-       DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
+        DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
+        return -1;
+    } else {
+        DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
     }
 #endif
     wait_for_event();
-    if (currentStatus == ERROR_STATE)
-    {
-      do_freeHandle_and_clean_up(true);
-      return -1;
+    if (currentStatus == ERROR_STATE) {
+        do_freeHandle_and_clean_up(true);
+        return -1;
     }
 
-    if (freeHandle_option == FREE_HANDLE_AT_IDLE)
-    {
-      OMX_STATETYPE state = OMX_StateInvalid;
-      OMX_GetState(dec_handle, &state);
-      if (state == OMX_StateIdle)
-      {
-        DEBUG_PRINT("Decoder is in OMX_StateIdle and trying to call OMX_FreeHandle \n");
-        do_freeHandle_and_clean_up(false);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
-        do_freeHandle_and_clean_up(true);
-      }
-      return -1;
+    if (freeHandle_option == FREE_HANDLE_AT_IDLE) {
+        OMX_STATETYPE state = OMX_StateInvalid;
+        OMX_GetState(dec_handle, &state);
+        if (state == OMX_StateIdle) {
+            DEBUG_PRINT("Decoder is in OMX_StateIdle and trying to call OMX_FreeHandle \n");
+            do_freeHandle_and_clean_up(false);
+        } else {
+            DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
+            do_freeHandle_and_clean_up(true);
+        }
+        return -1;
     }
 
 
     DEBUG_PRINT("OMX_SendCommand Decoder -> Executing\n");
     OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
     wait_for_event();
-    if (currentStatus == ERROR_STATE)
-    {
-      do_freeHandle_and_clean_up(true);
-      return -1;
+    if (currentStatus == ERROR_STATE) {
+        do_freeHandle_and_clean_up(true);
+        return -1;
     }
-    if (pOutYUVBufHdrs == NULL)
-    {
+    if (pOutYUVBufHdrs == NULL) {
         DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs is NULL\n");
         return -1;
     }
-    for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
+    for (bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
         DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
-        if (pOutYUVBufHdrs[bufCnt] == NULL)
-        {
+        if (pOutYUVBufHdrs[bufCnt] == NULL) {
             DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs[%d] is NULL\n", bufCnt);
             return -1;
         }
@@ -2476,8 +2250,7 @@
         ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
         if (OMX_ErrorNone != ret)
             DEBUG_PRINT_ERROR("Error - OMX_FillThisBuffer failed with result %d\n", ret);
-        else
-        {
+        else {
             DEBUG_PRINT("OMX_FillThisBuffer success!\n");
             free_op_buf_cnt--;
         }
@@ -2488,158 +2261,133 @@
     rcv_v1 = 0;
 
     //QPERF_START(client_decode);
-    if (codec_format_option == CODEC_FORMAT_VC1)
-    {
-      pInputBufHdrs[0]->nOffset = 0;
-      if(file_type_option == FILE_TYPE_RCV)
-      {
-      frameSize = Read_Buffer_From_RCV_File_Seq_Layer(pInputBufHdrs[0]);
-      pInputBufHdrs[0]->nFilledLen = frameSize;
-          DEBUG_PRINT("After Read_Buffer_From_RCV_File_Seq_Layer, "
-              "frameSize %d\n", frameSize);
-      }
-      else if(file_type_option == FILE_TYPE_VC1)
-      {
-          bHdrflag = 1;
-          pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
-          bHdrflag = 0;
-          DEBUG_PRINT_ERROR("After 1st Read_Buffer for VC1, "
-              "pInputBufHdrs[0]->nFilledLen %d\n", pInputBufHdrs[0]->nFilledLen);
-      }
-      else
-      {
-          pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
-          DEBUG_PRINT("After Read_Buffer pInputBufHdrs[0]->nFilledLen %d\n",
-              pInputBufHdrs[0]->nFilledLen);
-      }
+    if (codec_format_option == CODEC_FORMAT_VC1) {
+        pInputBufHdrs[0]->nOffset = 0;
+        if (file_type_option == FILE_TYPE_RCV) {
+            frameSize = Read_Buffer_From_RCV_File_Seq_Layer(pInputBufHdrs[0]);
+            pInputBufHdrs[0]->nFilledLen = frameSize;
+            DEBUG_PRINT("After Read_Buffer_From_RCV_File_Seq_Layer, "
+                    "frameSize %d\n", frameSize);
+        } else if (file_type_option == FILE_TYPE_VC1) {
+            bHdrflag = 1;
+            pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
+            bHdrflag = 0;
+            DEBUG_PRINT_ERROR("After 1st Read_Buffer for VC1, "
+                    "pInputBufHdrs[0]->nFilledLen %d\n", pInputBufHdrs[0]->nFilledLen);
+        } else {
+            pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
+            DEBUG_PRINT("After Read_Buffer pInputBufHdrs[0]->nFilledLen %d\n",
+                    pInputBufHdrs[0]->nFilledLen);
+        }
 
-      pInputBufHdrs[0]->nInputPortIndex = 0;
-      pInputBufHdrs[0]->nOffset = 0;
+        pInputBufHdrs[0]->nInputPortIndex = 0;
+        pInputBufHdrs[0]->nOffset = 0;
 #ifndef _MSM8974_
-      pInputBufHdrs[0]->nFlags = 0;
+        pInputBufHdrs[0]->nFlags = 0;
 #endif
-      ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[0]);
-      if (ret != OMX_ErrorNone)
-      {
-          DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
-          do_freeHandle_and_clean_up(true);
-          return -1;
-      }
-      else
-      {
-          etb_count++;
-          DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
-      }
-      i = 1;
+        ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[0]);
+        if (ret != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
+            do_freeHandle_and_clean_up(true);
+            return -1;
+        } else {
+            etb_count++;
+            DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
+        }
+        i = 1;
 #ifdef _MSM8974_
-      pInputBufHdrs[0]->nFlags = 0;
+        pInputBufHdrs[0]->nFlags = 0;
 #endif
-    }
-    else
-    {
-      i = 0;
+    } else {
+        i = 0;
     }
 
-    for (i; i < used_ip_buf_cnt;i++) {
-      pInputBufHdrs[i]->nInputPortIndex = 0;
-      pInputBufHdrs[i]->nOffset = 0;
-      if((frameSize = Read_Buffer(pInputBufHdrs[i])) <= 0 ){
-        DEBUG_PRINT("NO FRAME READ\n");
+    for (i; i < used_ip_buf_cnt; i++) {
+        pInputBufHdrs[i]->nInputPortIndex = 0;
+        pInputBufHdrs[i]->nOffset = 0;
+        if ((frameSize = Read_Buffer(pInputBufHdrs[i])) <= 0 ) {
+            DEBUG_PRINT("NO FRAME READ\n");
+            pInputBufHdrs[i]->nFilledLen = frameSize;
+            pInputBufHdrs[i]->nInputPortIndex = 0;
+            pInputBufHdrs[i]->nFlags |= OMX_BUFFERFLAG_EOS;;
+            bInputEosReached = true;
+
+            OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
+            etb_count++;
+            DEBUG_PRINT("File is small::Either EOS or Some Error while reading file\n");
+            break;
+        }
         pInputBufHdrs[i]->nFilledLen = frameSize;
         pInputBufHdrs[i]->nInputPortIndex = 0;
-        pInputBufHdrs[i]->nFlags |= OMX_BUFFERFLAG_EOS;;
-        bInputEosReached = true;
-
-        OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
-        etb_count++;
-        DEBUG_PRINT("File is small::Either EOS or Some Error while reading file\n");
-        break;
-      }
-      pInputBufHdrs[i]->nFilledLen = frameSize;
-      pInputBufHdrs[i]->nInputPortIndex = 0;
-      pInputBufHdrs[i]->nFlags = 0;
-//pBufHdr[bufCnt]->pAppPrivate = this;
-      DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pInputBufHdrs[i]->nTimeStamp);
-      ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
-      if (OMX_ErrorNone != ret) {
-          DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
-          do_freeHandle_and_clean_up(true);
-          return -1;
-      }
-      else {
-          DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
-          etb_count++;
-      }
+        pInputBufHdrs[i]->nFlags = 0;
+        //pBufHdr[bufCnt]->pAppPrivate = this;
+        DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pInputBufHdrs[i]->nTimeStamp);
+        ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
+        if (OMX_ErrorNone != ret) {
+            DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
+            do_freeHandle_and_clean_up(true);
+            return -1;
+        } else {
+            DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
+            etb_count++;
+        }
     }
 
-    if(0 != pthread_create(&ebd_thread_id, NULL, ebd_thread, NULL))
-    {
-      printf("\n Error in Creating fbd_thread \n");
-      free_queue(etb_queue);
-      free_queue(fbd_queue);
-      return -1;
+    if (0 != pthread_create(&ebd_thread_id, NULL, ebd_thread, NULL)) {
+        printf("\n Error in Creating fbd_thread \n");
+        free_queue(etb_queue);
+        free_queue(fbd_queue);
+        return -1;
     }
 
     // wait for event port settings changed event
     DEBUG_PRINT("wait_for_event: dyn reconfig");
     wait_for_event();
     DEBUG_PRINT("wait_for_event: dyn reconfig rcvd, currentStatus %d\n",
-                  currentStatus);
-    if (currentStatus == ERROR_STATE)
-    {
-      printf("Error - ERROR_STATE\n");
-      do_freeHandle_and_clean_up(true);
-      return -1;
-    }
-    else if (currentStatus == PORT_SETTING_CHANGE_STATE)
-    {
-      if (output_port_reconfig() != 0)
+            currentStatus);
+    if (currentStatus == ERROR_STATE) {
+        printf("Error - ERROR_STATE\n");
+        do_freeHandle_and_clean_up(true);
         return -1;
+    } else if (currentStatus == PORT_SETTING_CHANGE_STATE) {
+        if (output_port_reconfig() != 0)
+            return -1;
     }
 
-    if (freeHandle_option == FREE_HANDLE_AT_EXECUTING)
-    {
-      OMX_STATETYPE state = OMX_StateInvalid;
-      OMX_GetState(dec_handle, &state);
-      if (state == OMX_StateExecuting)
-      {
-        DEBUG_PRINT("Decoder is in OMX_StateExecuting and trying to call OMX_FreeHandle \n");
-        do_freeHandle_and_clean_up(false);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
-        do_freeHandle_and_clean_up(true);
-      }
-      return -1;
-    }
-    else if (freeHandle_option == FREE_HANDLE_AT_PAUSE)
-    {
-      OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
-      wait_for_event();
+    if (freeHandle_option == FREE_HANDLE_AT_EXECUTING) {
+        OMX_STATETYPE state = OMX_StateInvalid;
+        OMX_GetState(dec_handle, &state);
+        if (state == OMX_StateExecuting) {
+            DEBUG_PRINT("Decoder is in OMX_StateExecuting and trying to call OMX_FreeHandle \n");
+            do_freeHandle_and_clean_up(false);
+        } else {
+            DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
+            do_freeHandle_and_clean_up(true);
+        }
+        return -1;
+    } else if (freeHandle_option == FREE_HANDLE_AT_PAUSE) {
+        OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
+        wait_for_event();
 
-      OMX_STATETYPE state = OMX_StateInvalid;
-      OMX_GetState(dec_handle, &state);
-      if (state == OMX_StatePause)
-      {
-        DEBUG_PRINT("Decoder is in OMX_StatePause and trying to call OMX_FreeHandle \n");
-        do_freeHandle_and_clean_up(false);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
-        do_freeHandle_and_clean_up(true);
-      }
-      return -1;
+        OMX_STATETYPE state = OMX_StateInvalid;
+        OMX_GetState(dec_handle, &state);
+        if (state == OMX_StatePause) {
+            DEBUG_PRINT("Decoder is in OMX_StatePause and trying to call OMX_FreeHandle \n");
+            do_freeHandle_and_clean_up(false);
+        } else {
+            DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
+            do_freeHandle_and_clean_up(true);
+        }
+        return -1;
     }
 
     return 0;
 }
 
 static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *dec_handle,
-                                       OMX_BUFFERHEADERTYPE  ***pBufHdrs,
-                                       OMX_U32 nPortIndex,
-                                       long bufCntMin, long bufSize)
+        OMX_BUFFERHEADERTYPE  ***pBufHdrs,
+        OMX_U32 nPortIndex,
+        long bufCntMin, long bufSize)
 {
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
     OMX_ERRORTYPE error=OMX_ErrorNone;
@@ -2647,22 +2395,22 @@
 
     DEBUG_PRINT("pBufHdrs = %x,bufCntMin = %d\n", pBufHdrs, bufCntMin);
     *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
-                   malloc(sizeof(OMX_BUFFERHEADERTYPE)*bufCntMin);
+        malloc(sizeof(OMX_BUFFERHEADERTYPE)*bufCntMin);
 
-    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+    for (bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
         DEBUG_PRINT("OMX_AllocateBuffer No %d \n", bufCnt);
         error = OMX_AllocateBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
-                                   nPortIndex, NULL, bufSize);
+                nPortIndex, NULL, bufSize);
     }
 
     return error;
 }
 
 static OMX_ERRORTYPE use_input_buffer ( OMX_COMPONENTTYPE *dec_handle,
-                                  OMX_BUFFERHEADERTYPE  ***pBufHdrs,
-                                  OMX_U32 nPortIndex,
-                                  OMX_U32 bufSize,
-                                  long bufCntMin)
+        OMX_BUFFERHEADERTYPE  ***pBufHdrs,
+        OMX_U32 nPortIndex,
+        OMX_U32 bufSize,
+        long bufCntMin)
 {
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
     OMX_ERRORTYPE error=OMX_ErrorNone;
@@ -2670,31 +2418,31 @@
     OMX_U8* pvirt = NULL;
 
     *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
-                   malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
-    if(*pBufHdrs == NULL){
+        malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
+    if (*pBufHdrs == NULL) {
         DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
         return OMX_ErrorInsufficientResources;
-     }
+    }
 
-    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+    for (bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
         // allocate input buffers
-      DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
-      pvirt = (OMX_U8*) malloc (bufSize);
-      if(pvirt == NULL){
-        DEBUG_PRINT_ERROR("\n pvirt Allocation failed ");
-        return OMX_ErrorInsufficientResources;
-     }
-      error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
-                              nPortIndex, NULL, bufSize, pvirt);
-       }
+        DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
+        pvirt = (OMX_U8*) malloc (bufSize);
+        if (pvirt == NULL) {
+            DEBUG_PRINT_ERROR("\n pvirt Allocation failed ");
+            return OMX_ErrorInsufficientResources;
+        }
+        error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
+                nPortIndex, NULL, bufSize, pvirt);
+    }
     return error;
 }
 
 static OMX_ERRORTYPE use_output_buffer ( OMX_COMPONENTTYPE *dec_handle,
-                                  OMX_BUFFERHEADERTYPE  ***pBufHdrs,
-                                  OMX_U32 nPortIndex,
-                                  OMX_U32 bufSize,
-                                  long bufCntMin)
+        OMX_BUFFERHEADERTYPE  ***pBufHdrs,
+        OMX_U32 nPortIndex,
+        OMX_U32 bufSize,
+        long bufCntMin)
 {
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
     OMX_ERRORTYPE error=OMX_ErrorNone;
@@ -2702,60 +2450,60 @@
     OMX_U8* pvirt = NULL;
 
     *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
-                   malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
-    if(*pBufHdrs == NULL){
+        malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
+    if (*pBufHdrs == NULL) {
         DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
         return OMX_ErrorInsufficientResources;
-     }
+    }
     output_use_buffer = true;
     p_eglHeaders = (struct temp_egl **)
-                    malloc(sizeof(struct temp_egl *)* bufCntMin);
-    if (!p_eglHeaders){
+        malloc(sizeof(struct temp_egl *)* bufCntMin);
+    if (!p_eglHeaders) {
         DEBUG_PRINT_ERROR("\n EGL allocation failed");
         return OMX_ErrorInsufficientResources;
     }
 
-    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+    for (bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
         // allocate input buffers
-      DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
-      p_eglHeaders[bufCnt] = (struct temp_egl*)
-                         malloc(sizeof(struct temp_egl));
-      if(!p_eglHeaders[bufCnt]) {
-          DEBUG_PRINT_ERROR("\n EGL allocation failed");
-          return OMX_ErrorInsufficientResources;
-      }
-      p_eglHeaders[bufCnt]->pmem_fd = open(PMEM_DEVICE,O_RDWR);
-      p_eglHeaders[bufCnt]->offset = 0;
-      if(p_eglHeaders[bufCnt]->pmem_fd < 0) {
-          DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
-          return OMX_ErrorInsufficientResources;
-      }
+        DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
+        p_eglHeaders[bufCnt] = (struct temp_egl*)
+            malloc(sizeof(struct temp_egl));
+        if (!p_eglHeaders[bufCnt]) {
+            DEBUG_PRINT_ERROR("\n EGL allocation failed");
+            return OMX_ErrorInsufficientResources;
+        }
+        p_eglHeaders[bufCnt]->pmem_fd = open(PMEM_DEVICE,O_RDWR);
+        p_eglHeaders[bufCnt]->offset = 0;
+        if (p_eglHeaders[bufCnt]->pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
+            return OMX_ErrorInsufficientResources;
+        }
 
 #ifndef USE_ION
-      /* TBD - this commenting is dangerous */
-      align_pmem_buffers(p_eglHeaders[bufCnt]->pmem_fd, bufSize,
-                                  8192);
+        /* TBD - this commenting is dangerous */
+        align_pmem_buffers(p_eglHeaders[bufCnt]->pmem_fd, bufSize,
+                8192);
 #endif
-      DEBUG_PRINT_ERROR("\n allocation size %d pmem fd %d",bufSize,p_eglHeaders[bufCnt]->pmem_fd);
-      pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
-                      MAP_SHARED,p_eglHeaders[bufCnt]->pmem_fd,0);
-      DEBUG_PRINT_ERROR("\n Virtaul Address %p Size %d",pvirt,bufSize);
-      if (pvirt == MAP_FAILED) {
-        DEBUG_PRINT_ERROR("\n mmap failed for buffers");
-        return OMX_ErrorInsufficientResources;
-      }
+        DEBUG_PRINT_ERROR("\n allocation size %d pmem fd %d",bufSize,p_eglHeaders[bufCnt]->pmem_fd);
+        pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
+                MAP_SHARED,p_eglHeaders[bufCnt]->pmem_fd,0);
+        DEBUG_PRINT_ERROR("\n Virtaul Address %p Size %d",pvirt,bufSize);
+        if (pvirt == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("\n mmap failed for buffers");
+            return OMX_ErrorInsufficientResources;
+        }
         use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
         error = OMX_UseEGLImage(dec_handle, &((*pBufHdrs)[bufCnt]),
-                              nPortIndex, pvirt,(void *)p_eglHeaders[bufCnt]);
-       }
+                nPortIndex, pvirt,(void *)p_eglHeaders[bufCnt]);
+    }
     return error;
 }
 
 static OMX_ERRORTYPE use_output_buffer_multiple_fd ( OMX_COMPONENTTYPE *dec_handle,
-                                  OMX_BUFFERHEADERTYPE  ***pBufHdrs,
-                                  OMX_U32 nPortIndex,
-                                  OMX_U32 bufSize,
-                                  long bufCntMin)
+        OMX_BUFFERHEADERTYPE  ***pBufHdrs,
+        OMX_U32 nPortIndex,
+        OMX_U32 bufSize,
+        long bufCntMin)
 {
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
     OMX_ERRORTYPE error=OMX_ErrorNone;
@@ -2763,68 +2511,68 @@
     OMX_U8* pvirt = NULL;
 
     *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
-                   malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
-    if(*pBufHdrs == NULL){
+        malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
+    if (*pBufHdrs == NULL) {
         DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
         return OMX_ErrorInsufficientResources;
-     }
+    }
     pPlatformList = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)
         malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST)* bufCntMin);
 
-    if(pPlatformList == NULL){
+    if (pPlatformList == NULL) {
         DEBUG_PRINT_ERROR("\n pPlatformList Allocation failed ");
         return OMX_ErrorInsufficientResources;
-     }
+    }
 
     pPlatformEntry = (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
         malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY)* bufCntMin);
 
-    if(pPlatformEntry == NULL){
+    if (pPlatformEntry == NULL) {
         DEBUG_PRINT_ERROR("\n pPlatformEntry Allocation failed ");
         return OMX_ErrorInsufficientResources;
-     }
+    }
 
     pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
         malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO)* bufCntMin);
 
-    if(pPMEMInfo == NULL){
+    if (pPMEMInfo == NULL) {
         DEBUG_PRINT_ERROR("\n pPMEMInfo Allocation failed ");
         return OMX_ErrorInsufficientResources;
-     }
+    }
 
     //output_use_buffer = true;
-    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+    for (bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
         // allocate input buffers
-      DEBUG_PRINT("OMX_UseBuffer_multiple_fd No %d %d \n", bufCnt, bufSize);
+        DEBUG_PRINT("OMX_UseBuffer_multiple_fd No %d %d \n", bufCnt, bufSize);
 
-      pPlatformEntry[bufCnt].type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
-      pPlatformEntry[bufCnt].entry      = &pPMEMInfo[bufCnt];
-      // Initialize the Platform List
-      pPlatformList[bufCnt].nEntries    = 1;
-      pPlatformList[bufCnt].entryList   = &pPlatformEntry[bufCnt];
-      pPMEMInfo[bufCnt].offset          =  0;
-      pPMEMInfo[bufCnt].pmem_fd = open(PMEM_DEVICE,O_RDWR);;
-      if(pPMEMInfo[bufCnt].pmem_fd < 0) {
-          DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
-          return OMX_ErrorInsufficientResources;
-      }
+        pPlatformEntry[bufCnt].type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+        pPlatformEntry[bufCnt].entry      = &pPMEMInfo[bufCnt];
+        // Initialize the Platform List
+        pPlatformList[bufCnt].nEntries    = 1;
+        pPlatformList[bufCnt].entryList   = &pPlatformEntry[bufCnt];
+        pPMEMInfo[bufCnt].offset          =  0;
+        pPMEMInfo[bufCnt].pmem_fd = open(PMEM_DEVICE,O_RDWR);;
+        if (pPMEMInfo[bufCnt].pmem_fd < 0) {
+            DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
+            return OMX_ErrorInsufficientResources;
+        }
 #ifndef USE_ION
-      /* TBD - this commenting is dangerous */
-      align_pmem_buffers(pPMEMInfo[bufCnt].pmem_fd, bufSize,
-                                  8192);
+        /* TBD - this commenting is dangerous */
+        align_pmem_buffers(pPMEMInfo[bufCnt].pmem_fd, bufSize,
+                8192);
 #endif
-      DEBUG_PRINT("\n allocation size %d pmem fd 0x%x",bufSize,pPMEMInfo[bufCnt].pmem_fd);
-      pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
-                      MAP_SHARED,pPMEMInfo[bufCnt].pmem_fd,0);
-      getFreePmem();
-      DEBUG_PRINT("\n Virtaul Address %p Size %d pmem_fd=0x%x",pvirt,bufSize,pPMEMInfo[bufCnt].pmem_fd);
-      if (pvirt == MAP_FAILED) {
-        DEBUG_PRINT_ERROR("\n mmap failed for buffers");
-        return OMX_ErrorInsufficientResources;
-      }
-      use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
-      error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
-                            nPortIndex, &pPlatformList[bufCnt], bufSize, pvirt);
+        DEBUG_PRINT("\n allocation size %d pmem fd 0x%x",bufSize,pPMEMInfo[bufCnt].pmem_fd);
+        pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
+                MAP_SHARED,pPMEMInfo[bufCnt].pmem_fd,0);
+        getFreePmem();
+        DEBUG_PRINT("\n Virtaul Address %p Size %d pmem_fd=0x%x",pvirt,bufSize,pPMEMInfo[bufCnt].pmem_fd);
+        if (pvirt == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("\n mmap failed for buffers");
+            return OMX_ErrorInsufficientResources;
+        }
+        use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
+        error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
+                nPortIndex, &pPlatformList[bufCnt], bufSize, pvirt);
     }
     return error;
 }
@@ -2833,91 +2581,79 @@
     int bufCnt = 0;
     OMX_STATETYPE state = OMX_StateInvalid;
     OMX_GetState(dec_handle, &state);
-    if (state == OMX_StateExecuting || state == OMX_StatePause)
-    {
-      DEBUG_PRINT("Requesting transition to Idle");
-      OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateIdle, 0);
-      wait_for_event();
+    if (state == OMX_StateExecuting || state == OMX_StatePause) {
+        DEBUG_PRINT("Requesting transition to Idle");
+        OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateIdle, 0);
+        wait_for_event();
     }
     OMX_GetState(dec_handle, &state);
-    if (state == OMX_StateIdle)
-    {
-      DEBUG_PRINT("Requesting transition to Loaded");
-      OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateLoaded, 0);
-      for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt)
-      {
-         if (pInputBufHdrs[bufCnt]->pBuffer && input_use_buffer)
-         {
-            free(pInputBufHdrs[bufCnt]->pBuffer);
-            pInputBufHdrs[bufCnt]->pBuffer = NULL;
-            DEBUG_PRINT_ERROR("\nFree(pInputBufHdrs[%d]->pBuffer)",bufCnt);
-         }
-         OMX_FreeBuffer(dec_handle, 0, pInputBufHdrs[bufCnt]);
-      }
-      if (pInputBufHdrs)
-      {
-         free(pInputBufHdrs);
-         pInputBufHdrs = NULL;
-      }
-      for(bufCnt = 0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
-        if (output_use_buffer && p_eglHeaders) {
-            if(p_eglHeaders[bufCnt]) {
-               munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
-                       pOutYUVBufHdrs[bufCnt]->nAllocLen);
-               close(p_eglHeaders[bufCnt]->pmem_fd);
-               p_eglHeaders[bufCnt]->pmem_fd = -1;
-               free(p_eglHeaders[bufCnt]);
-               p_eglHeaders[bufCnt] = NULL;
+    if (state == OMX_StateIdle) {
+        DEBUG_PRINT("Requesting transition to Loaded");
+        OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateLoaded, 0);
+        for (bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) {
+            if (pInputBufHdrs[bufCnt]->pBuffer && input_use_buffer) {
+                free(pInputBufHdrs[bufCnt]->pBuffer);
+                pInputBufHdrs[bufCnt]->pBuffer = NULL;
+                DEBUG_PRINT_ERROR("\nFree(pInputBufHdrs[%d]->pBuffer)",bufCnt);
             }
+            OMX_FreeBuffer(dec_handle, 0, pInputBufHdrs[bufCnt]);
         }
-        if (use_external_pmem_buf)
-        {
-            DEBUG_PRINT("Freeing in external pmem case: buffer=0x%x, pmem_fd=0x%d",
-                              pOutYUVBufHdrs[bufCnt]->pBuffer,
-                              pPMEMInfo[bufCnt].pmem_fd);
-            if (pOutYUVBufHdrs[bufCnt]->pBuffer)
-            {
-                munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
-                        pOutYUVBufHdrs[bufCnt]->nAllocLen);
-            }
-            if (&pPMEMInfo[bufCnt])
-            {
-                close(pPMEMInfo[bufCnt].pmem_fd);
-                pPMEMInfo[bufCnt].pmem_fd = -1;
-            }
+        if (pInputBufHdrs) {
+            free(pInputBufHdrs);
+            pInputBufHdrs = NULL;
         }
-        OMX_FreeBuffer(dec_handle, 1, pOutYUVBufHdrs[bufCnt]);
-      }
-      if(p_eglHeaders) {
-          free(p_eglHeaders);
-          p_eglHeaders = NULL;
-      }
-      if (pPMEMInfo)
-      {
-          DEBUG_PRINT("Freeing in external pmem case:PMEM");
-          free(pPMEMInfo);
-          pPMEMInfo = NULL;
-      }
-      if (pPlatformEntry)
-      {
-          DEBUG_PRINT("Freeing in external pmem case:ENTRY");
-          free(pPlatformEntry);
-          pPlatformEntry = NULL;
-      }
-      if (pPlatformList)
-      {
-          DEBUG_PRINT("Freeing in external pmem case:LIST");
-          free(pPlatformList);
-          pPlatformList = NULL;
-      }
-      wait_for_event();
+        for (bufCnt = 0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
+            if (output_use_buffer && p_eglHeaders) {
+                if (p_eglHeaders[bufCnt]) {
+                    munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
+                            pOutYUVBufHdrs[bufCnt]->nAllocLen);
+                    close(p_eglHeaders[bufCnt]->pmem_fd);
+                    p_eglHeaders[bufCnt]->pmem_fd = -1;
+                    free(p_eglHeaders[bufCnt]);
+                    p_eglHeaders[bufCnt] = NULL;
+                }
+            }
+            if (use_external_pmem_buf) {
+                DEBUG_PRINT("Freeing in external pmem case: buffer=0x%x, pmem_fd=0x%d",
+                        pOutYUVBufHdrs[bufCnt]->pBuffer,
+                        pPMEMInfo[bufCnt].pmem_fd);
+                if (pOutYUVBufHdrs[bufCnt]->pBuffer) {
+                    munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
+                            pOutYUVBufHdrs[bufCnt]->nAllocLen);
+                }
+                if (&pPMEMInfo[bufCnt]) {
+                    close(pPMEMInfo[bufCnt].pmem_fd);
+                    pPMEMInfo[bufCnt].pmem_fd = -1;
+                }
+            }
+            OMX_FreeBuffer(dec_handle, 1, pOutYUVBufHdrs[bufCnt]);
+        }
+        if (p_eglHeaders) {
+            free(p_eglHeaders);
+            p_eglHeaders = NULL;
+        }
+        if (pPMEMInfo) {
+            DEBUG_PRINT("Freeing in external pmem case:PMEM");
+            free(pPMEMInfo);
+            pPMEMInfo = NULL;
+        }
+        if (pPlatformEntry) {
+            DEBUG_PRINT("Freeing in external pmem case:ENTRY");
+            free(pPlatformEntry);
+            pPlatformEntry = NULL;
+        }
+        if (pPlatformList) {
+            DEBUG_PRINT("Freeing in external pmem case:LIST");
+            free(pPlatformList);
+            pPlatformList = NULL;
+        }
+        wait_for_event();
     }
 
     DEBUG_PRINT("[OMX Vdec Test] - Free handle decoder\n");
     OMX_ERRORTYPE result = OMX_FreeHandle(dec_handle);
-    if (result != OMX_ErrorNone)
-    {
-       DEBUG_PRINT_ERROR("[OMX Vdec Test] - OMX_FreeHandle error. Error code: %d\n", result);
+    if (result != OMX_ErrorNone) {
+        DEBUG_PRINT_ERROR("[OMX Vdec Test] - OMX_FreeHandle error. Error code: %d\n", result);
     }
     dec_handle = NULL;
 
@@ -2926,8 +2662,7 @@
     OMX_Deinit();
 
     DEBUG_PRINT("[OMX Vdec Test] - closing all files\n");
-    if(inputBufferFileFd != -1)
-    {
+    if (inputBufferFileFd != -1) {
         close(inputBufferFileFd);
         inputBufferFileFd = -1;
     }
@@ -2940,29 +2675,27 @@
     }
 #ifdef _MSM8974_
     if (crcFile) {
-	    fclose(crcFile);
-	    crcFile = NULL;
+        fclose(crcFile);
+        crcFile = NULL;
     }
 #endif
     DEBUG_PRINT("[OMX Vdec Test] - after free outputfile\n");
 
-    if(etb_queue)
-    {
-      free_queue(etb_queue);
-      etb_queue = NULL;
+    if (etb_queue) {
+        free_queue(etb_queue);
+        etb_queue = NULL;
     }
     DEBUG_PRINT("[OMX Vdec Test] - after free etb_queue \n");
-    if(fbd_queue)
-    {
-      free_queue(fbd_queue);
-      fbd_queue = NULL;
+    if (fbd_queue) {
+        free_queue(fbd_queue);
+        fbd_queue = NULL;
     }
     DEBUG_PRINT("[OMX Vdec Test] - after free iftb_queue\n");
     printf("*****************************************\n");
     if (isDueToError)
-      printf("************...TEST FAILED...************\n");
+        printf("************...TEST FAILED...************\n");
     else
-      printf("**********...TEST SUCCESSFULL...*********\n");
+        printf("**********...TEST SUCCESSFULL...*********\n");
     printf("*****************************************\n");
 }
 
@@ -2976,18 +2709,19 @@
     unsigned char *read_buffer=NULL;
     char c = '1'; //initialize to anything except '\0'(0)
     char inputFrameSize[12];
-    int count =0; char cnt =0;
+    int count =0;
+    char cnt =0;
     memset(temp_buffer, 0, sizeof(temp_buffer));
 
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
 
     while (cnt < 10)
-    /* Check the input file format, may result in infinite loop */
+        /* Check the input file format, may result in infinite loop */
     {
         DEBUG_PRINT("loop[%d] count[%d]\n",cnt,count);
         count = read( inputBufferFileFd, &inputFrameSize[cnt], 1);
-        if(inputFrameSize[cnt] == '\0' )
-          break;
+        if (inputFrameSize[cnt] == '\0' )
+            break;
         cnt++;
     }
     inputFrameSize[cnt]='\0';
@@ -2999,12 +2733,12 @@
     bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer, frameSize);
 
     DEBUG_PRINT("Actual frame Size [%d] bytes_read using fread[%d]\n",
-                  frameSize, bytes_read);
+            frameSize, bytes_read);
 
-    if(bytes_read == 0 || bytes_read < frameSize ) {
+    if (bytes_read == 0 || bytes_read < frameSize ) {
         DEBUG_PRINT("Bytes read Zero After Read frame Size \n");
         DEBUG_PRINT("Checking VideoPlayback Count:video_playback_count is:%d\n",
-                       video_playback_count);
+                video_playback_count);
         return 0;
     }
     pBufHdr->nTimeStamp = timeStampLfile;
@@ -3021,62 +2755,50 @@
     int newFrame = 0;
     char *dataptr = (char *)pBufHdr->pBuffer;
     DEBUG_PRINT("Inside %s", __FUNCTION__);
-    do
-    {
+    do {
         newFrame = 0;
         bytes_read = read(inputBufferFileFd, &dataptr[cnt], 1);
-        if (!bytes_read)
-        {
+        if (!bytes_read) {
             DEBUG_PRINT("\n%s: Bytes read Zero", __FUNCTION__);
             break;
         }
         code <<= 8;
         code |= (0x000000FF & dataptr[cnt]);
         cnt++;
-        if ((cnt == 4) && (code != H264_START_CODE))
-        {
+        if ((cnt == 4) && (code != H264_START_CODE)) {
             DEBUG_PRINT_ERROR("\n%s: ERROR: Invalid start code found 0x%x", __FUNCTION__, code);
             cnt = 0;
             break;
         }
-        if ((cnt > 4) && (code == H264_START_CODE))
-        {
+        if ((cnt > 4) && (code == H264_START_CODE)) {
             DEBUG_PRINT("%s: Found H264_START_CODE", __FUNCTION__);
             bytes_read = read(inputBufferFileFd, &dataptr[cnt], 1);
-            if (!bytes_read)
-            {
+            if (!bytes_read) {
                 DEBUG_PRINT("\n%s: Bytes read Zero", __FUNCTION__);
                 break;
             }
             DEBUG_PRINT("%s: READ Byte[%d] = 0x%x", __FUNCTION__, cnt, dataptr[cnt]);
             naluType = dataptr[cnt] & 0x1F;
             cnt++;
-            if ((naluType == 1) || (naluType == 5))
-            {
+            if ((naluType == 1) || (naluType == 5)) {
                 DEBUG_PRINT("%s: Found AU", __FUNCTION__);
                 bytes_read = read(inputBufferFileFd, &dataptr[cnt], 1);
-                if (!bytes_read)
-                {
+                if (!bytes_read) {
                     DEBUG_PRINT("\n%s: Bytes read Zero", __FUNCTION__);
                     break;
                 }
                 DEBUG_PRINT("%s: READ Byte[%d] = 0x%x", __FUNCTION__, cnt, dataptr[cnt]);
                 newFrame = (dataptr[cnt] & 0x80);
                 cnt++;
-                if (newFrame)
-                {
+                if (newFrame) {
                     lseek64(inputBufferFileFd, -6, SEEK_CUR);
                     cnt -= 6;
                     DEBUG_PRINT("%s: Found a NAL unit (type 0x%x) of size = %d", __FUNCTION__, (dataptr[4] & 0x1F), cnt);
                     break;
-                }
-                else
-                {
+                } else {
                     DEBUG_PRINT("%s: Not a New Frame", __FUNCTION__);
                 }
-            }
-            else
-            {
+            } else {
                 lseek64(inputBufferFileFd, -5, SEEK_CUR);
                 cnt -= 5;
                 DEBUG_PRINT("%s: Found NAL unit (type 0x%x) of size = %d", __FUNCTION__, (dataptr[4] & 0x1F), cnt);
@@ -3087,9 +2809,9 @@
 
 #ifdef TEST_TS_FROM_SEI
     if (timeStampLfile == 0)
-      pBufHdr->nTimeStamp = 0;
+        pBufHdr->nTimeStamp = 0;
     else
-      pBufHdr->nTimeStamp = LLONG_MAX;
+        pBufHdr->nTimeStamp = LLONG_MAX;
 #else
     pBufHdr->nTimeStamp = timeStampLfile;
 #endif
@@ -3103,17 +2825,17 @@
     int bytes_read=0;
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
     bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer, NUMBER_OF_ARBITRARYBYTES_READ);
-    if(bytes_read == 0) {
+    if (bytes_read == 0) {
         DEBUG_PRINT("Bytes read Zero After Read frame Size \n");
         DEBUG_PRINT("Checking VideoPlayback Count:video_playback_count is:%d\n",
-                      video_playback_count);
+                video_playback_count);
         return 0;
     }
 #ifdef TEST_TS_FROM_SEI
     if (timeStampLfile == 0)
-      pBufHdr->nTimeStamp = 0;
+        pBufHdr->nTimeStamp = 0;
     else
-      pBufHdr->nTimeStamp = LLONG_MAX;
+        pBufHdr->nTimeStamp = LLONG_MAX;
 #else
     pBufHdr->nTimeStamp = timeStampLfile;
 #endif
@@ -3131,131 +2853,122 @@
 
     DEBUG_PRINT("Inside %s", __FUNCTION__);
 
-    do
-    {
-      //Start codes are always byte aligned.
-      bytes_read = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
-      if(bytes_read == 0 || bytes_read == -1)
-      {
-          DEBUG_PRINT("Bytes read Zero \n");
-          break;
-      }
-      code <<= 8;
-      code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
-      //VOP start code comparision
-      if (readOffset>3)
-      {
-        if(!header_code ){
-          if( VOP_START_CODE == code)
-          {
-            header_code = VOP_START_CODE;
-          }
-          else if ( (0xFFFFFC00 & code) == SHORT_HEADER_START_CODE )
-          {
-            header_code = SHORT_HEADER_START_CODE;
-          }
-        }
-        if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE))
-        {
-            //Seek backwards by 4
-            lseek64(inputBufferFileFd, -4, SEEK_CUR);
-            readOffset-=3;
+    do {
+        //Start codes are always byte aligned.
+        bytes_read = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
+        if (bytes_read == 0 || bytes_read == -1) {
+            DEBUG_PRINT("Bytes read Zero \n");
             break;
         }
-        else if (( header_code == SHORT_HEADER_START_CODE ) && ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00)))
-        {
-            //Seek backwards by 4
-            lseek64(inputBufferFileFd, -4, SEEK_CUR);
-            readOffset-=3;
-            break;
+        code <<= 8;
+        code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
+        //VOP start code comparision
+        if (readOffset>3) {
+            if (!header_code ) {
+                if ( VOP_START_CODE == code) {
+                    header_code = VOP_START_CODE;
+                } else if ( (0xFFFFFC00 & code) == SHORT_HEADER_START_CODE ) {
+                    header_code = SHORT_HEADER_START_CODE;
+                }
+            }
+            if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE)) {
+                //Seek backwards by 4
+                lseek64(inputBufferFileFd, -4, SEEK_CUR);
+                readOffset-=3;
+                break;
+            } else if (( header_code == SHORT_HEADER_START_CODE ) && ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00))) {
+                //Seek backwards by 4
+                lseek64(inputBufferFileFd, -4, SEEK_CUR);
+                readOffset-=3;
+                break;
+            }
         }
-      }
-      readOffset++;
-    }while (1);
+        readOffset++;
+    } while (1);
     pBufHdr->nTimeStamp = timeStampLfile;
     timeStampLfile += timestampInterval;
     return readOffset;
 }
 static int Read_Buffer_From_Mpeg2_Start_Code(OMX_BUFFERHEADERTYPE  *pBufHdr)
 {
-  unsigned int readOffset = 0;
-  int bytesRead = 0;
-  unsigned int code = 0;
-  pBufHdr->nFilledLen = 0;
-  static unsigned int firstParse = true;
-  unsigned int seenFrame = false;
+    unsigned int readOffset = 0;
+    int bytesRead = 0;
+    unsigned int code = 0;
+    pBufHdr->nFilledLen = 0;
+    static unsigned int firstParse = true;
+    unsigned int seenFrame = false;
 
-  DEBUG_PRINT("Inside %s", __FUNCTION__);
+    DEBUG_PRINT("Inside %s", __FUNCTION__);
 
-  /* Read one byte at a time. Construct the code every byte in order to
-   * compare to the start codes. Keep looping until we've read in a complete
-   * frame, which can be either just a picture start code + picture, or can
-   * include the sequence header as well
-   */
-  while (1) {
-    bytesRead = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
-
-    /* Exit the loop if we can't read any more bytes */
-    if (bytesRead == 0 || bytesRead == -1) {
-      break;
-    }
-
-    /* Construct the code one byte at a time */
-    code <<= 8;
-    code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
-
-    /* Can't compare the code to MPEG2 start codes until we've read the
-     * first four bytes
+    /* Read one byte at a time. Construct the code every byte in order to
+     * compare to the start codes. Keep looping until we've read in a complete
+     * frame, which can be either just a picture start code + picture, or can
+     * include the sequence header as well
      */
-    if (readOffset >= 3) {
+    while (1) {
+        bytesRead = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
 
-      /* If this is the first time we're reading from the file, then we
-       * need to throw away the system start code information at the
-       * beginning. We can just look for the first sequence header.
-       */
-      if (firstParse) {
-        if (code == MPEG2_SEQ_START_CODE) {
-          /* Seek back by 4 bytes and reset code so that we can skip
-           * down to the common case below.
-           */
-          lseek(inputBufferFileFd, -4, SEEK_CUR);
-          code = 0;
-          readOffset -= 3;
-          firstParse = false;
-          continue;
+        /* Exit the loop if we can't read any more bytes */
+        if (bytesRead == 0 || bytesRead == -1) {
+            break;
         }
-      }
 
-      /* If we have already parsed a frame and we see a sequence header, then
-       * the sequence header is part of the next frame so we seek back and
-       * break.
-       */
-      if (code == MPEG2_SEQ_START_CODE) {
-        if (seenFrame) {
-          lseek(inputBufferFileFd, -4, SEEK_CUR);
-          readOffset -= 3;
-          break;
-        }
-        /* If we haven't seen a frame yet, then read in all the data until we
-         * either see another frame start code or sequence header start code.
+        /* Construct the code one byte at a time */
+        code <<= 8;
+        code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
+
+        /* Can't compare the code to MPEG2 start codes until we've read the
+         * first four bytes
          */
-      } else if (code == MPEG2_FRAME_START_CODE) {
-        if (!seenFrame) {
-          seenFrame = true;
-        } else {
-          lseek(inputBufferFileFd, -4, SEEK_CUR);
-          readOffset -= 3;
-          break;
+        if (readOffset >= 3) {
+
+            /* If this is the first time we're reading from the file, then we
+             * need to throw away the system start code information at the
+             * beginning. We can just look for the first sequence header.
+             */
+            if (firstParse) {
+                if (code == MPEG2_SEQ_START_CODE) {
+                    /* Seek back by 4 bytes and reset code so that we can skip
+                     * down to the common case below.
+                     */
+                    lseek(inputBufferFileFd, -4, SEEK_CUR);
+                    code = 0;
+                    readOffset -= 3;
+                    firstParse = false;
+                    continue;
+                }
+            }
+
+            /* If we have already parsed a frame and we see a sequence header, then
+             * the sequence header is part of the next frame so we seek back and
+             * break.
+             */
+            if (code == MPEG2_SEQ_START_CODE) {
+                if (seenFrame) {
+                    lseek(inputBufferFileFd, -4, SEEK_CUR);
+                    readOffset -= 3;
+                    break;
+                }
+                /* If we haven't seen a frame yet, then read in all the data until we
+                 * either see another frame start code or sequence header start code.
+                 */
+            } else if (code == MPEG2_FRAME_START_CODE) {
+                if (!seenFrame) {
+                    seenFrame = true;
+                } else {
+                    lseek(inputBufferFileFd, -4, SEEK_CUR);
+                    readOffset -= 3;
+                    break;
+                }
+            }
         }
-      }
+
+        readOffset++;
     }
 
-    readOffset++;
-  }
-
-  pBufHdr->nTimeStamp = timeStampLfile;
-  timeStampLfile += timestampInterval;
-  return readOffset;
+    pBufHdr->nTimeStamp = timeStampLfile;
+    timeStampLfile += timestampInterval;
+    return readOffset;
 }
 
 
@@ -3270,29 +2983,25 @@
 
     // read the "size_nal_field"-byte size field
     bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer + pBufHdr->nOffset, nalSize);
-    if (bytes_read == 0 || bytes_read == -1)
-    {
-      DEBUG_PRINT("Failed to read frame or it might be EOF\n");
-      return 0;
+    if (bytes_read == 0 || bytes_read == -1) {
+        DEBUG_PRINT("Failed to read frame or it might be EOF\n");
+        return 0;
     }
 
-    for (i=0; i<SIZE_NAL_FIELD_MAX-nalSize; i++)
-    {
-      temp_size[SIZE_NAL_FIELD_MAX - 1 - i] = 0;
+    for (i=0; i<SIZE_NAL_FIELD_MAX-nalSize; i++) {
+        temp_size[SIZE_NAL_FIELD_MAX - 1 - i] = 0;
     }
 
     /* Due to little endiannes, Reorder the size based on size_nal_field */
-    for (j=0; i<SIZE_NAL_FIELD_MAX; i++, j++)
-    {
-      temp_size[SIZE_NAL_FIELD_MAX - 1 - i] = pBufHdr->pBuffer[pBufHdr->nOffset + j];
+    for (j=0; i<SIZE_NAL_FIELD_MAX; i++, j++) {
+        temp_size[SIZE_NAL_FIELD_MAX - 1 - i] = pBufHdr->pBuffer[pBufHdr->nOffset + j];
     }
     size = (unsigned int)(*((unsigned int *)(temp_size)));
 
     // now read the data
     bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer + pBufHdr->nOffset + nalSize, size);
-    if (bytes_read != size)
-    {
-      DEBUG_PRINT_ERROR("Failed to read frame\n");
+    if (bytes_read != size) {
+        DEBUG_PRINT_ERROR("Failed to read frame\n");
     }
 
     pBufHdr->nTimeStamp = timeStampLfile;
@@ -3323,49 +3032,43 @@
     /* reseek to beginning of sequence header */
     lseek64(inputBufferFileFd, -8, SEEK_CUR);
 #endif
-    if ((startcode & 0xFF000000) == 0xC5000000)
-    {
+    if ((startcode & 0xFF000000) == 0xC5000000) {
 
-      DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
+        DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
 #ifdef _MSM8974_
-      readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, size_struct_C);
-      lseek64(inputBufferFileFd, 24, SEEK_CUR);
+        readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, size_struct_C);
+        lseek64(inputBufferFileFd, 24, SEEK_CUR);
 #else
-      readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC + size_struct_C);
+        readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC + size_struct_C);
 #endif
-    }
-    else if((startcode & 0xFF000000) == 0x85000000)
-    {
-      // .RCV V1 file
+    } else if ((startcode & 0xFF000000) == 0x85000000) {
+        // .RCV V1 file
 
-      rcv_v1 = 1;
+        rcv_v1 = 1;
 
-      DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
+        DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
 #ifdef _MSM8974_
-      readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, size_struct_C);
-      lseek64(inputBufferFileFd, 8, SEEK_CUR);
+        readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, size_struct_C);
+        lseek64(inputBufferFileFd, 8, SEEK_CUR);
 #else
-      readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC + size_struct_C);
+        readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC + size_struct_C);
 #endif
 
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("Error: Unknown VC1 clip format %x\n", startcode);
+    } else {
+        DEBUG_PRINT_ERROR("Error: Unknown VC1 clip format %x\n", startcode);
     }
 
 #if 0
     {
-      int i=0;
-      printf("Read_Buffer_From_RCV_File, length %d readOffset %d\n", readOffset, readOffset);
-      for (i=0; i<36; i++)
-      {
-        printf("0x%.2x ", pBufHdr->pBuffer[i]);
-        if (i%16 == 15) {
-          printf("\n");
+        int i=0;
+        printf("Read_Buffer_From_RCV_File, length %d readOffset %d\n", readOffset, readOffset);
+        for (i=0; i<36; i++) {
+            printf("0x%.2x ", pBufHdr->pBuffer[i]);
+            if (i%16 == 15) {
+                printf("\n");
+            }
         }
-      }
-      printf("\n");
+        printf("\n");
     }
 #endif
     return readOffset;
@@ -3379,72 +3082,61 @@
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
 
     DEBUG_PRINT("Read_Buffer_From_RCV_File - nOffset %d\n", pBufHdr->nOffset);
-    if(rcv_v1)
-    {
-      /* for the case of RCV V1 format, the frame header is only of 4 bytes and has
-         only the frame size information */
+    if (rcv_v1) {
+        /* for the case of RCV V1 format, the frame header is only of 4 bytes and has
+           only the frame size information */
         readOffset = read(inputBufferFileFd, &len, 4);
         DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
 
-    }
-    else
-    {
-      /* for a regular RCV file, 3 bytes comprise the frame size and 1 byte for key*/
+    } else {
+        /* for a regular RCV file, 3 bytes comprise the frame size and 1 byte for key*/
         readOffset = read(inputBufferFileFd, &len, 3);
         DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
 
         readOffset = read(inputBufferFileFd, &key, 1);
-      if ( (key & 0x80) == false)
-      {
-        DEBUG_PRINT("Read_Buffer_From_RCV_File - Non IDR frame key %x\n", key);
-       }
+        if ( (key & 0x80) == false) {
+            DEBUG_PRINT("Read_Buffer_From_RCV_File - Non IDR frame key %x\n", key);
+        }
 
     }
 
-    if(!rcv_v1)
-    {
-      /* There is timestamp field only for regular RCV format and not for RCV V1 format*/
+    if (!rcv_v1) {
+        /* There is timestamp field only for regular RCV format and not for RCV V1 format*/
         readOffset = read(inputBufferFileFd, &pBufHdr->nTimeStamp, 4);
         DEBUG_PRINT("Read_Buffer_From_RCV_File - timeStamp %d\n", pBufHdr->nTimeStamp);
         pBufHdr->nTimeStamp *= 1000;
-    }
-    else
-    {
+    } else {
         pBufHdr->nTimeStamp = timeStampLfile;
         timeStampLfile += timestampInterval;
     }
 
-    if(len > pBufHdr->nAllocLen)
-    {
-       DEBUG_PRINT_ERROR("Error in sufficient buffer framesize %d, allocalen %d noffset %d\n",len,pBufHdr->nAllocLen, pBufHdr->nOffset);
-       readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset,
-                         pBufHdr->nAllocLen - pBufHdr->nOffset);
+    if (len > pBufHdr->nAllocLen) {
+        DEBUG_PRINT_ERROR("Error in sufficient buffer framesize %d, allocalen %d noffset %d\n",len,pBufHdr->nAllocLen, pBufHdr->nOffset);
+        readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset,
+                pBufHdr->nAllocLen - pBufHdr->nOffset);
 
-       loff_t off = (len - readOffset)*1LL;
-       lseek64(inputBufferFileFd, off ,SEEK_CUR);
-       return readOffset;
-    }
-    else {
+        loff_t off = (len - readOffset)*1LL;
+        lseek64(inputBufferFileFd, off ,SEEK_CUR);
+        return readOffset;
+    } else {
         readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset, len);
     }
-    if (readOffset != len)
-    {
-      DEBUG_PRINT("EOS reach or Reading error %d, %s \n", readOffset, strerror( errno ));
-      return 0;
+    if (readOffset != len) {
+        DEBUG_PRINT("EOS reach or Reading error %d, %s \n", readOffset, strerror( errno ));
+        return 0;
     }
 
 #if 0
     {
-      int i=0;
-      printf("Read_Buffer_From_RCV_File, length %d readOffset %d\n", len, readOffset);
-      for (i=0; i<64; i++)
-      {
-        printf("0x%.2x ", pBufHdr->pBuffer[i]);
-        if (i%16 == 15) {
-          printf("\n");
+        int i=0;
+        printf("Read_Buffer_From_RCV_File, length %d readOffset %d\n", len, readOffset);
+        for (i=0; i<64; i++) {
+            printf("0x%.2x ", pBufHdr->pBuffer[i]);
+            if (i%16 == 15) {
+                printf("\n");
+            }
         }
-      }
-      printf("\n");
+        printf("\n");
     }
 #endif
 
@@ -3467,87 +3159,78 @@
 
     numStartcodes = bHdrflag?1:2;
 
-    do
-    {
-      if (total_bytes == pBufHdr->nAllocLen)
-      {
-        DEBUG_PRINT_ERROR("Buffer overflow!");
-        break;
-      }
-      //Start codes are always byte aligned.
-      bytes_read = read(inputBufferFileFd, &pBuffer[readOffset],1 );
-
-      if(!bytes_read)
-      {
-          DEBUG_PRINT("\n Bytes read Zero \n");
-          break;
-      }
-      total_bytes++;
-      code <<= 8;
-      code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
-
-     if(!bSEQflag && (code == VC1_SEQUENCE_START_CODE)) {
-        if(startCode_cnt) bSEQflag = 1;
-      }
-
-      if(!bEntryflag && ( code == VC1_ENTRY_POINT_START_CODE)) {
-         if(startCode_cnt) bEntryflag = 1;
-      }
-
-      if(code == VC1_FRAME_START_CODE || code == VC1_FRAME_FIELD_CODE)
-      {
-         startCode_cnt++ ;
-      }
-
-      //VOP start code comparision
-      if(startCode_cnt == numStartcodes)
-      {
-        if (VC1_FRAME_START_CODE == (code & 0xFFFFFFFF) ||
-            VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF))
-        {
-          previous_vc1_au = 0;
-          if(VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF))
-          {
-              previous_vc1_au = 1;
-          }
-
-          if(!bHdrflag && (bSEQflag || bEntryflag)) {
-             lseek(inputBufferFileFd,-(SEQbytes+4),SEEK_CUR);
-             readOffset -= (SEQbytes+3);
-          }
-          else {
-            //Seek backwards by 4
-            lseek64(inputBufferFileFd, -4, SEEK_CUR);
-            readOffset-=3;
-          }
-
-          while(pBufHdr->pBuffer[readOffset-1] == 0)
-            readOffset--;
-
-          break;
+    do {
+        if (total_bytes == pBufHdr->nAllocLen) {
+            DEBUG_PRINT_ERROR("Buffer overflow!");
+            break;
         }
-      }
-      readOffset++;
-      if(bSEQflag || bEntryflag) {
-        SEQbytes++;
-      }
-    }while (1);
+        //Start codes are always byte aligned.
+        bytes_read = read(inputBufferFileFd, &pBuffer[readOffset],1 );
+
+        if (!bytes_read) {
+            DEBUG_PRINT("\n Bytes read Zero \n");
+            break;
+        }
+        total_bytes++;
+        code <<= 8;
+        code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
+
+        if (!bSEQflag && (code == VC1_SEQUENCE_START_CODE)) {
+            if (startCode_cnt) bSEQflag = 1;
+        }
+
+        if (!bEntryflag && ( code == VC1_ENTRY_POINT_START_CODE)) {
+            if (startCode_cnt) bEntryflag = 1;
+        }
+
+        if (code == VC1_FRAME_START_CODE || code == VC1_FRAME_FIELD_CODE) {
+            startCode_cnt++ ;
+        }
+
+        //VOP start code comparision
+        if (startCode_cnt == numStartcodes) {
+            if (VC1_FRAME_START_CODE == (code & 0xFFFFFFFF) ||
+                    VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF)) {
+                previous_vc1_au = 0;
+                if (VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF)) {
+                    previous_vc1_au = 1;
+                }
+
+                if (!bHdrflag && (bSEQflag || bEntryflag)) {
+                    lseek(inputBufferFileFd,-(SEQbytes+4),SEEK_CUR);
+                    readOffset -= (SEQbytes+3);
+                } else {
+                    //Seek backwards by 4
+                    lseek64(inputBufferFileFd, -4, SEEK_CUR);
+                    readOffset-=3;
+                }
+
+                while (pBufHdr->pBuffer[readOffset-1] == 0)
+                    readOffset--;
+
+                break;
+            }
+        }
+        readOffset++;
+        if (bSEQflag || bEntryflag) {
+            SEQbytes++;
+        }
+    } while (1);
 
     pBufHdr->nTimeStamp = timeStampLfile;
     timeStampLfile += timestampInterval;
 
 #if 0
     {
-      int i=0;
-      printf("Read_Buffer_From_VC1_File, readOffset %d\n", readOffset);
-      for (i=0; i<64; i++)
-      {
-        printf("0x%.2x ", pBufHdr->pBuffer[i]);
-        if (i%16 == 15) {
-          printf("\n");
+        int i=0;
+        printf("Read_Buffer_From_VC1_File, readOffset %d\n", readOffset);
+        for (i=0; i<64; i++) {
+            printf("0x%.2x ", pBufHdr->pBuffer[i]);
+            if (i%16 == 15) {
+                printf("\n");
+            }
         }
-      }
-      printf("\n");
+        printf("\n");
     }
 #endif
 
@@ -3558,7 +3241,7 @@
 {
 #define MAX_NO_B_FRMS 3 // Number of non-b-frames packed in each buffer
 #define N_PREV_FRMS_B 1 // Number of previous non-b-frames packed
-                        // with a set of consecutive b-frames
+    // with a set of consecutive b-frames
 #define FRM_ARRAY_SIZE (MAX_NO_B_FRMS + N_PREV_FRMS_B)
     char *p_buffer = NULL;
     unsigned int offset_array[FRM_ARRAY_SIZE];
@@ -3576,104 +3259,108 @@
     DEBUG_PRINT("Inside %s \n", __FUNCTION__);
 
     do {
-      p_buffer = (char *)pBufHdr->pBuffer + byte_pos;
+        p_buffer = (char *)pBufHdr->pBuffer + byte_pos;
 
-      bytes_read = read(inputBufferFileFd, p_buffer, NUMBER_OF_ARBITRARYBYTES_READ);
-      byte_pos += bytes_read;
-      for (byte_cntr = 0; byte_cntr < bytes_read && !pckt_ready; byte_cntr++) {
-        read_code <<= 8;
-        ((char*)&read_code)[0] = p_buffer[byte_cntr];
-        if (read_code == VOP_START_CODE) {
-          if (++byte_cntr < bytes_read) {
-            frame_type = p_buffer[byte_cntr];
-            frame_type &= 0x000000C0;
+        bytes_read = read(inputBufferFileFd, p_buffer, NUMBER_OF_ARBITRARYBYTES_READ);
+        byte_pos += bytes_read;
+        for (byte_cntr = 0; byte_cntr < bytes_read && !pckt_ready; byte_cntr++) {
+            read_code <<= 8;
+            ((char*)&read_code)[0] = p_buffer[byte_cntr];
+            if (read_code == VOP_START_CODE) {
+                if (++byte_cntr < bytes_read) {
+                    frame_type = p_buffer[byte_cntr];
+                    frame_type &= 0x000000C0;
 #ifdef __DEBUG_DIVX__
-            switch (frame_type) {
-              case 0x00: pckt_type[pckd_frms] = 'I'; break;
-              case 0x40: pckt_type[pckd_frms] = 'P'; break;
-              case 0x80: pckt_type[pckd_frms] = 'B'; break;
-              default: pckt_type[pckd_frms] = 'X';
-            }
-            pckd_frms++;
+                    switch (frame_type) {
+                        case 0x00:
+                            pckt_type[pckd_frms] = 'I';
+                            break;
+                        case 0x40:
+                            pckt_type[pckd_frms] = 'P';
+                            break;
+                        case 0x80:
+                            pckt_type[pckd_frms] = 'B';
+                            break;
+                        default:
+                            pckt_type[pckd_frms] = 'X';
+                    }
+                    pckd_frms++;
 #endif // __DEBUG_DIVX__
-            offset_array[vop_set_cntr] = byte_pos - bytes_read + byte_cntr - 4;
-            if (frame_type == 0x80) { // B Frame found!
-              if (!b_frames_found) {
-                // Try to packet N_PREV_FRMS_B previous frames
-                // with the next consecutive B frames
-                i = N_PREV_FRMS_B;
-                while ((vop_set_cntr - i) < 0 && i > 0) i--;
-                b_frm_idx = vop_set_cntr - i;
-                if (b_frm_idx > 0) {
-                  pckt_end_idx = b_frm_idx;
-                  pckt_ready = true;
+                    offset_array[vop_set_cntr] = byte_pos - bytes_read + byte_cntr - 4;
+                    if (frame_type == 0x80) { // B Frame found!
+                        if (!b_frames_found) {
+                            // Try to packet N_PREV_FRMS_B previous frames
+                            // with the next consecutive B frames
+                            i = N_PREV_FRMS_B;
+                            while ((vop_set_cntr - i) < 0 && i > 0) i--;
+                            b_frm_idx = vop_set_cntr - i;
+                            if (b_frm_idx > 0) {
+                                pckt_end_idx = b_frm_idx;
+                                pckt_ready = true;
 #ifdef __DEBUG_DIVX__
-                  pckt_type[b_frm_idx] = '\0';
-                  total_frames += b_frm_idx;
+                                pckt_type[b_frm_idx] = '\0';
+                                total_frames += b_frm_idx;
+#endif //__DEBUG_DIVX__
+                            }
+                        }
+                        b_frames_found++;
+                    } else if (b_frames_found) {
+                        pckt_end_idx = vop_set_cntr;
+                        pckt_ready = true;
+#ifdef __DEBUG_DIVX__
+                        pckt_type[pckd_frms - 1] = '\0';
+                        total_frames += pckd_frms - 1;
+#endif //__DEBUG_DIVX__
+                    } else if (vop_set_cntr == (FRM_ARRAY_SIZE -1)) {
+                        pckt_end_idx = MAX_NO_B_FRMS;
+                        pckt_ready = true;
+#ifdef __DEBUG_DIVX__
+                        pckt_type[pckt_end_idx] = '\0';
+                        total_frames += pckt_end_idx;
+#endif //__DEBUG_DIVX__
+                    } else
+                        vop_set_cntr++;
+                } else {
+                    // The vop start code was found in the last 4 bytes,
+                    // seek backwards by 4 to include this start code
+                    // with the next buffer.
+                    lseek64(inputBufferFileFd, -4, SEEK_CUR);
+                    byte_pos -= 4;
+#ifdef __DEBUG_DIVX__
+                    pckd_frms--;
 #endif //__DEBUG_DIVX__
                 }
-              }
-              b_frames_found++;
-            } else if (b_frames_found) {
-              pckt_end_idx = vop_set_cntr;
-              pckt_ready = true;
-#ifdef __DEBUG_DIVX__
-              pckt_type[pckd_frms - 1] = '\0';
-              total_frames += pckd_frms - 1;
-#endif //__DEBUG_DIVX__
-            } else if (vop_set_cntr == (FRM_ARRAY_SIZE -1)) {
-              pckt_end_idx = MAX_NO_B_FRMS;
-              pckt_ready = true;
-#ifdef __DEBUG_DIVX__
-              pckt_type[pckt_end_idx] = '\0';
-              total_frames += pckt_end_idx;
-#endif //__DEBUG_DIVX__
-            } else
-              vop_set_cntr++;
-          } else {
-            // The vop start code was found in the last 4 bytes,
-            // seek backwards by 4 to include this start code
-            // with the next buffer.
-            lseek64(inputBufferFileFd, -4, SEEK_CUR);
-            byte_pos -= 4;
-#ifdef __DEBUG_DIVX__
-            pckd_frms--;
-#endif //__DEBUG_DIVX__
-          }
+            }
         }
-      }
-      if (pckt_ready) {
-          loff_t off = (byte_pos - offset_array[pckt_end_idx]);
-          if ( lseek64(inputBufferFileFd, -1LL*off , SEEK_CUR) == -1 ){
-              DEBUG_PRINT_ERROR("lseek64 with offset = %lld failed with errno %d"
-                                ", current position =0x%llx", -1LL*off,
-                                errno, lseek64(inputBufferFileFd, 0, SEEK_CUR));
-          }
-      }
-      else {
-          char eofByte;
-          int ret = read(inputBufferFileFd, &eofByte, 1 );
-          if ( ret == 0 ) {
-              offset_array[vop_set_cntr] = byte_pos;
-              pckt_end_idx = vop_set_cntr;
-              pckt_ready = true;
+        if (pckt_ready) {
+            loff_t off = (byte_pos - offset_array[pckt_end_idx]);
+            if ( lseek64(inputBufferFileFd, -1LL*off , SEEK_CUR) == -1 ) {
+                DEBUG_PRINT_ERROR("lseek64 with offset = %lld failed with errno %d"
+                        ", current position =0x%llx", -1LL*off,
+                        errno, lseek64(inputBufferFileFd, 0, SEEK_CUR));
+            }
+        } else {
+            char eofByte;
+            int ret = read(inputBufferFileFd, &eofByte, 1 );
+            if ( ret == 0 ) {
+                offset_array[vop_set_cntr] = byte_pos;
+                pckt_end_idx = vop_set_cntr;
+                pckt_ready = true;
 #ifdef __DEBUG_DIVX__
-              pckt_type[pckd_frms] = '\0';
-              total_frames += pckd_frms;
+                pckt_type[pckd_frms] = '\0';
+                total_frames += pckd_frms;
 #endif //__DEBUG_DIVX__
-          }
-          else if (ret == 1){
-              if ( lseek64(inputBufferFileFd, -1, SEEK_CUR ) == -1 ){
-                  DEBUG_PRINT_ERROR("lseek64 failed with errno = %d, "
-                                    "current fileposition = %llx",
-                                    errno,
-                                    lseek64(inputBufferFileFd, 0, SEEK_CUR));
-              }
-          }
-          else {
-              DEBUG_PRINT_ERROR("Error when checking for EOF");
-          }
-      }
+            } else if (ret == 1) {
+                if ( lseek64(inputBufferFileFd, -1, SEEK_CUR ) == -1 ) {
+                    DEBUG_PRINT_ERROR("lseek64 failed with errno = %d, "
+                            "current fileposition = %llx",
+                            errno,
+                            lseek64(inputBufferFileFd, 0, SEEK_CUR));
+                }
+            } else {
+                DEBUG_PRINT_ERROR("Error when checking for EOF");
+            }
+        }
     } while (!pckt_ready);
     pBufHdr->nFilledLen = offset_array[pckt_end_idx];
     pBufHdr->nTimeStamp = timeStampLfile;
@@ -3681,8 +3368,8 @@
 #ifdef __DEBUG_DIVX__
     total_bytes += pBufHdr->nFilledLen;
     ALOGE("[DivX] Packet: Type[%s] Size[%u] TS[%lld] TB[%llx] NFrms[%lld]\n",
-      pckt_type, pBufHdr->nFilledLen, pBufHdr->nTimeStamp,
-	  total_bytes, total_frames);
+            pckt_type, pBufHdr->nFilledLen, pBufHdr->nTimeStamp,
+            total_bytes, total_frames);
 #endif //__DEBUG_DIVX__
     return pBufHdr->nFilledLen;
 }
@@ -3703,18 +3390,14 @@
 
     pBufHdr->nTimeStamp = timeStampLfile;
 
-    if (pBufHdr != NULL)
-    {
+    if (pBufHdr != NULL) {
         p_buffer = (char *)pBufHdr->pBuffer + pBufHdr->nOffset;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: pBufHdr is NULL\n");
         return 0;
     }
 
-    if (p_buffer == NULL)
-    {
+    if (p_buffer == NULL) {
         DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: p_bufhdr is NULL\n");
         return 0;
     }
@@ -3733,8 +3416,8 @@
 
     //the packet is ready to be sent
     DEBUG_PRINT("\nReturning Read Buffer from Divx 311: TS=[%ld], Offset=[%d]\n",
-           (long int)pBufHdr->nTimeStamp,
-           n_offset );
+            (long int)pBufHdr->nTimeStamp,
+            n_offset );
 
     return n_offset;
 }
@@ -3749,43 +3432,37 @@
     unsigned int frame_size = 0;
     unsigned int num_bytes_size = 4;
     unsigned int num_bytes_frame_type = 1;
-	unsigned long long time_stamp;
+    unsigned long long time_stamp;
     unsigned int n_offset = pBufHdr->nOffset;
-	static int ivf_header_read;
+    static int ivf_header_read;
 
-	if (pBufHdr != NULL)
-    {
+    if (pBufHdr != NULL) {
         p_buffer = (char *)pBufHdr->pBuffer + pBufHdr->nOffset;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: pBufHdr is NULL\n");
         return 0;
     }
 
-    if (p_buffer == NULL)
-    {
+    if (p_buffer == NULL) {
         DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: p_bufhdr is NULL\n");
         return 0;
     }
 
-	if(ivf_header_read == 0) {
-	bytes_read = read(inputBufferFileFd, p_buffer, 32);
-	ivf_header_read = 1;
-	if(p_buffer[0] == 'D' && p_buffer[1] == 'K' && p_buffer[2] == 'I' && p_buffer[3] == 'F')
-	{
-	printf(" \n IVF header found \n ");
-	} else
-	{
-		printf(" \n No IVF header found \n ");
-		lseek(inputBufferFileFd, -32, SEEK_CUR);
+    if (ivf_header_read == 0) {
+        bytes_read = read(inputBufferFileFd, p_buffer, 32);
+        ivf_header_read = 1;
+        if (p_buffer[0] == 'D' && p_buffer[1] == 'K' && p_buffer[2] == 'I' && p_buffer[3] == 'F') {
+            printf(" \n IVF header found \n ");
+        } else {
+            printf(" \n No IVF header found \n ");
+            lseek(inputBufferFileFd, -32, SEEK_CUR);
+        }
     }
-	}
-	bytes_read = read(inputBufferFileFd, &frame_size, 4);
-	bytes_read = read(inputBufferFileFd, &time_stamp, 8);
-	n_offset += read(inputBufferFileFd, p_buffer, frame_size);
-	pBufHdr->nTimeStamp = time_stamp;
-	return n_offset;
+    bytes_read = read(inputBufferFileFd, &frame_size, 4);
+    bytes_read = read(inputBufferFileFd, &time_stamp, 8);
+    n_offset += read(inputBufferFileFd, p_buffer, frame_size);
+    pBufHdr->nTimeStamp = time_stamp;
+    return n_offset;
 }
 #endif
 static int open_video_file ()
@@ -3794,50 +3471,45 @@
     char outputfilename[512];
     DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename);
 
-    if ( (inputBufferFileFd = open( in_filename, O_RDONLY | O_LARGEFILE) ) == -1 ){
+    if ( (inputBufferFileFd = open( in_filename, O_RDONLY | O_LARGEFILE) ) == -1 ) {
         DEBUG_PRINT_ERROR("Error - i/p file %s could NOT be opened errno = %d\n",
-                          in_filename, errno);
+                in_filename, errno);
         error_code = -1;
-    }
-    else {
+    } else {
         DEBUG_PRINT_ERROR("i/p file %s is opened \n", in_filename);
     }
 
     if (takeYuvLog) {
         strlcpy(outputfilename, "yuvframes.yuv", 14);
         outputBufferFile = fopen (outputfilename, "ab");
-        if (outputBufferFile == NULL)
-        {
-          DEBUG_PRINT_ERROR("ERROR - o/p file %s could NOT be opened\n", outputfilename);
-          error_code = -1;
-        }
-        else
-        {
-          DEBUG_PRINT("O/p file %s is opened \n", outputfilename);
+        if (outputBufferFile == NULL) {
+            DEBUG_PRINT_ERROR("ERROR - o/p file %s could NOT be opened\n", outputfilename);
+            error_code = -1;
+        } else {
+            DEBUG_PRINT("O/p file %s is opened \n", outputfilename);
         }
     }
 #ifdef _MSM8974_
     /*if (!crcFile) {
-	    crcFile = fopen(crclogname, "ab");
-	    if (!crcFile) {
-		    printf("Failed to open CRC file\n");
-		    error_code = -1;
-	    }
-    }*/
+      crcFile = fopen(crclogname, "ab");
+      if (!crcFile) {
+      printf("Failed to open CRC file\n");
+      error_code = -1;
+      }
+      }*/
 #endif
     return error_code;
 }
 
 void swap_byte(char *pByte, int nbyte)
 {
-  int i=0;
+    int i=0;
 
-  for (i=0; i<nbyte/2; i++)
-  {
-    pByte[i] ^= pByte[nbyte-i-1];
-    pByte[nbyte-i-1] ^= pByte[i];
-    pByte[i] ^= pByte[nbyte-i-1];
-  }
+    for (i=0; i<nbyte/2; i++) {
+        pByte[i] ^= pByte[nbyte-i-1];
+        pByte[nbyte-i-1] ^= pByte[i];
+        pByte[i] ^= pByte[nbyte-i-1];
+    }
 }
 
 int drawBG(void)
@@ -3851,8 +3523,7 @@
 #endif
     void *fb_buf = mmap (NULL, finfo.smem_len,PROT_READ|PROT_WRITE, MAP_SHARED, fb_fd, 0);
 
-    if (fb_buf == MAP_FAILED)
-    {
+    if (fb_buf == MAP_FAILED) {
         printf("ERROR: Framebuffer MMAP failed!\n");
         close(fb_fd);
         return -1;
@@ -3861,17 +3532,15 @@
     vinfo.yoffset = 0;
     p = (long *)fb_buf;
 
-    for (i=0; i < vinfo.xres * vinfo.yres; i++)
-    {
-    #ifdef FRAMEBUFFER_32
+    for (i=0; i < vinfo.xres * vinfo.yres; i++) {
+#ifdef FRAMEBUFFER_32
         *p++ = COLOR_BLACK_RGBA_8888;
-    #else
+#else
         *p++ = CLR_KEY;
-    #endif
+#endif
     }
 
-    if (ioctl(fb_fd, FBIOPAN_DISPLAY, &vinfo) < 0)
-    {
+    if (ioctl(fb_fd, FBIOPAN_DISPLAY, &vinfo) < 0) {
         printf("ERROR: FBIOPAN_DISPLAY failed! line=%d\n", __LINE__);
         return -1;
     }
@@ -3886,8 +3555,8 @@
     int vsync_en = enable;
     ret = ioctl(fb_fd, MSMFB_OVERLAY_VSYNC_CTRL, &vsync_en);
     if (ret)
-       printf("\n MSMFB_OVERLAY_VSYNC_CTRL failed! (Line %d)\n",
-               __LINE__);
+        printf("\n MSMFB_OVERLAY_VSYNC_CTRL failed! (Line %d)\n",
+                __LINE__);
     return ret;
 }
 
@@ -3900,8 +3569,7 @@
     overlayp->src.height = sliceheight;
 #ifdef MAX_RES_720P
     overlayp->src.format = MDP_Y_CRCB_H2V2;
-    if(color_fmt == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
-    {
+    if (color_fmt == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka) {
         overlayp->src.format = MDP_Y_CRCB_H2V2_TILE;
     }
 #endif
@@ -3916,28 +3584,22 @@
     overlayp->src_rect.w = width;
     overlayp->src_rect.h = height;
 
-    if(width >= vinfo.xres)
-    {
+    if (width >= vinfo.xres) {
         overlayp->dst_rect.x = 0;
         overlayp->dst_rect.w = vinfo.xres;
-    }
-    else
-    {
+    } else {
         overlayp->dst_rect.x = (vinfo.xres - width)/2;
         overlayp->dst_rect.w = width;
     }
 
-    if(height >= vinfo.yres)
-    {
+    if (height >= vinfo.yres) {
         overlayp->dst_rect.h = (overlayp->dst_rect.w * height)/width;
         overlayp->dst_rect.y = 0;
         if (overlayp->dst_rect.h < vinfo.yres)
             overlayp->dst_rect.y = (vinfo.yres - overlayp->dst_rect.h)/2;
         else
             overlayp->dst_rect.h = vinfo.yres;
-    }
-    else
-    {
+    } else {
         overlayp->dst_rect.y = (vinfo.yres - height)/2;
         overlayp->dst_rect.h = height;
     }
@@ -3946,7 +3608,7 @@
     overlayp->horz_deci = 0;
     overlayp->vert_deci = 0;
     int minHorDeci = 0;
-    if(overlayp->src_rect.w > 2048) {
+    if (overlayp->src_rect.w > 2048) {
         //If the client sends us something > what a layer mixer supports
         //then it means it doesn't want to use split-pipe but wants us to
         //decimate. A minimum decimation of 2 will ensure that the width is
@@ -3968,12 +3630,12 @@
     horDscale /= 4.0f;
     verDscale /= 4.0f;
 
-    if(horDscale < minHorDeci)
+    if (horDscale < minHorDeci)
         horDscale = minHorDeci;
-    if((int)horDscale)
+    if ((int)horDscale)
         overlayp->horz_deci = (int)log2f(horDscale);
 
-    if((int)verDscale)
+    if ((int)verDscale)
         overlayp->vert_deci = (int)log2f(verDscale);
 
     printf("overlayp->src.width = %u \n", overlayp->src.width);
@@ -4000,8 +3662,7 @@
     overlay_vsync_ctrl(OMX_TRUE);
     drawBG();
     vid_buf_front_id = ioctl(fb_fd, MSMFB_OVERLAY_SET, overlayp);
-    if (vid_buf_front_id < 0)
-    {
+    if (vid_buf_front_id < 0) {
         printf("ERROR: MSMFB_OVERLAY_SET failed! line=%d\n", __LINE__);
     }
     vid_buf_front_id = overlayp->id;
@@ -4020,16 +3681,14 @@
 
     DEBUG_PRINT("overlay_fb:");
     ov_front.id = overlayp->id;
-    if (pBufHdr->pPlatformPrivate == NULL)
-    {
+    if (pBufHdr->pPlatformPrivate == NULL) {
         ALOGE("overlay_fb: pPlatformPrivate is null");
         return -1;
     }
     pPMEMInfo  = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
-                    pBufHdr->pPlatformPrivate)->entryList->entry;
-    if (pPMEMInfo == NULL)
-    {
+        ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+         pBufHdr->pPlatformPrivate)->entryList->entry;
+    if (pPMEMInfo == NULL) {
 
         ALOGE("overlay_fb: pmem_info is null");
         return -1;
@@ -4049,14 +3708,12 @@
 
     DEBUG_PRINT("\n ov_front.data.memory_id = %d", ov_front.data.memory_id);
     DEBUG_PRINT("\n ov_front.data.offset = %u", ov_front.data.offset);
-    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, (void*)&ov_front))
-    {
+    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, (void*)&ov_front)) {
         printf("\nERROR! MSMFB_OVERLAY_PLAY failed at frame (Line %d)\n",
-            __LINE__);
+                __LINE__);
         return -1;
     }
-    if (ioctl(fb_fd, FBIOPAN_DISPLAY, &vinfo) < 0)
-    {
+    if (ioctl(fb_fd, FBIOPAN_DISPLAY, &vinfo) < 0) {
         printf("ERROR: FBIOPAN_DISPLAY failed! line=%d\n", __LINE__);
         return -1;
     }
@@ -4067,8 +3724,7 @@
 
 void overlay_unset()
 {
-    if (ioctl(fb_fd, MSMFB_OVERLAY_UNSET, &vid_buf_front_id))
-    {
+    if (ioctl(fb_fd, MSMFB_OVERLAY_UNSET, &vid_buf_front_id)) {
         printf("\nERROR! MSMFB_OVERLAY_UNSET failed! (Line %d)\n", __LINE__);
     }
 }
@@ -4089,12 +3745,11 @@
     struct mdp_blit_req *e;
     union {
         char dummy[sizeof(struct mdp_blit_req_list) +
-               sizeof(struct mdp_blit_req) * 1];
+            sizeof(struct mdp_blit_req) * 1];
         struct mdp_blit_req_list list;
     } img;
 
-    if (fb_fd < 0)
-    {
+    if (fb_fd < 0) {
         DEBUG_PRINT_ERROR("Warning: /dev/fb0 is not opened!\n");
         return;
     }
@@ -4109,21 +3764,19 @@
     // read to the end of existing extra data sections
     pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
 
-    while (addr < end && pExtraData->eType != OMX_ExtraDataFrameInfo)
-    {
-            addr += pExtraData->nSize;
-            pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
+    while (addr < end && pExtraData->eType != OMX_ExtraDataFrameInfo) {
+        addr += pExtraData->nSize;
+        pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
     }
 
-    if (pExtraData->eType != OMX_ExtraDataFrameInfo)
-    {
-       DEBUG_PRINT_ERROR("pExtraData->eType %d pExtraData->nSize %d\n",pExtraData->eType,pExtraData->nSize);
+    if (pExtraData->eType != OMX_ExtraDataFrameInfo) {
+        DEBUG_PRINT_ERROR("pExtraData->eType %d pExtraData->nSize %d\n",pExtraData->eType,pExtraData->nSize);
     }
     pExtraFrameInfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtraData->data;
 
-   pPMEMInfo  = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
-                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
-                    pBufHdr->pPlatformPrivate)->entryList->entry;
+    pPMEMInfo  = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+        ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+         pBufHdr->pPlatformPrivate)->entryList->entry;
 #if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
     vheap = (MemoryHeapBase *)pPMEMInfo->pmem_fd;
 #endif
@@ -4137,7 +3790,7 @@
     e->src.width = portFmt.format.video.nStride;
     e->src.height = portFmt.format.video.nSliceHeight;
     e->src.format = MDP_Y_CBCR_H2V2;
-        e->src.offset = pPMEMInfo->offset;
+    e->src.offset = pPMEMInfo->offset;
 #if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
     e->src.memory_id = vheap->getHeapID();
 #else
@@ -4154,40 +3807,41 @@
 
     e->transp_mask = 0xffffffff;
     DEBUG_PRINT("Frame interlace type %d!\n", pExtraFrameInfo->interlaceType);
-    if(pExtraFrameInfo->interlaceType != OMX_QCOM_InterlaceFrameProgressive)
-    {
-       DEBUG_PRINT("Interlaced Frame!\n");
-       e->flags = MDP_DEINTERLACE;
-    }
-    else
+    if (pExtraFrameInfo->interlaceType != OMX_QCOM_InterlaceFrameProgressive) {
+        DEBUG_PRINT("Interlaced Frame!\n");
+        e->flags = MDP_DEINTERLACE;
+    } else
         e->flags = 0;
     e->alpha = 0xff;
 
-    switch(displayWindow)
-    {
-    case 1: destx = 0;
+    switch (displayWindow) {
+        case 1:
+            destx = 0;
             desty = 0;
             destW = vinfo.xres/2;
             destH = vinfo.yres/2;
             break;
-    case 2: destx = vinfo.xres/2;
+        case 2:
+            destx = vinfo.xres/2;
             desty = 0;
             destW = vinfo.xres/2;
             destH = vinfo.yres/2;
             break;
 
-    case 3: destx = 0;
+        case 3:
+            destx = 0;
             desty = vinfo.yres/2;
             destW = vinfo.xres/2;
             destH = vinfo.yres/2;
             break;
-     case 4: destx = vinfo.xres/2;
+        case 4:
+            destx = vinfo.xres/2;
             desty = vinfo.yres/2;
             destW = vinfo.xres/2;
             destH = vinfo.yres/2;
             break;
-     case 0:
-     default:
+        case 0:
+        default:
             destx = 0;
             desty = 0;
             destW = vinfo.xres;
@@ -4195,12 +3849,12 @@
     }
 
 
-        if(portFmt.format.video.nFrameWidth < destW)
-          destW = portFmt.format.video.nFrameWidth ;
+    if (portFmt.format.video.nFrameWidth < destW)
+        destW = portFmt.format.video.nFrameWidth ;
 
 
-        if(portFmt.format.video.nFrameHeight < destH)
-           destH = portFmt.format.video.nFrameHeight;
+    if (portFmt.format.video.nFrameHeight < destH)
+        destH = portFmt.format.video.nFrameHeight;
 
     e->dst_rect.x = destx;
     e->dst_rect.y = desty;
@@ -4241,32 +3895,28 @@
     pthread_mutex_unlock(&enable_lock);
     // wait for Disable event to come back
     wait_for_event();
-    if(p_eglHeaders) {
+    if (p_eglHeaders) {
         free(p_eglHeaders);
         p_eglHeaders = NULL;
     }
-    if (pPMEMInfo)
-    {
+    if (pPMEMInfo) {
         DEBUG_PRINT("Freeing in external pmem case:PMEM");
         free(pPMEMInfo);
         pPMEMInfo = NULL;
     }
-    if (pPlatformEntry)
-    {
+    if (pPlatformEntry) {
         DEBUG_PRINT("Freeing in external pmem case:ENTRY");
         free(pPlatformEntry);
         pPlatformEntry = NULL;
     }
-    if (pPlatformList)
-    {
+    if (pPlatformList) {
         DEBUG_PRINT("Freeing in external pmem case:LIST");
         free(pPlatformList);
         pPlatformList = NULL;
     }
-    if (currentStatus == ERROR_STATE)
-    {
-      do_freeHandle_and_clean_up(true);
-      return -1;
+    if (currentStatus == ERROR_STATE) {
+        do_freeHandle_and_clean_up(true);
+        return -1;
     }
     DEBUG_PRINT("OP PORT DISABLED!\n");
     return 0;
@@ -4297,61 +3947,52 @@
         }
     }
 
-    if (use_external_pmem_buf)
-    {
+    if (use_external_pmem_buf) {
         DEBUG_PRINT("Enable op port: calling use_buffer_mult_fd\n");
         error =  use_output_buffer_multiple_fd(dec_handle,
-                                               &pOutYUVBufHdrs,
-                                               portFmt.nPortIndex,
-                                               portFmt.nBufferSize,
-                                               portFmt.nBufferCountActual);
-    }
-    else
-    {
+                &pOutYUVBufHdrs,
+                portFmt.nPortIndex,
+                portFmt.nBufferSize,
+                portFmt.nBufferCountActual);
+    } else {
         error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
-                                portFmt.nBufferCountActual, portFmt.nBufferSize);
+                portFmt.nBufferCountActual, portFmt.nBufferSize);
     }
     if (error != OMX_ErrorNone) {
         DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
         return -1;
-    }
-    else
-    {
+    } else {
         DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
         free_op_buf_cnt = portFmt.nBufferCountActual;
     }
 #else
     error =  use_output_buffer(dec_handle,
-                       &pOutYUVBufHdrs,
-                        portFmt.nPortIndex,
-                        portFmt.nBufferSize,
-                        portFmt.nBufferCountActual);
+            &pOutYUVBufHdrs,
+            portFmt.nPortIndex,
+            portFmt.nBufferSize,
+            portFmt.nBufferCountActual);
     free_op_buf_cnt = portFmt.nBufferCountActual;
     if (error != OMX_ErrorNone) {
-       DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
-       return -1;
-    }
-    else {
-       DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
+        DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
+        return -1;
+    } else {
+        DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
     }
 
 #endif
     // wait for enable event to come back
     wait_for_event();
-    if (currentStatus == ERROR_STATE)
-    {
-      do_freeHandle_and_clean_up(true);
-      return -1;
+    if (currentStatus == ERROR_STATE) {
+        do_freeHandle_and_clean_up(true);
+        return -1;
     }
-    if (pOutYUVBufHdrs == NULL)
-    {
+    if (pOutYUVBufHdrs == NULL) {
         DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs is NULL\n");
         return -1;
     }
-    for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
+    for (bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
         DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
-        if (pOutYUVBufHdrs[bufCnt] == NULL)
-        {
+        if (pOutYUVBufHdrs[bufCnt] == NULL) {
             DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs[%d] is NULL\n", bufCnt);
             return -1;
         }
@@ -4360,9 +4001,7 @@
         ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
         if (OMX_ErrorNone != ret) {
             DEBUG_PRINT_ERROR("ERROR - OMX_FillThisBuffer failed with result %d\n", ret);
-        }
-        else
-        {
+        } else {
             DEBUG_PRINT("OMX_FillThisBuffer success!\n");
             free_op_buf_cnt--;
         }
@@ -4375,14 +4014,14 @@
 {
     DEBUG_PRINT("PORT_SETTING_CHANGE_STATE\n");
     if (disable_output_port() != 0)
-	    return -1;
+        return -1;
 
     /* Port for which the Client needs to obtain info */
     portFmt.nPortIndex = 1;
     OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
     DEBUG_PRINT("Min Buffer Count=%d", portFmt.nBufferCountMin);
     DEBUG_PRINT("Buffer Size=%d", portFmt.nBufferSize);
-    if(OMX_DirOutput != portFmt.eDir) {
+    if (OMX_DirOutput != portFmt.eDir) {
         DEBUG_PRINT_ERROR("Error - Expect Output Port\n");
         return -1;
     }
@@ -4394,24 +4033,22 @@
     crop_rect.nWidth = width;
     crop_rect.nHeight = height;
 
-    if (displayYuv == 2)
-    {
-      DEBUG_PRINT("Reconfiguration at middle of playback...");
-      close_display();
-      if (open_display() != 0)
-      {
-        printf("\n Error opening display! Video won't be displayed...");
-        displayYuv = 0;
-      }
+    if (displayYuv == 2) {
+        DEBUG_PRINT("Reconfiguration at middle of playback...");
+        close_display();
+        if (open_display() != 0) {
+            printf("\n Error opening display! Video won't be displayed...");
+            displayYuv = 0;
+        }
     }
 
     if (displayYuv)
         overlay_set();
 
     if (enable_output_port() != 0)
-	    return -1;
+        return -1;
     DEBUG_PRINT("PORT_SETTING_CHANGE DONE!\n");
-	return 0;
+    return 0;
 }
 
 void free_output_buffers()
@@ -4420,35 +4057,31 @@
     OMX_BUFFERHEADERTYPE *pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
     while (pBuffer) {
         DEBUG_PRINT("\n pOutYUVBufHdrs %p p_eglHeaders %p output_use_buffer %d",
-               pOutYUVBufHdrs,p_eglHeaders,output_use_buffer);
-        if(pOutYUVBufHdrs && p_eglHeaders && output_use_buffer)
-        {
-           index = pBuffer - pOutYUVBufHdrs[0];
-           DEBUG_PRINT("\n Index of free buffer %d",index);
-           DEBUG_PRINT("\n Address freed %p size freed %d",pBuffer->pBuffer,
-                  pBuffer->nAllocLen);
-           munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
-           if(p_eglHeaders[index])
-           {
-               close(p_eglHeaders[index]->pmem_fd);
-               free(p_eglHeaders[index]);
-               p_eglHeaders[index] = NULL;
-           }
+                pOutYUVBufHdrs,p_eglHeaders,output_use_buffer);
+        if (pOutYUVBufHdrs && p_eglHeaders && output_use_buffer) {
+            index = pBuffer - pOutYUVBufHdrs[0];
+            DEBUG_PRINT("\n Index of free buffer %d",index);
+            DEBUG_PRINT("\n Address freed %p size freed %d",pBuffer->pBuffer,
+                    pBuffer->nAllocLen);
+            munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
+            if (p_eglHeaders[index]) {
+                close(p_eglHeaders[index]->pmem_fd);
+                free(p_eglHeaders[index]);
+                p_eglHeaders[index] = NULL;
+            }
         }
 
-        if (pOutYUVBufHdrs && use_external_pmem_buf)
-        {
+        if (pOutYUVBufHdrs && use_external_pmem_buf) {
             index = pBuffer - pOutYUVBufHdrs[0];
             DEBUG_PRINT("\n Address freed %p size freed %d,virt=0x%x,pmem_fd=0x%x",
-                              pBuffer->pBuffer,
-                              pBuffer->nAllocLen,
-                              use_buf_virt_addr[index],
-                              pPMEMInfo[index].pmem_fd);
+                    pBuffer->pBuffer,
+                    pBuffer->nAllocLen,
+                    use_buf_virt_addr[index],
+                    pPMEMInfo[index].pmem_fd);
             munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
             getFreePmem();
             use_buf_virt_addr[index] = -1;
-            if (&pPMEMInfo[index])
-            {
+            if (&pPMEMInfo[index]) {
                 close(pPMEMInfo[index].pmem_fd);
                 pPMEMInfo[index].pmem_fd = -1;
             }
@@ -4461,83 +4094,79 @@
 
 #ifndef USE_ION
 static bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
-                                  OMX_U32 alignment)
+        OMX_U32 alignment)
 {
-  struct pmem_allocation allocation;
-  allocation.size = buffer_size;
-  allocation.align = clip2(alignment);
+    struct pmem_allocation allocation;
+    allocation.size = buffer_size;
+    allocation.align = clip2(alignment);
 
-  if (allocation.align < 4096)
-  {
-    allocation.align = 4096;
-  }
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment failed with pmem driver");
-    return false;
-  }
-  return true;
+    if (allocation.align < 4096) {
+        allocation.align = 4096;
+    }
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment failed with pmem driver");
+        return false;
+    }
+    return true;
 }
 #endif
 
 int open_display()
 {
 #ifdef _ANDROID_
-  DEBUG_PRINT("\n Opening /dev/graphics/fb0");
-  fb_fd = open("/dev/graphics/fb0", O_RDWR);
+    DEBUG_PRINT("\n Opening /dev/graphics/fb0");
+    fb_fd = open("/dev/graphics/fb0", O_RDWR);
 #else
-  DEBUG_PRINT("\n Opening /dev/fb0");
-  fb_fd = open("/dev/fb0", O_RDWR);
+    DEBUG_PRINT("\n Opening /dev/fb0");
+    fb_fd = open("/dev/fb0", O_RDWR);
 #endif
-  if (fb_fd < 0) {
-    printf("[omx_vdec_test] - ERROR - can't open framebuffer!\n");
-    return -1;
-  }
+    if (fb_fd < 0) {
+        printf("[omx_vdec_test] - ERROR - can't open framebuffer!\n");
+        return -1;
+    }
 
-  DEBUG_PRINT("\n fb_fd = %d", fb_fd);
-  if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) < 0)
-  {
-    printf("[omx_vdec_test] - ERROR - can't retrieve fscreenInfo!\n");
-    close(fb_fd);
-    return -1;
-  }
-  if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
-  {
-    printf("[omx_vdec_test] - ERROR - can't retrieve vscreenInfo!\n");
-    close(fb_fd);
-    return -1;
-  }
-  printf("Display xres = %d, yres = %d \n", vinfo.xres, vinfo.yres);
-  return 0;
+    DEBUG_PRINT("\n fb_fd = %d", fb_fd);
+    if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) < 0) {
+        printf("[omx_vdec_test] - ERROR - can't retrieve fscreenInfo!\n");
+        close(fb_fd);
+        return -1;
+    }
+    if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) < 0) {
+        printf("[omx_vdec_test] - ERROR - can't retrieve vscreenInfo!\n");
+        close(fb_fd);
+        return -1;
+    }
+    printf("Display xres = %d, yres = %d \n", vinfo.xres, vinfo.yres);
+    return 0;
 }
 
 void close_display()
 {
-  overlay_unset();
-  overlay_vsync_ctrl(OMX_FALSE);
-  close(fb_fd);
-  fb_fd = -1;
+    overlay_unset();
+    overlay_vsync_ctrl(OMX_FALSE);
+    close(fb_fd);
+    fb_fd = -1;
 }
 
 void getFreePmem()
 {
 #ifndef USE_ION
-   int ret = -1;
-   /*Open pmem device and query free pmem*/
-   int pmem_fd = open (PMEM_DEVICE,O_RDWR);
+    int ret = -1;
+    /*Open pmem device and query free pmem*/
+    int pmem_fd = open (PMEM_DEVICE,O_RDWR);
 
-   if(pmem_fd < 0) {
-     ALOGE("Unable to open pmem device");
-     return;
-   }
-   struct pmem_freespace fs;
-   ret = ioctl(pmem_fd, PMEM_GET_FREE_SPACE, &fs);
-   if(ret) {
-     ALOGE("IOCTL to query pmem free space failed");
-     goto freespace_query_failed;
-   }
-   ALOGE("Available free space %lx largest chunk %lx\n", fs.total, fs.largest);
+    if (pmem_fd < 0) {
+        ALOGE("Unable to open pmem device");
+        return;
+    }
+    struct pmem_freespace fs;
+    ret = ioctl(pmem_fd, PMEM_GET_FREE_SPACE, &fs);
+    if (ret) {
+        ALOGE("IOCTL to query pmem free space failed");
+        goto freespace_query_failed;
+    }
+    ALOGE("Available free space %lx largest chunk %lx\n", fs.total, fs.largest);
 freespace_query_failed:
-   close(pmem_fd);
+    close(pmem_fd);
 #endif
 }
diff --git a/mm-video-v4l2/vidc/venc/inc/camera_test.h b/mm-video-v4l2/vidc/venc/inc/camera_test.h
old mode 100755
new mode 100644
index 53bc2da..84c5e5f
--- a/mm-video-v4l2/vidc/venc/inc/camera_test.h
+++ b/mm-video-v4l2/vidc/venc/inc/camera_test.h
@@ -1,58 +1,58 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#ifndef _CAMERA_TEST_H
-#define _CAMERA_TEST_H
-
-#define EXTERN_C_START extern "C" {
-#define EXTERN_C_END }
-
-#ifdef __cplusplus
-EXTERN_C_START
-#endif
-
-typedef void (*CameraPreviewCallback)(int nFD,
-                                      int nOffset,
-                                      void* pPhys,
-                                      void* pVirt,
-                                      long long nTimeStamp);
-
-
-int CameraTest_Initialize(int nFrameRate,
-                          int nFrameWidth,
-                          int nFrameHeight,
-                          CameraPreviewCallback pfnPreviewCallback);
-int CameraTest_Run();
-int CameraTest_ReleaseFrame(void* pPhys, void* pVirt);
-int CameraTest_Exit();
-
-
-#ifdef __cplusplus
-EXTERN_C_END
-#endif
-
-#endif
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef _CAMERA_TEST_H
+#define _CAMERA_TEST_H
+
+#define EXTERN_C_START extern "C" {
+#define EXTERN_C_END }
+
+#ifdef __cplusplus
+EXTERN_C_START
+#endif
+
+typedef void (*CameraPreviewCallback)(int nFD,
+        int nOffset,
+        void* pPhys,
+        void* pVirt,
+        long long nTimeStamp);
+
+
+int CameraTest_Initialize(int nFrameRate,
+        int nFrameWidth,
+        int nFrameHeight,
+        CameraPreviewCallback pfnPreviewCallback);
+int CameraTest_Run();
+int CameraTest_ReleaseFrame(void* pPhys, void* pVirt);
+int CameraTest_Exit();
+
+
+#ifdef __cplusplus
+EXTERN_C_END
+#endif
+
+#endif
diff --git a/mm-video-v4l2/vidc/venc/inc/fb_test.h b/mm-video-v4l2/vidc/venc/inc/fb_test.h
old mode 100755
new mode 100644
index 52a007f..173150c
--- a/mm-video-v4l2/vidc/venc/inc/fb_test.h
+++ b/mm-video-v4l2/vidc/venc/inc/fb_test.h
@@ -1,48 +1,48 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#ifndef _FB_TEST_H
-#define _FB_TEST_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-int FBTest_Initialize(int nFrameWidth,
-                      int nFrameHeight);
-int FBTest_DisplayImage(int nPmemFd, int nOffset);
-int FBTest_Exit();
-
-int FBTest_RunTest();
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // _FB_TEST_H
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef _FB_TEST_H
+#define _FB_TEST_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+    int FBTest_Initialize(int nFrameWidth,
+            int nFrameHeight);
+    int FBTest_DisplayImage(int nPmemFd, int nOffset);
+    int FBTest_Exit();
+
+    int FBTest_RunTest();
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // _FB_TEST_H
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
index 58b0d4f..bac58be 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
@@ -47,9 +47,9 @@
 #include <stdio.h>
 #include <sys/mman.h>
 #ifdef _ANDROID_
-  #include <binder/MemoryHeapBase.h>
+#include <binder/MemoryHeapBase.h>
 #ifdef _ANDROID_ICS_
-  #include "QComOMXMetadata.h"
+#include "QComOMXMetadata.h"
 #endif
 #endif // _ANDROID_
 #include <pthread.h>
@@ -69,9 +69,9 @@
 // local pmem heap object
 class VideoHeap : public MemoryHeapBase
 {
-public:
-  VideoHeap(int fd, size_t size, void* base);
-  virtual ~VideoHeap() {}
+    public:
+        VideoHeap(int fd, size_t size, void* base);
+        virtual ~VideoHeap() {}
 };
 
 #include <utils/Log.h>
@@ -83,16 +83,16 @@
 #endif // _ANDROID_
 
 #ifdef USE_ION
-    static const char* MEM_DEVICE = "/dev/ion";
-    #if defined(MAX_RES_720P) && !defined(_MSM8974_)
-    #define MEM_HEAP_ID ION_CAMERA_HEAP_ID
-    #else
-       #ifdef _MSM8974_
-       #define MEM_HEAP_ID ION_IOMMU_HEAP_ID
-       #else
-       #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
-       #endif
-    #endif
+static const char* MEM_DEVICE = "/dev/ion";
+#if defined(MAX_RES_720P) && !defined(_MSM8974_)
+#define MEM_HEAP_ID ION_CAMERA_HEAP_ID
+#else
+#ifdef _MSM8974_
+#define MEM_HEAP_ID ION_IOMMU_HEAP_ID
+#else
+#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
+#endif
+#endif
 #elif MAX_RES_720P
 static const char* MEM_DEVICE = "/dev/pmem_adsp";
 #elif MAX_RES_1080P_EBI
@@ -114,10 +114,10 @@
 //               Macros
 //////////////////////////////////////////////////////////////////////////////
 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
-                       (unsigned) bufHdr,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
-                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
+        (unsigned) bufHdr,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
+        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
 
 // BitMask Management logic
 #define BITS_PER_BYTE        32
@@ -125,496 +125,489 @@
 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
 #define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
-        &=  ~(BITMASK_FLAG(mIndex))
+    &=  ~(BITMASK_FLAG(mIndex))
 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
-        |=  BITMASK_FLAG(mIndex)
+    |=  BITMASK_FLAG(mIndex)
 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
         & BITMASK_FLAG(mIndex))
 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
-        & BITMASK_FLAG(mIndex)) == 0x0)
+            & BITMASK_FLAG(mIndex)) == 0x0)
 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
         & BITMASK_FLAG(mIndex))
 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
-        & BITMASK_FLAG(mIndex)) == 0x0)
+            & BITMASK_FLAG(mIndex)) == 0x0)
 #ifdef _ANDROID_ICS_
 #define MAX_NUM_INPUT_BUFFERS 32
 #endif
 void* message_thread(void *);
 #ifdef USE_ION
 int alloc_map_ion_memory(int size,struct ion_allocation_data *alloc_data,
-                                    struct ion_fd_data *fd_data,int flag);
+        struct ion_fd_data *fd_data,int flag);
 void free_ion_memory(struct venc_ion *buf_ion_info);
 #endif
 
 // OMX video class
 class omx_video: public qc_omx_component
 {
-protected:
+    protected:
 #ifdef _ANDROID_ICS_
-  bool meta_mode_enable;
-  bool c2d_opened;
-  encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
-  OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
-  bool mUseProxyColorFormat;
-  bool get_syntaxhdr_enable;
-  OMX_BUFFERHEADERTYPE  *psource_frame;
-  OMX_BUFFERHEADERTYPE  *pdest_frame;
+        bool meta_mode_enable;
+        bool c2d_opened;
+        encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
+        OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
+        bool mUseProxyColorFormat;
+        bool get_syntaxhdr_enable;
+        OMX_BUFFERHEADERTYPE  *psource_frame;
+        OMX_BUFFERHEADERTYPE  *pdest_frame;
 
-  class omx_c2d_conv {
-  public:
-    omx_c2d_conv();
-    ~omx_c2d_conv();
-    bool init();
-    bool open(unsigned int height,unsigned int width,
-              ColorConvertFormat src,
-              ColorConvertFormat dest,unsigned int src_stride);
-    bool convert(int src_fd, void *src_base, void *src_viraddr,
-                 int dest_fd, void *dest_base, void *dest_viraddr);
-    bool get_buffer_size(int port,unsigned int &buf_size);
-    int get_src_format();
-    void close();
-  private:
-    C2DColorConverterBase *c2dcc;
-    pthread_mutex_t c_lock;
-    void *mLibHandle;
-    ColorConvertFormat src_format;
-    createC2DColorConverter_t *mConvertOpen;
-    destroyC2DColorConverter_t *mConvertClose;
-  };
-  omx_c2d_conv c2d_conv;
+        class omx_c2d_conv
+        {
+            public:
+                omx_c2d_conv();
+                ~omx_c2d_conv();
+                bool init();
+                bool open(unsigned int height,unsigned int width,
+                        ColorConvertFormat src,
+                        ColorConvertFormat dest,unsigned int src_stride);
+                bool convert(int src_fd, void *src_base, void *src_viraddr,
+                        int dest_fd, void *dest_base, void *dest_viraddr);
+                bool get_buffer_size(int port,unsigned int &buf_size);
+                int get_src_format();
+                void close();
+            private:
+                C2DColorConverterBase *c2dcc;
+                pthread_mutex_t c_lock;
+                void *mLibHandle;
+                ColorConvertFormat src_format;
+                createC2DColorConverter_t *mConvertOpen;
+                destroyC2DColorConverter_t *mConvertClose;
+        };
+        omx_c2d_conv c2d_conv;
 #endif
-public:
-  omx_video();  // constructor
-  virtual ~omx_video();  // destructor
+    public:
+        omx_video();  // constructor
+        virtual ~omx_video();  // destructor
 
-  // virtual int async_message_process (void *context, void* message);
-  void process_event_cb(void *ctxt,unsigned char id);
+        // virtual int async_message_process (void *context, void* message);
+        void process_event_cb(void *ctxt,unsigned char id);
 
-  OMX_ERRORTYPE allocate_buffer(
-                               OMX_HANDLETYPE hComp,
-                               OMX_BUFFERHEADERTYPE **bufferHdr,
-                               OMX_U32 port,
-                               OMX_PTR appData,
-                               OMX_U32 bytes
-                               );
+        OMX_ERRORTYPE allocate_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32 port,
+                OMX_PTR appData,
+                OMX_U32 bytes
+                );
 
 
-  virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
+        virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
 
-  virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
+        virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
 
-  virtual OMX_U32 dev_stop(void) = 0;
-  virtual OMX_U32 dev_pause(void) = 0;
-  virtual OMX_U32 dev_start(void) = 0;
-  virtual OMX_U32 dev_flush(unsigned) = 0;
-  virtual OMX_U32 dev_resume(void) = 0;
-  virtual OMX_U32 dev_start_done(void) = 0;
-  virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
-  virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
-  virtual bool dev_free_buf(void *,unsigned) = 0;
-  virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
-  virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
-  virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
-  virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
-  virtual bool dev_loaded_start(void) = 0;
-  virtual bool dev_loaded_stop(void) = 0;
-  virtual bool dev_loaded_start_done(void) = 0;
-  virtual bool dev_loaded_stop_done(void) = 0;
+        virtual OMX_U32 dev_stop(void) = 0;
+        virtual OMX_U32 dev_pause(void) = 0;
+        virtual OMX_U32 dev_start(void) = 0;
+        virtual OMX_U32 dev_flush(unsigned) = 0;
+        virtual OMX_U32 dev_resume(void) = 0;
+        virtual OMX_U32 dev_start_done(void) = 0;
+        virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
+        virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
+        virtual bool dev_free_buf(void *,unsigned) = 0;
+        virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
+        virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
+        virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
+        virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
+        virtual bool dev_loaded_start(void) = 0;
+        virtual bool dev_loaded_stop(void) = 0;
+        virtual bool dev_loaded_start_done(void) = 0;
+        virtual bool dev_loaded_stop_done(void) = 0;
 #ifdef _MSM8974_
-  virtual int dev_handle_extradata(void*, int) = 0;
-  virtual int dev_set_format(int) = 0;
+        virtual int dev_handle_extradata(void*, int) = 0;
+        virtual int dev_set_format(int) = 0;
 #endif
-  virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
-  virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
+        virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
+        virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
 #ifdef _ANDROID_ICS_
-  void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
+        void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
 #endif
-  OMX_ERRORTYPE component_role_enum(
-                                   OMX_HANDLETYPE hComp,
-                                   OMX_U8 *role,
-                                   OMX_U32 index
-                                   );
+        OMX_ERRORTYPE component_role_enum(
+                OMX_HANDLETYPE hComp,
+                OMX_U8 *role,
+                OMX_U32 index
+                );
 
-  OMX_ERRORTYPE component_tunnel_request(
-                                        OMX_HANDLETYPE hComp,
-                                        OMX_U32 port,
-                                        OMX_HANDLETYPE  peerComponent,
-                                        OMX_U32 peerPort,
-                                        OMX_TUNNELSETUPTYPE *tunnelSetup
-                                        );
+        OMX_ERRORTYPE component_tunnel_request(
+                OMX_HANDLETYPE hComp,
+                OMX_U32 port,
+                OMX_HANDLETYPE  peerComponent,
+                OMX_U32 peerPort,
+                OMX_TUNNELSETUPTYPE *tunnelSetup
+                );
 
-  OMX_ERRORTYPE empty_this_buffer(
-                                 OMX_HANDLETYPE hComp,
-                                 OMX_BUFFERHEADERTYPE *buffer
-                                 );
+        OMX_ERRORTYPE empty_this_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
 
 
-  OMX_ERRORTYPE fill_this_buffer(
-                                OMX_HANDLETYPE hComp,
-                                OMX_BUFFERHEADERTYPE *buffer
-                                );
+        OMX_ERRORTYPE fill_this_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
 
-  OMX_ERRORTYPE free_buffer(
-                           OMX_HANDLETYPE hComp,
-                           OMX_U32 port,
-                           OMX_BUFFERHEADERTYPE *buffer
-                           );
+        OMX_ERRORTYPE free_buffer(
+                OMX_HANDLETYPE hComp,
+                OMX_U32 port,
+                OMX_BUFFERHEADERTYPE *buffer
+                );
 
-  OMX_ERRORTYPE get_component_version(
-                                     OMX_HANDLETYPE hComp,
-                                     OMX_STRING componentName,
-                                     OMX_VERSIONTYPE *componentVersion,
-                                     OMX_VERSIONTYPE *specVersion,
-                                     OMX_UUIDTYPE *componentUUID
-                                     );
+        OMX_ERRORTYPE get_component_version(
+                OMX_HANDLETYPE hComp,
+                OMX_STRING componentName,
+                OMX_VERSIONTYPE *componentVersion,
+                OMX_VERSIONTYPE *specVersion,
+                OMX_UUIDTYPE *componentUUID
+                );
 
-  OMX_ERRORTYPE get_config(
-                          OMX_HANDLETYPE hComp,
-                          OMX_INDEXTYPE configIndex,
-                          OMX_PTR configData
-                          );
+        OMX_ERRORTYPE get_config(
+                OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE configIndex,
+                OMX_PTR configData
+                );
 
-  OMX_ERRORTYPE get_extension_index(
-                                   OMX_HANDLETYPE hComp,
-                                   OMX_STRING paramName,
-                                   OMX_INDEXTYPE *indexType
-                                   );
+        OMX_ERRORTYPE get_extension_index(
+                OMX_HANDLETYPE hComp,
+                OMX_STRING paramName,
+                OMX_INDEXTYPE *indexType
+                );
 
-  OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
-                              OMX_INDEXTYPE  paramIndex,
-                              OMX_PTR        paramData);
+        OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData);
 
-  OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
-                          OMX_STATETYPE *state);
+        OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
+                OMX_STATETYPE *state);
 
 
 
-  OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
-                             OMX_COMMANDTYPE cmd,
-                             OMX_U32         param1,
-                             OMX_PTR         cmdData);
+        OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
+                OMX_COMMANDTYPE cmd,
+                OMX_U32         param1,
+                OMX_PTR         cmdData);
 
 
-  OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
-                              OMX_CALLBACKTYPE *callbacks,
-                              OMX_PTR          appData);
+        OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
+                OMX_CALLBACKTYPE *callbacks,
+                OMX_PTR          appData);
 
-  virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
-                           OMX_INDEXTYPE  configIndex,
-                           OMX_PTR        configData) = 0;
+        virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  configIndex,
+                OMX_PTR        configData) = 0;
 
-  virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
-                                      OMX_INDEXTYPE  paramIndex,
-                                      OMX_PTR        paramData) =0;
+        virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData) =0;
 
-  OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
-                           OMX_BUFFERHEADERTYPE **bufferHdr,
-                           OMX_U32              port,
-                           OMX_PTR              appData,
-                           OMX_U32              bytes,
-                           OMX_U8               *buffer);
+        OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes,
+                OMX_U8               *buffer);
 
 
-  OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
-                              OMX_BUFFERHEADERTYPE **bufferHdr,
-                              OMX_U32              port,
-                              OMX_PTR              appData,
-                              void *               eglImage);
+        OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                void *               eglImage);
 
 
 
-  int  m_pipe_in;
-  int  m_pipe_out;
+        int  m_pipe_in;
+        int  m_pipe_out;
 
-  pthread_t msg_thread_id;
-  pthread_t async_thread_id;
-  bool async_thread_created;
-  bool msg_thread_created;
+        pthread_t msg_thread_id;
+        pthread_t async_thread_id;
+        bool async_thread_created;
+        bool msg_thread_created;
 
-  OMX_U8 m_nkind[128];
+        OMX_U8 m_nkind[128];
 
 
-  //int *input_pmem_fd;
-  //int *output_pmem_fd;
-  struct pmem *m_pInput_pmem;
-  struct pmem *m_pOutput_pmem;
+        //int *input_pmem_fd;
+        //int *output_pmem_fd;
+        struct pmem *m_pInput_pmem;
+        struct pmem *m_pOutput_pmem;
 #ifdef USE_ION
-  struct venc_ion *m_pInput_ion;
-  struct venc_ion *m_pOutput_ion;
+        struct venc_ion *m_pInput_ion;
+        struct venc_ion *m_pOutput_ion;
 #endif
 
 
 
-public:
-  // Bit Positions
-  enum flags_bit_positions
-  {
-    // Defer transition to IDLE
-    OMX_COMPONENT_IDLE_PENDING            =0x1,
-    // Defer transition to LOADING
-    OMX_COMPONENT_LOADING_PENDING         =0x2,
-    // First  Buffer Pending
-    OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
-    // Second Buffer Pending
-    OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
-    // Defer transition to Enable
-    OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
-    // Defer transition to Enable
-    OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
-    // Defer transition to Disable
-    OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
-    // Defer transition to Disable
-    OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
-    //defer flush notification
-    OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
-    OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
-    OMX_COMPONENT_PAUSE_PENDING          =0xB,
-    OMX_COMPONENT_EXECUTE_PENDING        =0xC,
-    OMX_COMPONENT_LOADED_START_PENDING = 0xD,
-    OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
+    public:
+        // Bit Positions
+        enum flags_bit_positions {
+            // Defer transition to IDLE
+            OMX_COMPONENT_IDLE_PENDING            =0x1,
+            // Defer transition to LOADING
+            OMX_COMPONENT_LOADING_PENDING         =0x2,
+            // First  Buffer Pending
+            OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
+            // Second Buffer Pending
+            OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
+            // Defer transition to Enable
+            OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
+            // Defer transition to Enable
+            OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
+            // Defer transition to Disable
+            OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
+            // Defer transition to Disable
+            OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
+            //defer flush notification
+            OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
+            OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
+            OMX_COMPONENT_PAUSE_PENDING          =0xB,
+            OMX_COMPONENT_EXECUTE_PENDING        =0xC,
+            OMX_COMPONENT_LOADED_START_PENDING = 0xD,
+            OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
 
-  };
+        };
 
-  // Deferred callback identifiers
-  enum
-  {
-    //Event Callbacks from the venc component thread context
-    OMX_COMPONENT_GENERATE_EVENT       = 0x1,
-    //Buffer Done callbacks from the venc component thread context
-    OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
-    //Frame Done callbacks from the venc component thread context
-    OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
-    //Buffer Done callbacks from the venc component thread context
-    OMX_COMPONENT_GENERATE_FTB         = 0x4,
-    //Frame Done callbacks from the venc component thread context
-    OMX_COMPONENT_GENERATE_ETB         = 0x5,
-    //Command
-    OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
-    //Push-Pending Buffers
-    OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
-    // Empty Buffer Done callbacks
-    OMX_COMPONENT_GENERATE_EBD         = 0x8,
-    //Flush Event Callbacks from the venc component thread context
-    OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
-    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
-    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
-    OMX_COMPONENT_GENERATE_FBD = 0xc,
-    OMX_COMPONENT_GENERATE_START_DONE = 0xD,
-    OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
-    OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
-    OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
-    OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
-    OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
-    OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13
-  };
+        // Deferred callback identifiers
+        enum {
+            //Event Callbacks from the venc component thread context
+            OMX_COMPONENT_GENERATE_EVENT       = 0x1,
+            //Buffer Done callbacks from the venc component thread context
+            OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
+            //Frame Done callbacks from the venc component thread context
+            OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
+            //Buffer Done callbacks from the venc component thread context
+            OMX_COMPONENT_GENERATE_FTB         = 0x4,
+            //Frame Done callbacks from the venc component thread context
+            OMX_COMPONENT_GENERATE_ETB         = 0x5,
+            //Command
+            OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
+            //Push-Pending Buffers
+            OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
+            // Empty Buffer Done callbacks
+            OMX_COMPONENT_GENERATE_EBD         = 0x8,
+            //Flush Event Callbacks from the venc component thread context
+            OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
+            OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
+            OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
+            OMX_COMPONENT_GENERATE_FBD = 0xc,
+            OMX_COMPONENT_GENERATE_START_DONE = 0xD,
+            OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
+            OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
+            OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
+            OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
+            OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
+            OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13
+        };
 
-  struct omx_event
-  {
-    unsigned param1;
-    unsigned param2;
-    unsigned id;
-  };
+        struct omx_event {
+            unsigned param1;
+            unsigned param2;
+            unsigned id;
+        };
 
-  struct omx_cmd_queue
-  {
-    omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
-    unsigned m_read;
-    unsigned m_write;
-    unsigned m_size;
+        struct omx_cmd_queue {
+            omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
+            unsigned m_read;
+            unsigned m_write;
+            unsigned m_size;
 
-    omx_cmd_queue();
-    ~omx_cmd_queue();
-    bool insert_entry(unsigned p1, unsigned p2, unsigned id);
-    bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
-    // get msgtype of the first ele from the queue
-    unsigned get_q_msg_type();
+            omx_cmd_queue();
+            ~omx_cmd_queue();
+            bool insert_entry(unsigned p1, unsigned p2, unsigned id);
+            bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
+            // get msgtype of the first ele from the queue
+            unsigned get_q_msg_type();
 
-  };
+        };
 
-  bool allocate_done(void);
-  bool allocate_input_done(void);
-  bool allocate_output_done(void);
+        bool allocate_done(void);
+        bool allocate_input_done(void);
+        bool allocate_output_done(void);
 
-  OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
-  OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+        OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
 
-  OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
-                                      OMX_BUFFERHEADERTYPE **bufferHdr,
-                                      OMX_U32              port,
-                                      OMX_PTR              appData,
-                                      OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32              port,
+                OMX_PTR              appData,
+                OMX_U32              bytes);
 #ifdef _ANDROID_ICS_
-  OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
-                                      OMX_BUFFERHEADERTYPE **bufferHdr,
-                                      OMX_PTR              appData,
-                                      OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_PTR              appData,
+                OMX_U32              bytes);
 #endif
-  OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
-                                       OMX_BUFFERHEADERTYPE **bufferHdr,
-                                       OMX_U32 port,OMX_PTR appData,
-                                       OMX_U32              bytes);
+        OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
+                OMX_BUFFERHEADERTYPE **bufferHdr,
+                OMX_U32 port,OMX_PTR appData,
+                OMX_U32              bytes);
 
-  OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
-                                 OMX_BUFFERHEADERTYPE  **bufferHdr,
-                                 OMX_U32               port,
-                                 OMX_PTR               appData,
-                                 OMX_U32               bytes,
-                                 OMX_U8                *buffer);
+        OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE  **bufferHdr,
+                OMX_U32               port,
+                OMX_PTR               appData,
+                OMX_U32               bytes,
+                OMX_U8                *buffer);
 
-  OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
-                                  OMX_BUFFERHEADERTYPE   **bufferHdr,
-                                  OMX_U32                port,
-                                  OMX_PTR                appData,
-                                  OMX_U32                bytes,
-                                  OMX_U8                 *buffer);
+        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE   **bufferHdr,
+                OMX_U32                port,
+                OMX_PTR                appData,
+                OMX_U32                bytes,
+                OMX_U8                 *buffer);
 
-  bool execute_omx_flush(OMX_U32);
-  bool execute_output_flush(void);
-  bool execute_input_flush(void);
+        bool execute_omx_flush(OMX_U32);
+        bool execute_output_flush(void);
+        bool execute_input_flush(void);
 #ifdef _MSM8974_
-  bool execute_flush_all(void);
+        bool execute_flush_all(void);
 #endif
-  OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
-                                  OMX_BUFFERHEADERTYPE * buffer);
+        OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE * buffer);
 
-  OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
-                                 OMX_BUFFERHEADERTYPE * buffer);
-  OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
-                                        OMX_BUFFERHEADERTYPE *buffer);
-  OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
-                                  OMX_BUFFERHEADERTYPE *buffer);
-  OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
-  OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
-     struct pmem &Input_pmem_info,unsigned &index);
-  OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
-     struct pmem &Input_pmem_info);
-  OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
-     OMX_BUFFERHEADERTYPE *buffer);
-  bool release_done();
+        OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE * buffer);
+        OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
+        OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
+        OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
+        OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
+                struct pmem &Input_pmem_info,unsigned &index);
+        OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
+                struct pmem &Input_pmem_info);
+        OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
+                OMX_BUFFERHEADERTYPE *buffer);
+        bool release_done();
 
-  bool release_output_done();
-  bool release_input_done();
+        bool release_output_done();
+        bool release_input_done();
 
-  OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
-                                   OMX_COMMANDTYPE cmd,
-                                   OMX_U32         param1,
-                                   OMX_PTR         cmdData);
-  bool post_event( unsigned int p1,
-                   unsigned int p2,
-                   unsigned int id
-                 );
-  OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
-  inline void omx_report_error ()
-  {
-    if(m_pCallbacks.EventHandler && !m_error_propogated)
-    {
-      m_error_propogated = true;
-      m_pCallbacks.EventHandler(&m_cmp,m_app_data,
-                                OMX_EventError,OMX_ErrorHardware,0,NULL);
-    }
-  }
+        OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
+                OMX_COMMANDTYPE cmd,
+                OMX_U32         param1,
+                OMX_PTR         cmdData);
+        bool post_event( unsigned int p1,
+                unsigned int p2,
+                unsigned int id
+                   );
+        OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+        inline void omx_report_error () {
+            if (m_pCallbacks.EventHandler && !m_error_propogated) {
+                m_error_propogated = true;
+                m_pCallbacks.EventHandler(&m_cmp,m_app_data,
+                        OMX_EventError,OMX_ErrorHardware,0,NULL);
+            }
+        }
 
-  inline void omx_report_unsupported_setting ()
-  {
-    if(m_pCallbacks.EventHandler && !m_error_propogated)
-    {
-      m_error_propogated = true;
-      m_pCallbacks.EventHandler(&m_cmp,m_app_data,
-                                OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
-    }
-  }
+        inline void omx_report_unsupported_setting () {
+            if (m_pCallbacks.EventHandler && !m_error_propogated) {
+                m_error_propogated = true;
+                m_pCallbacks.EventHandler(&m_cmp,m_app_data,
+                        OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
+            }
+        }
 
-  void complete_pending_buffer_done_cbs();
+        void complete_pending_buffer_done_cbs();
 
-  //*************************************************************
-  //*******************MEMBER VARIABLES *************************
-  //*************************************************************
+        //*************************************************************
+        //*******************MEMBER VARIABLES *************************
+        //*************************************************************
 
-  pthread_mutex_t       m_lock;
-  sem_t                 m_cmd_lock;
-  bool              m_error_propogated;
+        pthread_mutex_t       m_lock;
+        sem_t                 m_cmd_lock;
+        bool              m_error_propogated;
 
-  //sem to handle the minimum procesing of commands
+        //sem to handle the minimum procesing of commands
 
 
-  // compression format
-  //OMX_VIDEO_CODINGTYPE eCompressionFormat;
-  // OMX State
-  OMX_STATETYPE m_state;
-  // Application data
-  OMX_PTR m_app_data;
-  OMX_BOOL m_use_input_pmem;
-  OMX_BOOL m_use_output_pmem;
-  // Application callbacks
-  OMX_CALLBACKTYPE m_pCallbacks;
-  OMX_PORT_PARAM_TYPE m_sPortParam;
-  OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
-  OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
-  OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
-  OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
-  OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
-  OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
-  OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
-  OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
-  OMX_PORT_PARAM_TYPE m_sPortParam_img;
-  OMX_PORT_PARAM_TYPE m_sPortParam_audio;
-  OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
-  OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
-  OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
-  OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
-  OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
-  OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
-  OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
-  OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
-  OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
-  OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
-  OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
-  QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
-  OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
-  OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
-  QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
-  QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
-  QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
-  QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
-  OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
-  OMX_U32 m_sExtraData;
-  OMX_U32 m_input_msg_id;
+        // compression format
+        //OMX_VIDEO_CODINGTYPE eCompressionFormat;
+        // OMX State
+        OMX_STATETYPE m_state;
+        // Application data
+        OMX_PTR m_app_data;
+        OMX_BOOL m_use_input_pmem;
+        OMX_BOOL m_use_output_pmem;
+        // Application callbacks
+        OMX_CALLBACKTYPE m_pCallbacks;
+        OMX_PORT_PARAM_TYPE m_sPortParam;
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
+        OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
+        OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
+        OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
+        OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
+        OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
+        OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
+        OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
+        OMX_PORT_PARAM_TYPE m_sPortParam_img;
+        OMX_PORT_PARAM_TYPE m_sPortParam_audio;
+        OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
+        OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
+        OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
+        OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
+        OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
+        OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
+        OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
+        OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
+        OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
+        OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
+        OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
+        QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
+        OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
+        QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
+        QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
+        QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
+        QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
+        OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
+        OMX_U32 m_sExtraData;
+        OMX_U32 m_input_msg_id;
 
-  // fill this buffer queue
-  omx_cmd_queue m_ftb_q;
-  // Command Q for rest of the events
-  omx_cmd_queue m_cmd_q;
-  omx_cmd_queue m_etb_q;
-  // Input memory pointer
-  OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
-  // Output memory pointer
-  OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
-  omx_cmd_queue m_opq_meta_q;
-  omx_cmd_queue m_opq_pmem_q;
-  OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
+        // fill this buffer queue
+        omx_cmd_queue m_ftb_q;
+        // Command Q for rest of the events
+        omx_cmd_queue m_cmd_q;
+        omx_cmd_queue m_etb_q;
+        // Input memory pointer
+        OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
+        // Output memory pointer
+        OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
+        omx_cmd_queue m_opq_meta_q;
+        omx_cmd_queue m_opq_pmem_q;
+        OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
 
-  bool input_flush_progress;
-  bool output_flush_progress;
-  bool input_use_buffer;
-  bool output_use_buffer;
-  int pending_input_buffers;
-  int pending_output_buffers;
+        bool input_flush_progress;
+        bool output_flush_progress;
+        bool input_use_buffer;
+        bool output_use_buffer;
+        int pending_input_buffers;
+        int pending_output_buffers;
 
-  unsigned int m_out_bm_count;
-  unsigned int m_inp_bm_count;
-  unsigned int m_flags;
-  unsigned int m_etb_count;
-  unsigned int m_fbd_count;
+        unsigned int m_out_bm_count;
+        unsigned int m_inp_bm_count;
+        unsigned int m_flags;
+        unsigned int m_etb_count;
+        unsigned int m_fbd_count;
 #ifdef _ANDROID_
-  // Heap pointer to frame buffers
-  sp<MemoryHeapBase>    m_heap_ptr;
+        // Heap pointer to frame buffers
+        sp<MemoryHeapBase>    m_heap_ptr;
 #endif //_ANDROID_
-  // to know whether Event Port Settings change has been triggered or not.
-  bool m_event_port_settings_sent;
-  OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
-  extra_data_handler extra_data_handle;
+        // to know whether Event Port Settings change has been triggered or not.
+        bool m_event_port_settings_sent;
+        OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
+        extra_data_handler extra_data_handle;
 
 };
 
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_common.h b/mm-video-v4l2/vidc/venc/inc/omx_video_common.h
old mode 100755
new mode 100644
index dc4be1d..af0de51
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_common.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_common.h
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -55,24 +55,21 @@
 #define OMX_CORE_WVGA_HEIGHT         480
 #define OMX_CORE_WVGA_WIDTH          800
 
-enum PortIndexType
-{
-  PORT_INDEX_IN = 0,
-  PORT_INDEX_OUT = 1,
-  PORT_INDEX_BOTH = -1,
-  PORT_INDEX_NONE = -2
+enum PortIndexType {
+    PORT_INDEX_IN = 0,
+    PORT_INDEX_OUT = 1,
+    PORT_INDEX_BOTH = -1,
+    PORT_INDEX_NONE = -2
 };
 
-struct pmem
-{
-  void *buffer;
-  int fd;
-  unsigned offset;
-  unsigned size;
+struct pmem {
+    void *buffer;
+    int fd;
+    unsigned offset;
+    unsigned size;
 };
 #ifdef USE_ION
-struct venc_ion
-{
+struct venc_ion {
     int ion_device_fd;
     struct ion_fd_data fd_ion_data;
     struct ion_allocation_data ion_alloc_data;
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h b/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h
index f59c4ab..9bd1087 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h
@@ -38,52 +38,52 @@
 #endif
 
 extern "C" {
-  OMX_API void * get_omx_component_factory_fn(void);
+    OMX_API void * get_omx_component_factory_fn(void);
 }
 
 class omx_venc: public omx_video
 {
-public:
-  omx_venc(); //constructor
-  ~omx_venc(); //des
-  static int async_message_process (void *context, void* message);
-  OMX_ERRORTYPE component_init(OMX_STRING role);
-  OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
-                              OMX_INDEXTYPE  paramIndex,
-                              OMX_PTR        paramData);
-  OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
-                           OMX_INDEXTYPE  configIndex,
-                           OMX_PTR        configData);
-  OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
-  //OMX strucutres
-  OMX_U32 m_nVenc_format;
-  class venc_dev *handle;
+    public:
+        omx_venc(); //constructor
+        ~omx_venc(); //des
+        static int async_message_process (void *context, void* message);
+        OMX_ERRORTYPE component_init(OMX_STRING role);
+        OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  paramIndex,
+                OMX_PTR        paramData);
+        OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
+                OMX_INDEXTYPE  configIndex,
+                OMX_PTR        configData);
+        OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
+        //OMX strucutres
+        OMX_U32 m_nVenc_format;
+        class venc_dev *handle;
 #ifdef _MSM8974_
-  int dev_handle_extradata(void *, int);
-  int dev_set_format(int);
+        int dev_handle_extradata(void *, int);
+        int dev_set_format(int);
 #endif
-private:
-  OMX_U32 dev_stop(void);
-  OMX_U32 dev_pause(void);
-  OMX_U32 dev_start(void);
-  OMX_U32 dev_flush(unsigned);
-  OMX_U32 dev_resume(void);
-  OMX_U32 dev_start_done(void);
-  OMX_U32 dev_set_message_thread_id(pthread_t);
-  bool dev_use_buf( void *,unsigned,unsigned);
-  bool dev_free_buf( void *,unsigned);
-  bool dev_empty_buf(void *, void *,unsigned,unsigned);
-  bool dev_fill_buf(void *, void *,unsigned,unsigned);
-  bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
-  bool dev_set_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
-  bool update_profile_level();
-  bool dev_get_seq_hdr(void *, unsigned, unsigned *);
-  bool dev_loaded_start(void);
-  bool dev_loaded_stop(void);
-  bool dev_loaded_start_done(void);
-  bool dev_loaded_stop_done(void);
-  bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *);
-  bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height);
+    private:
+        OMX_U32 dev_stop(void);
+        OMX_U32 dev_pause(void);
+        OMX_U32 dev_start(void);
+        OMX_U32 dev_flush(unsigned);
+        OMX_U32 dev_resume(void);
+        OMX_U32 dev_start_done(void);
+        OMX_U32 dev_set_message_thread_id(pthread_t);
+        bool dev_use_buf( void *,unsigned,unsigned);
+        bool dev_free_buf( void *,unsigned);
+        bool dev_empty_buf(void *, void *,unsigned,unsigned);
+        bool dev_fill_buf(void *, void *,unsigned,unsigned);
+        bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
+        bool dev_set_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
+        bool update_profile_level();
+        bool dev_get_seq_hdr(void *, unsigned, unsigned *);
+        bool dev_loaded_start(void);
+        bool dev_loaded_stop(void);
+        bool dev_loaded_start_done(void);
+        bool dev_loaded_stop_done(void);
+        bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *);
+        bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height);
 };
 
 #endif //__OMX_VENC__H
diff --git a/mm-video-v4l2/vidc/venc/inc/queue.h b/mm-video-v4l2/vidc/venc/inc/queue.h
old mode 100755
new mode 100644
index 530b087..0b653da
--- a/mm-video-v4l2/vidc/venc/inc/queue.h
+++ b/mm-video-v4l2/vidc/venc/inc/queue.h
@@ -1,80 +1,78 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#ifndef QUEUE_H
-#define QUEUE_H
-
-#include<pthread.h>
-#include <semaphore.h>
-#include <stdio.h>
-#include <string.h>
-
-/* Message Queue structure */
-struct video_msgq
-{
-    /* Command to be executed */
-    unsigned int cmd;
-
-    unsigned int status;
-
-    /* Client-specific data */
-    void *clientdata;
-};
-
-
-/* Thread & Message Queue information */
-struct video_queue_context
-{
-    /* Message Queue related members */
-    pthread_mutex_t  mutex;
-    sem_t sem_message;
-	int commandq_size;
-	int dataq_size;
-    struct video_msgq *ptr_dataq;
-	struct video_msgq *ptr_cmdq;
-    int write_dataq ;
-    int read_dataq;
-	int write_comq ;
-	int read_comq ;
-
-};
-
-int check_if_queue_empty ( unsigned int queuetocheck,void* queuecontext );
-
-struct video_msgq * queue_get_cmd ( void* queuecontext );
-
-
-
-int queue_post_cmdq ( void *queuecontext,
-                       struct video_msgq *post_msg
-                     );
-
-int queue_post_dataq ( void *queuecontext,
-                        struct video_msgq *post_msg
-                      );
-
-#endif /* QUEUE_H */
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef QUEUE_H
+#define QUEUE_H
+
+#include<pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Message Queue structure */
+struct video_msgq {
+    /* Command to be executed */
+    unsigned int cmd;
+
+    unsigned int status;
+
+    /* Client-specific data */
+    void *clientdata;
+};
+
+
+/* Thread & Message Queue information */
+struct video_queue_context {
+    /* Message Queue related members */
+    pthread_mutex_t  mutex;
+    sem_t sem_message;
+    int commandq_size;
+    int dataq_size;
+    struct video_msgq *ptr_dataq;
+    struct video_msgq *ptr_cmdq;
+    int write_dataq ;
+    int read_dataq;
+    int write_comq ;
+    int read_comq ;
+
+};
+
+int check_if_queue_empty ( unsigned int queuetocheck,void* queuecontext );
+
+struct video_msgq * queue_get_cmd ( void* queuecontext );
+
+
+
+int queue_post_cmdq ( void *queuecontext,
+        struct video_msgq *post_msg
+        );
+
+int queue_post_dataq ( void *queuecontext,
+        struct video_msgq *post_msg
+        );
+
+#endif /* QUEUE_H */
diff --git a/mm-video-v4l2/vidc/venc/inc/venc_util.h b/mm-video-v4l2/vidc/venc/inc/venc_util.h
old mode 100755
new mode 100644
index cfa590c..79602dc
--- a/mm-video-v4l2/vidc/venc/inc/venc_util.h
+++ b/mm-video-v4l2/vidc/venc/inc/venc_util.h
@@ -1,53 +1,53 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-/*============================================================================
-                    V E N C _ U T I L. H
-
-DESCRIPTION
-
-
-REFERENCES
-
-
-============================================================================*/
-
-#ifndef _VENC_UTIL_H
-#define _VENC_UTIL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-long long GetTimeStamp();
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+  V E N C _ U T I L. H
+
+  DESCRIPTION
+
+
+  REFERENCES
+
+
+  ============================================================================*/
+
+#ifndef _VENC_UTIL_H
+#define _VENC_UTIL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    long long GetTimeStamp();
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device.h
index fb24c76..f2b3efa 100644
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device.h
@@ -1,172 +1,171 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#ifndef __OMX_VENC_DEV__
-#define __OMX_VENC_DEV__
-
-#include "OMX_Types.h"
-#include "OMX_Core.h"
-#include "OMX_QCOMExtns.h"
-#include "qc_omx_component.h"
-#include "omx_video_common.h"
-#include <linux/msm_vidc_enc.h>
-#include <pthread.h>
-#include <linux/videodev2.h>
-#include <poll.h>
-#define TIMEOUT 5000
-#define MAX_RECON_BUFFERS 4
-
-void* async_venc_message_thread (void *);
-
-class venc_dev
-{
-public:
-  venc_dev(class omx_venc *venc_class); //constructor
-  ~venc_dev(); //des
-
-  bool venc_open(OMX_U32);
-  void venc_close();
-  unsigned venc_stop(void);
-  unsigned venc_pause(void);
-  unsigned venc_start(void);
-  unsigned venc_flush(unsigned);
-#ifdef _ANDROID_ICS_
-  bool venc_set_meta_mode(bool);
-#endif
-  unsigned venc_resume(void);
-  unsigned venc_start_done(void);
-  unsigned venc_set_message_thread_id(pthread_t);
-  bool venc_use_buf(void*, unsigned,unsigned);
-  bool venc_free_buf(void*, unsigned);
-  bool venc_empty_buf(void *, void *,unsigned,unsigned);
-  bool venc_fill_buf(void *, void *,unsigned,unsigned);
-
-  bool venc_get_buf_req(unsigned long *,unsigned long *,
-                        unsigned long *,unsigned long);
-  bool venc_set_buf_req(unsigned long *,unsigned long *,
-                        unsigned long *,unsigned long);
-  bool venc_set_param(void *,OMX_INDEXTYPE);
-  bool venc_set_config(void *configData, OMX_INDEXTYPE index);
-  bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
-  bool venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate);
-  bool venc_get_seq_hdr(void *, unsigned, unsigned *);
-  bool venc_loaded_start(void);
-  bool venc_loaded_stop(void);
-  bool venc_loaded_start_done(void);
-  bool venc_loaded_stop_done(void);
-  bool venc_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *);
-  OMX_U32 m_nDriver_fd;
-  bool m_profile_set;
-  bool m_level_set;
-  pthread_mutex_t loaded_start_stop_mlock;
-  pthread_cond_t loaded_start_stop_cond;
-
-  struct recon_buffer {
-	  unsigned char* virtual_address;
-	  int pmem_fd;
-	  int size;
-	  int alignment;
-	  int offset;
-#ifdef USE_ION
-          int ion_device_fd;
-          struct ion_allocation_data alloc_data;
-          struct ion_fd_data ion_alloc_fd;
-#endif
-	  };
-
-  recon_buffer recon_buff[MAX_RECON_BUFFERS];
-  int recon_buffers_count;
-  bool m_max_allowed_bitrate_check;
-  int m_eProfile;
-  int m_eLevel;
-  int etb_count;
-private:
-  struct venc_basecfg             m_sVenc_cfg;
-  struct venc_ratectrlcfg         rate_ctrl;
-  struct venc_targetbitrate       bitrate;
-  struct venc_intraperiod         intra_period;
-  struct venc_profile             codec_profile;
-  struct ven_profilelevel         profile_level;
-  struct venc_switch              set_param;
-  struct venc_voptimingcfg        time_inc;
-  struct venc_allocatorproperty   m_sInput_buff_property;
-  struct venc_allocatorproperty   m_sOutput_buff_property;
-  struct venc_sessionqp           session_qp;
-  struct venc_qprange             qp_range;
-  struct venc_multiclicecfg       multislice;
-  struct venc_entropycfg          entropy;
-  struct venc_dbcfg               dbkfilter;
-  struct venc_intrarefresh        intra_refresh;
-  struct venc_headerextension     hec;
-  struct venc_voptimingcfg        voptimecfg;
-  struct venc_seqheader           seqhdr;
-  struct venc_ltrmode             ltrmode;
-  struct venc_ltrcount            ltrcount;
-  struct venc_ltrperiod           ltrperiod;
-
-  bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
-  bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
-  bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
-  bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
-  bool venc_set_qp_range(OMX_U32 min_qp, OMX_U32 max_qp);
-  bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp);
-  bool venc_set_extradata(OMX_U32 extra_data);
-  bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
-  bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
-  bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
-  bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
-  bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
-  bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
-  bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
-  bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
-  bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
-  bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
-  void venc_config_print();
-  bool venc_set_slice_delivery_mode(OMX_BOOL enable);
-  bool venc_set_plusptype(OMX_BOOL enable);
-  bool venc_set_ltrmode(QOMX_VIDEO_LTRMODETYPE mode);
-  bool venc_set_ltrcount(OMX_U32 count);
-  bool venc_set_ltrperiod(OMX_U32 period);
-  bool venc_set_ltruse(OMX_U32 id, OMX_U32 frames);
-#ifdef MAX_RES_1080P
-  OMX_U32 pmem_free();
-  OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
-  OMX_U32 venc_allocate_recon_buffers();
-  inline int clip2(int x)
-  {
-	  x = x -1;
-	  x = x | x >> 1;
-	  x = x | x >> 2;
-	  x = x | x >> 4;
-	  x = x | x >> 16;
-	  x = x + 1;
-	  return x;
-  }
-#endif
-};
-
-#endif
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef __OMX_VENC_DEV__
+#define __OMX_VENC_DEV__
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
+#include "qc_omx_component.h"
+#include "omx_video_common.h"
+#include <linux/msm_vidc_enc.h>
+#include <pthread.h>
+#include <linux/videodev2.h>
+#include <poll.h>
+#define TIMEOUT 5000
+#define MAX_RECON_BUFFERS 4
+
+void* async_venc_message_thread (void *);
+
+class venc_dev
+{
+    public:
+        venc_dev(class omx_venc *venc_class); //constructor
+        ~venc_dev(); //des
+
+        bool venc_open(OMX_U32);
+        void venc_close();
+        unsigned venc_stop(void);
+        unsigned venc_pause(void);
+        unsigned venc_start(void);
+        unsigned venc_flush(unsigned);
+#ifdef _ANDROID_ICS_
+        bool venc_set_meta_mode(bool);
+#endif
+        unsigned venc_resume(void);
+        unsigned venc_start_done(void);
+        unsigned venc_set_message_thread_id(pthread_t);
+        bool venc_use_buf(void*, unsigned,unsigned);
+        bool venc_free_buf(void*, unsigned);
+        bool venc_empty_buf(void *, void *,unsigned,unsigned);
+        bool venc_fill_buf(void *, void *,unsigned,unsigned);
+
+        bool venc_get_buf_req(unsigned long *,unsigned long *,
+                unsigned long *,unsigned long);
+        bool venc_set_buf_req(unsigned long *,unsigned long *,
+                unsigned long *,unsigned long);
+        bool venc_set_param(void *,OMX_INDEXTYPE);
+        bool venc_set_config(void *configData, OMX_INDEXTYPE index);
+        bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
+        bool venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate);
+        bool venc_get_seq_hdr(void *, unsigned, unsigned *);
+        bool venc_loaded_start(void);
+        bool venc_loaded_stop(void);
+        bool venc_loaded_start_done(void);
+        bool venc_loaded_stop_done(void);
+        bool venc_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *);
+        OMX_U32 m_nDriver_fd;
+        bool m_profile_set;
+        bool m_level_set;
+        pthread_mutex_t loaded_start_stop_mlock;
+        pthread_cond_t loaded_start_stop_cond;
+
+        struct recon_buffer {
+            unsigned char* virtual_address;
+            int pmem_fd;
+            int size;
+            int alignment;
+            int offset;
+#ifdef USE_ION
+            int ion_device_fd;
+            struct ion_allocation_data alloc_data;
+            struct ion_fd_data ion_alloc_fd;
+#endif
+        };
+
+        recon_buffer recon_buff[MAX_RECON_BUFFERS];
+        int recon_buffers_count;
+        bool m_max_allowed_bitrate_check;
+        int m_eProfile;
+        int m_eLevel;
+        int etb_count;
+    private:
+        struct venc_basecfg             m_sVenc_cfg;
+        struct venc_ratectrlcfg         rate_ctrl;
+        struct venc_targetbitrate       bitrate;
+        struct venc_intraperiod         intra_period;
+        struct venc_profile             codec_profile;
+        struct ven_profilelevel         profile_level;
+        struct venc_switch              set_param;
+        struct venc_voptimingcfg        time_inc;
+        struct venc_allocatorproperty   m_sInput_buff_property;
+        struct venc_allocatorproperty   m_sOutput_buff_property;
+        struct venc_sessionqp           session_qp;
+        struct venc_qprange             qp_range;
+        struct venc_multiclicecfg       multislice;
+        struct venc_entropycfg          entropy;
+        struct venc_dbcfg               dbkfilter;
+        struct venc_intrarefresh        intra_refresh;
+        struct venc_headerextension     hec;
+        struct venc_voptimingcfg        voptimecfg;
+        struct venc_seqheader           seqhdr;
+        struct venc_ltrmode             ltrmode;
+        struct venc_ltrcount            ltrcount;
+        struct venc_ltrperiod           ltrperiod;
+
+        bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
+        bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
+        bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
+        bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
+        bool venc_set_qp_range(OMX_U32 min_qp, OMX_U32 max_qp);
+        bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp);
+        bool venc_set_extradata(OMX_U32 extra_data);
+        bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
+        bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
+        bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
+        bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
+        bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
+        bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
+        bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
+        bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
+        bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
+        bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
+        void venc_config_print();
+        bool venc_set_slice_delivery_mode(OMX_BOOL enable);
+        bool venc_set_plusptype(OMX_BOOL enable);
+        bool venc_set_ltrmode(QOMX_VIDEO_LTRMODETYPE mode);
+        bool venc_set_ltrcount(OMX_U32 count);
+        bool venc_set_ltrperiod(OMX_U32 period);
+        bool venc_set_ltruse(OMX_U32 id, OMX_U32 frames);
+#ifdef MAX_RES_1080P
+        OMX_U32 pmem_free();
+        OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
+        OMX_U32 venc_allocate_recon_buffers();
+        inline int clip2(int x) {
+            x = x -1;
+            x = x | x >> 1;
+            x = x | x >> 2;
+            x = x | x >> 4;
+            x = x | x >> 16;
+            x = x + 1;
+            return x;
+        }
+#endif
+};
+
+#endif
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index 78729b6..8a6fcc4 100644
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -42,120 +42,120 @@
 #define TIMEOUT 5*60*1000
 
 
-struct msm_venc_switch{
-	unsigned char	status;
+struct msm_venc_switch {
+    unsigned char    status;
 };
 
-struct msm_venc_allocatorproperty{
-	unsigned long	 mincount;
-	unsigned long	 actualcount;
-	unsigned long	 datasize;
-	unsigned long	 suffixsize;
-	unsigned long	 alignment;
-	unsigned long	 bufpoolid;
+struct msm_venc_allocatorproperty {
+    unsigned long     mincount;
+    unsigned long     actualcount;
+    unsigned long     datasize;
+    unsigned long     suffixsize;
+    unsigned long     alignment;
+    unsigned long     bufpoolid;
 };
 
-struct msm_venc_basecfg{
-	unsigned long	input_width;
-	unsigned long	input_height;
-	unsigned long	dvs_width;
-	unsigned long	dvs_height;
-	unsigned long	codectype;
-	unsigned long	fps_num;
-	unsigned long	fps_den;
-	unsigned long	targetbitrate;
-	unsigned long	inputformat;
+struct msm_venc_basecfg {
+    unsigned long    input_width;
+    unsigned long    input_height;
+    unsigned long    dvs_width;
+    unsigned long    dvs_height;
+    unsigned long    codectype;
+    unsigned long    fps_num;
+    unsigned long    fps_den;
+    unsigned long    targetbitrate;
+    unsigned long    inputformat;
 };
 
-struct msm_venc_profile{
-	unsigned long	profile;
+struct msm_venc_profile {
+    unsigned long    profile;
 };
-struct msm_venc_profilelevel{
-	unsigned long	level;
+struct msm_venc_profilelevel {
+    unsigned long    level;
 };
 
-struct msm_venc_sessionqp{
-	unsigned long	iframeqp;
-	unsigned long	pframqp;
-	unsigned long	bframqp;
+struct msm_venc_sessionqp {
+    unsigned long    iframeqp;
+    unsigned long    pframqp;
+    unsigned long    bframqp;
 };
 
-struct msm_venc_qprange{
-	unsigned long	maxqp;
-	unsigned long	minqp;
+struct msm_venc_qprange {
+    unsigned long    maxqp;
+    unsigned long    minqp;
 };
-struct msm_venc_intraperiod{
-	unsigned long	num_pframes;
-	unsigned long	num_bframes;
+struct msm_venc_intraperiod {
+    unsigned long    num_pframes;
+    unsigned long    num_bframes;
 };
-struct msm_venc_seqheader{
-	unsigned char *hdrbufptr;
-	unsigned long	bufsize;
-	unsigned long	hdrlen;
+struct msm_venc_seqheader {
+    unsigned char *hdrbufptr;
+    unsigned long    bufsize;
+    unsigned long    hdrlen;
 };
 
-struct msm_venc_capability{
-	unsigned long	codec_types;
-	unsigned long	maxframe_width;
-	unsigned long	maxframe_height;
-	unsigned long	maxtarget_bitrate;
-	unsigned long	maxframe_rate;
-	unsigned long	input_formats;
-	unsigned char	dvs;
+struct msm_venc_capability {
+    unsigned long    codec_types;
+    unsigned long    maxframe_width;
+    unsigned long    maxframe_height;
+    unsigned long    maxtarget_bitrate;
+    unsigned long    maxframe_rate;
+    unsigned long    input_formats;
+    unsigned char    dvs;
 };
 
-struct msm_venc_entropycfg{
-	unsigned longentropysel;
-	unsigned long	cabacmodel;
+struct msm_venc_entropycfg {
+    unsigned longentropysel;
+    unsigned long    cabacmodel;
 };
 
-struct msm_venc_dbcfg{
-	unsigned long	db_mode;
-	unsigned long	slicealpha_offset;
-	unsigned long	slicebeta_offset;
+struct msm_venc_dbcfg {
+    unsigned long    db_mode;
+    unsigned long    slicealpha_offset;
+    unsigned long    slicebeta_offset;
 };
 
-struct msm_venc_intrarefresh{
-	unsigned long	irmode;
-	unsigned long	mbcount;
+struct msm_venc_intrarefresh {
+    unsigned long    irmode;
+    unsigned long    mbcount;
 };
 
-struct msm_venc_multiclicecfg{
-	unsigned long	mslice_mode;
-	unsigned long	mslice_size;
+struct msm_venc_multiclicecfg {
+    unsigned long    mslice_mode;
+    unsigned long    mslice_size;
 };
 
-struct msm_venc_bufferflush{
-	unsigned long	flush_mode;
+struct msm_venc_bufferflush {
+    unsigned long    flush_mode;
 };
 
-struct msm_venc_ratectrlcfg{
-	unsigned long	rcmode;
+struct msm_venc_ratectrlcfg {
+    unsigned long    rcmode;
 };
 
-struct	msm_venc_voptimingcfg{
-	unsigned long	voptime_resolution;
+struct    msm_venc_voptimingcfg {
+    unsigned long    voptime_resolution;
 };
-struct msm_venc_framerate{
-	unsigned long	fps_denominator;
-	unsigned long	fps_numerator;
+struct msm_venc_framerate {
+    unsigned long    fps_denominator;
+    unsigned long    fps_numerator;
 };
 
-struct msm_venc_targetbitrate{
-	unsigned long	target_bitrate;
+struct msm_venc_targetbitrate {
+    unsigned long    target_bitrate;
 };
 
 
-struct msm_venc_rotation{
-	unsigned long	rotation;
+struct msm_venc_rotation {
+    unsigned long    rotation;
 };
 
-struct msm_venc_timeout{
-	 unsigned long	millisec;
+struct msm_venc_timeout {
+    unsigned long    millisec;
 };
 
-struct msm_venc_headerextension{
-	 unsigned long	header_extension;
+struct msm_venc_headerextension {
+    unsigned long    header_extension;
 };
 
 struct msm_venc_video_capability {
@@ -166,179 +166,178 @@
 };
 
 struct msm_venc_idrperiod {
-	unsigned long idrperiod;
+    unsigned long idrperiod;
 };
 
 struct msm_venc_slice_delivery {
-	unsigned long enable;
+    unsigned long enable;
 };
 
 enum v4l2_ports {
-	CAPTURE_PORT,
-	OUTPUT_PORT,
-	MAX_PORT
+    CAPTURE_PORT,
+    OUTPUT_PORT,
+    MAX_PORT
 };
 
 struct extradata_buffer_info {
-	int buffer_size;
-	char* uaddr;
-	int count;
-	int size;
-	int allocated;
+    int buffer_size;
+    char* uaddr;
+    int count;
+    int size;
+    int allocated;
 #ifdef USE_ION
-	struct venc_ion ion;
+    struct venc_ion ion;
 #endif
 };
 
 class venc_dev
 {
-public:
-  venc_dev(class omx_venc *venc_class); //constructor
-  ~venc_dev(); //des
+    public:
+        venc_dev(class omx_venc *venc_class); //constructor
+        ~venc_dev(); //des
 
-  static void* async_venc_message_thread (void *);
-  bool venc_open(OMX_U32);
-  void venc_close();
-  unsigned venc_stop(void);
-  unsigned venc_pause(void);
-  unsigned venc_start(void);
-  unsigned venc_flush(unsigned);
+        static void* async_venc_message_thread (void *);
+        bool venc_open(OMX_U32);
+        void venc_close();
+        unsigned venc_stop(void);
+        unsigned venc_pause(void);
+        unsigned venc_start(void);
+        unsigned venc_flush(unsigned);
 #ifdef _ANDROID_ICS_
-  bool venc_set_meta_mode(bool);
+        bool venc_set_meta_mode(bool);
 #endif
-  unsigned venc_resume(void);
-  unsigned venc_start_done(void);
-  unsigned venc_stop_done(void);
-  unsigned venc_set_message_thread_id(pthread_t);
-  bool venc_use_buf(void*, unsigned,unsigned);
-  bool venc_free_buf(void*, unsigned);
-  bool venc_empty_buf(void *, void *,unsigned,unsigned);
-  bool venc_fill_buf(void *, void *,unsigned,unsigned);
+        unsigned venc_resume(void);
+        unsigned venc_start_done(void);
+        unsigned venc_stop_done(void);
+        unsigned venc_set_message_thread_id(pthread_t);
+        bool venc_use_buf(void*, unsigned,unsigned);
+        bool venc_free_buf(void*, unsigned);
+        bool venc_empty_buf(void *, void *,unsigned,unsigned);
+        bool venc_fill_buf(void *, void *,unsigned,unsigned);
 
-  bool venc_get_buf_req(unsigned long *,unsigned long *,
-                        unsigned long *,unsigned long);
-  bool venc_set_buf_req(unsigned long *,unsigned long *,
-                        unsigned long *,unsigned long);
-  bool venc_set_param(void *,OMX_INDEXTYPE);
-  bool venc_set_config(void *configData, OMX_INDEXTYPE index);
-  bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
-  bool venc_get_seq_hdr(void *, unsigned, unsigned *);
-  bool venc_loaded_start(void);
-  bool venc_loaded_stop(void);
-  bool venc_loaded_start_done(void);
-  bool venc_loaded_stop_done(void);
-  bool venc_is_video_session_supported(unsigned long width, unsigned long height);
-  OMX_U32 m_nDriver_fd;
-  bool m_profile_set;
-  bool m_level_set;
-  int num_planes;
-  int etb, ebd, ftb, fbd;
-  struct recon_buffer {
-	  unsigned char* virtual_address;
-	  int pmem_fd;
-	  int size;
-	  int alignment;
-	  int offset;
+        bool venc_get_buf_req(unsigned long *,unsigned long *,
+                unsigned long *,unsigned long);
+        bool venc_set_buf_req(unsigned long *,unsigned long *,
+                unsigned long *,unsigned long);
+        bool venc_set_param(void *,OMX_INDEXTYPE);
+        bool venc_set_config(void *configData, OMX_INDEXTYPE index);
+        bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
+        bool venc_get_seq_hdr(void *, unsigned, unsigned *);
+        bool venc_loaded_start(void);
+        bool venc_loaded_stop(void);
+        bool venc_loaded_start_done(void);
+        bool venc_loaded_stop_done(void);
+        bool venc_is_video_session_supported(unsigned long width, unsigned long height);
+        OMX_U32 m_nDriver_fd;
+        bool m_profile_set;
+        bool m_level_set;
+        int num_planes;
+        int etb, ebd, ftb, fbd;
+        struct recon_buffer {
+            unsigned char* virtual_address;
+            int pmem_fd;
+            int size;
+            int alignment;
+            int offset;
 #ifdef USE_ION
-          int ion_device_fd;
-          struct ion_allocation_data alloc_data;
-          struct ion_fd_data ion_alloc_fd;
+            int ion_device_fd;
+            struct ion_allocation_data alloc_data;
+            struct ion_fd_data ion_alloc_fd;
 #endif
-	  };
+        };
 
-  int stopped;
-  bool m_max_allowed_bitrate_check;
-  pthread_t m_tid;
-  bool async_thread_created;
-  class omx_venc *venc_handle;
-  OMX_ERRORTYPE allocate_extradata();
-  void free_extradata();
-  bool handle_extradata(void *, int);
-  int venc_set_format(int);
-private:
-  struct msm_venc_basecfg             m_sVenc_cfg;
-  struct msm_venc_ratectrlcfg         rate_ctrl;
-  struct msm_venc_targetbitrate       bitrate;
-  struct msm_venc_intraperiod         intra_period;
-  struct msm_venc_profile             codec_profile;
-  struct msm_venc_profilelevel        profile_level;
-  struct msm_venc_switch              set_param;
-  struct msm_venc_voptimingcfg        time_inc;
-  struct msm_venc_allocatorproperty   m_sInput_buff_property;
-  struct msm_venc_allocatorproperty   m_sOutput_buff_property;
-  struct msm_venc_sessionqp           session_qp;
-  struct msm_venc_multiclicecfg       multislice;
-  struct msm_venc_entropycfg          entropy;
-  struct msm_venc_dbcfg               dbkfilter;
-  struct msm_venc_intrarefresh        intra_refresh;
-  struct msm_venc_headerextension     hec;
-  struct msm_venc_voptimingcfg        voptimecfg;
-  struct msm_venc_video_capability    capability;
-  struct msm_venc_idrperiod           idrperiod;
-  struct msm_venc_slice_delivery      slice_mode;
+        int stopped;
+        bool m_max_allowed_bitrate_check;
+        pthread_t m_tid;
+        bool async_thread_created;
+        class omx_venc *venc_handle;
+        OMX_ERRORTYPE allocate_extradata();
+        void free_extradata();
+        bool handle_extradata(void *, int);
+        int venc_set_format(int);
+    private:
+        struct msm_venc_basecfg             m_sVenc_cfg;
+        struct msm_venc_ratectrlcfg         rate_ctrl;
+        struct msm_venc_targetbitrate       bitrate;
+        struct msm_venc_intraperiod         intra_period;
+        struct msm_venc_profile             codec_profile;
+        struct msm_venc_profilelevel        profile_level;
+        struct msm_venc_switch              set_param;
+        struct msm_venc_voptimingcfg        time_inc;
+        struct msm_venc_allocatorproperty   m_sInput_buff_property;
+        struct msm_venc_allocatorproperty   m_sOutput_buff_property;
+        struct msm_venc_sessionqp           session_qp;
+        struct msm_venc_multiclicecfg       multislice;
+        struct msm_venc_entropycfg          entropy;
+        struct msm_venc_dbcfg               dbkfilter;
+        struct msm_venc_intrarefresh        intra_refresh;
+        struct msm_venc_headerextension     hec;
+        struct msm_venc_voptimingcfg        voptimecfg;
+        struct msm_venc_video_capability    capability;
+        struct msm_venc_idrperiod           idrperiod;
+        struct msm_venc_slice_delivery      slice_mode;
 
-  bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
-  bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
-  bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
-  bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
-  bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp);
-  bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
-  bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
-  bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
-  bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
-  bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
-  bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
-  bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
-  bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
-  bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
-  bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
-  void venc_config_print();
-  bool venc_set_slice_delivery_mode(OMX_U32 enable);
-  bool venc_set_extradata(OMX_U32 extra_data);
-  bool venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod);
+        bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
+        bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
+        bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
+        bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
+        bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp);
+        bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
+        bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
+        bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
+        bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
+        bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
+        bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
+        bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
+        bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
+        bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
+        bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
+        void venc_config_print();
+        bool venc_set_slice_delivery_mode(OMX_U32 enable);
+        bool venc_set_extradata(OMX_U32 extra_data);
+        bool venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod);
 #ifdef MAX_RES_1080P
-  OMX_U32 pmem_free();
-  OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
-  OMX_U32 venc_allocate_recon_buffers();
-  inline int clip2(int x)
-  {
-	  x = x -1;
-	  x = x | x >> 1;
-	  x = x | x >> 2;
-	  x = x | x >> 4;
-	  x = x | x >> 16;
-	  x = x + 1;
-	  return x;
-  }
+        OMX_U32 pmem_free();
+        OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
+        OMX_U32 venc_allocate_recon_buffers();
+        inline int clip2(int x) {
+            x = x -1;
+            x = x | x >> 1;
+            x = x | x >> 2;
+            x = x | x >> 4;
+            x = x | x >> 16;
+            x = x + 1;
+            return x;
+        }
 #endif
-  int metadatamode;
-  bool streaming[MAX_PORT];
-  bool extradata;
-  struct extradata_buffer_info extradata_info;
+        int metadatamode;
+        bool streaming[MAX_PORT];
+        bool extradata;
+        struct extradata_buffer_info extradata_info;
 
-  pthread_mutex_t pause_resume_mlock;
-  pthread_cond_t pause_resume_cond;
-  bool paused;
-  int color_format;
+        pthread_mutex_t pause_resume_mlock;
+        pthread_cond_t pause_resume_cond;
+        bool paused;
+        int color_format;
 };
 
 enum instance_state {
-	MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
-	MSM_VIDC_CORE_INIT,
-	MSM_VIDC_CORE_INIT_DONE,
-	MSM_VIDC_OPEN,
-	MSM_VIDC_OPEN_DONE,
-	MSM_VIDC_LOAD_RESOURCES,
-	MSM_VIDC_LOAD_RESOURCES_DONE,
-	MSM_VIDC_START,
-	MSM_VIDC_START_DONE,
-	MSM_VIDC_STOP,
-	MSM_VIDC_STOP_DONE,
-	MSM_VIDC_RELEASE_RESOURCES,
-	MSM_VIDC_RELEASE_RESOURCES_DONE,
-	MSM_VIDC_CLOSE,
-	MSM_VIDC_CLOSE_DONE,
-	MSM_VIDC_CORE_UNINIT,
+    MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
+    MSM_VIDC_CORE_INIT,
+    MSM_VIDC_CORE_INIT_DONE,
+    MSM_VIDC_OPEN,
+    MSM_VIDC_OPEN_DONE,
+    MSM_VIDC_LOAD_RESOURCES,
+    MSM_VIDC_LOAD_RESOURCES_DONE,
+    MSM_VIDC_START,
+    MSM_VIDC_START_DONE,
+    MSM_VIDC_STOP,
+    MSM_VIDC_STOP_DONE,
+    MSM_VIDC_RELEASE_RESOURCES,
+    MSM_VIDC_RELEASE_RESOURCES_DONE,
+    MSM_VIDC_CLOSE,
+    MSM_VIDC_CLOSE_DONE,
+    MSM_VIDC_CORE_UNINIT,
 };
 #endif
 
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_test.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_test.h
old mode 100755
new mode 100644
index bf1082a..217611a
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_test.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_test.h
@@ -1,76 +1,75 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include <stdio.h>
-#include <stdlib.h>
-#include "queue.h"
-#include<fcntl.h>
-#include<sys/ioctl.h>
-#include <sys/mman.h>
-#include <linux/msm_vidc_enc.h>
-#include<pthread.h>
-#include <semaphore.h>
-#include <stdio.h>
-
-#define INPUT_BUFFER 0
-#define OUTPUT_BUFFER 1
-
-struct video_encoder_context
-{
-	unsigned long   input_width;
-  unsigned long   input_height;
-	unsigned long   codectype;
-  unsigned long   fps_num;
-  unsigned long   fps_den;
-  unsigned long   targetbitrate;
-  unsigned long   inputformat;
-
-	struct venc_allocatorproperty input_buffer;
-  struct venc_allocatorproperty output_buffer;
-	struct venc_bufferpayload     **ptr_inputbuffer;
-	struct venc_bufferpayload     **ptr_outputbuffer;
-	struct video_queue_context    queue_context;
-	int                           video_driver_fd;
-
-	FILE * inputBufferFile;
-	FILE * outputBufferFile;
-
-  pthread_t videothread_id;
-	pthread_t asyncthread_id;
-	sem_t sem_synchronize;
-};
-
-int init_encoder ( struct video_encoder_context *init_decode );
-int allocate_buffer ( unsigned int buffer_dir,
-					            struct video_encoder_context *decode_context
-					          );
-int free_buffer ( unsigned int buffer_dir,
-				          struct video_encoder_context *decode_context
-				         );
-int start_encoding (struct video_encoder_context *decode_context);
-int stop_encoding  (struct video_encoder_context *decode_context);
-int deinit_encoder (struct video_encoder_context *init_decode);
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include "queue.h"
+#include<fcntl.h>
+#include<sys/ioctl.h>
+#include <sys/mman.h>
+#include <linux/msm_vidc_enc.h>
+#include<pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#define INPUT_BUFFER 0
+#define OUTPUT_BUFFER 1
+
+struct video_encoder_context {
+    unsigned long   input_width;
+    unsigned long   input_height;
+    unsigned long   codectype;
+    unsigned long   fps_num;
+    unsigned long   fps_den;
+    unsigned long   targetbitrate;
+    unsigned long   inputformat;
+
+    struct venc_allocatorproperty input_buffer;
+    struct venc_allocatorproperty output_buffer;
+    struct venc_bufferpayload     **ptr_inputbuffer;
+    struct venc_bufferpayload     **ptr_outputbuffer;
+    struct video_queue_context    queue_context;
+    int                           video_driver_fd;
+
+    FILE * inputBufferFile;
+    FILE * outputBufferFile;
+
+    pthread_t videothread_id;
+    pthread_t asyncthread_id;
+    sem_t sem_synchronize;
+};
+
+int init_encoder ( struct video_encoder_context *init_decode );
+int allocate_buffer ( unsigned int buffer_dir,
+        struct video_encoder_context *decode_context
+        );
+int free_buffer ( unsigned int buffer_dir,
+        struct video_encoder_context *decode_context
+        );
+int start_encoding (struct video_encoder_context *decode_context);
+int stop_encoding  (struct video_encoder_context *decode_context);
+int deinit_encoder (struct video_encoder_context *init_decode);
diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
index d207bcd..c4e30ae 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
@@ -76,8 +76,7 @@
 #define VC1_STRUCT_B_POS            24
 #define VC1_SEQ_LAYER_SIZE          36
 
-typedef struct OMXComponentCapabilityFlagsType
-{
+typedef struct OMXComponentCapabilityFlagsType {
     ////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS
     OMX_BOOL iIsOMXComponentMultiThreaded;
     OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;
@@ -96,104 +95,93 @@
 
 void* message_thread(void *input)
 {
-  omx_video* omx = reinterpret_cast<omx_video*>(input);
-  unsigned char id;
-  int n;
+    omx_video* omx = reinterpret_cast<omx_video*>(input);
+    unsigned char id;
+    int n;
 
-  DEBUG_PRINT_LOW("omx_venc: message thread start\n");
-  prctl(PR_SET_NAME, (unsigned long)"VideoEncMsgThread", 0, 0, 0);
-  while(1)
-  {
-    n = read(omx->m_pipe_in, &id, 1);
-    if(0 == n)
-    {
-      break;
-    }
+    DEBUG_PRINT_LOW("omx_venc: message thread start\n");
+    prctl(PR_SET_NAME, (unsigned long)"VideoEncMsgThread", 0, 0, 0);
+    while (1) {
+        n = read(omx->m_pipe_in, &id, 1);
+        if (0 == n) {
+            break;
+        }
 
-    if(1 == n)
-    {
-      omx->process_event_cb(omx, id);
-    }
+        if (1 == n) {
+            omx->process_event_cb(omx, id);
+        }
 #ifdef QLE_BUILD
-    if(n < 0) break;
+        if (n < 0) break;
 #else
-    if((n < 0) && (errno != EINTR)) break;
+        if ((n < 0) && (errno != EINTR)) break;
 #endif
-  }
-  DEBUG_PRINT_LOW("omx_venc: message thread stop\n");
-  return 0;
+    }
+    DEBUG_PRINT_LOW("omx_venc: message thread stop\n");
+    return 0;
 }
 
 void post_message(omx_video *omx, unsigned char id)
 {
-  DEBUG_PRINT_LOW("omx_venc: post_message %d\n", id);
-  write(omx->m_pipe_out, &id, 1);
+    DEBUG_PRINT_LOW("omx_venc: post_message %d\n", id);
+    write(omx->m_pipe_out, &id, 1);
 }
 
 // omx_cmd_queue destructor
 omx_video::omx_cmd_queue::~omx_cmd_queue()
 {
-  // Nothing to do
+    // Nothing to do
 }
 
 // omx cmd queue constructor
 omx_video::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
 {
-  memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
+    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
 }
 
 // omx cmd queue insert
 bool omx_video::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
 {
-  bool ret = true;
-  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
-  {
-    m_q[m_write].id       = id;
-    m_q[m_write].param1   = p1;
-    m_q[m_write].param2   = p2;
-    m_write++;
-    m_size ++;
-    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_write = 0;
+    bool ret = true;
+    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
+        m_q[m_write].id       = id;
+        m_q[m_write].param1   = p1;
+        m_q[m_write].param2   = p2;
+        m_write++;
+        m_size ++;
+        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_write = 0;
+        }
+    } else {
+        ret = false;
+        DEBUG_PRINT_ERROR("ERROR!!! Command Queue Full\n");
     }
-  }
-  else
-  {
-    ret = false;
-    DEBUG_PRINT_ERROR("ERROR!!! Command Queue Full\n");
-  }
-  return ret;
+    return ret;
 }
 
 // omx cmd queue pop
 bool omx_video::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
 {
-  bool ret = true;
-  if(m_size > 0)
-  {
-    *id = m_q[m_read].id;
-    *p1 = m_q[m_read].param1;
-    *p2 = m_q[m_read].param2;
-    // Move the read pointer ahead
-    ++m_read;
-    --m_size;
-    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
-    {
-      m_read = 0;
+    bool ret = true;
+    if (m_size > 0) {
+        *id = m_q[m_read].id;
+        *p1 = m_q[m_read].param1;
+        *p2 = m_q[m_read].param2;
+        // Move the read pointer ahead
+        ++m_read;
+        --m_size;
+        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+            m_read = 0;
+        }
+    } else {
+        ret = false;
     }
-  }
-  else
-  {
-    ret = false;
-  }
-  return ret;
+    return ret;
 }
 
 // Retrieve the first mesg type in the queue
 unsigned omx_video::omx_cmd_queue::get_q_msg_type()
 {
-  return m_q[m_read].id;
+    return m_q[m_read].id;
 }
 
 
@@ -201,496 +189,434 @@
 #ifdef _ANDROID_
 VideoHeap::VideoHeap(int fd, size_t size, void* base)
 {
-  // dup file descriptor, map once, use pmem
-  init(dup(fd), base, size, 0 , MEM_DEVICE);
+    // dup file descriptor, map once, use pmem
+    init(dup(fd), base, size, 0 , MEM_DEVICE);
 }
 #endif // _ANDROID_
 
 /* ======================================================================
-FUNCTION
-  omx_venc::omx_venc
+   FUNCTION
+   omx_venc::omx_venc
 
-DESCRIPTION
-  Constructor
+   DESCRIPTION
+   Constructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_video::omx_video():
-	m_pInput_pmem(NULL),
-	m_pOutput_pmem(NULL),
+    m_pInput_pmem(NULL),
+    m_pOutput_pmem(NULL),
 #ifdef USE_ION
-	m_pInput_ion(NULL),
-	m_pOutput_ion(NULL),
+    m_pInput_ion(NULL),
+    m_pOutput_ion(NULL),
 #endif
-	m_error_propogated(false),
-	m_state(OMX_StateInvalid),
-	m_app_data(NULL),
-	m_use_input_pmem(OMX_FALSE),
-	m_use_output_pmem(OMX_FALSE),
-	m_inp_mem_ptr(NULL),
-	m_out_mem_ptr(NULL),
-	input_flush_progress (false),
-	output_flush_progress (false),
-	input_use_buffer (false),
-	output_use_buffer (false),
-	pending_input_buffers(0),
-	pending_output_buffers(0),
-	m_out_bm_count(0),
-	m_inp_bm_count(0),
-	m_flags(0),
-	m_etb_count(0),
-	m_fbd_count(0),
-	m_event_port_settings_sent(false),
-  m_input_msg_id(OMX_COMPONENT_GENERATE_ETB),
-  psource_frame(NULL),
-  pdest_frame(NULL),
-  c2d_opened(false)
+    m_error_propogated(false),
+    m_state(OMX_StateInvalid),
+    m_app_data(NULL),
+    m_use_input_pmem(OMX_FALSE),
+    m_use_output_pmem(OMX_FALSE),
+    m_inp_mem_ptr(NULL),
+    m_out_mem_ptr(NULL),
+    input_flush_progress (false),
+    output_flush_progress (false),
+    input_use_buffer (false),
+    output_use_buffer (false),
+    pending_input_buffers(0),
+    pending_output_buffers(0),
+    m_out_bm_count(0),
+    m_inp_bm_count(0),
+    m_flags(0),
+    m_etb_count(0),
+    m_fbd_count(0),
+    m_event_port_settings_sent(false),
+    m_input_msg_id(OMX_COMPONENT_GENERATE_ETB),
+    psource_frame(NULL),
+    pdest_frame(NULL),
+    c2d_opened(false)
 {
-  DEBUG_PRINT_HIGH("\n omx_video(): Inside Constructor()");
-  memset(&m_cmp,0,sizeof(m_cmp));
-  memset(&m_pCallbacks,0,sizeof(m_pCallbacks));
-  async_thread_created = false;
-  msg_thread_created = false;
+    DEBUG_PRINT_HIGH("\n omx_video(): Inside Constructor()");
+    memset(&m_cmp,0,sizeof(m_cmp));
+    memset(&m_pCallbacks,0,sizeof(m_pCallbacks));
+    async_thread_created = false;
+    msg_thread_created = false;
 
-  pthread_mutex_init(&m_lock, NULL);
-  sem_init(&m_cmd_lock,0,0);
+    pthread_mutex_init(&m_lock, NULL);
+    sem_init(&m_cmd_lock,0,0);
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::~omx_venc
+   FUNCTION
+   omx_venc::~omx_venc
 
-DESCRIPTION
-  Destructor
+   DESCRIPTION
+   Destructor
 
-PARAMETERS
-  None
+   PARAMETERS
+   None
 
-RETURN VALUE
-  None.
-========================================================================== */
+   RETURN VALUE
+   None.
+   ========================================================================== */
 omx_video::~omx_video()
 {
-  DEBUG_PRINT_HIGH("\n ~omx_video(): Inside Destructor()");
-  if(m_pipe_in) close(m_pipe_in);
-  if(m_pipe_out) close(m_pipe_out);
-  DEBUG_PRINT_HIGH("omx_video: Waiting on Msg Thread exit\n");
-  if (msg_thread_created)
-	  pthread_join(msg_thread_id,NULL);
-  DEBUG_PRINT_HIGH("omx_video: Waiting on Async Thread exit\n");
-  /*For V4L2 based drivers, pthread_join is done in device_close
-   * so no need to do it here*/
+    DEBUG_PRINT_HIGH("\n ~omx_video(): Inside Destructor()");
+    if (m_pipe_in) close(m_pipe_in);
+    if (m_pipe_out) close(m_pipe_out);
+    DEBUG_PRINT_HIGH("omx_video: Waiting on Msg Thread exit\n");
+    if (msg_thread_created)
+        pthread_join(msg_thread_id,NULL);
+    DEBUG_PRINT_HIGH("omx_video: Waiting on Async Thread exit\n");
+    /*For V4L2 based drivers, pthread_join is done in device_close
+     * so no need to do it here*/
 #ifndef _MSM8974_
-  if (async_thread_created)
-	  pthread_join(async_thread_id,NULL);
+    if (async_thread_created)
+        pthread_join(async_thread_id,NULL);
 #endif
-  pthread_mutex_destroy(&m_lock);
-  sem_destroy(&m_cmd_lock);
-  DEBUG_PRINT_HIGH("\n m_etb_count = %u, m_fbd_count = %u\n", m_etb_count,
-      m_fbd_count);
-  DEBUG_PRINT_HIGH("omx_video: Destructor exit\n");
-  DEBUG_PRINT_HIGH("Exiting 7x30 OMX Video Encoder ...\n");
+    pthread_mutex_destroy(&m_lock);
+    sem_destroy(&m_cmd_lock);
+    DEBUG_PRINT_HIGH("\n m_etb_count = %u, m_fbd_count = %u\n", m_etb_count,
+            m_fbd_count);
+    DEBUG_PRINT_HIGH("omx_video: Destructor exit\n");
+    DEBUG_PRINT_HIGH("Exiting 7x30 OMX Video Encoder ...\n");
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::OMXCntrlProcessMsgCb
+   FUNCTION
+   omx_venc::OMXCntrlProcessMsgCb
 
-DESCRIPTION
-  IL Client callbacks are generated through this routine. The decoder
-  provides the thread context for this routine.
+   DESCRIPTION
+   IL Client callbacks are generated through this routine. The decoder
+   provides the thread context for this routine.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 void omx_video::process_event_cb(void *ctxt, unsigned char id)
 {
-  unsigned p1; // Parameter - 1
-  unsigned p2; // Parameter - 2
-  unsigned ident;
-  unsigned qsize=0; // qsize
-  omx_video *pThis = (omx_video *) ctxt;
+    unsigned p1; // Parameter - 1
+    unsigned p2; // Parameter - 2
+    unsigned ident;
+    unsigned qsize=0; // qsize
+    omx_video *pThis = (omx_video *) ctxt;
 
-  if(!pThis)
-  {
-    DEBUG_PRINT_ERROR("ERROR:ProcessMsgCb:Context is incorrect; bailing out\n");
-    return;
-  }
-
-  // Protect the shared queue data structure
-  do
-  {
-    /*Read the message id's from the queue*/
-
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size;
-    if(qsize)
-    {
-      pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
+    if (!pThis) {
+        DEBUG_PRINT_ERROR("ERROR:ProcessMsgCb:Context is incorrect; bailing out\n");
+        return;
     }
 
-    if(qsize == 0)
-    {
-      qsize = pThis->m_ftb_q.m_size;
-      if(qsize)
-      {
-        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
-      }
-    }
+    // Protect the shared queue data structure
+    do {
+        /*Read the message id's from the queue*/
 
-    if(qsize == 0)
-    {
-      qsize = pThis->m_etb_q.m_size;
-      if(qsize)
-      {
-        pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
-      }
-    }
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size;
+        if (qsize) {
+            pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
+        }
 
-    pthread_mutex_unlock(&pThis->m_lock);
-
-    /*process message if we have one*/
-    if(qsize > 0)
-    {
-      id = ident;
-      switch(id)
-      {
-      case OMX_COMPONENT_GENERATE_EVENT:
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          switch(p1)
-          {
-          case OMX_CommandStateSet:
-            pThis->m_state = (OMX_STATETYPE) p2;
-            DEBUG_PRINT_LOW("Process -> state set to %d \n", pThis->m_state);
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete, p1, p2, NULL);
-            break;
-
-          case OMX_EventError:
-            DEBUG_PRINT_ERROR("\nERROR: OMX_EventError: p2 = %d\n", p2);
-            if(p2 == OMX_ErrorHardware)
-            {
-              pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                               OMX_EventError,OMX_ErrorHardware,0,NULL);
+        if (qsize == 0) {
+            qsize = pThis->m_ftb_q.m_size;
+            if (qsize) {
+                pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
             }
-            else
-            {
-              pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                               OMX_EventError, p2, NULL, NULL );
+        }
 
+        if (qsize == 0) {
+            qsize = pThis->m_etb_q.m_size;
+            if (qsize) {
+                pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
             }
-            break;
-
-          case OMX_CommandPortDisable:
-            DEBUG_PRINT_LOW("Process -> Port %d set to PORT_STATE_DISABLED" \
-                        "state \n", p2);
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete, p1, p2, NULL );
-            break;
-          case OMX_CommandPortEnable:
-            DEBUG_PRINT_LOW("Process ->Port %d set PORT_STATE_ENABLED state\n" \
-                        , p2);
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
-                                             OMX_EventCmdComplete, p1, p2, NULL );
-            break;
-
-          default:
-            DEBUG_PRINT_LOW("\n process_event_cb forwarding EventCmdComplete %d \n", p1);
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete, p1, p2, NULL );
-            break;
-
-          }
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("ERROR: ProcessMsgCb NULL callbacks\n");
-        }
-        break;
-      case OMX_COMPONENT_GENERATE_ETB_OPQ:
-        DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_ETB_OPQ\n");
-        if(pThis->empty_this_buffer_opaque((OMX_HANDLETYPE)p1,\
-                                          (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: ETBProxy() failed!\n");
-          pThis->omx_report_error ();
-        }
-        break;
-      case OMX_COMPONENT_GENERATE_ETB:
-        DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_ETB\n");
-        if(pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-                                          (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: ETBProxy() failed!\n");
-          pThis->omx_report_error ();
-        }
-        break;
-
-      case OMX_COMPONENT_GENERATE_FTB:
-        if( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
-                                          (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: FTBProxy() failed!\n");
-          pThis->omx_report_error ();
-        }
-        break;
-
-      case OMX_COMPONENT_GENERATE_COMMAND:
-        pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
-                                  (OMX_U32)p2,(OMX_PTR)NULL);
-        break;
-
-      case OMX_COMPONENT_GENERATE_EBD:
-        if( pThis->empty_buffer_done(&pThis->m_cmp,
-                                     (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
-          pThis->omx_report_error ();
-        }
-        break;
-
-      case OMX_COMPONENT_GENERATE_FBD:
-        if( pThis->fill_buffer_done(&pThis->m_cmp,
-                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
-          pThis->omx_report_error ();
-        }
-        break;
-
-      case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
-
-        pThis->input_flush_progress = false;
-        DEBUG_PRINT_HIGH("\nm_etb_count at i/p flush = %u", m_etb_count);
-        m_etb_count = 0;
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          /*Check if we need generate event for Flush done*/
-          if(BITMASK_PRESENT(&pThis->m_flags,
-                             OMX_COMPONENT_INPUT_FLUSH_PENDING))
-          {
-            BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete,OMX_CommandFlush,
-                                             PORT_INDEX_IN,NULL );
-          }
-          else if(BITMASK_PRESENT(&pThis->m_flags,
-                                  OMX_COMPONENT_IDLE_PENDING))
-          {
-            if(!pThis->output_flush_progress)
-            {
-              DEBUG_PRINT_LOW("\n dev_stop called after input flush complete\n");
-              if(dev_stop() != 0)
-              {
-                DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed in i/p flush!\n");
-                pThis->omx_report_error ();
-              }
-            }
-          }
         }
 
-        break;
+        pthread_mutex_unlock(&pThis->m_lock);
 
-      case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
+        /*process message if we have one*/
+        if (qsize > 0) {
+            id = ident;
+            switch (id) {
+                case OMX_COMPONENT_GENERATE_EVENT:
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        switch (p1) {
+                            case OMX_CommandStateSet:
+                                pThis->m_state = (OMX_STATETYPE) p2;
+                                DEBUG_PRINT_LOW("Process -> state set to %d \n", pThis->m_state);
+                                pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL);
+                                break;
 
-        pThis->output_flush_progress = false;
-        DEBUG_PRINT_HIGH("\nm_fbd_count at o/p flush = %u", m_fbd_count);
-        m_fbd_count = 0;
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          /*Check if we need generate event for Flush done*/
-          if(BITMASK_PRESENT(&pThis->m_flags,
-                             OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
-          {
-            BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+                            case OMX_EventError:
+                                DEBUG_PRINT_ERROR("\nERROR: OMX_EventError: p2 = %d\n", p2);
+                                if (p2 == OMX_ErrorHardware) {
+                                    pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError,OMX_ErrorHardware,0,NULL);
+                                } else {
+                                    pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                            OMX_EventError, p2, NULL, NULL );
 
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete,OMX_CommandFlush,
-                                             PORT_INDEX_OUT,NULL );
-          }
-          else if(BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
-          {
-            DEBUG_PRINT_LOW("\n dev_stop called after Output flush complete\n");
-            if(!pThis->input_flush_progress)
-            {
-              if(dev_stop() != 0)
-              {
-                DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed in o/p flush!\n");
-                pThis->omx_report_error ();
-              }
-            }
-          }
-        }
-        break;
+                                }
+                                break;
 
-      case OMX_COMPONENT_GENERATE_START_DONE:
-        DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE msg");
+                            case OMX_CommandPortDisable:
+                                DEBUG_PRINT_LOW("Process -> Port %d set to PORT_STATE_DISABLED" \
+                                        "state \n", p2);
+                                pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
+                            case OMX_CommandPortEnable:
+                                DEBUG_PRINT_LOW("Process ->Port %d set PORT_STATE_ENABLED state\n" \
+                                        , p2);
+                                pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
 
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
-          if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-          {
-            DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Move to \
-                             executing");
-            // Send the callback now
-            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-            pThis->m_state = OMX_StateExecuting;
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete,OMX_CommandStateSet,
-                                             OMX_StateExecuting, NULL);
-          }
-          else if(BITMASK_PRESENT(&pThis->m_flags,
-                                  OMX_COMPONENT_PAUSE_PENDING))
-          {
-            if(dev_pause())
-            {
-              DEBUG_PRINT_ERROR("\nERROR: dev_pause() failed in Start Done!\n");
-              pThis->omx_report_error ();
-            }
-          }
-          else if (BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_LOADED_START_PENDING))
-          {
-            if(dev_loaded_start_done())
-            {
-              DEBUG_PRINT_LOW("successful loaded Start Done!");
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: failed in loaded Start Done!");
-              pThis->omx_report_error ();
-            }
-            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_START_PENDING);
-          }
-          else
-          {
-            DEBUG_PRINT_LOW("\nERROR: unknown flags=%x\n",pThis->m_flags);
-          }
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
-        }
-        break;
+                            default:
+                                DEBUG_PRINT_LOW("\n process_event_cb forwarding EventCmdComplete %d \n", p1);
+                                pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                        OMX_EventCmdComplete, p1, p2, NULL );
+                                break;
 
-      case OMX_COMPONENT_GENERATE_PAUSE_DONE:
-        DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE msg");
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
-          {
-            //Send the callback now
-            pThis->complete_pending_buffer_done_cbs();
-            DEBUG_PRINT_LOW("omx_video::process_event_cb() Sending PAUSE complete after all pending EBD/FBD\n");
-            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
-            pThis->m_state = OMX_StatePause;
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete,OMX_CommandStateSet,
-                                             OMX_StatePause, NULL);
-          }
-        }
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: ProcessMsgCb NULL callbacks\n");
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB_OPQ:
+                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_ETB_OPQ\n");
+                    if (pThis->empty_this_buffer_opaque((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\nERROR: ETBProxy() failed!\n");
+                        pThis->omx_report_error ();
+                    }
+                    break;
+                case OMX_COMPONENT_GENERATE_ETB:
+                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_ETB\n");
+                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\nERROR: ETBProxy() failed!\n");
+                        pThis->omx_report_error ();
+                    }
+                    break;
 
-        break;
+                case OMX_COMPONENT_GENERATE_FTB:
+                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\nERROR: FTBProxy() failed!\n");
+                        pThis->omx_report_error ();
+                    }
+                    break;
 
-      case OMX_COMPONENT_GENERATE_RESUME_DONE:
-        DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_RESUME_DONE msg");
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
-          {
-            // Send the callback now
-            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
-            pThis->m_state = OMX_StateExecuting;
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
-                                             OMX_EventCmdComplete,OMX_CommandStateSet,
-                                             OMX_StateExecuting,NULL);
-          }
-        }
+                case OMX_COMPONENT_GENERATE_COMMAND:
+                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
+                            (OMX_U32)p2,(OMX_PTR)NULL);
+                    break;
 
-        break;
+                case OMX_COMPONENT_GENERATE_EBD:
+                    if ( pThis->empty_buffer_done(&pThis->m_cmp,
+                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                        DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
+                        pThis->omx_report_error ();
+                    }
+                    break;
 
-      case OMX_COMPONENT_GENERATE_STOP_DONE:
-        DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE msg");
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          pThis->complete_pending_buffer_done_cbs();
-          if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
-          {
-            // Send the callback now
-            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
-            pThis->m_state = OMX_StateIdle;
-            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp,pThis->m_app_data,
-                                             OMX_EventCmdComplete,OMX_CommandStateSet,
-                                             OMX_StateIdle,NULL);
-          }
-          else if (BITMASK_PRESENT(&pThis->m_flags,
-                                   OMX_COMPONENT_LOADED_STOP_PENDING))
-          {
-            if(dev_loaded_stop_done())
-            {
-              DEBUG_PRINT_LOW("successful loaded Stop Done!");
-            }
-            else
-            {
-              DEBUG_PRINT_ERROR("ERROR: failed in loaded Stop Done!");
-              pThis->omx_report_error ();
-            }
-            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_STOP_PENDING);
-          }
-          else
-          {
-            DEBUG_PRINT_LOW("\nERROR: unknown flags=%x\n",pThis->m_flags);
-          }
-        }
+                case OMX_COMPONENT_GENERATE_FBD:
+                    if ( pThis->fill_buffer_done(&pThis->m_cmp,
+                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                        DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
+                        pThis->omx_report_error ();
+                    }
+                    break;
 
-        break;
+                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
 
-      case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
-        DEBUG_PRINT_ERROR("\nERROR: OMX_COMPONENT_GENERATE_HARDWARE_ERROR!\n");
-        pThis->omx_report_error ();
-        break;
+                    pThis->input_flush_progress = false;
+                    DEBUG_PRINT_HIGH("\nm_etb_count at i/p flush = %u", m_etb_count);
+                    m_etb_count = 0;
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        /*Check if we need generate event for Flush done*/
+                        if (BITMASK_PRESENT(&pThis->m_flags,
+                                    OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
+                            BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
+                            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    OMX_EventCmdComplete,OMX_CommandFlush,
+                                    PORT_INDEX_IN,NULL );
+                        } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                    OMX_COMPONENT_IDLE_PENDING)) {
+                            if (!pThis->output_flush_progress) {
+                                DEBUG_PRINT_LOW("\n dev_stop called after input flush complete\n");
+                                if (dev_stop() != 0) {
+                                    DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed in i/p flush!\n");
+                                    pThis->omx_report_error ();
+                                }
+                            }
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
+
+                    pThis->output_flush_progress = false;
+                    DEBUG_PRINT_HIGH("\nm_fbd_count at o/p flush = %u", m_fbd_count);
+                    m_fbd_count = 0;
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        /*Check if we need generate event for Flush done*/
+                        if (BITMASK_PRESENT(&pThis->m_flags,
+                                    OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
+                            BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+
+                            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    OMX_EventCmdComplete,OMX_CommandFlush,
+                                    PORT_INDEX_OUT,NULL );
+                        } else if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
+                            DEBUG_PRINT_LOW("\n dev_stop called after Output flush complete\n");
+                            if (!pThis->input_flush_progress) {
+                                if (dev_stop() != 0) {
+                                    DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed in o/p flush!\n");
+                                    pThis->omx_report_error ();
+                                }
+                            }
+                        }
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_START_DONE:
+                    DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE msg");
+
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
+                        if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                            DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Move to \
+                                    executing");
+                            // Send the callback now
+                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                            pThis->m_state = OMX_StateExecuting;
+                            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    OMX_EventCmdComplete,OMX_CommandStateSet,
+                                    OMX_StateExecuting, NULL);
+                        } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                    OMX_COMPONENT_PAUSE_PENDING)) {
+                            if (dev_pause()) {
+                                DEBUG_PRINT_ERROR("\nERROR: dev_pause() failed in Start Done!\n");
+                                pThis->omx_report_error ();
+                            }
+                        } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                    OMX_COMPONENT_LOADED_START_PENDING)) {
+                            if (dev_loaded_start_done()) {
+                                DEBUG_PRINT_LOW("successful loaded Start Done!");
+                            } else {
+                                DEBUG_PRINT_ERROR("ERROR: failed in loaded Start Done!");
+                                pThis->omx_report_error ();
+                            }
+                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_START_PENDING);
+                        } else {
+                            DEBUG_PRINT_LOW("\nERROR: unknown flags=%x\n",pThis->m_flags);
+                        }
+                    } else {
+                        DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
+                    }
+                    break;
+
+                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
+                    DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE msg");
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
+                            //Send the callback now
+                            pThis->complete_pending_buffer_done_cbs();
+                            DEBUG_PRINT_LOW("omx_video::process_event_cb() Sending PAUSE complete after all pending EBD/FBD\n");
+                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
+                            pThis->m_state = OMX_StatePause;
+                            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    OMX_EventCmdComplete,OMX_CommandStateSet,
+                                    OMX_StatePause, NULL);
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_RESUME_DONE:
+                    DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_RESUME_DONE msg");
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+                            // Send the callback now
+                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+                            pThis->m_state = OMX_StateExecuting;
+                            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                    OMX_EventCmdComplete,OMX_CommandStateSet,
+                                    OMX_StateExecuting,NULL);
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_STOP_DONE:
+                    DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE msg");
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        pThis->complete_pending_buffer_done_cbs();
+                        if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                            // Send the callback now
+                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
+                            pThis->m_state = OMX_StateIdle;
+                            pThis->m_pCallbacks.EventHandler(&pThis->m_cmp,pThis->m_app_data,
+                                    OMX_EventCmdComplete,OMX_CommandStateSet,
+                                    OMX_StateIdle,NULL);
+                        } else if (BITMASK_PRESENT(&pThis->m_flags,
+                                    OMX_COMPONENT_LOADED_STOP_PENDING)) {
+                            if (dev_loaded_stop_done()) {
+                                DEBUG_PRINT_LOW("successful loaded Stop Done!");
+                            } else {
+                                DEBUG_PRINT_ERROR("ERROR: failed in loaded Stop Done!");
+                                pThis->omx_report_error ();
+                            }
+                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_STOP_PENDING);
+                        } else {
+                            DEBUG_PRINT_LOW("\nERROR: unknown flags=%x\n",pThis->m_flags);
+                        }
+                    }
+
+                    break;
+
+                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
+                    DEBUG_PRINT_ERROR("\nERROR: OMX_COMPONENT_GENERATE_HARDWARE_ERROR!\n");
+                    pThis->omx_report_error ();
+                    break;
 #ifndef _MSM8974_
-      case OMX_COMPONENT_GENERATE_LTRUSE_FAILED:
-        DEBUG_PRINT_ERROR("ERROR: OMX_COMPONENT_GENERATE_LTRUSE_FAILED!");
-        if(pThis->m_pCallbacks.EventHandler)
-        {
-          DEBUG_PRINT_ERROR("Sending QOMX_ErrorLTRUseFailed, p2 = 0x%x", p2);
-          pThis->m_pCallbacks.EventHandler(
-                &pThis->m_cmp, pThis->m_app_data,
-                OMX_EventError, QOMX_ErrorLTRUseFailed, NULL, NULL);
-        }
-        break;
+                case OMX_COMPONENT_GENERATE_LTRUSE_FAILED:
+                    DEBUG_PRINT_ERROR("ERROR: OMX_COMPONENT_GENERATE_LTRUSE_FAILED!");
+                    if (pThis->m_pCallbacks.EventHandler) {
+                        DEBUG_PRINT_ERROR("Sending QOMX_ErrorLTRUseFailed, p2 = 0x%x", p2);
+                        pThis->m_pCallbacks.EventHandler(
+                                &pThis->m_cmp, pThis->m_app_data,
+                                OMX_EventError, QOMX_ErrorLTRUseFailed, NULL, NULL);
+                    }
+                    break;
 #endif
-      default:
-        DEBUG_PRINT_LOW("\n process_event_cb unknown msg id 0x%02x", id);
-        break;
-      }
-    }
+                default:
+                    DEBUG_PRINT_LOW("\n process_event_cb unknown msg id 0x%02x", id);
+                    break;
+            }
+        }
 
-    pthread_mutex_lock(&pThis->m_lock);
-    qsize = pThis->m_cmd_q.m_size + pThis->m_ftb_q.m_size +\
-            pThis->m_etb_q.m_size;
+        pthread_mutex_lock(&pThis->m_lock);
+        qsize = pThis->m_cmd_q.m_size + pThis->m_ftb_q.m_size +\
+                pThis->m_etb_q.m_size;
 
-    pthread_mutex_unlock(&pThis->m_lock);
+        pthread_mutex_unlock(&pThis->m_lock);
 
-  }
-  while(qsize>0);
-  DEBUG_PRINT_LOW("\n exited the while loop\n");
+    } while (qsize>0);
+    DEBUG_PRINT_LOW("\n exited the while loop\n");
 
 }
 
@@ -698,762 +624,645 @@
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::GetComponentVersion
+   FUNCTION
+   omx_venc::GetComponentVersion
 
-DESCRIPTION
-  Returns the component version.
+   DESCRIPTION
+   Returns the component version.
 
-PARAMETERS
-  TBD.
+   PARAMETERS
+   TBD.
 
-RETURN VALUE
-  OMX_ErrorNone.
+   RETURN VALUE
+   OMX_ErrorNone.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::get_component_version
 (
-OMX_IN OMX_HANDLETYPE hComp,
-OMX_OUT OMX_STRING componentName,
-OMX_OUT OMX_VERSIONTYPE* componentVersion,
-OMX_OUT OMX_VERSIONTYPE* specVersion,
-OMX_OUT OMX_UUIDTYPE* componentUUID
-)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID
+ )
 {
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Get Comp Version in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  /* TBD -- Return the proper version */
-  if (specVersion)
-  {
-    specVersion->nVersion = OMX_SPEC_VERSION;
-  }
-  return OMX_ErrorNone;
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Get Comp Version in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
+    /* TBD -- Return the proper version */
+    if (specVersion) {
+        specVersion->nVersion = OMX_SPEC_VERSION;
+    }
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_venc::SendCommand
+   FUNCTION
+   omx_venc::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::send_command(OMX_IN OMX_HANDLETYPE hComp,
-                                       OMX_IN OMX_COMMANDTYPE cmd,
-                                       OMX_IN OMX_U32 param1,
-                                       OMX_IN OMX_PTR cmdData
-                                      )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if(cmd == OMX_CommandFlush || cmd == OMX_CommandPortDisable || cmd == OMX_CommandPortEnable)
-  {
-    if((param1 != PORT_INDEX_IN) && (param1 != PORT_INDEX_OUT) && (param1 != PORT_INDEX_BOTH))
-    {
-      DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->bad port index\n");
-      return OMX_ErrorBadPortIndex;
+    if (cmd == OMX_CommandFlush || cmd == OMX_CommandPortDisable || cmd == OMX_CommandPortEnable) {
+        if ((param1 != PORT_INDEX_IN) && (param1 != PORT_INDEX_OUT) && (param1 != PORT_INDEX_BOTH)) {
+            DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->bad port index\n");
+            return OMX_ErrorBadPortIndex;
+        }
     }
-  }
-  if(cmd == OMX_CommandMarkBuffer)
-  {
-    if(param1 != PORT_INDEX_IN)
-    {
-      DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->bad port index \n");
-      return OMX_ErrorBadPortIndex;
+    if (cmd == OMX_CommandMarkBuffer) {
+        if (param1 != PORT_INDEX_IN) {
+            DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->bad port index \n");
+            return OMX_ErrorBadPortIndex;
+        }
+        if (!cmdData) {
+            DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->param is null");
+            return OMX_ErrorBadParameter;
+        }
     }
-    if(!cmdData)
-    {
-      DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->param is null");
-      return OMX_ErrorBadParameter;
-    }
-  }
 
-  post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
-  sem_wait(&m_cmd_lock);
-  return OMX_ErrorNone;
+    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
+    sem_wait(&m_cmd_lock);
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::SendCommand
+   FUNCTION
+   omx_venc::SendCommand
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
-                                             OMX_IN OMX_COMMANDTYPE cmd,
-                                             OMX_IN OMX_U32 param1,
-                                             OMX_IN OMX_PTR cmdData
-                                            )
+        OMX_IN OMX_COMMANDTYPE cmd,
+        OMX_IN OMX_U32 param1,
+        OMX_IN OMX_PTR cmdData
+        )
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
-  int bFlag = 1;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
+    int bFlag = 1;
 
-  if(cmd == OMX_CommandStateSet)
-  {
-    /***************************/
-    /* Current State is Loaded */
-    /***************************/
-    if(m_state == OMX_StateLoaded)
-    {
-      if(eState == OMX_StateIdle)
-      {
-        //if all buffers are allocated or all ports disabled
-        if(allocate_done() ||
-           ( m_sInPortDef.bEnabled == OMX_FALSE && m_sOutPortDef.bEnabled == OMX_FALSE))
-        {
-          DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->Idle\n");
+    if (cmd == OMX_CommandStateSet) {
+        /***************************/
+        /* Current State is Loaded */
+        /***************************/
+        if (m_state == OMX_StateLoaded) {
+            if (eState == OMX_StateIdle) {
+                //if all buffers are allocated or all ports disabled
+                if (allocate_done() ||
+                        ( m_sInPortDef.bEnabled == OMX_FALSE && m_sOutPortDef.bEnabled == OMX_FALSE)) {
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->Idle\n");
+                } else {
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->Idle-Pending\n");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Loaded to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Loaded\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Loaded to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->WaitForResources\n");
+            }
+            /* Requesting transition from Loaded to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Loaded to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->%d Not Handled\n",\
+                        eState);
+                eRet = OMX_ErrorBadParameter;
+            }
         }
-        else
-        {
-          DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->Idle-Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
-          // Skip the event notification
-          bFlag = 0;
+
+        /***************************/
+        /* Current State is IDLE */
+        /***************************/
+        else if (m_state == OMX_StateIdle) {
+            if (eState == OMX_StateLoaded) {
+                if (release_done()) {
+                    /*
+                       Since error is None , we will post an event at the end
+                       of this function definition
+                     */
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Loaded\n");
+                    if (dev_stop() != 0) {
+                        DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed at Idle --> Loaded");
+                        eRet = OMX_ErrorHardware;
+                    }
+                } else {
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Loaded-Pending\n");
+                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
+                    // Skip the event notification
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Executing */
+            else if (eState == OMX_StateExecuting) {
+                if ( dev_start() ) {
+                    DEBUG_PRINT_ERROR("\nERROR: dev_start() failed in SCP on Idle --> Exe\n");
+                    omx_report_error ();
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Executing\n");
+                    bFlag = 0;
+                }
+
+                dev_start_done();
+            }
+            /* Requesting transition from Idle to Idle */
+            else if (eState == OMX_StateIdle) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->Idle\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Idle to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Idle to Pause */
+            else if (eState == OMX_StatePause) {
+                /*To pause the Video core we need to start the driver*/
+                if ( dev_start() ) {
+                    DEBUG_PRINT_ERROR("\nERROR: dev_start() failed in SCP on Idle --> Pause\n");
+                    omx_report_error ();
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Pause\n");
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Idle to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
         }
-      }
-      /* Requesting transition from Loaded to Loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Loaded\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Loaded to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        /* Since error is None , we will post an event
-           at the end of this function definition */
-        DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->WaitForResources\n");
-      }
-      /* Requesting transition from Loaded to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Loaded to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->%d Not Handled\n",\
-                          eState);
-        eRet = OMX_ErrorBadParameter;
-      }
+
+        /******************************/
+        /* Current State is Executing */
+        /******************************/
+        else if (m_state == OMX_StateExecuting) {
+            /* Requesting transition from Executing to Idle */
+            if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition
+                 */
+                DEBUG_PRINT_LOW("\n OMXCORE-SM: Executing --> Idle \n");
+                //here this should be Pause-Idle pending and should be cleared when flush is complete and change the state to Idle
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+                execute_omx_flush(OMX_ALL);
+                bFlag = 0;
+            }
+            /* Requesting transition from Executing to Paused */
+            else if (eState == OMX_StatePause) {
+
+                if (dev_pause()) {
+                    DEBUG_PRINT_ERROR("\nERROR: dev_pause() failed in SCP on Exe --> Pause\n");
+                    post_event(OMX_EventError,OMX_ErrorHardware,\
+                            OMX_COMPONENT_GENERATE_EVENT);
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Executing-->Pause\n");
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Executing to Loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> Loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Executing to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> Executing \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Executing to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is Pause  */
+        /***************************/
+        else if (m_state == OMX_StatePause) {
+            /* Requesting transition from Pause to Executing */
+            if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_LOW("\n Pause --> Executing \n");
+                if ( dev_resume() ) {
+                    post_event(OMX_EventError,OMX_ErrorHardware,\
+                            OMX_COMPONENT_GENERATE_EVENT);
+                    eRet = OMX_ErrorHardware;
+                } else {
+                    BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
+                    DEBUG_PRINT_LOW("OMXCORE-SM: Pause-->Executing\n");
+                    post_event (NULL, NULL, OMX_COMPONENT_GENERATE_RESUME_DONE);
+                    bFlag = 0;
+                }
+            }
+            /* Requesting transition from Pause to Idle */
+            else if (eState == OMX_StateIdle) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("\n Pause --> Idle \n");
+                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+                execute_omx_flush(OMX_ALL);
+                bFlag = 0;
+            }
+            /* Requesting transition from Pause to loaded */
+            else if (eState == OMX_StateLoaded) {
+                DEBUG_PRINT_ERROR("\nERROR: Pause --> loaded \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("\nERROR: Pause --> WaitForResources \n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from Pause to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("\nERROR: Pause --> Pause \n");
+                post_event(OMX_EventError,OMX_ErrorSameState,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from Pause to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("\nERROR: Pause --> Invalid \n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            } else {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Paused --> %d Not Handled\n",eState);
+                eRet = OMX_ErrorBadParameter;
+            }
+        }
+        /***************************/
+        /* Current State is WaitForResources  */
+        /***************************/
+        else if (m_state == OMX_StateWaitForResources) {
+            /* Requesting transition from WaitForResources to Loaded */
+            if (eState == OMX_StateLoaded) {
+                /* Since error is None , we will post an event
+                   at the end of this function definition */
+                DEBUG_PRINT_LOW("OMXCORE-SM: WaitForResources-->Loaded\n");
+            }
+            /* Requesting transition from WaitForResources to WaitForResources */
+            else if (eState == OMX_StateWaitForResources) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->WaitForResources\n");
+                post_event(OMX_EventError,OMX_ErrorSameState,
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorSameState;
+            }
+            /* Requesting transition from WaitForResources to Executing */
+            else if (eState == OMX_StateExecuting) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Executing\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Pause */
+            else if (eState == OMX_StatePause) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Pause\n");
+                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorIncorrectStateTransition;
+            }
+            /* Requesting transition from WaitForResources to Invalid */
+            else if (eState == OMX_StateInvalid) {
+                DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Invalid\n");
+                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+                eRet = OMX_ErrorInvalidState;
+            }
+            /* Requesting transition from WaitForResources to Loaded -
+               is NOT tested by Khronos TS */
+
+        } else {
+            DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: %d --> %d(Not Handled)\n",m_state,eState);
+            eRet = OMX_ErrorBadParameter;
+        }
     }
-
-    /***************************/
-    /* Current State is IDLE */
-    /***************************/
-    else if(m_state == OMX_StateIdle)
-    {
-      if(eState == OMX_StateLoaded)
-      {
-        if(release_done())
-        {
-          /*
-             Since error is None , we will post an event at the end
-             of this function definition
-          */
-          DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Loaded\n");
-          if(dev_stop() != 0)
-          {
-            DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed at Idle --> Loaded");
-            eRet = OMX_ErrorHardware;
-          }
+    /********************************/
+    /* Current State is Invalid */
+    /*******************************/
+    else if (m_state == OMX_StateInvalid) {
+        /* State Transition from Inavlid to any state */
+        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
+                    || OMX_StateIdle || OMX_StateExecuting
+                    || OMX_StatePause || OMX_StateInvalid)) {
+            DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Invalid -->Loaded\n");
+            post_event(OMX_EventError,OMX_ErrorInvalidState,\
+                    OMX_COMPONENT_GENERATE_EVENT);
+            eRet = OMX_ErrorInvalidState;
         }
-        else
-        {
-          DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Loaded-Pending\n");
-          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
-          // Skip the event notification
-          bFlag = 0;
+    } else if (cmd == OMX_CommandFlush) {
+        if (0 == param1 || OMX_ALL == param1) {
+            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
         }
-      }
-      /* Requesting transition from Idle to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        if( dev_start() )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: dev_start() failed in SCP on Idle --> Exe\n");
-          omx_report_error ();
-          eRet = OMX_ErrorHardware;
-        }
-        else
-        {
-          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
-          DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Executing\n");
-          bFlag = 0;
+        if (1 == param1 || OMX_ALL == param1) {
+            //generate output flush event only.
+            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
         }
 
-	dev_start_done();
-      }
-      /* Requesting transition from Idle to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->Idle\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Idle to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Idle to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        /*To pause the Video core we need to start the driver*/
-        if( dev_start() )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: dev_start() failed in SCP on Idle --> Pause\n");
-          omx_report_error ();
-          eRet = OMX_ErrorHardware;
-        }
-        else
-        {
-          BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
-          DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Pause\n");
-          bFlag = 0;
-        }
-      }
-      /* Requesting transition from Idle to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-
-    /******************************/
-    /* Current State is Executing */
-    /******************************/
-    else if(m_state == OMX_StateExecuting)
-    {
-      /* Requesting transition from Executing to Idle */
-      if(eState == OMX_StateIdle)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition
-        */
-        DEBUG_PRINT_LOW("\n OMXCORE-SM: Executing --> Idle \n");
-        //here this should be Pause-Idle pending and should be cleared when flush is complete and change the state to Idle
-        BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-        execute_omx_flush(OMX_ALL);
+        execute_omx_flush(param1);
         bFlag = 0;
-      }
-      /* Requesting transition from Executing to Paused */
-      else if(eState == OMX_StatePause)
-      {
+    } else if ( cmd == OMX_CommandPortEnable) {
+        if (param1 == PORT_INDEX_IN || param1 == OMX_ALL) {
+            m_sInPortDef.bEnabled = OMX_TRUE;
 
-        if(dev_pause())
-        {
-          DEBUG_PRINT_ERROR("\nERROR: dev_pause() failed in SCP on Exe --> Pause\n");
-          post_event(OMX_EventError,OMX_ErrorHardware,\
-                     OMX_COMPONENT_GENERATE_EVENT);
-          eRet = OMX_ErrorHardware;
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || allocate_input_done()) {
+                post_event(OMX_CommandPortEnable,PORT_INDEX_IN,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                DEBUG_PRINT_LOW("OMXCORE-SM: Disabled-->Enabled Pending\n");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
         }
-        else
-        {
-          BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
-          DEBUG_PRINT_LOW("OMXCORE-SM: Executing-->Pause\n");
-          bFlag = 0;
+        if (param1 == PORT_INDEX_OUT || param1 == OMX_ALL) {
+            m_sOutPortDef.bEnabled = OMX_TRUE;
+
+            if ( (m_state == OMX_StateLoaded &&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+                    || (allocate_output_done())) {
+                post_event(OMX_CommandPortEnable,PORT_INDEX_OUT,
+                        OMX_COMPONENT_GENERATE_EVENT);
+
+            } else {
+                DEBUG_PRINT_LOW("OMXCORE-SM: Disabled-->Enabled Pending\n");
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+                // Skip the event notification
+                bFlag = 0;
+            }
         }
-      }
-      /* Requesting transition from Executing to Loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> Loaded \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Executing to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> WaitForResources \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Executing to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> Executing \n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Executing to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: OMXCORE-SM: Executing --> Invalid \n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
-    }
-    /***************************/
-    /* Current State is Pause  */
-    /***************************/
-    else if(m_state == OMX_StatePause)
-    {
-      /* Requesting transition from Pause to Executing */
-      if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
-        if( dev_resume() )
-        {
-          post_event(OMX_EventError,OMX_ErrorHardware,\
-                     OMX_COMPONENT_GENERATE_EVENT);
-          eRet = OMX_ErrorHardware;
+    } else if (cmd == OMX_CommandPortDisable) {
+        if (param1 == PORT_INDEX_IN || param1 == OMX_ALL) {
+            m_sInPortDef.bEnabled = OMX_FALSE;
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_input_done()) {
+                post_event(OMX_CommandPortDisable,PORT_INDEX_IN,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    execute_omx_flush(PORT_INDEX_IN);
+                }
+
+                // Skip the event notification
+                bFlag = 0;
+            }
         }
-        else
-        {
-          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
-          DEBUG_PRINT_LOW("OMXCORE-SM: Pause-->Executing\n");
-          post_event (NULL, NULL, OMX_COMPONENT_GENERATE_RESUME_DONE);
-          bFlag = 0;
+        if (param1 == PORT_INDEX_OUT || param1 == OMX_ALL) {
+            m_sOutPortDef.bEnabled = OMX_FALSE;
+
+            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+                    && release_output_done()) {
+                post_event(OMX_CommandPortDisable,PORT_INDEX_OUT,\
+                        OMX_COMPONENT_GENERATE_EVENT);
+            } else {
+                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+                    execute_omx_flush(PORT_INDEX_OUT);
+                }
+                // Skip the event notification
+                bFlag = 0;
+
+            }
         }
-      }
-      /* Requesting transition from Pause to Idle */
-      else if(eState == OMX_StateIdle)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
-        BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
-        execute_omx_flush(OMX_ALL);
-        bFlag = 0;
-      }
-      /* Requesting transition from Pause to loaded */
-      else if(eState == OMX_StateLoaded)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Pause --> loaded \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Pause --> WaitForResources \n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from Pause to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Pause --> Pause \n");
-        post_event(OMX_EventError,OMX_ErrorSameState,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from Pause to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Pause --> Invalid \n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Paused --> %d Not Handled\n",eState);
-        eRet = OMX_ErrorBadParameter;
-      }
+    } else {
+        DEBUG_PRINT_ERROR("ERROR: Invalid Command received other than StateSet (%d)\n",cmd);
+        eRet = OMX_ErrorNotImplemented;
     }
-    /***************************/
-    /* Current State is WaitForResources  */
-    /***************************/
-    else if(m_state == OMX_StateWaitForResources)
-    {
-      /* Requesting transition from WaitForResources to Loaded */
-      if(eState == OMX_StateLoaded)
-      {
-        /* Since error is None , we will post an event
-        at the end of this function definition */
-        DEBUG_PRINT_LOW("OMXCORE-SM: WaitForResources-->Loaded\n");
-      }
-      /* Requesting transition from WaitForResources to WaitForResources */
-      else if(eState == OMX_StateWaitForResources)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->WaitForResources\n");
-        post_event(OMX_EventError,OMX_ErrorSameState,
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorSameState;
-      }
-      /* Requesting transition from WaitForResources to Executing */
-      else if(eState == OMX_StateExecuting)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Executing\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Pause */
-      else if(eState == OMX_StatePause)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Pause\n");
-        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorIncorrectStateTransition;
-      }
-      /* Requesting transition from WaitForResources to Invalid */
-      else if(eState == OMX_StateInvalid)
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Invalid\n");
-        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
-        eRet = OMX_ErrorInvalidState;
-      }
-      /* Requesting transition from WaitForResources to Loaded -
-      is NOT tested by Khronos TS */
-
+    if (eRet == OMX_ErrorNone && bFlag) {
+        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: %d --> %d(Not Handled)\n",m_state,eState);
-      eRet = OMX_ErrorBadParameter;
-    }
-  }
-  /********************************/
-  /* Current State is Invalid */
-  /*******************************/
-  else if(m_state == OMX_StateInvalid)
-  {
-    /* State Transition from Inavlid to any state */
-    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
-                  || OMX_StateIdle || OMX_StateExecuting
-                  || OMX_StatePause || OMX_StateInvalid))
-    {
-      DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Invalid -->Loaded\n");
-      post_event(OMX_EventError,OMX_ErrorInvalidState,\
-                 OMX_COMPONENT_GENERATE_EVENT);
-      eRet = OMX_ErrorInvalidState;
-    }
-  }
-  else if(cmd == OMX_CommandFlush)
-  {
-    if(0 == param1 || OMX_ALL == param1)
-    {
-      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
-    }
-    if(1 == param1 || OMX_ALL == param1)
-    {
-      //generate output flush event only.
-      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
-    }
-
-    execute_omx_flush(param1);
-    bFlag = 0;
-  }
-  else if( cmd == OMX_CommandPortEnable)
-  {
-    if(param1 == PORT_INDEX_IN || param1 == OMX_ALL)
-    {
-      m_sInPortDef.bEnabled = OMX_TRUE;
-
-      if( (m_state == OMX_StateLoaded &&
-           !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-          || allocate_input_done())
-      {
-        post_event(OMX_CommandPortEnable,PORT_INDEX_IN,
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("OMXCORE-SM: Disabled-->Enabled Pending\n");
-        BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
-        // Skip the event notification
-        bFlag = 0;
-      }
-    }
-    if(param1 == PORT_INDEX_OUT || param1 == OMX_ALL)
-    {
-      m_sOutPortDef.bEnabled = OMX_TRUE;
-
-      if( (m_state == OMX_StateLoaded &&
-           !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-          || (allocate_output_done()))
-      {
-        post_event(OMX_CommandPortEnable,PORT_INDEX_OUT,
-                   OMX_COMPONENT_GENERATE_EVENT);
-
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("OMXCORE-SM: Disabled-->Enabled Pending\n");
-        BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-        // Skip the event notification
-        bFlag = 0;
-      }
-    }
-  }
-  else if(cmd == OMX_CommandPortDisable)
-  {
-    if(param1 == PORT_INDEX_IN || param1 == OMX_ALL)
-    {
-      m_sInPortDef.bEnabled = OMX_FALSE;
-      if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-         && release_input_done())
-      {
-        post_event(OMX_CommandPortDisable,PORT_INDEX_IN,
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
-      else
-      {
-        BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
-        if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-        {
-          execute_omx_flush(PORT_INDEX_IN);
-        }
-
-        // Skip the event notification
-        bFlag = 0;
-      }
-    }
-    if(param1 == PORT_INDEX_OUT || param1 == OMX_ALL)
-    {
-      m_sOutPortDef.bEnabled = OMX_FALSE;
-
-      if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
-         && release_output_done())
-      {
-        post_event(OMX_CommandPortDisable,PORT_INDEX_OUT,\
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
-      else
-      {
-        BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
-        if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
-        {
-          execute_omx_flush(PORT_INDEX_OUT);
-        }
-        // Skip the event notification
-        bFlag = 0;
-
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("ERROR: Invalid Command received other than StateSet (%d)\n",cmd);
-    eRet = OMX_ErrorNotImplemented;
-  }
-  if(eRet == OMX_ErrorNone && bFlag)
-  {
-    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
-  }
-  sem_post(&m_cmd_lock);
-  return eRet;
+    sem_post(&m_cmd_lock);
+    return eRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::ExecuteOmxFlush
+   FUNCTION
+   omx_venc::ExecuteOmxFlush
 
-DESCRIPTION
-  Executes the OMX flush.
+   DESCRIPTION
+   Executes the OMX flush.
 
-PARAMETERS
-  flushtype - input flush(1)/output flush(0)/ both.
+   PARAMETERS
+   flushtype - input flush(1)/output flush(0)/ both.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::execute_omx_flush(OMX_U32 flushType)
 {
-  bool bRet = false;
-  DEBUG_PRINT_LOW("\n execute_omx_flush -  %d\n", flushType);
+    bool bRet = false;
+    DEBUG_PRINT_LOW("\n execute_omx_flush -  %d\n", flushType);
 #ifdef _MSM8974_
-  /* XXX: The driver/hardware does not support flushing of individual ports
-   * in all states. So we pretty much need to flush both ports internally,
-   * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
-   * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
-   * we automatically omit sending the FLUSH done for the "opposite" port. */
+    /* XXX: The driver/hardware does not support flushing of individual ports
+     * in all states. So we pretty much need to flush both ports internally,
+     * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
+     * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
+     * we automatically omit sending the FLUSH done for the "opposite" port. */
 
-  input_flush_progress = true;
-  output_flush_progress = true;
-  bRet = execute_flush_all();
-#else
-  if(flushType == 0 || flushType == OMX_ALL)
-  {
     input_flush_progress = true;
-    //flush input only
-    bRet = execute_input_flush();
-  }
-  if(flushType == 1 || flushType == OMX_ALL)
-  {
-    //flush output only
     output_flush_progress = true;
-    bRet = execute_output_flush();
-  }
+    bRet = execute_flush_all();
+#else
+    if (flushType == 0 || flushType == OMX_ALL) {
+        input_flush_progress = true;
+        //flush input only
+        bRet = execute_input_flush();
+    }
+    if (flushType == 1 || flushType == OMX_ALL) {
+        //flush output only
+        output_flush_progress = true;
+        bRet = execute_output_flush();
+    }
 #endif
-  return bRet;
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_output_flush
 
 DESCRIPTION
-  Executes the OMX flush at OUTPUT PORT.
+Executes the OMX flush at OUTPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_video::execute_output_flush(void)
 {
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate FBD for all Buffers in the FTBq*/
-  DEBUG_PRINT_LOW("\n execute_output_flush\n");
-  pthread_mutex_lock(&m_lock);
-  while(m_ftb_q.m_size)
-  {
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
+    /*Generate FBD for all Buffers in the FTBq*/
+    DEBUG_PRINT_LOW("\n execute_output_flush\n");
+    pthread_mutex_lock(&m_lock);
+    while (m_ftb_q.m_size) {
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
 
-    if(ident == OMX_COMPONENT_GENERATE_FTB )
-    {
-      pending_output_buffers++;
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        if (ident == OMX_COMPONENT_GENERATE_FTB ) {
+            pending_output_buffers++;
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-    else if(ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+
+    pthread_mutex_unlock(&m_lock);
+    /*Check if there are buffers with the Driver*/
+    if (dev_flush(PORT_INDEX_OUT)) {
+        DEBUG_PRINT_ERROR("\nERROR: o/p dev_flush() Failed");
+        return false;
     }
-  }
 
-  pthread_mutex_unlock(&m_lock);
-  /*Check if there are buffers with the Driver*/
-  if(dev_flush(PORT_INDEX_OUT))
-  {
-    DEBUG_PRINT_ERROR("\nERROR: o/p dev_flush() Failed");
-    return false;
-  }
-
-  return bRet;
+    return bRet;
 }
 /*=========================================================================
 FUNCTION : execute_input_flush
 
 DESCRIPTION
-  Executes the OMX flush at INPUT PORT.
+Executes the OMX flush at INPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 bool omx_video::execute_input_flush(void)
 {
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  /*Generate EBD for all Buffers in the ETBq*/
-  DEBUG_PRINT_LOW("\n execute_input_flush\n");
+    /*Generate EBD for all Buffers in the ETBq*/
+    DEBUG_PRINT_LOW("\n execute_input_flush\n");
 
-  pthread_mutex_lock(&m_lock);
-  while(m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_ETB)
-    {
-      pending_input_buffers++;
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+    pthread_mutex_lock(&m_lock);
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_ETB) {
+            pending_input_buffers++;
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        } else if (ident == OMX_COMPONENT_GENERATE_ETB_OPQ) {
+            m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,(OMX_BUFFERHEADERTYPE *)p2);
+        }
     }
-    else if(ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+    if (mUseProxyColorFormat) {
+        if (psource_frame) {
+            m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,psource_frame);
+            psource_frame = NULL;
+        }
+        while (m_opq_meta_q.m_size) {
+            unsigned p1,p2,id;
+            m_opq_meta_q.pop_entry(&p1,&p2,&id);
+            m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,
+                    (OMX_BUFFERHEADERTYPE  *)p1);
+        }
+        if (pdest_frame) {
+            m_opq_pmem_q.insert_entry((unsigned int)pdest_frame,0,0);
+            pdest_frame = NULL;
+        }
     }
-    else if(ident == OMX_COMPONENT_GENERATE_ETB_OPQ)
-    {
-      m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,(OMX_BUFFERHEADERTYPE *)p2);
+    pthread_mutex_unlock(&m_lock);
+    /*Check if there are buffers with the Driver*/
+    if (dev_flush(PORT_INDEX_IN)) {
+        DEBUG_PRINT_ERROR("\nERROR: i/p dev_flush() Failed");
+        return false;
     }
-  }
-  if(mUseProxyColorFormat) {
-    if(psource_frame) {
-      m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,psource_frame);
-      psource_frame = NULL;
-    }
-    while(m_opq_meta_q.m_size) {
-      unsigned p1,p2,id;
-      m_opq_meta_q.pop_entry(&p1,&p2,&id);
-      m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,
-         (OMX_BUFFERHEADERTYPE  *)p1);
-    }
-    if(pdest_frame){
-      m_opq_pmem_q.insert_entry((unsigned int)pdest_frame,0,0);
-      pdest_frame = NULL;
-    }
-  }
-  pthread_mutex_unlock(&m_lock);
-  /*Check if there are buffers with the Driver*/
-  if(dev_flush(PORT_INDEX_IN))
-  {
-    DEBUG_PRINT_ERROR("\nERROR: i/p dev_flush() Failed");
-    return false;
-  }
 
-  return bRet;
+    return bRet;
 }
 
 
@@ -1461,3525 +1270,3133 @@
 FUNCTION : execute_flush
 
 DESCRIPTION
-  Executes the OMX flush at INPUT & OUTPUT PORT.
+Executes the OMX flush at INPUT & OUTPUT PORT.
 
 PARAMETERS
-  None.
+None.
 
 RETURN VALUE
-  true/false
+true/false
 ==========================================================================*/
 #ifdef _MSM8974_
 bool omx_video::execute_flush_all(void)
 {
-  unsigned      p1 = 0; // Parameter - 1
-  unsigned      p2 = 0; // Parameter - 2
-  unsigned      ident = 0;
-  bool bRet = true;
+    unsigned      p1 = 0; // Parameter - 1
+    unsigned      p2 = 0; // Parameter - 2
+    unsigned      ident = 0;
+    bool bRet = true;
 
-  DEBUG_PRINT_LOW("\n execute_flush_all\n");
+    DEBUG_PRINT_LOW("\n execute_flush_all\n");
 
-  /*Generate EBD for all Buffers in the ETBq*/
-  pthread_mutex_lock(&m_lock);
-  while(m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_ETB)
-    {
-      pending_input_buffers++;
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+    /*Generate EBD for all Buffers in the ETBq*/
+    pthread_mutex_lock(&m_lock);
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_ETB) {
+            pending_input_buffers++;
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-    else if(ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+
+    /*Generate FBD for all Buffers in the FTBq*/
+    DEBUG_PRINT_LOW("\n execute_output_flush\n");
+    while (m_ftb_q.m_size) {
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+
+        if (ident == OMX_COMPONENT_GENERATE_FTB ) {
+            pending_output_buffers++;
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+        }
     }
-  }
 
-  /*Generate FBD for all Buffers in the FTBq*/
-  DEBUG_PRINT_LOW("\n execute_output_flush\n");
-  while(m_ftb_q.m_size)
-  {
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
+    pthread_mutex_unlock(&m_lock);
 
-    if(ident == OMX_COMPONENT_GENERATE_FTB )
-    {
-      pending_output_buffers++;
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+    /*Check if there are buffers with the Driver*/
+    if (dev_flush(PORT_INDEX_BOTH)) {
+        DEBUG_PRINT_ERROR("\nERROR: dev_flush() Failed");
+        return false;
     }
-    else if(ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
-    }
-  }
-
-  pthread_mutex_unlock(&m_lock);
-
-  /*Check if there are buffers with the Driver*/
-  if(dev_flush(PORT_INDEX_BOTH))
-  {
-    DEBUG_PRINT_ERROR("\nERROR: dev_flush() Failed");
-    return false;
-  }
-  return bRet;
+    return bRet;
 }
 
 #endif
 
 /* ======================================================================
-FUNCTION
-  omx_venc::SendCommandEvent
+   FUNCTION
+   omx_venc::SendCommandEvent
 
-DESCRIPTION
-  Send the event to decoder pipe.  This is needed to generate the callbacks
-  in decoder thread context.
+   DESCRIPTION
+   Send the event to decoder pipe.  This is needed to generate the callbacks
+   in decoder thread context.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::post_event(unsigned int p1,
-                           unsigned int p2,
-                           unsigned int id)
+        unsigned int p2,
+        unsigned int id)
 {
-  bool bRet      =                      false;
+    bool bRet      =                      false;
 
 
-  pthread_mutex_lock(&m_lock);
+    pthread_mutex_lock(&m_lock);
 
-  if ((id == OMX_COMPONENT_GENERATE_FTB) ||
-      (id == OMX_COMPONENT_GENERATE_FBD) ||
-      (id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH))
-  {
-    m_ftb_q.insert_entry(p1,p2,id);
-  }
-  else if ((id == OMX_COMPONENT_GENERATE_ETB) ||
-      (id == OMX_COMPONENT_GENERATE_EBD) ||
-      (id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH))
-  {
-    m_etb_q.insert_entry(p1,p2,id);
-  }
-  else
-  {
-    m_cmd_q.insert_entry(p1,p2,id);
-  }
+    if ((id == OMX_COMPONENT_GENERATE_FTB) ||
+            (id == OMX_COMPONENT_GENERATE_FBD) ||
+            (id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH)) {
+        m_ftb_q.insert_entry(p1,p2,id);
+    } else if ((id == OMX_COMPONENT_GENERATE_ETB) ||
+            (id == OMX_COMPONENT_GENERATE_EBD) ||
+            (id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH)) {
+        m_etb_q.insert_entry(p1,p2,id);
+    } else {
+        m_cmd_q.insert_entry(p1,p2,id);
+    }
 
-  bRet = true;
-  DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
-  post_message(this, id);
-  pthread_mutex_unlock(&m_lock);
+    bRet = true;
+    DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
+    post_message(this, id);
+    pthread_mutex_unlock(&m_lock);
 
-  return bRet;
+    return bRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::GetParameter
+   FUNCTION
+   omx_venc::GetParameter
 
-DESCRIPTION
-  OMX Get Parameter method implementation
+   DESCRIPTION
+   OMX Get Parameter method implementation
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if successful.
+   RETURN VALUE
+   Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                        OMX_IN OMX_INDEXTYPE paramIndex,
-                                        OMX_INOUT OMX_PTR     paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_INOUT OMX_PTR     paramData)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned int height=0,width = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned int height=0,width = 0;
 
-  DEBUG_PRINT_LOW("get_parameter: \n");
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  if(paramData == NULL)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData \n");
-    return OMX_ErrorBadParameter;
-  }
-  switch(paramIndex)
-  {
-  case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+    DEBUG_PRINT_LOW("get_parameter: \n");
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
+    if (paramData == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData \n");
+        return OMX_ErrorBadParameter;
+    }
+    switch (paramIndex) {
+        case OMX_IndexParamPortDefinition:
+            {
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
 
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
-      if(portDefn->nPortIndex == (OMX_U32) PORT_INDEX_IN)
-      {
-        DEBUG_PRINT_LOW("m_sInPortDef: size = %d, min cnt = %d, actual cnt = %d",
-            m_sInPortDef.nBufferSize, m_sInPortDef.nBufferCountMin,
-            m_sInPortDef.nBufferCountActual);
-        memcpy(portDefn, &m_sInPortDef, sizeof(m_sInPortDef));
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
+                if (portDefn->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
+                    DEBUG_PRINT_LOW("m_sInPortDef: size = %d, min cnt = %d, actual cnt = %d",
+                            m_sInPortDef.nBufferSize, m_sInPortDef.nBufferCountMin,
+                            m_sInPortDef.nBufferCountActual);
+                    memcpy(portDefn, &m_sInPortDef, sizeof(m_sInPortDef));
 #ifdef _ANDROID_ICS_
-        if(meta_mode_enable)
-        {
-          portDefn->nBufferSize = sizeof(encoder_media_buffer_type);
-        }
-        if (mUseProxyColorFormat) {
-            portDefn->format.video.eColorFormat =
-              (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque;
-        }
+                    if (meta_mode_enable) {
+                        portDefn->nBufferSize = sizeof(encoder_media_buffer_type);
+                    }
+                    if (mUseProxyColorFormat) {
+                        portDefn->format.video.eColorFormat =
+                            (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque;
+                    }
 #endif
-      }
-      else if(portDefn->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        dev_get_buf_req (&m_sOutPortDef.nBufferCountMin,
-                         &m_sOutPortDef.nBufferCountActual,
-                         &m_sOutPortDef.nBufferSize,
-                         m_sOutPortDef.nPortIndex);
-        DEBUG_PRINT_LOW("m_sOutPortDef: size = %d, min cnt = %d, actual cnt = %d",
-            m_sOutPortDef.nBufferSize, m_sOutPortDef.nBufferCountMin,
-            m_sOutPortDef.nBufferCountActual);
-        memcpy(portDefn, &m_sOutPortDef, sizeof(m_sOutPortDef));
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-  case OMX_IndexParamVideoInit:
-    {
-      OMX_PORT_PARAM_TYPE *portParamType =
-      (OMX_PORT_PARAM_TYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
-
-      memcpy(portParamType, &m_sPortParam, sizeof(m_sPortParam));
-      break;
-    }
-  case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-      (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
-
-      if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
-      {
-          int index = portFmt->nIndex;
-          if(index > 1)
-            eRet = OMX_ErrorNoMore;
-          else {
-            memcpy(portFmt, &m_sInPortFormat, sizeof(m_sInPortFormat));
-#ifdef _ANDROID_ICS_
-            if (index == 1) {
-                //we support two formats
-                //index 0 - YUV420SP
-                //index 1 - opaque which internally maps to YUV420SP.
-                //this can be extended in the future
-                portFmt->nIndex = index; //restore index set from client
-                portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque;
+                } else if (portDefn->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    dev_get_buf_req (&m_sOutPortDef.nBufferCountMin,
+                            &m_sOutPortDef.nBufferCountActual,
+                            &m_sOutPortDef.nBufferSize,
+                            m_sOutPortDef.nPortIndex);
+                    DEBUG_PRINT_LOW("m_sOutPortDef: size = %d, min cnt = %d, actual cnt = %d",
+                            m_sOutPortDef.nBufferSize, m_sOutPortDef.nBufferCountMin,
+                            m_sOutPortDef.nBufferCountActual);
+                    memcpy(portDefn, &m_sOutPortDef, sizeof(m_sOutPortDef));
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
             }
+        case OMX_IndexParamVideoInit:
+            {
+                OMX_PORT_PARAM_TYPE *portParamType =
+                    (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
+
+                memcpy(portParamType, &m_sPortParam, sizeof(m_sPortParam));
+                break;
+            }
+        case OMX_IndexParamVideoPortFormat:
+            {
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
+
+                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
+                    int index = portFmt->nIndex;
+                    if (index > 1)
+                        eRet = OMX_ErrorNoMore;
+                    else {
+                        memcpy(portFmt, &m_sInPortFormat, sizeof(m_sInPortFormat));
+#ifdef _ANDROID_ICS_
+                        if (index == 1) {
+                            //we support two formats
+                            //index 0 - YUV420SP
+                            //index 1 - opaque which internally maps to YUV420SP.
+                            //this can be extended in the future
+                            portFmt->nIndex = index; //restore index set from client
+                            portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque;
+                        }
 #endif
-          }
-      }
-      else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        memcpy(portFmt, &m_sOutPortFormat, sizeof(m_sOutPortFormat));
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-  case OMX_IndexParamVideoBitrate:
-    {
-      OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoBitrate\n");
+                    }
+                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    memcpy(portFmt, &m_sOutPortFormat, sizeof(m_sOutPortFormat));
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+        case OMX_IndexParamVideoBitrate:
+            {
+                OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoBitrate\n");
 
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        memcpy(pParam, &m_sParamBitrate, sizeof(m_sParamBitrate));
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
-        eRet = OMX_ErrorBadPortIndex;
-      }
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    memcpy(pParam, &m_sParamBitrate, sizeof(m_sParamBitrate));
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
 
-      break;
-    }
-  case OMX_IndexParamVideoMpeg4:
-    {
-      OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4\n");
-      memcpy(pParam, &m_sParamMPEG4, sizeof(m_sParamMPEG4));
-      break;
-    }
-  case OMX_IndexParamVideoH263:
-    {
-      OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263\n");
-      memcpy(pParam, &m_sParamH263, sizeof(m_sParamH263));
-      break;
-    }
-  case OMX_IndexParamVideoAvc:
-    {
-      OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc\n");
-      memcpy(pParam, &m_sParamAVC, sizeof(m_sParamAVC));
-      break;
-    }
-  case OMX_IndexParamVideoProfileLevelQuerySupported:
-    {
-      OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported\n");
-      eRet = get_supported_profile_level(pParam);
-      if(eRet)
-        DEBUG_PRINT_ERROR("Invalid entry returned from get_supported_profile_level %lu, %lu",
-                          pParam->eProfile, pParam->eLevel);
-      break;
-     }
-  case OMX_IndexParamVideoProfileLevelCurrent:
-    {
-      OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelCurrent\n");
-      memcpy(pParam, &m_sParamProfileLevel, sizeof(m_sParamProfileLevel));
-      break;
-    }
-    /*Component should support this port definition*/
-  case OMX_IndexParamAudioInit:
-    {
-      OMX_PORT_PARAM_TYPE *audioPortParamType = (OMX_PORT_PARAM_TYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
-      memcpy(audioPortParamType, &m_sPortParam_audio, sizeof(m_sPortParam_audio));
-      break;
-    }
-    /*Component should support this port definition*/
-  case OMX_IndexParamImageInit:
-    {
-      OMX_PORT_PARAM_TYPE *imagePortParamType = (OMX_PORT_PARAM_TYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
-      memcpy(imagePortParamType, &m_sPortParam_img, sizeof(m_sPortParam_img));
-      break;
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4\n");
+                memcpy(pParam, &m_sParamMPEG4, sizeof(m_sParamMPEG4));
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263\n");
+                memcpy(pParam, &m_sParamH263, sizeof(m_sParamH263));
+                break;
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc\n");
+                memcpy(pParam, &m_sParamAVC, sizeof(m_sParamAVC));
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelQuerySupported:
+            {
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported\n");
+                eRet = get_supported_profile_level(pParam);
+                if (eRet)
+                    DEBUG_PRINT_ERROR("Invalid entry returned from get_supported_profile_level %lu, %lu",
+                            pParam->eProfile, pParam->eLevel);
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelCurrent:
+            {
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelCurrent\n");
+                memcpy(pParam, &m_sParamProfileLevel, sizeof(m_sParamProfileLevel));
+                break;
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamAudioInit:
+            {
+                OMX_PORT_PARAM_TYPE *audioPortParamType = (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
+                memcpy(audioPortParamType, &m_sPortParam_audio, sizeof(m_sPortParam_audio));
+                break;
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamImageInit:
+            {
+                OMX_PORT_PARAM_TYPE *imagePortParamType = (OMX_PORT_PARAM_TYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
+                memcpy(imagePortParamType, &m_sPortParam_img, sizeof(m_sPortParam_img));
+                break;
 
-    }
-    /*Component should support this port definition*/
-  case OMX_IndexParamOtherInit:
-    {
-      DEBUG_PRINT_ERROR("ERROR: get_parameter: OMX_IndexParamOtherInit %08x\n", paramIndex);
-      eRet =OMX_ErrorUnsupportedIndex;
-      break;
-    }
-  case OMX_IndexParamStandardComponentRole:
-    {
-      OMX_PARAM_COMPONENTROLETYPE *comp_role;
-      comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-      comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
-      comp_role->nSize = sizeof(*comp_role);
+            }
+            /*Component should support this port definition*/
+        case OMX_IndexParamOtherInit:
+            {
+                DEBUG_PRINT_ERROR("ERROR: get_parameter: OMX_IndexParamOtherInit %08x\n", paramIndex);
+                eRet =OMX_ErrorUnsupportedIndex;
+                break;
+            }
+        case OMX_IndexParamStandardComponentRole:
+            {
+                OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
+                comp_role->nSize = sizeof(*comp_role);
 
-      DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",paramIndex);
-      if(NULL != comp_role->cRole)
-      {
-        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,OMX_MAX_STRINGNAME_SIZE);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Getparameter: OMX_IndexParamStandardComponentRole %d is passed with NULL parameter for role\n",paramIndex);
-        eRet =OMX_ErrorBadParameter;
-      }
-      break;
-    }
-    /* Added for parameter test */
-  case OMX_IndexParamPriorityMgmt:
-    {
+                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",paramIndex);
+                if (NULL != comp_role->cRole) {
+                    strlcpy((char*)comp_role->cRole,(const char*)m_cRole,OMX_MAX_STRINGNAME_SIZE);
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: Getparameter: OMX_IndexParamStandardComponentRole %d is passed with NULL parameter for role\n",paramIndex);
+                    eRet =OMX_ErrorBadParameter;
+                }
+                break;
+            }
+            /* Added for parameter test */
+        case OMX_IndexParamPriorityMgmt:
+            {
 
-      OMX_PRIORITYMGMTTYPE *priorityMgmType = (OMX_PRIORITYMGMTTYPE *) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
-      memcpy(priorityMgmType, &m_sPriorityMgmt, sizeof(m_sPriorityMgmt));
-      break;
-    }
-    /* Added for parameter test */
-  case OMX_IndexParamCompBufferSupplier:
-    {
-      OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
-      if(bufferSupplierType->nPortIndex ==(OMX_U32) PORT_INDEX_IN)
-      {
-        memcpy(bufferSupplierType, &m_sInBufSupplier, sizeof(m_sInBufSupplier));
-      }
-      else if(bufferSupplierType->nPortIndex ==(OMX_U32) PORT_INDEX_OUT)
-      {
-        memcpy(bufferSupplierType, &m_sOutBufSupplier, sizeof(m_sOutBufSupplier));
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
+                OMX_PRIORITYMGMTTYPE *priorityMgmType = (OMX_PRIORITYMGMTTYPE *) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
+                memcpy(priorityMgmType, &m_sPriorityMgmt, sizeof(m_sPriorityMgmt));
+                break;
+            }
+            /* Added for parameter test */
+        case OMX_IndexParamCompBufferSupplier:
+            {
+                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
+                if (bufferSupplierType->nPortIndex ==(OMX_U32) PORT_INDEX_IN) {
+                    memcpy(bufferSupplierType, &m_sInBufSupplier, sizeof(m_sInBufSupplier));
+                } else if (bufferSupplierType->nPortIndex ==(OMX_U32) PORT_INDEX_OUT) {
+                    memcpy(bufferSupplierType, &m_sOutBufSupplier, sizeof(m_sOutBufSupplier));
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
 
-  case OMX_IndexParamVideoQuantization:
-    {
-      OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoQuantization\n");
-      memcpy(session_qp, &m_sSessionQuantization, sizeof(m_sSessionQuantization));
-      break;
-    }
+        case OMX_IndexParamVideoQuantization:
+            {
+                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoQuantization\n");
+                memcpy(session_qp, &m_sSessionQuantization, sizeof(m_sSessionQuantization));
+                break;
+            }
 
-    case OMX_QcomIndexParamVideoQPRange:
-    {
-      OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
-      DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamVideoQPRange\n");
-      memcpy(qp_range, &m_sSessionQPRange, sizeof(m_sSessionQPRange));
-      break;
-    }
+        case OMX_QcomIndexParamVideoQPRange:
+            {
+                OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamVideoQPRange\n");
+                memcpy(qp_range, &m_sSessionQPRange, sizeof(m_sSessionQPRange));
+                break;
+            }
 
-    case OMX_IndexParamVideoErrorCorrection:
-    {
-      OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* errorresilience = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
-      DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection\n");
-      errorresilience->bEnableHEC = m_sErrorCorrection.bEnableHEC;
-      errorresilience->bEnableResync = m_sErrorCorrection.bEnableResync;
-      errorresilience->nResynchMarkerSpacing = m_sErrorCorrection.nResynchMarkerSpacing;
-      break;
-    }
-  case OMX_IndexParamVideoIntraRefresh:
-    {
-      OMX_VIDEO_PARAM_INTRAREFRESHTYPE* intrarefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
-      DEBUG_PRINT_LOW("OMX_IndexParamVideoIntraRefresh\n");
-      DEBUG_PRINT_ERROR("OMX_IndexParamVideoIntraRefresh GET\n");
-      intrarefresh->eRefreshMode = m_sIntraRefresh.eRefreshMode;
-      intrarefresh->nCirMBs = m_sIntraRefresh.nCirMBs;
-      break;
-    }
-  case OMX_QcomIndexPortDefn:
-    //TODO
-    break;
-  case OMX_COMPONENT_CAPABILITY_TYPE_INDEX:
-   {
-        OMXComponentCapabilityFlagsType *pParam = reinterpret_cast<OMXComponentCapabilityFlagsType*>(paramData);
-        DEBUG_PRINT_LOW("get_parameter: OMX_COMPONENT_CAPABILITY_TYPE_INDEX\n");
-        pParam->iIsOMXComponentMultiThreaded = OMX_TRUE;
-        pParam->iOMXComponentSupportsExternalOutputBufferAlloc = OMX_FALSE;
-        pParam->iOMXComponentSupportsExternalInputBufferAlloc = OMX_TRUE;
-        pParam->iOMXComponentSupportsMovableInputBuffers = OMX_TRUE;
-        pParam->iOMXComponentUsesNALStartCodes = OMX_TRUE;
-        pParam->iOMXComponentSupportsPartialFrames = OMX_FALSE;
-        pParam->iOMXComponentCanHandleIncompleteFrames = OMX_FALSE;
-        pParam->iOMXComponentUsesFullAVCFrames = OMX_FALSE;
-        m_use_input_pmem = OMX_TRUE;
-        DEBUG_PRINT_LOW("Supporting capability index in encoder node");
-        break;
-   }
+        case OMX_IndexParamVideoErrorCorrection:
+            {
+                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* errorresilience = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
+                DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection\n");
+                errorresilience->bEnableHEC = m_sErrorCorrection.bEnableHEC;
+                errorresilience->bEnableResync = m_sErrorCorrection.bEnableResync;
+                errorresilience->nResynchMarkerSpacing = m_sErrorCorrection.nResynchMarkerSpacing;
+                break;
+            }
+        case OMX_IndexParamVideoIntraRefresh:
+            {
+                OMX_VIDEO_PARAM_INTRAREFRESHTYPE* intrarefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
+                DEBUG_PRINT_LOW("OMX_IndexParamVideoIntraRefresh\n");
+                DEBUG_PRINT_ERROR("OMX_IndexParamVideoIntraRefresh GET\n");
+                intrarefresh->eRefreshMode = m_sIntraRefresh.eRefreshMode;
+                intrarefresh->nCirMBs = m_sIntraRefresh.nCirMBs;
+                break;
+            }
+        case OMX_QcomIndexPortDefn:
+            //TODO
+            break;
+        case OMX_COMPONENT_CAPABILITY_TYPE_INDEX:
+            {
+                OMXComponentCapabilityFlagsType *pParam = reinterpret_cast<OMXComponentCapabilityFlagsType*>(paramData);
+                DEBUG_PRINT_LOW("get_parameter: OMX_COMPONENT_CAPABILITY_TYPE_INDEX\n");
+                pParam->iIsOMXComponentMultiThreaded = OMX_TRUE;
+                pParam->iOMXComponentSupportsExternalOutputBufferAlloc = OMX_FALSE;
+                pParam->iOMXComponentSupportsExternalInputBufferAlloc = OMX_TRUE;
+                pParam->iOMXComponentSupportsMovableInputBuffers = OMX_TRUE;
+                pParam->iOMXComponentUsesNALStartCodes = OMX_TRUE;
+                pParam->iOMXComponentSupportsPartialFrames = OMX_FALSE;
+                pParam->iOMXComponentCanHandleIncompleteFrames = OMX_FALSE;
+                pParam->iOMXComponentUsesFullAVCFrames = OMX_FALSE;
+                m_use_input_pmem = OMX_TRUE;
+                DEBUG_PRINT_LOW("Supporting capability index in encoder node");
+                break;
+            }
 #if !defined(MAX_RES_720P) || defined(_MSM8974_)
-  case OMX_QcomIndexParamIndexExtraDataType:
-    {
-      DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamIndexExtraDataType");
-      QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
-      if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo)
-      {
-        if (pParam->nPortIndex == PORT_INDEX_OUT)
-        {
-          pParam->bEnabled =
-             (OMX_BOOL)((m_sExtraData & VEN_EXTRADATA_SLICEINFO) ? 1 : 0);
-          DEBUG_PRINT_HIGH("Slice Info extradata %d", pParam->bEnabled);
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_parameter: slice information is "
-              "valid for output port only");
-          eRet =OMX_ErrorUnsupportedIndex;
-        }
-      }
+        case OMX_QcomIndexParamIndexExtraDataType:
+            {
+                DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamIndexExtraDataType");
+                QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
+                if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) {
+                    if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                        pParam->bEnabled =
+                            (OMX_BOOL)((m_sExtraData & VEN_EXTRADATA_SLICEINFO) ? 1 : 0);
+                        DEBUG_PRINT_HIGH("Slice Info extradata %d", pParam->bEnabled);
+                    } else {
+                        DEBUG_PRINT_ERROR("get_parameter: slice information is "
+                                "valid for output port only");
+                        eRet =OMX_ErrorUnsupportedIndex;
+                    }
+                }
 #ifndef _MSM8974_
-      else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo)
-      {
-        if (pParam->nPortIndex == PORT_INDEX_OUT)
-        {
-          pParam->bEnabled =
-             (OMX_BOOL)((m_sExtraData & VEN_EXTRADATA_LTRINFO) ? 1 : 0);
-          DEBUG_PRINT_HIGH("LTR Info extradata %d", pParam->bEnabled);
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("get_parameter: LTR information is "
-              "valid for output port only");
-          eRet = OMX_ErrorUnsupportedIndex;
-        }
-      }
+                else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) {
+                    if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                        pParam->bEnabled =
+                            (OMX_BOOL)((m_sExtraData & VEN_EXTRADATA_LTRINFO) ? 1 : 0);
+                        DEBUG_PRINT_HIGH("LTR Info extradata %d", pParam->bEnabled);
+                    } else {
+                        DEBUG_PRINT_ERROR("get_parameter: LTR information is "
+                                "valid for output port only");
+                        eRet = OMX_ErrorUnsupportedIndex;
+                    }
+                }
 #endif
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: unsupported extradata index (0x%x)",
-            pParam->nIndex);
-        eRet = OMX_ErrorUnsupportedIndex;
-      }
-      break;
-    }
-  case QOMX_IndexParamVideoLTRCountRangeSupported:
-    {
-       DEBUG_PRINT_HIGH("get_parameter: QOMX_IndexParamVideoLTRCountRangeSupported");
-       QOMX_EXTNINDEX_RANGETYPE *pParam = (QOMX_EXTNINDEX_RANGETYPE *)paramData;
-       if (pParam->nPortIndex == PORT_INDEX_OUT)
-       {
-          OMX_U32 min = 0, max = 0, step_size = 0;
-          if (dev_get_capability_ltrcount(&min, &max, &step_size))
-          {
-             pParam->nMin = min;
-             pParam->nMax = max;
-             pParam->nStepSize = step_size;
-          }
-          else
-          {
-             DEBUG_PRINT_ERROR("get_parameter: get_capability_ltrcount failed");
-             eRet = OMX_ErrorUndefined;
-          }
-       }
-       else
-       {
-          DEBUG_PRINT_ERROR("LTR count range is valid for output port only");
-          eRet = OMX_ErrorUnsupportedIndex;
-       }
-    }
-  break;
+                else {
+                    DEBUG_PRINT_ERROR("get_parameter: unsupported extradata index (0x%x)",
+                            pParam->nIndex);
+                    eRet = OMX_ErrorUnsupportedIndex;
+                }
+                break;
+            }
+        case QOMX_IndexParamVideoLTRCountRangeSupported:
+            {
+                DEBUG_PRINT_HIGH("get_parameter: QOMX_IndexParamVideoLTRCountRangeSupported");
+                QOMX_EXTNINDEX_RANGETYPE *pParam = (QOMX_EXTNINDEX_RANGETYPE *)paramData;
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    OMX_U32 min = 0, max = 0, step_size = 0;
+                    if (dev_get_capability_ltrcount(&min, &max, &step_size)) {
+                        pParam->nMin = min;
+                        pParam->nMax = max;
+                        pParam->nStepSize = step_size;
+                    } else {
+                        DEBUG_PRINT_ERROR("get_parameter: get_capability_ltrcount failed");
+                        eRet = OMX_ErrorUndefined;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("LTR count range is valid for output port only");
+                    eRet = OMX_ErrorUnsupportedIndex;
+                }
+            }
+            break;
 #endif
-  case QOMX_IndexParamVideoSyntaxHdr:
-    {
-       DEBUG_PRINT_HIGH("QOMX_IndexParamVideoSyntaxHdr");
-       QOMX_EXTNINDEX_PARAMTYPE* pParam =
-          reinterpret_cast<QOMX_EXTNINDEX_PARAMTYPE*>(paramData);
-       if (pParam->pData == NULL)
-       {
-         DEBUG_PRINT_ERROR("Error: Data buffer is NULL");
-         eRet = OMX_ErrorBadParameter;
-         break;
-       }
-       if (get_syntaxhdr_enable == false)
-       {
-         DEBUG_PRINT_ERROR("ERROR: get_parameter: Get syntax header disabled");
-         eRet = OMX_ErrorUnsupportedIndex;
-         break;
-       }
-       BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_START_PENDING);
-       if(dev_loaded_start())
-       {
-         DEBUG_PRINT_LOW("device start successful");
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("device start failed");
-         BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_START_PENDING);
-         return OMX_ErrorHardware;
-       }
-       if(dev_get_seq_hdr(pParam->pData,
-            (unsigned)(pParam->nSize - sizeof(QOMX_EXTNINDEX_PARAMTYPE)),
-            (unsigned *)&pParam->nDataSize))
-       {
-         DEBUG_PRINT_HIGH("get syntax header successful (hdrlen = %lu)",
-            pParam->nDataSize);
-         for (unsigned i = 0; i < pParam->nDataSize; i++) {
-           DEBUG_PRINT_LOW("Header[%d] = %x", i, *((char *)pParam->pData + i));
-         }
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("Error returned from GetSyntaxHeader()");
-         eRet = OMX_ErrorHardware;
-       }
-       BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING);
-       if(dev_loaded_stop())
-       {
-         DEBUG_PRINT_LOW("device stop successful");
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("device stop failed");
-         BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING);
-         eRet = OMX_ErrorHardware;
-       }
-       break;
-    }
-  case OMX_IndexParamVideoSliceFMO:
-  default:
-    {
-      DEBUG_PRINT_LOW("ERROR: get_parameter: unknown param %08x\n", paramIndex);
-      eRet =OMX_ErrorUnsupportedIndex;
-      break;
+        case QOMX_IndexParamVideoSyntaxHdr:
+            {
+                DEBUG_PRINT_HIGH("QOMX_IndexParamVideoSyntaxHdr");
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    reinterpret_cast<QOMX_EXTNINDEX_PARAMTYPE*>(paramData);
+                if (pParam->pData == NULL) {
+                    DEBUG_PRINT_ERROR("Error: Data buffer is NULL");
+                    eRet = OMX_ErrorBadParameter;
+                    break;
+                }
+                if (get_syntaxhdr_enable == false) {
+                    DEBUG_PRINT_ERROR("ERROR: get_parameter: Get syntax header disabled");
+                    eRet = OMX_ErrorUnsupportedIndex;
+                    break;
+                }
+                BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_START_PENDING);
+                if (dev_loaded_start()) {
+                    DEBUG_PRINT_LOW("device start successful");
+                } else {
+                    DEBUG_PRINT_ERROR("device start failed");
+                    BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_START_PENDING);
+                    return OMX_ErrorHardware;
+                }
+                if (dev_get_seq_hdr(pParam->pData,
+                            (unsigned)(pParam->nSize - sizeof(QOMX_EXTNINDEX_PARAMTYPE)),
+                            (unsigned *)&pParam->nDataSize)) {
+                    DEBUG_PRINT_HIGH("get syntax header successful (hdrlen = %lu)",
+                            pParam->nDataSize);
+                    for (unsigned i = 0; i < pParam->nDataSize; i++) {
+                        DEBUG_PRINT_LOW("Header[%d] = %x", i, *((char *)pParam->pData + i));
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("Error returned from GetSyntaxHeader()");
+                    eRet = OMX_ErrorHardware;
+                }
+                BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING);
+                if (dev_loaded_stop()) {
+                    DEBUG_PRINT_LOW("device stop successful");
+                } else {
+                    DEBUG_PRINT_ERROR("device stop failed");
+                    BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING);
+                    eRet = OMX_ErrorHardware;
+                }
+                break;
+            }
+        case OMX_IndexParamVideoSliceFMO:
+        default:
+            {
+                DEBUG_PRINT_LOW("ERROR: get_parameter: unknown param %08x\n", paramIndex);
+                eRet =OMX_ErrorUnsupportedIndex;
+                break;
+            }
+
     }
 
-  }
-
-  return eRet;
+    return eRet;
 
 }
 /* ======================================================================
-FUNCTION
-  omx_video::GetConfig
+   FUNCTION
+   omx_video::GetConfig
 
-DESCRIPTION
-  OMX Get Config Method implementation.
+   DESCRIPTION
+   OMX Get Config Method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::get_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                     OMX_IN OMX_INDEXTYPE configIndex,
-                                     OMX_INOUT OMX_PTR     configData)
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_INOUT OMX_PTR     configData)
 {
-  ////////////////////////////////////////////////////////////////
-  // Supported Config Index           Type
-  // =============================================================
-  // OMX_IndexConfigVideoBitrate      OMX_VIDEO_CONFIG_BITRATETYPE
-  // OMX_IndexConfigVideoFramerate    OMX_CONFIG_FRAMERATETYPE
-  // OMX_IndexConfigCommonRotate      OMX_CONFIG_ROTATIONTYPE
-  ////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////
+    // Supported Config Index           Type
+    // =============================================================
+    // OMX_IndexConfigVideoBitrate      OMX_VIDEO_CONFIG_BITRATETYPE
+    // OMX_IndexConfigVideoFramerate    OMX_CONFIG_FRAMERATETYPE
+    // OMX_IndexConfigCommonRotate      OMX_CONFIG_ROTATIONTYPE
+    ////////////////////////////////////////////////////////////////
 
-  if(configData == NULL)
-  {
-    DEBUG_PRINT_ERROR("ERROR: param is null");
-    return OMX_ErrorBadParameter;
-  }
+    if (configData == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: param is null");
+        return OMX_ErrorBadParameter;
+    }
 
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: can't be in invalid state");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: can't be in invalid state");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  //@todo need to validate params
-  switch(configIndex)
-  {
-  case OMX_IndexConfigVideoBitrate:
-    {
-      OMX_VIDEO_CONFIG_BITRATETYPE* pParam = reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
-      memcpy(pParam, &m_sConfigBitrate, sizeof(m_sConfigBitrate));
-      break;
+    //@todo need to validate params
+    switch (configIndex) {
+        case OMX_IndexConfigVideoBitrate:
+            {
+                OMX_VIDEO_CONFIG_BITRATETYPE* pParam = reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
+                memcpy(pParam, &m_sConfigBitrate, sizeof(m_sConfigBitrate));
+                break;
+            }
+        case OMX_IndexConfigVideoFramerate:
+            {
+                OMX_CONFIG_FRAMERATETYPE* pParam = reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
+                memcpy(pParam, &m_sConfigFramerate, sizeof(m_sConfigFramerate));
+                break;
+            }
+        case OMX_IndexConfigCommonRotate:
+            {
+                OMX_CONFIG_ROTATIONTYPE* pParam = reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+                memcpy(pParam, &m_sConfigFrameRotation, sizeof(m_sConfigFrameRotation));
+                break;
+            }
+        case QOMX_IndexConfigVideoIntraperiod:
+            {
+                DEBUG_PRINT_LOW("get_config:QOMX_IndexConfigVideoIntraperiod\n");
+                QOMX_VIDEO_INTRAPERIODTYPE* pParam = reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
+                memcpy(pParam, &m_sIntraperiod, sizeof(m_sIntraperiod));
+                break;
+            }
+        case OMX_IndexConfigVideoAVCIntraPeriod:
+            {
+                OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam =
+                    reinterpret_cast<OMX_VIDEO_CONFIG_AVCINTRAPERIOD*>(configData);
+                DEBUG_PRINT_LOW("get_config: OMX_IndexConfigVideoAVCIntraPeriod");
+                memcpy(pParam, &m_sConfigAVCIDRPeriod, sizeof(m_sConfigAVCIDRPeriod));
+                break;
+            }
+        default:
+            DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
+            return OMX_ErrorUnsupportedIndex;
     }
-  case OMX_IndexConfigVideoFramerate:
-    {
-      OMX_CONFIG_FRAMERATETYPE* pParam = reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
-      memcpy(pParam, &m_sConfigFramerate, sizeof(m_sConfigFramerate));
-      break;
-    }
-  case OMX_IndexConfigCommonRotate:
-    {
-      OMX_CONFIG_ROTATIONTYPE* pParam = reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
-      memcpy(pParam, &m_sConfigFrameRotation, sizeof(m_sConfigFrameRotation));
-      break;
-    }
-  case QOMX_IndexConfigVideoIntraperiod:
-    {
-      DEBUG_PRINT_LOW("get_config:QOMX_IndexConfigVideoIntraperiod\n");
-      QOMX_VIDEO_INTRAPERIODTYPE* pParam = reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
-      memcpy(pParam, &m_sIntraperiod, sizeof(m_sIntraperiod));
-      break;
-    }
-  case OMX_IndexConfigVideoAVCIntraPeriod:
-    {
-      OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam =
-        reinterpret_cast<OMX_VIDEO_CONFIG_AVCINTRAPERIOD*>(configData);
-      DEBUG_PRINT_LOW("get_config: OMX_IndexConfigVideoAVCIntraPeriod");
-      memcpy(pParam, &m_sConfigAVCIDRPeriod, sizeof(m_sConfigAVCIDRPeriod));
-      break;
-    }
-  default:
-    DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
-    return OMX_ErrorUnsupportedIndex;
-  }
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 
 }
 
 /* ======================================================================
-FUNCTION
-  omx_video::GetExtensionIndex
+   FUNCTION
+   omx_video::GetExtensionIndex
 
-DESCRIPTION
-  OMX GetExtensionIndex method implementaion.  <TBD>
+   DESCRIPTION
+   OMX GetExtensionIndex method implementaion.  <TBD>
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
-                                              OMX_IN OMX_STRING      paramName,
-                                              OMX_OUT OMX_INDEXTYPE* indexType)
+        OMX_IN OMX_STRING      paramName,
+        OMX_OUT OMX_INDEXTYPE* indexType)
 {
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Get Extension Index in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Get Extension Index in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 #ifdef MAX_RES_1080P
-  if (!strncmp(paramName, "OMX.QCOM.index.param.SliceDeliveryMode",
-      sizeof("OMX.QCOM.index.param.SliceDeliveryMode") - 1)) {
-    *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode;
-    return OMX_ErrorNone;
-  }
+    if (!strncmp(paramName, "OMX.QCOM.index.param.SliceDeliveryMode",
+                sizeof("OMX.QCOM.index.param.SliceDeliveryMode") - 1)) {
+        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode;
+        return OMX_ErrorNone;
+    }
 #endif
 #ifdef _ANDROID_ICS_
-  if (!strncmp(paramName, "OMX.google.android.index.storeMetaDataInBuffers",sizeof("OMX.google.android.index.storeMetaDataInBuffers") - 1)) {
+    if (!strncmp(paramName, "OMX.google.android.index.storeMetaDataInBuffers",sizeof("OMX.google.android.index.storeMetaDataInBuffers") - 1)) {
         *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoEncodeMetaBufferMode;
         return OMX_ErrorNone;
-  }
+    }
 #endif
-  return OMX_ErrorNotImplemented;
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_video::GetState
+   FUNCTION
+   omx_video::GetState
 
-DESCRIPTION
-  Returns the state information back to the caller.<TBD>
+   DESCRIPTION
+   Returns the state information back to the caller.<TBD>
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::get_state(OMX_IN OMX_HANDLETYPE  hComp,
-                                    OMX_OUT OMX_STATETYPE* state)
+        OMX_OUT OMX_STATETYPE* state)
 {
-  *state = m_state;
-  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
-  return OMX_ErrorNone;
+    *state = m_state;
+    DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_video::ComponentTunnelRequest
+   FUNCTION
+   omx_video::ComponentTunnelRequest
 
-DESCRIPTION
-  OMX Component Tunnel Request method implementation. <TBD>
+   DESCRIPTION
+   OMX Component Tunnel Request method implementation. <TBD>
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
-                                                   OMX_IN OMX_U32                        port,
-                                                   OMX_IN OMX_HANDLETYPE        peerComponent,
-                                                   OMX_IN OMX_U32                    peerPort,
-                                                   OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_HANDLETYPE        peerComponent,
+        OMX_IN OMX_U32                    peerPort,
+        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
 {
-  DEBUG_PRINT_ERROR("ERROR: component_tunnel_request Not Implemented\n");
-  return OMX_ErrorNotImplemented;
+    DEBUG_PRINT_ERROR("ERROR: component_tunnel_request Not Implemented\n");
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_video::UseInputBuffer
+   FUNCTION
+   omx_video::UseInputBuffer
 
-DESCRIPTION
-  Helper function for Use buffer in the input pin
+   DESCRIPTION
+   Helper function for Use buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::use_input_buffer(
-                                          OMX_IN OMX_HANDLETYPE            hComp,
-                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                          OMX_IN OMX_U32                   port,
-                                          OMX_IN OMX_PTR                   appData,
-                                          OMX_IN OMX_U32                   bytes,
-                                          OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  unsigned   i = 0;
-  unsigned char *buf_addr = NULL;
+    unsigned   i = 0;
+    unsigned char *buf_addr = NULL;
 
-  DEBUG_PRINT_HIGH("use_input_buffer: port = %lu appData = %p bytes = %lu buffer = %p",port,appData,bytes,buffer);
-  if(bytes != m_sInPortDef.nBufferSize)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: use_input_buffer: Size Mismatch!! "
-                      "bytes[%lu] != Port.nBufferSize[%lu]", bytes, m_sInPortDef.nBufferSize);
-    return OMX_ErrorBadParameter;
-  }
-
-  if(!m_inp_mem_ptr)
-  {
-    input_use_buffer = true;
-    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
-                    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual);
-    if(m_inp_mem_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_inp_mem_ptr");
-      return OMX_ErrorInsufficientResources;
-    }
-
-
-    m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual);
-    if(m_pInput_pmem == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_pmem");
-      return OMX_ErrorInsufficientResources;
-    }
-#ifdef USE_ION
-    m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual);
-    if(m_pInput_ion == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_ion");
-      return OMX_ErrorInsufficientResources;
-    }
-#endif
-
-    for(i=0; i< m_sInPortDef.nBufferCountActual; i++)
-    {
-      m_pInput_pmem[i].fd = -1;
-#ifdef USE_ION
-      m_pInput_ion[i].ion_device_fd =-1;
-      m_pInput_ion[i].fd_ion_data.fd =-1;
-      m_pInput_ion[i].ion_alloc_data.handle=NULL;
-#endif
-    }
-
-  }
-
-  for(i=0; i< m_sInPortDef.nBufferCountActual; i++)
-  {
-    if(BITMASK_ABSENT(&m_inp_bm_count,i))
-    {
-      break;
-    }
-  }
-
-  if(i < m_sInPortDef.nBufferCountActual)
-  {
-
-    *bufferHdr = (m_inp_mem_ptr + i);
-    BITMASK_SET(&m_inp_bm_count,i);
-
-    (*bufferHdr)->pBuffer           = (OMX_U8 *)buffer;
-    (*bufferHdr)->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    (*bufferHdr)->nVersion.nVersion = OMX_SPEC_VERSION;
-    (*bufferHdr)->nAllocLen         = m_sInPortDef.nBufferSize;
-    (*bufferHdr)->pAppPrivate       = appData;
-    (*bufferHdr)->nInputPortIndex   = PORT_INDEX_IN;
-
-    if(!m_use_input_pmem)
-    {
-#ifdef USE_ION
-#ifdef _MSM8974_
-      m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
-                                      &m_pInput_ion[i].ion_alloc_data,
-                                      &m_pInput_ion[i].fd_ion_data,0);
-#else
-      m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
-                                      &m_pInput_ion[i].ion_alloc_data,
-                                      &m_pInput_ion[i].fd_ion_data,ION_FLAG_CACHED);
-#endif
-      if(m_pInput_ion[i].ion_device_fd < 0) {
-        DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
-        return OMX_ErrorInsufficientResources;
-      }
-      m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd;
-#else
-      m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
-      if(m_pInput_pmem[i].fd == 0)
-      {
-        m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
-      }
-
-      if(m_pInput_pmem[i] .fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed");
-        return OMX_ErrorInsufficientResources;
-      }
-#endif
-      m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
-      m_pInput_pmem[i].offset = 0;
-      m_pInput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE,
-                                                      MAP_SHARED,m_pInput_pmem[i].fd,0);
-
-      if(m_pInput_pmem[i].buffer == MAP_FAILED)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: mmap() Failed");
-        close(m_pInput_pmem[i].fd);
-#ifdef USE_ION
-        free_ion_memory(&m_pInput_ion[i]);
-#endif
-        return OMX_ErrorInsufficientResources;
-      }
-    }
-    else
-    {
-      OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pParam = reinterpret_cast<OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *>((*bufferHdr)->pAppPrivate);
-      DEBUG_PRINT_LOW("Inside qcom_ext with luma:(fd:%d,offset:0x%x)", pParam->pmem_fd, pParam->offset);
-
-      if(pParam)
-      {
-        m_pInput_pmem[i].fd = pParam->pmem_fd;
-        m_pInput_pmem[i].offset = pParam->offset;
-        m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
-        m_pInput_pmem[i].buffer = (unsigned char *)buffer;
-        DEBUG_PRINT_LOW("\n DBG:: pParam->pmem_fd = %u, pParam->offset = %u",
-            pParam->pmem_fd, pParam->offset);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Invalid AppData given for PMEM i/p UseBuffer case");
+    DEBUG_PRINT_HIGH("use_input_buffer: port = %lu appData = %p bytes = %lu buffer = %p",port,appData,bytes,buffer);
+    if (bytes != m_sInPortDef.nBufferSize) {
+        DEBUG_PRINT_ERROR("\nERROR: use_input_buffer: Size Mismatch!! "
+                "bytes[%lu] != Port.nBufferSize[%lu]", bytes, m_sInPortDef.nBufferSize);
         return OMX_ErrorBadParameter;
-      }
     }
 
-    DEBUG_PRINT_LOW("\nuse_inp:: bufhdr = %p, pBuffer = %p, m_pInput_pmem[i].buffer = %p",
+    if (!m_inp_mem_ptr) {
+        input_use_buffer = true;
+        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
+                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual);
+        if (m_inp_mem_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_inp_mem_ptr");
+            return OMX_ErrorInsufficientResources;
+        }
+
+
+        m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual);
+        if (m_pInput_pmem == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_pmem");
+            return OMX_ErrorInsufficientResources;
+        }
+#ifdef USE_ION
+        m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual);
+        if (m_pInput_ion == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_ion");
+            return OMX_ErrorInsufficientResources;
+        }
+#endif
+
+        for (i=0; i< m_sInPortDef.nBufferCountActual; i++) {
+            m_pInput_pmem[i].fd = -1;
+#ifdef USE_ION
+            m_pInput_ion[i].ion_device_fd =-1;
+            m_pInput_ion[i].fd_ion_data.fd =-1;
+            m_pInput_ion[i].ion_alloc_data.handle=NULL;
+#endif
+        }
+
+    }
+
+    for (i=0; i< m_sInPortDef.nBufferCountActual; i++) {
+        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+            break;
+        }
+    }
+
+    if (i < m_sInPortDef.nBufferCountActual) {
+
+        *bufferHdr = (m_inp_mem_ptr + i);
+        BITMASK_SET(&m_inp_bm_count,i);
+
+        (*bufferHdr)->pBuffer           = (OMX_U8 *)buffer;
+        (*bufferHdr)->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        (*bufferHdr)->nVersion.nVersion = OMX_SPEC_VERSION;
+        (*bufferHdr)->nAllocLen         = m_sInPortDef.nBufferSize;
+        (*bufferHdr)->pAppPrivate       = appData;
+        (*bufferHdr)->nInputPortIndex   = PORT_INDEX_IN;
+
+        if (!m_use_input_pmem) {
+#ifdef USE_ION
+#ifdef _MSM8974_
+            m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
+                    &m_pInput_ion[i].ion_alloc_data,
+                    &m_pInput_ion[i].fd_ion_data,0);
+#else
+            m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
+                    &m_pInput_ion[i].ion_alloc_data,
+                    &m_pInput_ion[i].fd_ion_data,ION_FLAG_CACHED);
+#endif
+            if (m_pInput_ion[i].ion_device_fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+                return OMX_ErrorInsufficientResources;
+            }
+            m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd;
+#else
+            m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+            if (m_pInput_pmem[i].fd == 0) {
+                m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+            }
+
+            if (m_pInput_pmem[i] .fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed");
+                return OMX_ErrorInsufficientResources;
+            }
+#endif
+            m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
+            m_pInput_pmem[i].offset = 0;
+            m_pInput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE,
+                    MAP_SHARED,m_pInput_pmem[i].fd,0);
+
+            if (m_pInput_pmem[i].buffer == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("\nERROR: mmap() Failed");
+                close(m_pInput_pmem[i].fd);
+#ifdef USE_ION
+                free_ion_memory(&m_pInput_ion[i]);
+#endif
+                return OMX_ErrorInsufficientResources;
+            }
+        } else {
+            OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pParam = reinterpret_cast<OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *>((*bufferHdr)->pAppPrivate);
+            DEBUG_PRINT_LOW("Inside qcom_ext with luma:(fd:%d,offset:0x%x)", pParam->pmem_fd, pParam->offset);
+
+            if (pParam) {
+                m_pInput_pmem[i].fd = pParam->pmem_fd;
+                m_pInput_pmem[i].offset = pParam->offset;
+                m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
+                m_pInput_pmem[i].buffer = (unsigned char *)buffer;
+                DEBUG_PRINT_LOW("\n DBG:: pParam->pmem_fd = %u, pParam->offset = %u",
+                        pParam->pmem_fd, pParam->offset);
+            } else {
+                DEBUG_PRINT_ERROR("ERROR: Invalid AppData given for PMEM i/p UseBuffer case");
+                return OMX_ErrorBadParameter;
+            }
+        }
+
+        DEBUG_PRINT_LOW("\nuse_inp:: bufhdr = %p, pBuffer = %p, m_pInput_pmem[i].buffer = %p",
                 (*bufferHdr), (*bufferHdr)->pBuffer, m_pInput_pmem[i].buffer);
-    if( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: dev_use_buf() Failed for i/p buf");
-      return OMX_ErrorInsufficientResources;
+        if ( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true) {
+            DEBUG_PRINT_ERROR("\nERROR: dev_use_buf() Failed for i/p buf");
+            return OMX_ErrorInsufficientResources;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: All buffers are already used, invalid use_buf call for "
+                "index = %u", i);
+        eRet = OMX_ErrorInsufficientResources;
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: All buffers are already used, invalid use_buf call for "
-                      "index = %u", i);
-    eRet = OMX_ErrorInsufficientResources;
-  }
 
-  return eRet;
+    return eRet;
 }
 
 
 
 /* ======================================================================
-FUNCTION
-  omx_video::UseOutputBuffer
+   FUNCTION
+   omx_video::UseOutputBuffer
 
-DESCRIPTION
-  Helper function for Use buffer in the input pin
+   DESCRIPTION
+   Helper function for Use buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::use_output_buffer(
-                                           OMX_IN OMX_HANDLETYPE            hComp,
-                                           OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                           OMX_IN OMX_U32                   port,
-                                           OMX_IN OMX_PTR                   appData,
-                                           OMX_IN OMX_U32                   bytes,
-                                           OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
-  unsigned char *buf_addr = NULL;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
+    unsigned char *buf_addr = NULL;
 #ifdef _MSM8974_
-  int align_size;
+    int align_size;
 #endif
 
-  DEBUG_PRINT_HIGH("\n Inside use_output_buffer()");
-  if(bytes != m_sOutPortDef.nBufferSize)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: use_output_buffer: Size Mismatch!! "
-                      "bytes[%lu] != Port.nBufferSize[%lu]", bytes, m_sOutPortDef.nBufferSize);
-    return OMX_ErrorBadParameter;
-  }
-
-  if(!m_out_mem_ptr)
-  {
-    output_use_buffer = true;
-    int nBufHdrSize        = 0;
-
-    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",m_sOutPortDef.nBufferCountActual);
-    nBufHdrSize        = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE);
-    /*
-     * Memory for output side involves the following:
-     * 1. Array of Buffer Headers
-     * 2. Bitmask array to hold the buffer allocation details
-     * In order to minimize the memory management entire allocation
-     * is done in one step.
-     */
-    //OMX Buffer header
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
-    if(m_out_mem_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_out_mem_ptr");
-      return OMX_ErrorInsufficientResources;
+    DEBUG_PRINT_HIGH("\n Inside use_output_buffer()");
+    if (bytes != m_sOutPortDef.nBufferSize) {
+        DEBUG_PRINT_ERROR("\nERROR: use_output_buffer: Size Mismatch!! "
+                "bytes[%lu] != Port.nBufferSize[%lu]", bytes, m_sOutPortDef.nBufferSize);
+        return OMX_ErrorBadParameter;
     }
 
-    m_pOutput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sOutPortDef.nBufferCountActual);
-    if(m_pOutput_pmem == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_pmem");
-      return OMX_ErrorInsufficientResources;
-    }
+    if (!m_out_mem_ptr) {
+        output_use_buffer = true;
+        int nBufHdrSize        = 0;
+
+        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",m_sOutPortDef.nBufferCountActual);
+        nBufHdrSize        = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE);
+        /*
+         * Memory for output side involves the following:
+         * 1. Array of Buffer Headers
+         * 2. Bitmask array to hold the buffer allocation details
+         * In order to minimize the memory management entire allocation
+         * is done in one step.
+         */
+        //OMX Buffer header
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        if (m_out_mem_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_out_mem_ptr");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        m_pOutput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sOutPortDef.nBufferCountActual);
+        if (m_pOutput_pmem == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_pmem");
+            return OMX_ErrorInsufficientResources;
+        }
 #ifdef USE_ION
-    m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual);
-    if(m_pOutput_ion == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_ion");
-      return OMX_ErrorInsufficientResources;
-    }
+        m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual);
+        if (m_pOutput_ion == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_ion");
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
-    if(m_out_mem_ptr)
-    {
-      bufHdr          =  m_out_mem_ptr;
-      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
-      // Settting the entire storage nicely
-      for(i=0; i < m_sOutPortDef.nBufferCountActual ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        bufHdr->nAllocLen          = bytes;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = appData;
-        bufHdr->nOutputPortIndex   = PORT_INDEX_OUT;
-        bufHdr->pBuffer            = NULL;
-        bufHdr++;
-        m_pOutput_pmem[i].fd = -1;
+        if (m_out_mem_ptr) {
+            bufHdr          =  m_out_mem_ptr;
+            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+            // Settting the entire storage nicely
+            for (i=0; i < m_sOutPortDef.nBufferCountActual ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                bufHdr->nAllocLen          = bytes;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = appData;
+                bufHdr->nOutputPortIndex   = PORT_INDEX_OUT;
+                bufHdr->pBuffer            = NULL;
+                bufHdr++;
+                m_pOutput_pmem[i].fd = -1;
 #ifdef USE_ION
-        m_pOutput_ion[i].ion_device_fd =-1;
-        m_pOutput_ion[i].fd_ion_data.fd=-1;
-        m_pOutput_ion[i].ion_alloc_data.handle =NULL;
+                m_pOutput_ion[i].ion_device_fd =-1;
+                m_pOutput_ion[i].fd_ion_data.fd=-1;
+                m_pOutput_ion[i].ion_alloc_data.handle =NULL;
 #endif
-      }
+            }
+        } else {
+            DEBUG_PRINT_ERROR("ERROR: Output buf mem alloc failed[0x%p]\n",m_out_mem_ptr);
+            eRet =  OMX_ErrorInsufficientResources;
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: Output buf mem alloc failed[0x%p]\n",m_out_mem_ptr);
-      eRet =  OMX_ErrorInsufficientResources;
+
+    for (i=0; i< m_sOutPortDef.nBufferCountActual; i++) {
+        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+            break;
+        }
     }
-  }
 
-  for(i=0; i< m_sOutPortDef.nBufferCountActual; i++)
-  {
-    if(BITMASK_ABSENT(&m_out_bm_count,i))
-    {
-      break;
-    }
-  }
+    if (eRet == OMX_ErrorNone) {
+        if (i < m_sOutPortDef.nBufferCountActual) {
+            *bufferHdr = (m_out_mem_ptr + i );
+            (*bufferHdr)->pBuffer = (OMX_U8 *)buffer;
+            (*bufferHdr)->pAppPrivate = appData;
+            BITMASK_SET(&m_out_bm_count,i);
 
-  if(eRet == OMX_ErrorNone)
-  {
-    if(i < m_sOutPortDef.nBufferCountActual)
-    {
-      *bufferHdr = (m_out_mem_ptr + i );
-      (*bufferHdr)->pBuffer = (OMX_U8 *)buffer;
-	  (*bufferHdr)->pAppPrivate = appData;
-      BITMASK_SET(&m_out_bm_count,i);
-
-      if(!m_use_output_pmem)
-      {
+            if (!m_use_output_pmem) {
 #ifdef USE_ION
 #ifdef _MSM8974_
-      align_size = ((m_sOutPortDef.nBufferSize + 4095)/4096) * 4096;
-      m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(align_size,
-                                         &m_pOutput_ion[i].ion_alloc_data,
-                                         &m_pOutput_ion[i].fd_ion_data,0);
+                align_size = ((m_sOutPortDef.nBufferSize + 4095)/4096) * 4096;
+                m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(align_size,
+                        &m_pOutput_ion[i].ion_alloc_data,
+                        &m_pOutput_ion[i].fd_ion_data,0);
 #else
-      m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(
-                                         m_sOutPortDef.nBufferSize,
-                                         &m_pOutput_ion[i].ion_alloc_data,
-                                         &m_pOutput_ion[i].fd_ion_data,ION_FLAG_CACHED);
+                m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(
+                        m_sOutPortDef.nBufferSize,
+                        &m_pOutput_ion[i].ion_alloc_data,
+                        &m_pOutput_ion[i].fd_ion_data,ION_FLAG_CACHED);
 #endif
-      if(m_pOutput_ion[i].ion_device_fd < 0) {
-        DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
-        return OMX_ErrorInsufficientResources;
-      }
-      m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd;
+                if (m_pOutput_ion[i].ion_device_fd < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+                    return OMX_ErrorInsufficientResources;
+                }
+                m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd;
 #else
-        m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+                m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
 
-        if(m_pOutput_pmem[i].fd == 0)
-        {
-          m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
-        }
+                if (m_pOutput_pmem[i].fd == 0) {
+                    m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+                }
 
-        if(m_pOutput_pmem[i].fd < 0)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed");
-          return OMX_ErrorInsufficientResources;
-        }
+                if (m_pOutput_pmem[i].fd < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed");
+                    return OMX_ErrorInsufficientResources;
+                }
 #endif
-        m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
-        m_pOutput_pmem[i].offset = 0;
+                m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
+                m_pOutput_pmem[i].offset = 0;
 #ifdef _MSM8974_
-      m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,align_size,PROT_READ|PROT_WRITE,
-                                                       MAP_SHARED,m_pOutput_pmem[i].fd,0);
+                m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,align_size,PROT_READ|PROT_WRITE,
+                        MAP_SHARED,m_pOutput_pmem[i].fd,0);
 #else
-      m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE,
-                                                       MAP_SHARED,m_pOutput_pmem[i].fd,0);
+                m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE,
+                        MAP_SHARED,m_pOutput_pmem[i].fd,0);
 #endif
-        if(m_pOutput_pmem[i].buffer == MAP_FAILED)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: mmap() Failed");
-          close(m_pOutput_pmem[i].fd);
+                if (m_pOutput_pmem[i].buffer == MAP_FAILED) {
+                    DEBUG_PRINT_ERROR("\nERROR: mmap() Failed");
+                    close(m_pOutput_pmem[i].fd);
 #ifdef USE_ION
-          free_ion_memory(&m_pOutput_ion[i]);
+                    free_ion_memory(&m_pOutput_ion[i]);
 #endif
-          return OMX_ErrorInsufficientResources;
-        }
-      }
-      else
-      {
-        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pParam = reinterpret_cast<OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*>((*bufferHdr)->pAppPrivate);
-        DEBUG_PRINT_LOW("Inside qcom_ext pParam:0x%x )", pParam);
+                    return OMX_ErrorInsufficientResources;
+                }
+            } else {
+                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pParam = reinterpret_cast<OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*>((*bufferHdr)->pAppPrivate);
+                DEBUG_PRINT_LOW("Inside qcom_ext pParam:0x%x )", pParam);
 
-        if(pParam)
-        {
-          DEBUG_PRINT_LOW("Inside qcom_ext with luma:(fd:%d,offset:0x%x)", pParam->pmem_fd, pParam->offset);
-          m_pOutput_pmem[i].fd = pParam->pmem_fd;
-          m_pOutput_pmem[i].offset = pParam->offset;
-          m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
-          m_pOutput_pmem[i].buffer = (unsigned char *)buffer;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("ERROR: Invalid AppData given for PMEM o/p UseBuffer case");
-          return OMX_ErrorBadParameter;
-        }
-        buf_addr = (unsigned char *)buffer;
-      }
+                if (pParam) {
+                    DEBUG_PRINT_LOW("Inside qcom_ext with luma:(fd:%d,offset:0x%x)", pParam->pmem_fd, pParam->offset);
+                    m_pOutput_pmem[i].fd = pParam->pmem_fd;
+                    m_pOutput_pmem[i].offset = pParam->offset;
+                    m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
+                    m_pOutput_pmem[i].buffer = (unsigned char *)buffer;
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: Invalid AppData given for PMEM o/p UseBuffer case");
+                    return OMX_ErrorBadParameter;
+                }
+                buf_addr = (unsigned char *)buffer;
+            }
 
-      DEBUG_PRINT_LOW("\n use_out:: bufhdr = %p, pBuffer = %p, m_pOutput_pmem[i].buffer = %p",
-                (*bufferHdr), (*bufferHdr)->pBuffer, m_pOutput_pmem[i].buffer);
-      if(dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true)
-      {
-        DEBUG_PRINT_ERROR("ERROR: dev_use_buf Failed for o/p buf");
-        return OMX_ErrorInsufficientResources;
-      }
+            DEBUG_PRINT_LOW("\n use_out:: bufhdr = %p, pBuffer = %p, m_pOutput_pmem[i].buffer = %p",
+                    (*bufferHdr), (*bufferHdr)->pBuffer, m_pOutput_pmem[i].buffer);
+            if (dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true) {
+                DEBUG_PRINT_ERROR("ERROR: dev_use_buf Failed for o/p buf");
+                return OMX_ErrorInsufficientResources;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("ERROR: All o/p Buffers have been Used, invalid use_buf call for "
+                    "index = %u", i);
+            eRet = OMX_ErrorInsufficientResources;
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: All o/p Buffers have been Used, invalid use_buf call for "
-                      "index = %u", i);
-      eRet = OMX_ErrorInsufficientResources;
-    }
-  }
-  return eRet;
+    return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_video::UseBuffer
+   FUNCTION
+   omx_video::UseBuffer
 
-DESCRIPTION
-  OMX Use Buffer method implementation.
+   DESCRIPTION
+   OMX Use Buffer method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None , if everything successful.
+   RETURN VALUE
+   OMX Error None , if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::use_buffer(
-                                    OMX_IN OMX_HANDLETYPE            hComp,
-                                    OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                    OMX_IN OMX_U32                   port,
-                                    OMX_IN OMX_PTR                   appData,
-                                    OMX_IN OMX_U32                   bytes,
-                                    OMX_IN OMX_U8*                   buffer)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes,
+        OMX_IN OMX_U8*                   buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Use Buffer in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  if(port == PORT_INDEX_IN)
-  {
-    eRet = use_input_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    eRet = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index received %d\n",(int)port);
-    eRet = OMX_ErrorBadPortIndex;
-  }
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Use Buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
+    if (port == PORT_INDEX_IN) {
+        eRet = use_input_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
+    } else if (port == PORT_INDEX_OUT) {
+        eRet = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
+    } else {
+        DEBUG_PRINT_ERROR("ERROR: Invalid Port Index received %d\n",(int)port);
+        eRet = OMX_ErrorBadPortIndex;
+    }
 
-  if(eRet == OMX_ErrorNone)
-  {
-    if(allocate_done())
-    {
-      if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-      {
-        // Send the callback now
-        BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
-        post_event(OMX_CommandStateSet,OMX_StateIdle,
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
-    }
-    if(port == PORT_INDEX_IN && m_sInPortDef.bPopulated)
-    {
-      if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-      {
-        BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-        post_event(OMX_CommandPortEnable,
-                   PORT_INDEX_IN,
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
+    if (eRet == OMX_ErrorNone) {
+        if (allocate_done()) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                // Send the callback now
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+                post_event(OMX_CommandStateSet,OMX_StateIdle,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            }
+        }
+        if (port == PORT_INDEX_IN && m_sInPortDef.bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
+                        PORT_INDEX_IN,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            }
 
+        } else if (port == PORT_INDEX_OUT && m_sOutPortDef.bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
+                        PORT_INDEX_OUT,
+                        OMX_COMPONENT_GENERATE_EVENT);
+                m_event_port_settings_sent = false;
+            }
+        }
     }
-    else if(port == PORT_INDEX_OUT && m_sOutPortDef.bPopulated)
-    {
-      if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-      {
-        BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-        post_event(OMX_CommandPortEnable,
-                   PORT_INDEX_OUT,
-                   OMX_COMPONENT_GENERATE_EVENT);
-        m_event_port_settings_sent = false;
-      }
-    }
-  }
-  return eRet;
+    return eRet;
 }
 
 OMX_ERRORTYPE omx_video::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
-  OMX_U8 *temp_buff ;
+    unsigned int index = 0;
+    OMX_U8 *temp_buff ;
 
-  if(bufferHdr == NULL || m_inp_mem_ptr == NULL)
-  {
-    DEBUG_PRINT_ERROR("ERROR: free_input: Invalid bufferHdr[%p] or m_inp_mem_ptr[%p]",
-      bufferHdr, m_inp_mem_ptr);
-    return OMX_ErrorBadParameter;
-  }
+    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: free_input: Invalid bufferHdr[%p] or m_inp_mem_ptr[%p]",
+                bufferHdr, m_inp_mem_ptr);
+        return OMX_ErrorBadParameter;
+    }
 
-  index = bufferHdr - ((!mUseProxyColorFormat)?m_inp_mem_ptr:meta_buffer_hdr);
+    index = bufferHdr - ((!mUseProxyColorFormat)?m_inp_mem_ptr:meta_buffer_hdr);
 #ifdef _ANDROID_ICS_
-  if(meta_mode_enable)
-  {
-    if(index < m_sInPortDef.nBufferCountActual)
-    {
-      memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index]));
-      memset(&meta_buffers[index], 0, sizeof(meta_buffers[index]));
+    if (meta_mode_enable) {
+        if (index < m_sInPortDef.nBufferCountActual) {
+            memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index]));
+            memset(&meta_buffers[index], 0, sizeof(meta_buffers[index]));
+        }
+        if (!mUseProxyColorFormat)
+            return OMX_ErrorNone;
+        else
+            c2d_conv.close();
     }
-    if(!mUseProxyColorFormat)
-      return OMX_ErrorNone;
-    else
-      c2d_conv.close();
-  }
 #endif
-  if(index < m_sInPortDef.nBufferCountActual && !mUseProxyColorFormat &&
-     dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true)
-  {
-    DEBUG_PRINT_LOW("\nERROR: dev_free_buf() Failed for i/p buf");
-  }
+    if (index < m_sInPortDef.nBufferCountActual && !mUseProxyColorFormat &&
+            dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true) {
+        DEBUG_PRINT_LOW("\nERROR: dev_free_buf() Failed for i/p buf");
+    }
 
-  if(index < m_sInPortDef.nBufferCountActual && m_pInput_pmem)
-  {
-    if(m_pInput_pmem[index].fd > 0 && input_use_buffer == false)
-    {
-      DEBUG_PRINT_LOW("\n FreeBuffer:: i/p AllocateBuffer case");
-      munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size);
-      close (m_pInput_pmem[index].fd);
+    if (index < m_sInPortDef.nBufferCountActual && m_pInput_pmem) {
+        if (m_pInput_pmem[index].fd > 0 && input_use_buffer == false) {
+            DEBUG_PRINT_LOW("\n FreeBuffer:: i/p AllocateBuffer case");
+            munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size);
+            close (m_pInput_pmem[index].fd);
 #ifdef USE_ION
-      free_ion_memory(&m_pInput_ion[index]);
+            free_ion_memory(&m_pInput_ion[index]);
 #endif
-      m_pInput_pmem[index].fd = -1;
-    }
-    else if(m_pInput_pmem[index].fd > 0 && (input_use_buffer == true &&
-      m_use_input_pmem == OMX_FALSE))
-    {
-      DEBUG_PRINT_LOW("\n FreeBuffer:: i/p Heap UseBuffer case");
-      if(dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: dev_free_buf() Failed for i/p buf");
-      }
-      munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size);
-      close (m_pInput_pmem[index].fd);
+            m_pInput_pmem[index].fd = -1;
+        } else if (m_pInput_pmem[index].fd > 0 && (input_use_buffer == true &&
+                    m_use_input_pmem == OMX_FALSE)) {
+            DEBUG_PRINT_LOW("\n FreeBuffer:: i/p Heap UseBuffer case");
+            if (dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true) {
+                DEBUG_PRINT_ERROR("\nERROR: dev_free_buf() Failed for i/p buf");
+            }
+            munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size);
+            close (m_pInput_pmem[index].fd);
 #ifdef USE_ION
-      free_ion_memory(&m_pInput_ion[index]);
+            free_ion_memory(&m_pInput_ion[index]);
 #endif
-      m_pInput_pmem[index].fd = -1;
+            m_pInput_pmem[index].fd = -1;
+        } else {
+            DEBUG_PRINT_ERROR("\n FreeBuffer:: fd is invalid or i/p PMEM UseBuffer case");
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("\n FreeBuffer:: fd is invalid or i/p PMEM UseBuffer case");
-    }
-  }
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_video::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
 {
-  unsigned int index = 0;
-  OMX_U8 *temp_buff ;
+    unsigned int index = 0;
+    OMX_U8 *temp_buff ;
 
-  if(bufferHdr == NULL || m_out_mem_ptr == NULL)
-  {
-    DEBUG_PRINT_ERROR("ERROR: free_output: Invalid bufferHdr[%p] or m_out_mem_ptr[%p]",
-      bufferHdr, m_out_mem_ptr);
-    return OMX_ErrorBadParameter;
-  }
-  index = bufferHdr - m_out_mem_ptr;
-
-  if(index < m_sOutPortDef.nBufferCountActual &&
-     dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true)
-  {
-    DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf");
-  }
-
-  if(index < m_sOutPortDef.nBufferCountActual && m_pOutput_pmem)
-  {
-    if(m_pOutput_pmem[index].fd > 0 && output_use_buffer == false )
-    {
-      DEBUG_PRINT_LOW("\n FreeBuffer:: o/p AllocateBuffer case");
-      munmap (m_pOutput_pmem[index].buffer,m_pOutput_pmem[index].size);
-      close (m_pOutput_pmem[index].fd);
-#ifdef USE_ION
-      free_ion_memory(&m_pOutput_ion[index]);
-#endif
-      m_pOutput_pmem[index].fd = -1;
+    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: free_output: Invalid bufferHdr[%p] or m_out_mem_ptr[%p]",
+                bufferHdr, m_out_mem_ptr);
+        return OMX_ErrorBadParameter;
     }
-    else if( m_pOutput_pmem[index].fd > 0 && (output_use_buffer == true
-      && m_use_output_pmem == OMX_FALSE))
-    {
-      DEBUG_PRINT_LOW("\n FreeBuffer:: o/p Heap UseBuffer case");
-      if(dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true)
-      {
+    index = bufferHdr - m_out_mem_ptr;
+
+    if (index < m_sOutPortDef.nBufferCountActual &&
+            dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true) {
         DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf");
-      }
-      munmap (m_pOutput_pmem[index].buffer,m_pOutput_pmem[index].size);
-      close (m_pOutput_pmem[index].fd);
+    }
+
+    if (index < m_sOutPortDef.nBufferCountActual && m_pOutput_pmem) {
+        if (m_pOutput_pmem[index].fd > 0 && output_use_buffer == false ) {
+            DEBUG_PRINT_LOW("\n FreeBuffer:: o/p AllocateBuffer case");
+            munmap (m_pOutput_pmem[index].buffer,m_pOutput_pmem[index].size);
+            close (m_pOutput_pmem[index].fd);
 #ifdef USE_ION
-      free_ion_memory(&m_pOutput_ion[index]);
+            free_ion_memory(&m_pOutput_ion[index]);
 #endif
-      m_pOutput_pmem[index].fd = -1;
+            m_pOutput_pmem[index].fd = -1;
+        } else if ( m_pOutput_pmem[index].fd > 0 && (output_use_buffer == true
+                    && m_use_output_pmem == OMX_FALSE)) {
+            DEBUG_PRINT_LOW("\n FreeBuffer:: o/p Heap UseBuffer case");
+            if (dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true) {
+                DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf");
+            }
+            munmap (m_pOutput_pmem[index].buffer,m_pOutput_pmem[index].size);
+            close (m_pOutput_pmem[index].fd);
+#ifdef USE_ION
+            free_ion_memory(&m_pOutput_ion[index]);
+#endif
+            m_pOutput_pmem[index].fd = -1;
+        } else {
+            DEBUG_PRINT_LOW("\n FreeBuffer:: fd is invalid or o/p PMEM UseBuffer case");
+        }
     }
-    else
-    {
-      DEBUG_PRINT_LOW("\n FreeBuffer:: fd is invalid or o/p PMEM UseBuffer case");
-    }
-  }
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 #ifdef _ANDROID_ICS_
 OMX_ERRORTYPE omx_video::allocate_input_meta_buffer(
-                    OMX_HANDLETYPE       hComp,
-                    OMX_BUFFERHEADERTYPE **bufferHdr,
-                    OMX_PTR              appData,
-                    OMX_U32              bytes)
+        OMX_HANDLETYPE       hComp,
+        OMX_BUFFERHEADERTYPE **bufferHdr,
+        OMX_PTR              appData,
+        OMX_U32              bytes)
 {
-  unsigned index = 0;
-  if(!bufferHdr || bytes != sizeof(encoder_media_buffer_type))
-  {
-    DEBUG_PRINT_ERROR("wrong params allocate_input_meta_buffer Hdr %p len %lu",
-                     bufferHdr,bytes);
-    return OMX_ErrorBadParameter;
-  }
+    unsigned index = 0;
+    if (!bufferHdr || bytes != sizeof(encoder_media_buffer_type)) {
+        DEBUG_PRINT_ERROR("wrong params allocate_input_meta_buffer Hdr %p len %lu",
+                bufferHdr,bytes);
+        return OMX_ErrorBadParameter;
+    }
 
-  if(!m_inp_mem_ptr && !mUseProxyColorFormat)
-    m_inp_mem_ptr = meta_buffer_hdr;
-  for(index = 0;((index < m_sInPortDef.nBufferCountActual) &&
-      meta_buffer_hdr[index].pBuffer); index++);
-  if(index == m_sInPortDef.nBufferCountActual)
-  {
-    DEBUG_PRINT_ERROR("All buffers are allocated input_meta_buffer");
-    return OMX_ErrorBadParameter;
-  }
-  if(mUseProxyColorFormat){
-    if(opaque_buffer_hdr[index]){
-      DEBUG_PRINT_ERROR("All buffers are allocated opaque_buffer_hdr");
-      return OMX_ErrorBadParameter;
+    if (!m_inp_mem_ptr && !mUseProxyColorFormat)
+        m_inp_mem_ptr = meta_buffer_hdr;
+    for (index = 0; ((index < m_sInPortDef.nBufferCountActual) &&
+                meta_buffer_hdr[index].pBuffer); index++);
+    if (index == m_sInPortDef.nBufferCountActual) {
+        DEBUG_PRINT_ERROR("All buffers are allocated input_meta_buffer");
+        return OMX_ErrorBadParameter;
     }
-    if(allocate_input_buffer(hComp,&opaque_buffer_hdr[index],
-       PORT_INDEX_IN,appData,m_sInPortDef.nBufferSize) != OMX_ErrorNone) {
-      DEBUG_PRINT_ERROR("All buffers are allocated opaque_buffer_hdr");
-      return OMX_ErrorBadParameter;
+    if (mUseProxyColorFormat) {
+        if (opaque_buffer_hdr[index]) {
+            DEBUG_PRINT_ERROR("All buffers are allocated opaque_buffer_hdr");
+            return OMX_ErrorBadParameter;
+        }
+        if (allocate_input_buffer(hComp,&opaque_buffer_hdr[index],
+                    PORT_INDEX_IN,appData,m_sInPortDef.nBufferSize) != OMX_ErrorNone) {
+            DEBUG_PRINT_ERROR("All buffers are allocated opaque_buffer_hdr");
+            return OMX_ErrorBadParameter;
+        }
     }
-  }
-  BITMASK_SET(&m_inp_bm_count,index);
-  *bufferHdr = &meta_buffer_hdr[index];
-  memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index]));
-  meta_buffer_hdr[index].nSize = sizeof(meta_buffer_hdr[index]);
-  meta_buffer_hdr[index].nAllocLen = bytes;
-  meta_buffer_hdr[index].nVersion.nVersion = OMX_SPEC_VERSION;
-  meta_buffer_hdr[index].nInputPortIndex = PORT_INDEX_IN;
-  meta_buffer_hdr[index].pBuffer = (OMX_U8*)&meta_buffers[index];
-  meta_buffer_hdr[index].pAppPrivate = appData;
-  if(mUseProxyColorFormat) {
-    m_opq_pmem_q.insert_entry((unsigned int)opaque_buffer_hdr[index],0,0);
-    DEBUG_PRINT_HIGH("\n opaque_buffer_hdr insert %p", opaque_buffer_hdr[index]);
-  }
-  return OMX_ErrorNone;
+    BITMASK_SET(&m_inp_bm_count,index);
+    *bufferHdr = &meta_buffer_hdr[index];
+    memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index]));
+    meta_buffer_hdr[index].nSize = sizeof(meta_buffer_hdr[index]);
+    meta_buffer_hdr[index].nAllocLen = bytes;
+    meta_buffer_hdr[index].nVersion.nVersion = OMX_SPEC_VERSION;
+    meta_buffer_hdr[index].nInputPortIndex = PORT_INDEX_IN;
+    meta_buffer_hdr[index].pBuffer = (OMX_U8*)&meta_buffers[index];
+    meta_buffer_hdr[index].pAppPrivate = appData;
+    if (mUseProxyColorFormat) {
+        m_opq_pmem_q.insert_entry((unsigned int)opaque_buffer_hdr[index],0,0);
+        DEBUG_PRINT_HIGH("\n opaque_buffer_hdr insert %p", opaque_buffer_hdr[index]);
+    }
+    return OMX_ErrorNone;
 }
 #endif
 /* ======================================================================
-FUNCTION
-  omx_venc::AllocateInputBuffer
+   FUNCTION
+   omx_venc::AllocateInputBuffer
 
-DESCRIPTION
-  Helper function for allocate buffer in the input pin
+   DESCRIPTION
+   Helper function for allocate buffer in the input pin
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::allocate_input_buffer(
-                                               OMX_IN OMX_HANDLETYPE            hComp,
-                                               OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                               OMX_IN OMX_U32                   port,
-                                               OMX_IN OMX_PTR                   appData,
-                                               OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned   i = 0;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned   i = 0;
 
-  DEBUG_PRINT_HIGH("\n allocate_input_buffer()::");
-  if(bytes != m_sInPortDef.nBufferSize)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Buffer size mismatch error: bytes[%lu] != nBufferSize[%lu]\n",
-      bytes, m_sInPortDef.nBufferSize);
-    return OMX_ErrorBadParameter;
-  }
-
-  if(!m_inp_mem_ptr)
-  {
-    DEBUG_PRINT_HIGH("%s: size = %lu, actual cnt %lu", __FUNCTION__,
-        m_sInPortDef.nBufferSize, m_sInPortDef.nBufferCountActual);
-    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
-                    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual);
-    if(m_inp_mem_ptr == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_inp_mem_ptr");
-      return OMX_ErrorInsufficientResources;
+    DEBUG_PRINT_HIGH("\n allocate_input_buffer()::");
+    if (bytes != m_sInPortDef.nBufferSize) {
+        DEBUG_PRINT_ERROR("\nERROR: Buffer size mismatch error: bytes[%lu] != nBufferSize[%lu]\n",
+                bytes, m_sInPortDef.nBufferSize);
+        return OMX_ErrorBadParameter;
     }
 
-    m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual);
+    if (!m_inp_mem_ptr) {
+        DEBUG_PRINT_HIGH("%s: size = %lu, actual cnt %lu", __FUNCTION__,
+                m_sInPortDef.nBufferSize, m_sInPortDef.nBufferCountActual);
+        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
+                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual);
+        if (m_inp_mem_ptr == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_inp_mem_ptr");
+            return OMX_ErrorInsufficientResources;
+        }
 
-    if(m_pInput_pmem == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_pmem");
-      return OMX_ErrorInsufficientResources;
-    }
+        m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual);
+
+        if (m_pInput_pmem == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_pmem");
+            return OMX_ErrorInsufficientResources;
+        }
 #ifdef USE_ION
-    m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual);
-    if(m_pInput_ion == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_ion");
-      return OMX_ErrorInsufficientResources;
-    }
+        m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual);
+        if (m_pInput_ion == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_ion");
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
-    for(i=0; i< m_sInPortDef.nBufferCountActual; i++)
-    {
-      m_pInput_pmem[i].fd = -1;
+        for (i=0; i< m_sInPortDef.nBufferCountActual; i++) {
+            m_pInput_pmem[i].fd = -1;
 #ifdef USE_ION
-      m_pInput_ion[i].ion_device_fd =-1;
-      m_pInput_ion[i].fd_ion_data.fd =-1;
-      m_pInput_ion[i].ion_alloc_data.handle=NULL;
+            m_pInput_ion[i].ion_device_fd =-1;
+            m_pInput_ion[i].fd_ion_data.fd =-1;
+            m_pInput_ion[i].ion_alloc_data.handle=NULL;
 #endif
+        }
     }
-  }
 
-  for(i=0; i< m_sInPortDef.nBufferCountActual; i++)
-  {
-    if(BITMASK_ABSENT(&m_inp_bm_count,i))
-    {
-      break;
+    for (i=0; i< m_sInPortDef.nBufferCountActual; i++) {
+        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+            break;
+        }
     }
-  }
-  if(i < m_sInPortDef.nBufferCountActual)
-  {
+    if (i < m_sInPortDef.nBufferCountActual) {
 
-    *bufferHdr = (m_inp_mem_ptr + i);
-    (*bufferHdr)->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
-    (*bufferHdr)->nVersion.nVersion = OMX_SPEC_VERSION;
-    (*bufferHdr)->nAllocLen         = m_sInPortDef.nBufferSize;
-    (*bufferHdr)->pAppPrivate       = appData;
-    (*bufferHdr)->nInputPortIndex   = PORT_INDEX_IN;
+        *bufferHdr = (m_inp_mem_ptr + i);
+        (*bufferHdr)->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
+        (*bufferHdr)->nVersion.nVersion = OMX_SPEC_VERSION;
+        (*bufferHdr)->nAllocLen         = m_sInPortDef.nBufferSize;
+        (*bufferHdr)->pAppPrivate       = appData;
+        (*bufferHdr)->nInputPortIndex   = PORT_INDEX_IN;
 
 #ifdef USE_ION
 #ifdef _MSM8974_
-    m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
-                                    &m_pInput_ion[i].ion_alloc_data,
-                                    &m_pInput_ion[i].fd_ion_data,0);
+        m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
+                &m_pInput_ion[i].ion_alloc_data,
+                &m_pInput_ion[i].fd_ion_data,0);
 #else
-    m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
-                                    &m_pInput_ion[i].ion_alloc_data,
-                                    &m_pInput_ion[i].fd_ion_data,ION_FLAG_CACHED);
+        m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
+                &m_pInput_ion[i].ion_alloc_data,
+                &m_pInput_ion[i].fd_ion_data,ION_FLAG_CACHED);
 #endif
-    if(m_pInput_ion[i].ion_device_fd < 0) {
-      DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
-      return OMX_ErrorInsufficientResources;
-    }
+        if (m_pInput_ion[i].ion_device_fd < 0) {
+            DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+            return OMX_ErrorInsufficientResources;
+        }
 
-    m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd;
+        m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd;
 #else
-    m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+        m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
 
-    if(m_pInput_pmem[i].fd == 0)
-    {
-      m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
-    }
+        if (m_pInput_pmem[i].fd == 0) {
+            m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+        }
 
-    if(m_pInput_pmem[i].fd < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed\n");
-      return OMX_ErrorInsufficientResources;
-    }
+        if (m_pInput_pmem[i].fd < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed\n");
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
-    m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
-    m_pInput_pmem[i].offset = 0;
+        m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
+        m_pInput_pmem[i].offset = 0;
 
-    m_pInput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE,
-                                                    MAP_SHARED,m_pInput_pmem[i].fd,0);
-    if(m_pInput_pmem[i].buffer == MAP_FAILED)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: mmap FAILED= %d\n", errno);
-      close(m_pInput_pmem[i].fd);
+        m_pInput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE,
+                MAP_SHARED,m_pInput_pmem[i].fd,0);
+        if (m_pInput_pmem[i].buffer == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("\nERROR: mmap FAILED= %d\n", errno);
+            close(m_pInput_pmem[i].fd);
 #ifdef USE_ION
-      free_ion_memory(&m_pInput_ion[i]);
+            free_ion_memory(&m_pInput_ion[i]);
 #endif
-      return OMX_ErrorInsufficientResources;
+            return OMX_ErrorInsufficientResources;
+        }
+
+        (*bufferHdr)->pBuffer           = (OMX_U8 *)m_pInput_pmem[i].buffer;
+        DEBUG_PRINT_LOW("\n Virtual address in allocate buffer is %p", m_pInput_pmem[i].buffer);
+        BITMASK_SET(&m_inp_bm_count,i);
+        //here change the I/P param here from buf_adr to pmem
+        if (!mUseProxyColorFormat && (dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true)) {
+            DEBUG_PRINT_ERROR("\nERROR: dev_use_buf FAILED for i/p buf\n");
+            return OMX_ErrorInsufficientResources;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: All i/p buffers are allocated, invalid allocate buf call"
+                "for index [%d]\n", i);
+        eRet = OMX_ErrorInsufficientResources;
     }
 
-    (*bufferHdr)->pBuffer           = (OMX_U8 *)m_pInput_pmem[i].buffer;
-    DEBUG_PRINT_LOW("\n Virtual address in allocate buffer is %p", m_pInput_pmem[i].buffer);
-    BITMASK_SET(&m_inp_bm_count,i);
-    //here change the I/P param here from buf_adr to pmem
-    if(!mUseProxyColorFormat && (dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true))
-    {
-      DEBUG_PRINT_ERROR("\nERROR: dev_use_buf FAILED for i/p buf\n");
-      return OMX_ErrorInsufficientResources;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: All i/p buffers are allocated, invalid allocate buf call"
-                      "for index [%d]\n", i);
-    eRet = OMX_ErrorInsufficientResources;
-  }
-
-  return eRet;
+    return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::AllocateOutputBuffer
+   FUNCTION
+   omx_venc::AllocateOutputBuffer
 
-DESCRIPTION
-  Helper fn for AllocateBuffer in the output pin
+   DESCRIPTION
+   Helper fn for AllocateBuffer in the output pin
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything went well.
+   RETURN VALUE
+   OMX Error None if everything went well.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::allocate_output_buffer(
-                                                OMX_IN OMX_HANDLETYPE            hComp,
-                                                OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                                OMX_IN OMX_U32                   port,
-                                                OMX_IN OMX_PTR                   appData,
-                                                OMX_IN OMX_U32                   bytes)
+        OMX_IN OMX_HANDLETYPE            hComp,
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                   port,
+        OMX_IN OMX_PTR                   appData,
+        OMX_IN OMX_U32                   bytes)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
-  unsigned                         i= 0; // Temporary counter
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
+    unsigned                         i= 0; // Temporary counter
 #ifdef _MSM8974_
-  int align_size;
+    int align_size;
 #endif
-  DEBUG_PRINT_HIGH("\n allocate_output_buffer()for %lu bytes", bytes);
-  if(!m_out_mem_ptr)
-  {
-    int nBufHdrSize        = 0;
-    DEBUG_PRINT_HIGH("%s: size = %lu, actual cnt %lu", __FUNCTION__,
-        m_sOutPortDef.nBufferSize, m_sOutPortDef.nBufferCountActual);
-    nBufHdrSize        = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE);
+    DEBUG_PRINT_HIGH("\n allocate_output_buffer()for %lu bytes", bytes);
+    if (!m_out_mem_ptr) {
+        int nBufHdrSize        = 0;
+        DEBUG_PRINT_HIGH("%s: size = %lu, actual cnt %lu", __FUNCTION__,
+                m_sOutPortDef.nBufferSize, m_sOutPortDef.nBufferCountActual);
+        nBufHdrSize        = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE);
 
-    /*
-     * Memory for output side involves the following:
-     * 1. Array of Buffer Headers
-     * 2. Bitmask array to hold the buffer allocation details
-     * In order to minimize the memory management entire allocation
-     * is done in one step.
-     */
-    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
+        /*
+         * Memory for output side involves the following:
+         * 1. Array of Buffer Headers
+         * 2. Bitmask array to hold the buffer allocation details
+         * In order to minimize the memory management entire allocation
+         * is done in one step.
+         */
+        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
 
 #ifdef USE_ION
-    m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual);
-    if(m_pOutput_ion == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_ion");
-      return OMX_ErrorInsufficientResources;
-    }
+        m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual);
+        if (m_pOutput_ion == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_ion");
+            return OMX_ErrorInsufficientResources;
+        }
 #endif
-    m_pOutput_pmem = (struct pmem *) calloc(sizeof(struct pmem), m_sOutPortDef.nBufferCountActual);
-    if(m_pOutput_pmem == NULL)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_pmem");
-      return OMX_ErrorInsufficientResources;
-    }
-    if(m_out_mem_ptr && m_pOutput_pmem)
-    {
-      bufHdr          =  m_out_mem_ptr;
+        m_pOutput_pmem = (struct pmem *) calloc(sizeof(struct pmem), m_sOutPortDef.nBufferCountActual);
+        if (m_pOutput_pmem == NULL) {
+            DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_pmem");
+            return OMX_ErrorInsufficientResources;
+        }
+        if (m_out_mem_ptr && m_pOutput_pmem) {
+            bufHdr          =  m_out_mem_ptr;
 
-      for(i=0; i < m_sOutPortDef.nBufferCountActual ; i++)
-      {
-        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
-        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
-        // Set the values when we determine the right HxW param
-        bufHdr->nAllocLen          = bytes;
-        bufHdr->nFilledLen         = 0;
-        bufHdr->pAppPrivate        = appData;
-        bufHdr->nOutputPortIndex   = PORT_INDEX_OUT;
-        bufHdr->pBuffer            = NULL;
-        bufHdr++;
-        m_pOutput_pmem[i].fd = -1;
+            for (i=0; i < m_sOutPortDef.nBufferCountActual ; i++) {
+                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
+                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
+                // Set the values when we determine the right HxW param
+                bufHdr->nAllocLen          = bytes;
+                bufHdr->nFilledLen         = 0;
+                bufHdr->pAppPrivate        = appData;
+                bufHdr->nOutputPortIndex   = PORT_INDEX_OUT;
+                bufHdr->pBuffer            = NULL;
+                bufHdr++;
+                m_pOutput_pmem[i].fd = -1;
 #ifdef USE_ION
-        m_pOutput_ion[i].ion_device_fd =-1;
-        m_pOutput_ion[i].fd_ion_data.fd=-1;
-        m_pOutput_ion[i].ion_alloc_data.handle =NULL;
+                m_pOutput_ion[i].ion_device_fd =-1;
+                m_pOutput_ion[i].fd_ion_data.fd=-1;
+                m_pOutput_ion[i].ion_alloc_data.handle =NULL;
 #endif
-      }
+            }
+        } else {
+            DEBUG_PRINT_ERROR("ERROR: calloc() failed for m_out_mem_ptr/m_pOutput_pmem");
+            eRet = OMX_ErrorInsufficientResources;
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: calloc() failed for m_out_mem_ptr/m_pOutput_pmem");
-      eRet = OMX_ErrorInsufficientResources;
-    }
-  }
 
-  DEBUG_PRINT_HIGH("\n actual cnt = %lu", m_sOutPortDef.nBufferCountActual);
-  for(i=0; i< m_sOutPortDef.nBufferCountActual; i++)
-  {
-    if(BITMASK_ABSENT(&m_out_bm_count,i))
-    {
-      DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
-      break;
+    DEBUG_PRINT_HIGH("\n actual cnt = %lu", m_sOutPortDef.nBufferCountActual);
+    for (i=0; i< m_sOutPortDef.nBufferCountActual; i++) {
+        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+            DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
+            break;
+        }
     }
-  }
-  if(eRet == OMX_ErrorNone)
-  {
-    if(i < m_sOutPortDef.nBufferCountActual)
-    {
+    if (eRet == OMX_ErrorNone) {
+        if (i < m_sOutPortDef.nBufferCountActual) {
 #ifdef USE_ION
 #ifdef _MSM8974_
-      align_size = ((m_sOutPortDef.nBufferSize + 4095)/4096) * 4096;
-      m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(align_size,
-                                       &m_pOutput_ion[i].ion_alloc_data,
-                                       &m_pOutput_ion[i].fd_ion_data,0);
+            align_size = ((m_sOutPortDef.nBufferSize + 4095)/4096) * 4096;
+            m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(align_size,
+                    &m_pOutput_ion[i].ion_alloc_data,
+                    &m_pOutput_ion[i].fd_ion_data,0);
 #else
-      m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sOutPortDef.nBufferSize,
-                                       &m_pOutput_ion[i].ion_alloc_data,
-                                       &m_pOutput_ion[i].fd_ion_data,ION_FLAG_CACHED);
+            m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sOutPortDef.nBufferSize,
+                    &m_pOutput_ion[i].ion_alloc_data,
+                    &m_pOutput_ion[i].fd_ion_data,ION_FLAG_CACHED);
 #endif
-      if(m_pOutput_ion[i].ion_device_fd < 0) {
-        DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
-        return OMX_ErrorInsufficientResources;
-      }
+            if (m_pOutput_ion[i].ion_device_fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+                return OMX_ErrorInsufficientResources;
+            }
 
-      m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd;
+            m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd;
 #else
-      m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
-      if(m_pOutput_pmem[i].fd == 0)
-      {
-        m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
-      }
+            m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+            if (m_pOutput_pmem[i].fd == 0) {
+                m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
+            }
 
-      if(m_pOutput_pmem[i].fd < 0)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() failed");
-        return OMX_ErrorInsufficientResources;
-      }
+            if (m_pOutput_pmem[i].fd < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() failed");
+                return OMX_ErrorInsufficientResources;
+            }
 #endif
-      m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
-      m_pOutput_pmem[i].offset = 0;
+            m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
+            m_pOutput_pmem[i].offset = 0;
 #ifdef _MSM8974_
-      m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,align_size,PROT_READ|PROT_WRITE,
-                                                       MAP_SHARED,m_pOutput_pmem[i].fd,0);
+            m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,align_size,PROT_READ|PROT_WRITE,
+                    MAP_SHARED,m_pOutput_pmem[i].fd,0);
 #else
-      m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE,
-                                                       MAP_SHARED,m_pOutput_pmem[i].fd,0);
+            m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE,
+                    MAP_SHARED,m_pOutput_pmem[i].fd,0);
 #endif
-      if(m_pOutput_pmem[i].buffer == MAP_FAILED)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: MMAP_FAILED in o/p alloc buffer");
-        close (m_pOutput_pmem[i].fd);
+            if (m_pOutput_pmem[i].buffer == MAP_FAILED) {
+                DEBUG_PRINT_ERROR("\nERROR: MMAP_FAILED in o/p alloc buffer");
+                close (m_pOutput_pmem[i].fd);
 #ifdef USE_ION
-        free_ion_memory(&m_pOutput_ion[i]);
+                free_ion_memory(&m_pOutput_ion[i]);
 #endif
-        return OMX_ErrorInsufficientResources;
-      }
+                return OMX_ErrorInsufficientResources;
+            }
 
-      *bufferHdr = (m_out_mem_ptr + i );
-      (*bufferHdr)->pBuffer = (OMX_U8 *)m_pOutput_pmem[i].buffer;
-      (*bufferHdr)->pAppPrivate = appData;
+            *bufferHdr = (m_out_mem_ptr + i );
+            (*bufferHdr)->pBuffer = (OMX_U8 *)m_pOutput_pmem[i].buffer;
+            (*bufferHdr)->pAppPrivate = appData;
 
-      BITMASK_SET(&m_out_bm_count,i);
+            BITMASK_SET(&m_out_bm_count,i);
 
-      if(dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: dev_use_buf FAILED for o/p buf");
-        return OMX_ErrorInsufficientResources;
-      }
+            if (dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true) {
+                DEBUG_PRINT_ERROR("\nERROR: dev_use_buf FAILED for o/p buf");
+                return OMX_ErrorInsufficientResources;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: All o/p buffers are allocated, invalid allocate buf call"
+                    "for index [%d] actual: %lu\n", i, m_sOutPortDef.nBufferCountActual);
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: All o/p buffers are allocated, invalid allocate buf call"
-                        "for index [%d] actual: %lu\n", i, m_sOutPortDef.nBufferCountActual);
-    }
-  }
 
-  return eRet;
+    return eRet;
 }
 
 
 // AllocateBuffer  -- API Call
 /* ======================================================================
-FUNCTION
-  omx_video::AllocateBuffer
+   FUNCTION
+   omx_video::AllocateBuffer
 
-DESCRIPTION
-  Returns zero if all the buffers released..
+   DESCRIPTION
+   Returns zero if all the buffers released..
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
-                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                          OMX_IN OMX_U32                        port,
-                                          OMX_IN OMX_PTR                     appData,
-                                          OMX_IN OMX_U32                       bytes)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN OMX_U32                       bytes)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
+    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
 
-  DEBUG_PRINT_LOW("\n Allocate buffer of size = %d on port %d \n", bytes, (int)port);
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Allocate Buf in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
+    DEBUG_PRINT_LOW("\n Allocate buffer of size = %d on port %d \n", bytes, (int)port);
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Allocate Buf in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  // What if the client calls again.
-  if(port == PORT_INDEX_IN)
-  {
+    // What if the client calls again.
+    if (port == PORT_INDEX_IN) {
 #ifdef _ANDROID_ICS_
-    if(meta_mode_enable)
-      eRet = allocate_input_meta_buffer(hComp,bufferHdr,appData,bytes);
-    else
+        if (meta_mode_enable)
+            eRet = allocate_input_meta_buffer(hComp,bufferHdr,appData,bytes);
+        else
 #endif
-      eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index received %d\n",(int)port);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
-  if(eRet == OMX_ErrorNone)
-  {
-    if(allocate_done())
-    {
-      if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-      {
-        // Send the callback now
-        BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
-        post_event(OMX_CommandStateSet,OMX_StateIdle,
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
+            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
+    } else if (port == PORT_INDEX_OUT) {
+        eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+    } else {
+        DEBUG_PRINT_ERROR("ERROR: Invalid Port Index received %d\n",(int)port);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    if(port == PORT_INDEX_IN && m_sInPortDef.bPopulated)
-    {
-      if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
-      {
-        BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
-        post_event(OMX_CommandPortEnable,
-                   PORT_INDEX_IN,
-                   OMX_COMPONENT_GENERATE_EVENT);
-      }
+    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
+    if (eRet == OMX_ErrorNone) {
+        if (allocate_done()) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                // Send the callback now
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+                post_event(OMX_CommandStateSet,OMX_StateIdle,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            }
+        }
+        if (port == PORT_INDEX_IN && m_sInPortDef.bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
+                        PORT_INDEX_IN,
+                        OMX_COMPONENT_GENERATE_EVENT);
+            }
+        }
+        if (port == PORT_INDEX_OUT && m_sOutPortDef.bPopulated) {
+            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+                post_event(OMX_CommandPortEnable,
+                        PORT_INDEX_OUT,
+                        OMX_COMPONENT_GENERATE_EVENT);
+                m_event_port_settings_sent = false;
+            }
+        }
     }
-    if(port == PORT_INDEX_OUT && m_sOutPortDef.bPopulated)
-    {
-      if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
-      {
-        BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
-        post_event(OMX_CommandPortEnable,
-                   PORT_INDEX_OUT,
-                   OMX_COMPONENT_GENERATE_EVENT);
-        m_event_port_settings_sent = false;
-      }
-    }
-  }
-  DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
-  return eRet;
+    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
+    return eRet;
 }
 
 
 // Free Buffer - API call
 /* ======================================================================
-FUNCTION
-  omx_video::FreeBuffer
+   FUNCTION
+   omx_video::FreeBuffer
 
-DESCRIPTION
+   DESCRIPTION
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                      OMX_IN OMX_U32                 port,
-                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_U32                 port,
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  unsigned int nPortIndex;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    unsigned int nPortIndex;
 
-  DEBUG_PRINT_LOW("In for encoder free_buffer \n");
+    DEBUG_PRINT_LOW("In for encoder free_buffer \n");
 
-  if(m_state == OMX_StateIdle &&
-     (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-  {
-    DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
-  }
-  else if((m_sInPortDef.bEnabled == OMX_FALSE && port == PORT_INDEX_IN)||
-          (m_sOutPortDef.bEnabled == OMX_FALSE && port == PORT_INDEX_OUT))
-  {
-    DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
-  }
-  else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,ports need to be disabled\n");
-    post_event(OMX_EventError,
-               OMX_ErrorPortUnpopulated,
-               OMX_COMPONENT_GENERATE_EVENT);
+    if (m_state == OMX_StateIdle &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
+        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
+    } else if ((m_sInPortDef.bEnabled == OMX_FALSE && port == PORT_INDEX_IN)||
+            (m_sOutPortDef.bEnabled == OMX_FALSE && port == PORT_INDEX_OUT)) {
+        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
+    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
+        DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,ports need to be disabled\n");
+        post_event(OMX_EventError,
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
+        return eRet;
+    } else {
+        DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,port lost Buffers\n");
+        post_event(OMX_EventError,
+                OMX_ErrorPortUnpopulated,
+                OMX_COMPONENT_GENERATE_EVENT);
+    }
+
+    if (port == PORT_INDEX_IN) {
+        // check if the buffer is valid
+        nPortIndex = buffer - ((!mUseProxyColorFormat)?m_inp_mem_ptr:meta_buffer_hdr);
+
+        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d, actual cnt %d \n",
+                nPortIndex, m_sInPortDef.nBufferCountActual);
+        if (nPortIndex < m_sInPortDef.nBufferCountActual) {
+            // Clear the bit associated with it.
+            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
+            free_input_buffer (buffer);
+            m_sInPortDef.bPopulated = OMX_FALSE;
+
+            /*Free the Buffer Header*/
+            if (release_input_done()
+#ifdef _ANDROID_ICS_
+                    && !meta_mode_enable
+#endif
+               ) {
+                input_use_buffer = false;
+                if (m_inp_mem_ptr) {
+                    DEBUG_PRINT_LOW("Freeing m_inp_mem_ptr\n");
+                    free (m_inp_mem_ptr);
+                    m_inp_mem_ptr = NULL;
+                }
+                if (m_pInput_pmem) {
+                    DEBUG_PRINT_LOW("Freeing m_pInput_pmem\n");
+                    free(m_pInput_pmem);
+                    m_pInput_pmem = NULL;
+                }
+#ifdef USE_ION
+                if (m_pInput_ion) {
+                    DEBUG_PRINT_LOW("Freeing m_pInput_ion\n");
+                    free(m_pInput_ion);
+                    m_pInput_ion = NULL;
+                }
+#endif
+            }
+        } else {
+            DEBUG_PRINT_ERROR("ERROR: free_buffer ,Port Index Invalid\n");
+            eRet = OMX_ErrorBadPortIndex;
+        }
+
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
+                && release_input_done()) {
+            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
+            post_event(OMX_CommandPortDisable,
+                    PORT_INDEX_IN,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        }
+    } else if (port == PORT_INDEX_OUT) {
+        // check if the buffer is valid
+        nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr;
+
+        DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d, actual cnt %d \n",
+                nPortIndex, m_sOutPortDef.nBufferCountActual);
+        if (nPortIndex < m_sOutPortDef.nBufferCountActual) {
+            // Clear the bit associated with it.
+            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
+            m_sOutPortDef.bPopulated = OMX_FALSE;
+            free_output_buffer (buffer);
+
+            if (release_output_done()) {
+                output_use_buffer = false;
+                if (m_out_mem_ptr) {
+                    DEBUG_PRINT_LOW("Freeing m_out_mem_ptr\n");
+                    free (m_out_mem_ptr);
+                    m_out_mem_ptr = NULL;
+                }
+                if (m_pOutput_pmem) {
+                    DEBUG_PRINT_LOW("Freeing m_pOutput_pmem\n");
+                    free(m_pOutput_pmem);
+                    m_pOutput_pmem = NULL;
+                }
+#ifdef USE_ION
+                if (m_pOutput_ion) {
+                    DEBUG_PRINT_LOW("Freeing m_pOutput_ion\n");
+                    free(m_pOutput_ion);
+                    m_pOutput_ion = NULL;
+                }
+#endif
+            }
+        } else {
+            DEBUG_PRINT_ERROR("ERROR: free_buffer , Port Index Invalid\n");
+            eRet = OMX_ErrorBadPortIndex;
+        }
+        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
+                && release_output_done() ) {
+            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
+
+            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+            post_event(OMX_CommandPortDisable,
+                    PORT_INDEX_OUT,
+                    OMX_COMPONENT_GENERATE_EVENT);
+
+        }
+    } else {
+        eRet = OMX_ErrorBadPortIndex;
+    }
+    if ((eRet == OMX_ErrorNone) &&
+            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
+        if (release_done()) {
+            if (dev_stop() != 0) {
+                DEBUG_PRINT_ERROR("ERROR: dev_stop() FAILED\n");
+                eRet = OMX_ErrorHardware;
+            }
+            // Send the callback now
+            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
+            post_event(OMX_CommandStateSet, OMX_StateLoaded,
+                    OMX_COMPONENT_GENERATE_EVENT);
+        } else {
+            DEBUG_PRINT_HIGH("in free buffer, release not done, need to free more buffers input 0x%x output 0x%x",
+                    m_out_bm_count, m_inp_bm_count);
+        }
+    }
+
     return eRet;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,port lost Buffers\n");
-    post_event(OMX_EventError,
-               OMX_ErrorPortUnpopulated,
-               OMX_COMPONENT_GENERATE_EVENT);
-  }
-
-  if(port == PORT_INDEX_IN)
-  {
-    // check if the buffer is valid
-    nPortIndex = buffer - ((!mUseProxyColorFormat)?m_inp_mem_ptr:meta_buffer_hdr);
-
-    DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d, actual cnt %d \n",
-                    nPortIndex, m_sInPortDef.nBufferCountActual);
-    if(nPortIndex < m_sInPortDef.nBufferCountActual)
-    {
-      // Clear the bit associated with it.
-      BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
-      free_input_buffer (buffer);
-      m_sInPortDef.bPopulated = OMX_FALSE;
-
-      /*Free the Buffer Header*/
-      if(release_input_done()
-#ifdef _ANDROID_ICS_
-         && !meta_mode_enable
-#endif
-         )
-      {
-        input_use_buffer = false;
-        if(m_inp_mem_ptr)
-        {
-          DEBUG_PRINT_LOW("Freeing m_inp_mem_ptr\n");
-          free (m_inp_mem_ptr);
-          m_inp_mem_ptr = NULL;
-        }
-        if(m_pInput_pmem)
-        {
-          DEBUG_PRINT_LOW("Freeing m_pInput_pmem\n");
-          free(m_pInput_pmem);
-          m_pInput_pmem = NULL;
-        }
-#ifdef USE_ION
-        if(m_pInput_ion)
-        {
-          DEBUG_PRINT_LOW("Freeing m_pInput_ion\n");
-          free(m_pInput_ion);
-          m_pInput_ion = NULL;
-        }
-#endif
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: free_buffer ,Port Index Invalid\n");
-      eRet = OMX_ErrorBadPortIndex;
-    }
-
-    if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
-       && release_input_done())
-    {
-      DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
-      post_event(OMX_CommandPortDisable,
-                 PORT_INDEX_IN,
-                 OMX_COMPONENT_GENERATE_EVENT);
-    }
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    // check if the buffer is valid
-    nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr;
-
-    DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d, actual cnt %d \n",
-                    nPortIndex, m_sOutPortDef.nBufferCountActual);
-    if(nPortIndex < m_sOutPortDef.nBufferCountActual)
-    {
-      // Clear the bit associated with it.
-      BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
-      m_sOutPortDef.bPopulated = OMX_FALSE;
-      free_output_buffer (buffer);
-
-      if(release_output_done())
-      {
-        output_use_buffer = false;
-        if(m_out_mem_ptr)
-        {
-          DEBUG_PRINT_LOW("Freeing m_out_mem_ptr\n");
-          free (m_out_mem_ptr);
-          m_out_mem_ptr = NULL;
-        }
-        if(m_pOutput_pmem)
-        {
-          DEBUG_PRINT_LOW("Freeing m_pOutput_pmem\n");
-          free(m_pOutput_pmem);
-          m_pOutput_pmem = NULL;
-        }
-#ifdef USE_ION
-        if(m_pOutput_ion)
-        {
-          DEBUG_PRINT_LOW("Freeing m_pOutput_ion\n");
-          free(m_pOutput_ion);
-          m_pOutput_ion = NULL;
-        }
-#endif
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("ERROR: free_buffer , Port Index Invalid\n");
-      eRet = OMX_ErrorBadPortIndex;
-    }
-    if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
-       && release_output_done() )
-    {
-      DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
-
-      DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
-      post_event(OMX_CommandPortDisable,
-                 PORT_INDEX_OUT,
-                 OMX_COMPONENT_GENERATE_EVENT);
-
-    }
-  }
-  else
-  {
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  if((eRet == OMX_ErrorNone) &&
-     (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
-  {
-    if(release_done())
-    {
-      if(dev_stop() != 0)
-      {
-        DEBUG_PRINT_ERROR("ERROR: dev_stop() FAILED\n");
-        eRet = OMX_ErrorHardware;
-      }
-      // Send the callback now
-      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
-      post_event(OMX_CommandStateSet, OMX_StateLoaded,
-                 OMX_COMPONENT_GENERATE_EVENT);
-    } else {
-      DEBUG_PRINT_HIGH("in free buffer, release not done, need to free more buffers input 0x%x output 0x%x",
-                       m_out_bm_count, m_inp_bm_count);
-    }
-  }
-
-  return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_video::EmptyThisBuffer
+   FUNCTION
+   omx_video::EmptyThisBuffer
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
-                                            OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
-  unsigned int nBufferIndex ;
+    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
+    unsigned int nBufferIndex ;
 
-  DEBUG_PRINT_LOW("\n ETB: buffer = %p, buffer->pBuffer[%p]\n", buffer, buffer->pBuffer);
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Empty this buffer in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
+    DEBUG_PRINT_LOW("\n ETB: buffer = %p, buffer->pBuffer[%p]\n", buffer, buffer->pBuffer);
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Empty this buffer in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (buffer == NULL || (buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)))
-  {
-    DEBUG_PRINT_ERROR("\nERROR: omx_video::etb--> buffer is null or buffer size is invalid");
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL || (buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE))) {
+        DEBUG_PRINT_ERROR("\nERROR: omx_video::etb--> buffer is null or buffer size is invalid");
+        return OMX_ErrorBadParameter;
+    }
 
-  if(buffer->nVersion.nVersion != OMX_SPEC_VERSION)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: omx_video::etb--> OMX Version Invalid");
-    return OMX_ErrorVersionMismatch;
-  }
+    if (buffer->nVersion.nVersion != OMX_SPEC_VERSION) {
+        DEBUG_PRINT_ERROR("\nERROR: omx_video::etb--> OMX Version Invalid");
+        return OMX_ErrorVersionMismatch;
+    }
 
-  if (buffer->nInputPortIndex != (OMX_U32)PORT_INDEX_IN)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Bad port index to call empty_this_buffer");
-    return OMX_ErrorBadPortIndex;
-  }
-  if(!m_sInPortDef.bEnabled)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Cannot call empty_this_buffer while I/P port is disabled");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (buffer->nInputPortIndex != (OMX_U32)PORT_INDEX_IN) {
+        DEBUG_PRINT_ERROR("\nERROR: Bad port index to call empty_this_buffer");
+        return OMX_ErrorBadPortIndex;
+    }
+    if (!m_sInPortDef.bEnabled) {
+        DEBUG_PRINT_ERROR("\nERROR: Cannot call empty_this_buffer while I/P port is disabled");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  nBufferIndex = buffer - ((!mUseProxyColorFormat)?m_inp_mem_ptr:meta_buffer_hdr);
+    nBufferIndex = buffer - ((!mUseProxyColorFormat)?m_inp_mem_ptr:meta_buffer_hdr);
 
-  if(nBufferIndex > m_sInPortDef.nBufferCountActual )
-  {
-    DEBUG_PRINT_ERROR("ERROR: ETB: Invalid buffer index[%d]\n", nBufferIndex);
-    return OMX_ErrorBadParameter;
-  }
+    if (nBufferIndex > m_sInPortDef.nBufferCountActual ) {
+        DEBUG_PRINT_ERROR("ERROR: ETB: Invalid buffer index[%d]\n", nBufferIndex);
+        return OMX_ErrorBadParameter;
+    }
 
-  m_etb_count++;
-  DEBUG_PRINT_LOW("\n DBG: i/p nTimestamp = %u", (unsigned)buffer->nTimeStamp);
-  post_event ((unsigned)hComp,(unsigned)buffer,m_input_msg_id);
-  return OMX_ErrorNone;
+    m_etb_count++;
+    DEBUG_PRINT_LOW("\n DBG: i/p nTimestamp = %u", (unsigned)buffer->nTimeStamp);
+    post_event ((unsigned)hComp,(unsigned)buffer,m_input_msg_id);
+    return OMX_ErrorNone;
 }
 /* ======================================================================
-FUNCTION
-  omx_video::empty_this_buffer_proxy
+   FUNCTION
+   omx_video::empty_this_buffer_proxy
 
-DESCRIPTION
-  This routine is used to push the encoded video frames to
-  the video decoder.
+   DESCRIPTION
+   This routine is used to push the encoded video frames to
+   the video decoder.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything went successful.
+   RETURN VALUE
+   OMX Error None if everything went successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
-                                                  OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  OMX_U8 *pmem_data_buf = NULL;
-  int push_cnt = 0;
-  unsigned nBufIndex = 0, nBufIndex_meta = 0;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  encoder_media_buffer_type *media_buffer;
+    OMX_U8 *pmem_data_buf = NULL;
+    int push_cnt = 0;
+    unsigned nBufIndex = 0, nBufIndex_meta = 0;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    encoder_media_buffer_type *media_buffer;
 
 #ifdef _MSM8974_
-  int fd = 0;
+    int fd = 0;
 #endif
-  DEBUG_PRINT_LOW("\n ETBProxy: buffer->pBuffer[%p]\n", buffer->pBuffer);
-  if(buffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Invalid buffer[%p]\n", buffer);
-    return OMX_ErrorBadParameter;
-  }
-  nBufIndex = buffer - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
-  nBufIndex_meta = buffer - meta_buffer_hdr;
-  media_buffer = (encoder_media_buffer_type *)meta_buffer_hdr[nBufIndex].pBuffer;
-  if(nBufIndex >= m_sInPortDef.nBufferCountActual &&
-     nBufIndex_meta >= m_sInPortDef.nBufferCountActual)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Invalid bufindex = %u\n", nBufIndex);
-    return OMX_ErrorBadParameter;
-  }
-  pending_input_buffers++;
-  if(input_flush_progress == true)
-  {
-    post_event ((unsigned int)buffer,0,
+    DEBUG_PRINT_LOW("\n ETBProxy: buffer->pBuffer[%p]\n", buffer->pBuffer);
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Invalid buffer[%p]\n", buffer);
+        return OMX_ErrorBadParameter;
+    }
+    nBufIndex = buffer - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+    nBufIndex_meta = buffer - meta_buffer_hdr;
+    media_buffer = (encoder_media_buffer_type *)meta_buffer_hdr[nBufIndex].pBuffer;
+    if (nBufIndex >= m_sInPortDef.nBufferCountActual &&
+            nBufIndex_meta >= m_sInPortDef.nBufferCountActual) {
+        DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Invalid bufindex = %u\n", nBufIndex);
+        return OMX_ErrorBadParameter;
+    }
+    pending_input_buffers++;
+    if (input_flush_progress == true) {
+        post_event ((unsigned int)buffer,0,
                 OMX_COMPONENT_GENERATE_EBD);
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Input flush in progress");
-    return OMX_ErrorNone;
-  }
+        DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Input flush in progress");
+        return OMX_ErrorNone;
+    }
 #ifdef _MSM8974_
-  if(!meta_mode_enable ||
-     (media_buffer && media_buffer->buffer_type == kMetadataBufferTypeGrallocSource)) {
-    fd = m_pInput_pmem[nBufIndex].fd;
-  }
+    if (!meta_mode_enable ||
+            (media_buffer && media_buffer->buffer_type == kMetadataBufferTypeGrallocSource)) {
+        fd = m_pInput_pmem[nBufIndex].fd;
+    }
 #endif
 #ifdef _ANDROID_ICS_
-  if(meta_mode_enable && !mUseProxyColorFormat)
-  {
-    bool met_error = false;
-    if(media_buffer)
-    {
-      if (media_buffer->buffer_type != kMetadataBufferTypeCameraSource &&
-          media_buffer->buffer_type != kMetadataBufferTypeGrallocSource)
-          met_error = true;
-      else {
-        if(media_buffer->buffer_type == kMetadataBufferTypeCameraSource)
-        {
-          if(media_buffer->meta_handle == NULL)
+    if (meta_mode_enable && !mUseProxyColorFormat) {
+        bool met_error = false;
+        if (media_buffer) {
+            if (media_buffer->buffer_type != kMetadataBufferTypeCameraSource &&
+                    media_buffer->buffer_type != kMetadataBufferTypeGrallocSource)
+                met_error = true;
+            else {
+                if (media_buffer->buffer_type == kMetadataBufferTypeCameraSource) {
+                    if (media_buffer->meta_handle == NULL)
+                        met_error = true;
+                    else if ((media_buffer->meta_handle->numFds != 1 &&
+                                media_buffer->meta_handle->numInts != 2))
+                        met_error = true;
+                }
+            }
+        } else
             met_error = true;
-          else if((media_buffer->meta_handle->numFds != 1 &&
-                   media_buffer->meta_handle->numInts != 2))
-            met_error = true;
+        if (met_error) {
+            DEBUG_PRINT_ERROR("\nERROR: Unkown source/metahandle in ETB call");
+            post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
+            return OMX_ErrorBadParameter;
         }
-      }
-    } else
-      met_error = true;
-    if(met_error)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Unkown source/metahandle in ETB call");
-      post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
-      return OMX_ErrorBadParameter;
-    }
-    struct pmem Input_pmem_info;
-    if(media_buffer->buffer_type == kMetadataBufferTypeCameraSource)
-    {
-      Input_pmem_info.buffer = media_buffer;
-      Input_pmem_info.fd = media_buffer->meta_handle->data[0];
+        struct pmem Input_pmem_info;
+        if (media_buffer->buffer_type == kMetadataBufferTypeCameraSource) {
+            Input_pmem_info.buffer = media_buffer;
+            Input_pmem_info.fd = media_buffer->meta_handle->data[0];
 #ifdef _MSM8974_
-      fd = Input_pmem_info.fd;
+            fd = Input_pmem_info.fd;
 #endif
-      Input_pmem_info.offset = media_buffer->meta_handle->data[1];
-      Input_pmem_info.size = media_buffer->meta_handle->data[2];
-      DEBUG_PRINT_LOW("ETB fd = %d, offset = %d, size = %d",Input_pmem_info.fd,
-                        Input_pmem_info.offset,
-                        Input_pmem_info.size);
-    } else {
-      private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
-      Input_pmem_info.buffer = media_buffer;
-      Input_pmem_info.fd = handle->fd;
+            Input_pmem_info.offset = media_buffer->meta_handle->data[1];
+            Input_pmem_info.size = media_buffer->meta_handle->data[2];
+            DEBUG_PRINT_LOW("ETB fd = %d, offset = %d, size = %d",Input_pmem_info.fd,
+                    Input_pmem_info.offset,
+                    Input_pmem_info.size);
+        } else {
+            private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
+            Input_pmem_info.buffer = media_buffer;
+            Input_pmem_info.fd = handle->fd;
 #ifdef _MSM8974_
-      fd = Input_pmem_info.fd;
+            fd = Input_pmem_info.fd;
 #endif
-      Input_pmem_info.offset = 0;
-      Input_pmem_info.size = handle->size;
-    }
-    if(dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,0) != true) {
-      DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
-      post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
-      return OMX_ErrorBadParameter;
-    }
-  }
-  else if(input_use_buffer && !m_use_input_pmem)
+            Input_pmem_info.offset = 0;
+            Input_pmem_info.size = handle->size;
+        }
+        if (dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,0) != true) {
+            DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
+            post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
+            return OMX_ErrorBadParameter;
+        }
+    } else if (input_use_buffer && !m_use_input_pmem)
 #else
-  if(input_use_buffer && !m_use_input_pmem)
+        if (input_use_buffer && !m_use_input_pmem)
 #endif
-  {
-    DEBUG_PRINT_LOW("\n Heap UseBuffer case, so memcpy the data");
-    pmem_data_buf = (OMX_U8 *)m_pInput_pmem[nBufIndex].buffer;
-    memcpy (pmem_data_buf, (buffer->pBuffer + buffer->nOffset),
-            buffer->nFilledLen);
-    DEBUG_PRINT_LOW("memcpy() done in ETBProxy for i/p Heap UseBuf");
-  } else if (mUseProxyColorFormat) {
-    fd = m_pInput_pmem[nBufIndex].fd;
-  }
+        {
+            DEBUG_PRINT_LOW("\n Heap UseBuffer case, so memcpy the data");
+            pmem_data_buf = (OMX_U8 *)m_pInput_pmem[nBufIndex].buffer;
+            memcpy (pmem_data_buf, (buffer->pBuffer + buffer->nOffset),
+                    buffer->nFilledLen);
+            DEBUG_PRINT_LOW("memcpy() done in ETBProxy for i/p Heap UseBuf");
+        } else if (mUseProxyColorFormat) {
+            fd = m_pInput_pmem[nBufIndex].fd;
+        }
 #ifdef _MSM8974_
-  if(dev_empty_buf(buffer, pmem_data_buf,nBufIndex,fd) != true)
+    if (dev_empty_buf(buffer, pmem_data_buf,nBufIndex,fd) != true)
 #else
-  if(dev_empty_buf(buffer, pmem_data_buf,0,0) != true)
+        if (dev_empty_buf(buffer, pmem_data_buf,0,0) != true)
 #endif
-  {
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxy: dev_empty_buf failed");
+        {
+            DEBUG_PRINT_ERROR("\nERROR: ETBProxy: dev_empty_buf failed");
 #ifdef _ANDROID_ICS_
-    omx_release_meta_buffer(buffer);
+            omx_release_meta_buffer(buffer);
 #endif
-    post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
-    /*Generate an async error and move to invalid state*/
-    pending_input_buffers--;
-    return OMX_ErrorBadParameter;
-  }
-  return ret;
+            post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
+            /*Generate an async error and move to invalid state*/
+            pending_input_buffers--;
+            return OMX_ErrorBadParameter;
+        }
+    return ret;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_video::FillThisBuffer
+   FUNCTION
+   omx_video::FillThisBuffer
 
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
-                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  DEBUG_PRINT_LOW("\n FTB: buffer->pBuffer[%p]\n", buffer->pBuffer);
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: FTB in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
+    DEBUG_PRINT_LOW("\n FTB: buffer->pBuffer[%p]\n", buffer->pBuffer);
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: FTB in Invalid State\n");
+        return OMX_ErrorInvalidState;
+    }
 
-  if (buffer == NULL ||(buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)))
-  {
-    DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->Invalid buffer or size\n");
-    return OMX_ErrorBadParameter;
-  }
+    if (buffer == NULL ||(buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE))) {
+        DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->Invalid buffer or size\n");
+        return OMX_ErrorBadParameter;
+    }
 
-  if(buffer->nVersion.nVersion != OMX_SPEC_VERSION)
-  {
-    DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->OMX Version Invalid\n");
-    return OMX_ErrorVersionMismatch;
-  }
+    if (buffer->nVersion.nVersion != OMX_SPEC_VERSION) {
+        DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->OMX Version Invalid\n");
+        return OMX_ErrorVersionMismatch;
+    }
 
-  if (buffer->nOutputPortIndex != (OMX_U32)PORT_INDEX_OUT)
-  {
-    DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->Bad port index\n");
-    return OMX_ErrorBadPortIndex;
-  }
+    if (buffer->nOutputPortIndex != (OMX_U32)PORT_INDEX_OUT) {
+        DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->Bad port index\n");
+        return OMX_ErrorBadPortIndex;
+    }
 
-  if(!m_sOutPortDef.bEnabled)
-  {
-    DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->port is disabled\n");
-    return OMX_ErrorIncorrectStateOperation;
-  }
+    if (!m_sOutPortDef.bEnabled) {
+        DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->port is disabled\n");
+        return OMX_ErrorIncorrectStateOperation;
+    }
 
-  post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB);
-  return OMX_ErrorNone;
-}
-
-/* ======================================================================
-FUNCTION
-  omx_video::fill_this_buffer_proxy
-
-DESCRIPTION
-  IL client uses this method to release the frame buffer
-  after displaying them.
-
-PARAMETERS
-  None.
-
-RETURN VALUE
-  true/false
-
-========================================================================== */
-OMX_ERRORTYPE  omx_video::fill_this_buffer_proxy(
-                                                OMX_IN OMX_HANDLETYPE        hComp,
-                                                OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
-{
-  OMX_U8 *pmem_data_buf = NULL;
-  OMX_ERRORTYPE nRet = OMX_ErrorNone;
-
-  DEBUG_PRINT_LOW("\n FTBProxy: bufferAdd->pBuffer[%p]\n", bufferAdd->pBuffer);
-
-  if(bufferAdd == NULL || ((bufferAdd - m_out_mem_ptr) >= m_sOutPortDef.nBufferCountActual) )
-  {
-    DEBUG_PRINT_ERROR("\nERROR: FTBProxy: Invalid i/p params\n");
-    return OMX_ErrorBadParameter;
-  }
-
-  pending_output_buffers++;
-  /*Return back the output buffer to client*/
-  if( m_sOutPortDef.bEnabled != OMX_TRUE || output_flush_progress == true)
-  {
-    DEBUG_PRINT_LOW("\n o/p port is Disabled or Flush in Progress");
-    post_event ((unsigned int)bufferAdd,0,
-                OMX_COMPONENT_GENERATE_FBD);
+    post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB);
     return OMX_ErrorNone;
-  }
-
-  if(output_use_buffer && !m_use_output_pmem)
-  {
-    DEBUG_PRINT_LOW("\n Heap UseBuffer case");
-    pmem_data_buf = (OMX_U8 *)m_pOutput_pmem[bufferAdd - m_out_mem_ptr].buffer;
-  }
-
-  if(dev_fill_buf(bufferAdd, pmem_data_buf,(bufferAdd - m_out_mem_ptr),m_pOutput_pmem[bufferAdd - m_out_mem_ptr].fd) != true)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: dev_fill_buf() Failed");
-    post_event ((unsigned int)bufferAdd,0,OMX_COMPONENT_GENERATE_FBD);
-    pending_output_buffers--;
-    return OMX_ErrorBadParameter;
-  }
-
-  return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_video::SetCallbacks
+   FUNCTION
+   omx_video::fill_this_buffer_proxy
 
-DESCRIPTION
-  Set the callbacks.
+   DESCRIPTION
+   IL client uses this method to release the frame buffer
+   after displaying them.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
+OMX_ERRORTYPE  omx_video::fill_this_buffer_proxy(
+        OMX_IN OMX_HANDLETYPE        hComp,
+        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
+{
+    OMX_U8 *pmem_data_buf = NULL;
+    OMX_ERRORTYPE nRet = OMX_ErrorNone;
+
+    DEBUG_PRINT_LOW("\n FTBProxy: bufferAdd->pBuffer[%p]\n", bufferAdd->pBuffer);
+
+    if (bufferAdd == NULL || ((bufferAdd - m_out_mem_ptr) >= m_sOutPortDef.nBufferCountActual) ) {
+        DEBUG_PRINT_ERROR("\nERROR: FTBProxy: Invalid i/p params\n");
+        return OMX_ErrorBadParameter;
+    }
+
+    pending_output_buffers++;
+    /*Return back the output buffer to client*/
+    if ( m_sOutPortDef.bEnabled != OMX_TRUE || output_flush_progress == true) {
+        DEBUG_PRINT_LOW("\n o/p port is Disabled or Flush in Progress");
+        post_event ((unsigned int)bufferAdd,0,
+                OMX_COMPONENT_GENERATE_FBD);
+        return OMX_ErrorNone;
+    }
+
+    if (output_use_buffer && !m_use_output_pmem) {
+        DEBUG_PRINT_LOW("\n Heap UseBuffer case");
+        pmem_data_buf = (OMX_U8 *)m_pOutput_pmem[bufferAdd - m_out_mem_ptr].buffer;
+    }
+
+    if (dev_fill_buf(bufferAdd, pmem_data_buf,(bufferAdd - m_out_mem_ptr),m_pOutput_pmem[bufferAdd - m_out_mem_ptr].fd) != true) {
+        DEBUG_PRINT_ERROR("\nERROR: dev_fill_buf() Failed");
+        post_event ((unsigned int)bufferAdd,0,OMX_COMPONENT_GENERATE_FBD);
+        pending_output_buffers--;
+        return OMX_ErrorBadParameter;
+    }
+
+    return OMX_ErrorNone;
+}
+
+/* ======================================================================
+   FUNCTION
+   omx_video::SetCallbacks
+
+   DESCRIPTION
+   Set the callbacks.
+
+   PARAMETERS
+   None.
+
+   RETURN VALUE
+   OMX Error None if everything successful.
+
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
-                                        OMX_IN OMX_CALLBACKTYPE* callbacks,
-                                        OMX_IN OMX_PTR             appData)
+        OMX_IN OMX_CALLBACKTYPE* callbacks,
+        OMX_IN OMX_PTR             appData)
 {
 
-  m_pCallbacks       = *callbacks;
-  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_pCallbacks.EmptyBufferDone,\
-               m_pCallbacks.EventHandler,m_pCallbacks.FillBufferDone);
-  m_app_data =    appData;
-  return OMX_ErrorNotImplemented;
+    m_pCallbacks       = *callbacks;
+    DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_pCallbacks.EmptyBufferDone,\
+            m_pCallbacks.EventHandler,m_pCallbacks.FillBufferDone);
+    m_app_data =    appData;
+    return OMX_ErrorNotImplemented;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::UseEGLImage
+   FUNCTION
+   omx_venc::UseEGLImage
 
-DESCRIPTION
-  OMX Use EGL Image method implementation <TBD>.
+   DESCRIPTION
+   OMX Use EGL Image method implementation <TBD>.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  Not Implemented error.
+   RETURN VALUE
+   Not Implemented error.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
-                                        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
-                                        OMX_IN OMX_U32                        port,
-                                        OMX_IN OMX_PTR                     appData,
-                                        OMX_IN void*                      eglImage)
+        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+        OMX_IN OMX_U32                        port,
+        OMX_IN OMX_PTR                     appData,
+        OMX_IN void*                      eglImage)
 {
-  DEBUG_PRINT_ERROR("ERROR: use_EGL_image:  Not Implemented \n");
-  return OMX_ErrorNotImplemented;
+    DEBUG_PRINT_ERROR("ERROR: use_EGL_image:  Not Implemented \n");
+    return OMX_ErrorNotImplemented;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::ComponentRoleEnum
+   FUNCTION
+   omx_venc::ComponentRoleEnum
 
-DESCRIPTION
-  OMX Component Role Enum method implementation.
+   DESCRIPTION
+   OMX Component Role Enum method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything is successful.
-========================================================================== */
+   RETURN VALUE
+   OMX Error None if everything is successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
-                                              OMX_OUT OMX_U8*        role,
-                                              OMX_IN OMX_U32        index)
+        OMX_OUT OMX_U8*        role,
+        OMX_IN OMX_U32        index)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
     }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
+    if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
     }
-  }
-  else if(!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
 #ifdef _MSM8974_
-  else if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-  {
-    if((0 == index) && role)
-    {
-      strlcpy((char *)role, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+    else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+        if ((0 == index) && role) {
+            strlcpy((char *)role, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+        } else {
+            DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
+            eRet = OMX_ErrorNoMore;
+        }
     }
-    else
-    {
-      DEBUG_PRINT_ERROR("\nERROR: No more roles \n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
 #endif
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Querying Role on Unknown Component\n");
-    eRet = OMX_ErrorInvalidComponentName;
-  }
-  return eRet;
+    else {
+        DEBUG_PRINT_ERROR("\nERROR: Querying Role on Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
+    }
+    return eRet;
 }
 
 
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::AllocateDone
+   FUNCTION
+   omx_venc::AllocateDone
 
-DESCRIPTION
-  Checks if entire buffer pool is allocated by IL Client or not.
-  Need this to move to IDLE state.
+   DESCRIPTION
+   Checks if entire buffer pool is allocated by IL Client or not.
+   Need this to move to IDLE state.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false.
+   RETURN VALUE
+   true/false.
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::allocate_done(void)
 {
-  bool bRet = false;
-  bool bRet_In = false;
-  bool bRet_Out = false;
+    bool bRet = false;
+    bool bRet_In = false;
+    bool bRet_Out = false;
 
-  bRet_In = allocate_input_done();
-  bRet_Out = allocate_output_done();
+    bRet_In = allocate_input_done();
+    bRet_Out = allocate_output_done();
 
-  if(bRet_In && bRet_Out)
-  {
-    bRet = true;
-  }
+    if (bRet_In && bRet_Out) {
+        bRet = true;
+    }
 
-  return bRet;
+    return bRet;
 }
 /* ======================================================================
-FUNCTION
-  omx_venc::AllocateInputDone
+   FUNCTION
+   omx_venc::AllocateInputDone
 
-DESCRIPTION
-  Checks if I/P buffer pool is allocated by IL Client or not.
+   DESCRIPTION
+   Checks if I/P buffer pool is allocated by IL Client or not.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false.
+   RETURN VALUE
+   true/false.
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::allocate_input_done(void)
 {
-  bool bRet = false;
-  unsigned i=0;
+    bool bRet = false;
+    unsigned i=0;
 
-  if(m_inp_mem_ptr == NULL)
-  {
-    return bRet;
-  }
-  if(m_inp_mem_ptr )
-  {
-    for(;i<m_sInPortDef.nBufferCountActual;i++)
-    {
-      if(BITMASK_ABSENT(&m_inp_bm_count,i))
-      {
-        break;
-      }
+    if (m_inp_mem_ptr == NULL) {
+        return bRet;
     }
-  }
-  if(i==m_sInPortDef.nBufferCountActual)
-  {
-    bRet = true;
-  }
-  if(i==m_sInPortDef.nBufferCountActual && m_sInPortDef.bEnabled)
-  {
-    m_sInPortDef.bPopulated = OMX_TRUE;
-  }
-  return bRet;
+    if (m_inp_mem_ptr ) {
+        for (; i<m_sInPortDef.nBufferCountActual; i++) {
+            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+                break;
+            }
+        }
+    }
+    if (i==m_sInPortDef.nBufferCountActual) {
+        bRet = true;
+    }
+    if (i==m_sInPortDef.nBufferCountActual && m_sInPortDef.bEnabled) {
+        m_sInPortDef.bPopulated = OMX_TRUE;
+    }
+    return bRet;
 }
 /* ======================================================================
-FUNCTION
-  omx_venc::AllocateOutputDone
+   FUNCTION
+   omx_venc::AllocateOutputDone
 
-DESCRIPTION
-  Checks if entire O/P buffer pool is allocated by IL Client or not.
+   DESCRIPTION
+   Checks if entire O/P buffer pool is allocated by IL Client or not.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false.
+   RETURN VALUE
+   true/false.
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::allocate_output_done(void)
 {
-  bool bRet = false;
-  unsigned j=0;
+    bool bRet = false;
+    unsigned j=0;
 
-  if(m_out_mem_ptr == NULL)
-  {
-    return bRet;
-  }
-
-  if(m_out_mem_ptr )
-  {
-    for(;j<m_sOutPortDef.nBufferCountActual;j++)
-    {
-      if(BITMASK_ABSENT(&m_out_bm_count,j))
-      {
-        break;
-      }
+    if (m_out_mem_ptr == NULL) {
+        return bRet;
     }
-  }
 
-  if(j==m_sOutPortDef.nBufferCountActual)
-  {
-    bRet = true;
-  }
+    if (m_out_mem_ptr ) {
+        for (; j<m_sOutPortDef.nBufferCountActual; j++) {
+            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
+                break;
+            }
+        }
+    }
 
-  if(j==m_sOutPortDef.nBufferCountActual && m_sOutPortDef.bEnabled)
-  {
-    m_sOutPortDef.bPopulated = OMX_TRUE;
-  }
-  return bRet;
+    if (j==m_sOutPortDef.nBufferCountActual) {
+        bRet = true;
+    }
+
+    if (j==m_sOutPortDef.nBufferCountActual && m_sOutPortDef.bEnabled) {
+        m_sOutPortDef.bPopulated = OMX_TRUE;
+    }
+    return bRet;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::ReleaseDone
+   FUNCTION
+   omx_venc::ReleaseDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::release_done(void)
 {
-  bool bRet = false;
-  DEBUG_PRINT_LOW("Inside release_done()\n");
-  if(release_input_done())
-  {
-    if(release_output_done())
-    {
-      bRet = true;
+    bool bRet = false;
+    DEBUG_PRINT_LOW("Inside release_done()\n");
+    if (release_input_done()) {
+        if (release_output_done()) {
+            bRet = true;
+        }
     }
-  }
-  return bRet;
+    return bRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::ReleaseOutputDone
+   FUNCTION
+   omx_venc::ReleaseOutputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::release_output_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("Inside release_output_done()\n");
-  if(m_out_mem_ptr)
-  {
-    for(;j<m_sOutPortDef.nBufferCountActual;j++)
-    {
-      if(BITMASK_PRESENT(&m_out_bm_count,j))
-      {
-        break;
-      }
+    DEBUG_PRINT_LOW("Inside release_output_done()\n");
+    if (m_out_mem_ptr) {
+        for (; j<m_sOutPortDef.nBufferCountActual; j++) {
+            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
+                break;
+            }
+        }
+        if (j==m_sOutPortDef.nBufferCountActual) {
+            bRet = true;
+        }
+    } else {
+        bRet = true;
     }
-    if(j==m_sOutPortDef.nBufferCountActual)
-    {
-      bRet = true;
-    }
-  }
-  else
-  {
-    bRet = true;
-  }
-  return bRet;
+    return bRet;
 }
 /* ======================================================================
-FUNCTION
-  omx_venc::ReleaseInputDone
+   FUNCTION
+   omx_venc::ReleaseInputDone
 
-DESCRIPTION
-  Checks if IL client has released all the buffers.
+   DESCRIPTION
+   Checks if IL client has released all the buffers.
 
-PARAMETERS
-  None.
+   PARAMETERS
+   None.
 
-RETURN VALUE
-  true/false
+   RETURN VALUE
+   true/false
 
-========================================================================== */
+   ========================================================================== */
 bool omx_video::release_input_done(void)
 {
-  bool bRet = false;
-  unsigned i=0,j=0;
+    bool bRet = false;
+    unsigned i=0,j=0;
 
-  DEBUG_PRINT_LOW("Inside release_input_done()\n");
-  if(m_inp_mem_ptr)
-  {
-    for(;j<m_sInPortDef.nBufferCountActual;j++)
-    {
-      if( BITMASK_PRESENT(&m_inp_bm_count,j))
-      {
-        break;
-      }
+    DEBUG_PRINT_LOW("Inside release_input_done()\n");
+    if (m_inp_mem_ptr) {
+        for (; j<m_sInPortDef.nBufferCountActual; j++) {
+            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
+                break;
+            }
+        }
+        if (j==m_sInPortDef.nBufferCountActual) {
+            bRet = true;
+        }
+    } else {
+        bRet = true;
     }
-    if(j==m_sInPortDef.nBufferCountActual)
-    {
-      bRet = true;
-    }
-  }
-  else
-  {
-    bRet = true;
-  }
-  return bRet;
+    return bRet;
 }
 
 OMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp,
-                                          OMX_BUFFERHEADERTYPE * buffer)
+        OMX_BUFFERHEADERTYPE * buffer)
 {
 #ifdef _MSM8974_
     int index = buffer - m_out_mem_ptr;
 #endif
     DEBUG_PRINT_LOW("fill_buffer_done: buffer->pBuffer[%p], flags=0x%x size = %d",
-                    buffer->pBuffer, buffer->nFlags,buffer->nFilledLen);
-  if(buffer == NULL || ((buffer - m_out_mem_ptr) > m_sOutPortDef.nBufferCountActual))
-  {
-    return OMX_ErrorBadParameter;
-  }
+            buffer->pBuffer, buffer->nFlags,buffer->nFilledLen);
+    if (buffer == NULL || ((buffer - m_out_mem_ptr) > m_sOutPortDef.nBufferCountActual)) {
+        return OMX_ErrorBadParameter;
+    }
 
-  pending_output_buffers--;
+    pending_output_buffers--;
 
-  extra_data_handle.create_extra_data(buffer);
+    extra_data_handle.create_extra_data(buffer);
 #ifndef _MSM8974_
-  if(buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
-    DEBUG_PRINT_LOW("parsing extradata");
-    extra_data_handle.parse_extra_data(buffer);
-  }
+    if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
+        DEBUG_PRINT_LOW("parsing extradata");
+        extra_data_handle.parse_extra_data(buffer);
+    }
 #endif
-  /* For use buffer we need to copy the data */
-  if(m_pCallbacks.FillBufferDone)
-  {
-    if(buffer->nFilledLen > 0)
-    {
-      m_fbd_count++;
+    /* For use buffer we need to copy the data */
+    if (m_pCallbacks.FillBufferDone) {
+        if (buffer->nFilledLen > 0) {
+            m_fbd_count++;
 
 #ifdef OUTPUT_BUFFER_LOG
-      if(outputBufferFile1)
-      {
-        fwrite((const char *)buffer->pBuffer, buffer->nFilledLen, 1, outputBufferFile1);
-      }
+            if (outputBufferFile1) {
+                fwrite((const char *)buffer->pBuffer, buffer->nFilledLen, 1, outputBufferFile1);
+            }
 #endif
-    }
+        }
 #ifdef _MSM8974_
-    if(buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
-      if(!dev_handle_extradata((void *)buffer, index))
-        DEBUG_PRINT_ERROR("Failed to parse extradata\n");
-    }
+        if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
+            if (!dev_handle_extradata((void *)buffer, index))
+                DEBUG_PRINT_ERROR("Failed to parse extradata\n");
+        }
 #endif
-    m_pCallbacks.FillBufferDone (hComp,m_app_data,buffer);
-  }
-  else
-  {
-    return OMX_ErrorBadParameter;
-  }
-  return OMX_ErrorNone;
+        m_pCallbacks.FillBufferDone (hComp,m_app_data,buffer);
+    } else {
+        return OMX_ErrorBadParameter;
+    }
+    return OMX_ErrorNone;
 }
 
 OMX_ERRORTYPE omx_video::empty_buffer_done(OMX_HANDLETYPE         hComp,
-                                           OMX_BUFFERHEADERTYPE* buffer)
+        OMX_BUFFERHEADERTYPE* buffer)
 {
-  int buffer_index  = -1;
-  int buffer_index_meta = -1;
+    int buffer_index  = -1;
+    int buffer_index_meta = -1;
 
-  buffer_index = (buffer - m_inp_mem_ptr);
-  buffer_index_meta = (buffer - meta_buffer_hdr);
-  DEBUG_PRINT_LOW("\n empty_buffer_done: buffer[%p]", buffer);
-  if(buffer == NULL ||
-     ((buffer_index > m_sInPortDef.nBufferCountActual) &&
-      (buffer_index_meta > m_sInPortDef.nBufferCountActual)))
-  {
-    DEBUG_PRINT_ERROR("\n ERROR in empty_buffer_done due to index buffer");
-    return OMX_ErrorBadParameter;
-  }
-
-  pending_input_buffers--;
-
-  if(mUseProxyColorFormat && (buffer_index < m_sInPortDef.nBufferCountActual)) {
-    if(!pdest_frame) {
-      pdest_frame = buffer;
-      DEBUG_PRINT_LOW("\n empty_buffer_done pdest_frame address is %p",pdest_frame);
-      return push_input_buffer(hComp);
-
-    } else {
-      DEBUG_PRINT_LOW("\n empty_buffer_done insert address is %p",buffer);
-      if (!m_opq_pmem_q.insert_entry((unsigned int)buffer, 0, 0)) {
-        DEBUG_PRINT_ERROR("\n empty_buffer_done: pmem queue is full");
+    buffer_index = (buffer - m_inp_mem_ptr);
+    buffer_index_meta = (buffer - meta_buffer_hdr);
+    DEBUG_PRINT_LOW("\n empty_buffer_done: buffer[%p]", buffer);
+    if (buffer == NULL ||
+            ((buffer_index > m_sInPortDef.nBufferCountActual) &&
+             (buffer_index_meta > m_sInPortDef.nBufferCountActual))) {
+        DEBUG_PRINT_ERROR("\n ERROR in empty_buffer_done due to index buffer");
         return OMX_ErrorBadParameter;
-      }
     }
-  } else if(m_pCallbacks.EmptyBufferDone) {
-    m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, buffer);
-  }
-  return OMX_ErrorNone;
+
+    pending_input_buffers--;
+
+    if (mUseProxyColorFormat && (buffer_index < m_sInPortDef.nBufferCountActual)) {
+        if (!pdest_frame) {
+            pdest_frame = buffer;
+            DEBUG_PRINT_LOW("\n empty_buffer_done pdest_frame address is %p",pdest_frame);
+            return push_input_buffer(hComp);
+
+        } else {
+            DEBUG_PRINT_LOW("\n empty_buffer_done insert address is %p",buffer);
+            if (!m_opq_pmem_q.insert_entry((unsigned int)buffer, 0, 0)) {
+                DEBUG_PRINT_ERROR("\n empty_buffer_done: pmem queue is full");
+                return OMX_ErrorBadParameter;
+            }
+        }
+    } else if (m_pCallbacks.EmptyBufferDone) {
+        m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, buffer);
+    }
+    return OMX_ErrorNone;
 }
 
 void omx_video::complete_pending_buffer_done_cbs()
 {
-  unsigned p1;
-  unsigned p2;
-  unsigned ident;
-  omx_cmd_queue tmp_q, pending_bd_q;
-  pthread_mutex_lock(&m_lock);
-  // pop all pending GENERATE FDB from ftb queue
-  while (m_ftb_q.m_size)
-  {
-    m_ftb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_FBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to ftb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_ftb_q.insert_entry(p1,p2,ident);
-  }
-  // pop all pending GENERATE EDB from etb queue
-  while (m_etb_q.m_size)
-  {
-    m_etb_q.pop_entry(&p1,&p2,&ident);
-    if(ident == OMX_COMPONENT_GENERATE_EBD)
-    {
-      pending_bd_q.insert_entry(p1,p2,ident);
-    }
-    else
-    {
-      tmp_q.insert_entry(p1,p2,ident);
-    }
-  }
-  //return all non GENERATE FDB to etb queue
-  while(tmp_q.m_size)
-  {
-    tmp_q.pop_entry(&p1,&p2,&ident);
-    m_etb_q.insert_entry(p1,p2,ident);
-  }
-  pthread_mutex_unlock(&m_lock);
-  // process all pending buffer dones
-  while(pending_bd_q.m_size)
-  {
-    pending_bd_q.pop_entry(&p1,&p2,&ident);
-    switch(ident)
-    {
-    case OMX_COMPONENT_GENERATE_EBD:
-        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
-          omx_report_error ();
+    unsigned p1;
+    unsigned p2;
+    unsigned ident;
+    omx_cmd_queue tmp_q, pending_bd_q;
+    pthread_mutex_lock(&m_lock);
+    // pop all pending GENERATE FDB from ftb queue
+    while (m_ftb_q.m_size) {
+        m_ftb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_FBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
         }
-        break;
+    }
+    //return all non GENERATE FDB to ftb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_ftb_q.insert_entry(p1,p2,ident);
+    }
+    // pop all pending GENERATE EDB from etb queue
+    while (m_etb_q.m_size) {
+        m_etb_q.pop_entry(&p1,&p2,&ident);
+        if (ident == OMX_COMPONENT_GENERATE_EBD) {
+            pending_bd_q.insert_entry(p1,p2,ident);
+        } else {
+            tmp_q.insert_entry(p1,p2,ident);
+        }
+    }
+    //return all non GENERATE FDB to etb queue
+    while (tmp_q.m_size) {
+        tmp_q.pop_entry(&p1,&p2,&ident);
+        m_etb_q.insert_entry(p1,p2,ident);
+    }
+    pthread_mutex_unlock(&m_lock);
+    // process all pending buffer dones
+    while (pending_bd_q.m_size) {
+        pending_bd_q.pop_entry(&p1,&p2,&ident);
+        switch (ident) {
+            case OMX_COMPONENT_GENERATE_EBD:
+                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+                    DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+                break;
 
-      case OMX_COMPONENT_GENERATE_FBD:
-        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
-        {
-          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
-          omx_report_error ();
+            case OMX_COMPONENT_GENERATE_FBD:
+                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+                    DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
+                    omx_report_error ();
+                }
+                break;
         }
-        break;
     }
-  }
 }
 
 #ifdef MAX_RES_720P
 OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!profileLevelType)
-    return OMX_ErrorBadParameter;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!profileLevelType)
+        return OMX_ErrorBadParameter;
 
-  if(profileLevelType->nPortIndex == 1) {
-    if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC)
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+    if (profileLevelType->nPortIndex == 1) {
+        if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        }
+    } else {
+        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263)
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if(m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%d, Level:%d\n",
-                    profileLevelType->eProfile,profileLevelType->eLevel);
-  return eRet;
+    DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%d, Level:%d\n",
+            profileLevelType->eProfile,profileLevelType->eLevel);
+    return eRet;
 }
 #endif
 
 #ifdef MAX_RES_1080P
 OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
-  if(!profileLevelType)
-    return OMX_ErrorBadParameter;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    if (!profileLevelType)
+        return OMX_ErrorBadParameter;
 
-  if(profileLevelType->nPortIndex == 1) {
-    if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC)
-    {
+    if (profileLevelType->nPortIndex == 1) {
+        if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC) {
 #ifdef _MSM8974_
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
 
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
 #else
-    if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
 
-      }
-      else if (profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else if(profileLevelType->nProfileIndex == 2)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
-        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
-            profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else if (profileLevelType->nProfileIndex == 2) {
+                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
+            } else {
+                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
+                        profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
 #endif
+        } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4) {
+            if (profileLevelType->nProfileIndex == 0) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else if (profileLevelType->nProfileIndex == 1) {
+                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
+            } else {
+                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+                eRet = OMX_ErrorNoMore;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore\n");
+            eRet = OMX_ErrorNoMore;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
+        eRet = OMX_ErrorBadPortIndex;
     }
-    else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263)
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
-        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else if(m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
-    {
-      if (profileLevelType->nProfileIndex == 0)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else if(profileLevelType->nProfileIndex == 1)
-      {
-        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
-        eRet = OMX_ErrorNoMore;
-      }
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore\n");
-      eRet = OMX_ErrorNoMore;
-    }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
-    eRet = OMX_ErrorBadPortIndex;
-  }
-  DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%lu, Level:%lu\n",
-                    profileLevelType->eProfile,profileLevelType->eLevel);
-  return eRet;
+    DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%lu, Level:%lu\n",
+            profileLevelType->eProfile,profileLevelType->eLevel);
+    return eRet;
 }
 #endif
 
 #ifdef USE_ION
 int alloc_map_ion_memory(int size,struct ion_allocation_data *alloc_data,
-                                    struct ion_fd_data *fd_data,int flag)
+        struct ion_fd_data *fd_data,int flag)
 {
-        struct venc_ion buf_ion_info;
-        int ion_device_fd =-1,rc=0,ion_dev_flags = 0;
-        if (size <=0 || !alloc_data || !fd_data) {
-		DEBUG_PRINT_ERROR("\nInvalid input to alloc_map_ion_memory");
-		return -EINVAL;
-	}
+    struct venc_ion buf_ion_info;
+    int ion_device_fd =-1,rc=0,ion_dev_flags = 0;
+    if (size <=0 || !alloc_data || !fd_data) {
+        DEBUG_PRINT_ERROR("\nInvalid input to alloc_map_ion_memory");
+        return -EINVAL;
+    }
 
-        ion_dev_flags = O_RDONLY;
-        ion_device_fd = open (MEM_DEVICE,ion_dev_flags);
-        if(ion_device_fd < 0)
-        {
-           DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
-           return ion_device_fd;
-        }
-        alloc_data->len = size;
-        alloc_data->align = 4096;
-        alloc_data->flags = flag;
-#ifdef MAX_RES_720P
-        alloc_data->len = (size + (alloc_data->align - 1)) & ~(alloc_data->align - 1);
-        alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
-#else
-        alloc_data->heap_mask = (ION_HEAP(MEM_HEAP_ID) |
-                              ION_HEAP(ION_IOMMU_HEAP_ID));
-#endif
-        rc = ioctl(ion_device_fd,ION_IOC_ALLOC,alloc_data);
-        if(rc || !alloc_data->handle) {
-           DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
-           alloc_data->handle =NULL;
-           close(ion_device_fd);
-           ion_device_fd = -1;
-           return ion_device_fd;
-        }
-        fd_data->handle = alloc_data->handle;
-        rc = ioctl(ion_device_fd,ION_IOC_MAP,fd_data);
-        if(rc) {
-            DEBUG_PRINT_ERROR("\n ION MAP failed ");
-            buf_ion_info.ion_alloc_data = *alloc_data;
-            buf_ion_info.ion_device_fd = ion_device_fd;
-            buf_ion_info.fd_ion_data = *fd_data;
-            free_ion_memory(&buf_ion_info);
-            fd_data->fd =-1;
-            ion_device_fd =-1;
-        }
+    ion_dev_flags = O_RDONLY;
+    ion_device_fd = open (MEM_DEVICE,ion_dev_flags);
+    if (ion_device_fd < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
         return ion_device_fd;
+    }
+    alloc_data->len = size;
+    alloc_data->align = 4096;
+    alloc_data->flags = flag;
+#ifdef MAX_RES_720P
+    alloc_data->len = (size + (alloc_data->align - 1)) & ~(alloc_data->align - 1);
+    alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
+#else
+    alloc_data->heap_mask = (ION_HEAP(MEM_HEAP_ID) |
+            ION_HEAP(ION_IOMMU_HEAP_ID));
+#endif
+    rc = ioctl(ion_device_fd,ION_IOC_ALLOC,alloc_data);
+    if (rc || !alloc_data->handle) {
+        DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+        alloc_data->handle =NULL;
+        close(ion_device_fd);
+        ion_device_fd = -1;
+        return ion_device_fd;
+    }
+    fd_data->handle = alloc_data->handle;
+    rc = ioctl(ion_device_fd,ION_IOC_MAP,fd_data);
+    if (rc) {
+        DEBUG_PRINT_ERROR("\n ION MAP failed ");
+        buf_ion_info.ion_alloc_data = *alloc_data;
+        buf_ion_info.ion_device_fd = ion_device_fd;
+        buf_ion_info.fd_ion_data = *fd_data;
+        free_ion_memory(&buf_ion_info);
+        fd_data->fd =-1;
+        ion_device_fd =-1;
+    }
+    return ion_device_fd;
 }
 
 void free_ion_memory(struct venc_ion *buf_ion_info)
 {
-     if (!buf_ion_info) {
+    if (!buf_ion_info) {
         DEBUG_PRINT_ERROR("\n Invalid input to free_ion_memory");
-	return;
-     }
-     if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
-              &buf_ion_info->ion_alloc_data.handle)) {
-         DEBUG_PRINT_ERROR("\n ION free failed ");
-         return;
-     }
-     close(buf_ion_info->ion_device_fd);
-     buf_ion_info->ion_alloc_data.handle = NULL;
-     buf_ion_info->ion_device_fd = -1;
-     buf_ion_info->fd_ion_data.fd = -1;
+        return;
+    }
+    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
+                &buf_ion_info->ion_alloc_data.handle)) {
+        DEBUG_PRINT_ERROR("\n ION free failed ");
+        return;
+    }
+    close(buf_ion_info->ion_device_fd);
+    buf_ion_info->ion_alloc_data.handle = NULL;
+    buf_ion_info->ion_device_fd = -1;
+    buf_ion_info->fd_ion_data.fd = -1;
 }
 #endif
 
 #ifdef _ANDROID_ICS_
 void omx_video::omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer)
 {
-  if(buffer && meta_mode_enable)
-  {
-    encoder_media_buffer_type *media_ptr;
-    struct pmem Input_pmem;
-    unsigned int index_pmem = 0;
-    bool meta_error = false;
+    if (buffer && meta_mode_enable) {
+        encoder_media_buffer_type *media_ptr;
+        struct pmem Input_pmem;
+        unsigned int index_pmem = 0;
+        bool meta_error = false;
 
-    index_pmem = (buffer - m_inp_mem_ptr);
-    if(mUseProxyColorFormat &&
-       (index_pmem < m_sInPortDef.nBufferCountActual)) {
-        if(!dev_free_buf((&m_pInput_pmem[index_pmem]),PORT_INDEX_IN)){
-          DEBUG_PRINT_ERROR("\n omx_release_meta_buffer dev free failed");
-        }
-    } else {
-      media_ptr = (encoder_media_buffer_type *) buffer->pBuffer;
-      if(media_ptr && media_ptr->meta_handle)
-      {
-        if(media_ptr->buffer_type == kMetadataBufferTypeCameraSource &&
-           media_ptr->meta_handle->numFds == 1 &&
-           media_ptr->meta_handle->numInts == 2) {
-          Input_pmem.fd = media_ptr->meta_handle->data[0];
-          Input_pmem.buffer = media_ptr;
-          Input_pmem.size = media_ptr->meta_handle->data[2];
-          Input_pmem.offset = media_ptr->meta_handle->data[1];
-          DEBUG_PRINT_LOW("EBD fd = %d, offset = %d, size = %d",Input_pmem.fd,
+        index_pmem = (buffer - m_inp_mem_ptr);
+        if (mUseProxyColorFormat &&
+                (index_pmem < m_sInPortDef.nBufferCountActual)) {
+            if (!dev_free_buf((&m_pInput_pmem[index_pmem]),PORT_INDEX_IN)) {
+                DEBUG_PRINT_ERROR("\n omx_release_meta_buffer dev free failed");
+            }
+        } else {
+            media_ptr = (encoder_media_buffer_type *) buffer->pBuffer;
+            if (media_ptr && media_ptr->meta_handle) {
+                if (media_ptr->buffer_type == kMetadataBufferTypeCameraSource &&
+                        media_ptr->meta_handle->numFds == 1 &&
+                        media_ptr->meta_handle->numInts == 2) {
+                    Input_pmem.fd = media_ptr->meta_handle->data[0];
+                    Input_pmem.buffer = media_ptr;
+                    Input_pmem.size = media_ptr->meta_handle->data[2];
+                    Input_pmem.offset = media_ptr->meta_handle->data[1];
+                    DEBUG_PRINT_LOW("EBD fd = %d, offset = %d, size = %d",Input_pmem.fd,
                             Input_pmem.offset,
                             Input_pmem.size);
-        } else if(media_ptr->buffer_type == kMetadataBufferTypeGrallocSource) {
-          private_handle_t *handle = (private_handle_t *)media_ptr->meta_handle;
-          Input_pmem.buffer = media_ptr;
-          Input_pmem.fd = handle->fd;
-          Input_pmem.offset = 0;
-          Input_pmem.size = handle->size;
-        } else {
-          meta_error = true;
-          DEBUG_PRINT_ERROR(" Meta Error set in EBD");
+                } else if (media_ptr->buffer_type == kMetadataBufferTypeGrallocSource) {
+                    private_handle_t *handle = (private_handle_t *)media_ptr->meta_handle;
+                    Input_pmem.buffer = media_ptr;
+                    Input_pmem.fd = handle->fd;
+                    Input_pmem.offset = 0;
+                    Input_pmem.size = handle->size;
+                } else {
+                    meta_error = true;
+                    DEBUG_PRINT_ERROR(" Meta Error set in EBD");
+                }
+                if (!meta_error)
+                    meta_error = !dev_free_buf(&Input_pmem,PORT_INDEX_IN);
+                if (meta_error) {
+                    DEBUG_PRINT_ERROR(" Warning dev_free_buf failed flush value is %d",
+                            input_flush_progress);
+                }
+            }
         }
-        if(!meta_error)
-           meta_error = !dev_free_buf(&Input_pmem,PORT_INDEX_IN);
-          if(meta_error)
-          {
-           DEBUG_PRINT_ERROR(" Warning dev_free_buf failed flush value is %d",
-               input_flush_progress);
-          }
-        }
-     }
-  }
+    }
 }
 #endif
 omx_video::omx_c2d_conv::omx_c2d_conv()
 {
-  c2dcc = NULL;
-  mLibHandle = NULL;
-  mConvertOpen = NULL;
-  mConvertClose = NULL;
-  src_format = NV12_128m;
-  pthread_mutex_init(&c_lock, NULL);
-}
-
-bool omx_video::omx_c2d_conv::init() {
-  bool status = true;
-  if(mLibHandle || mConvertOpen || mConvertClose) {
-    DEBUG_PRINT_ERROR("\n omx_c2d_conv::init called twice");
-    status = false;
-  }
-  if(status) {
-    mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY);
-    if(mLibHandle){
-       mConvertOpen = (createC2DColorConverter_t *)
-       dlsym(mLibHandle,"createC2DColorConverter");
-       mConvertClose = (destroyC2DColorConverter_t *)
-       dlsym(mLibHandle,"destroyC2DColorConverter");
-       if(!mConvertOpen || !mConvertClose)
-         status = false;
-    } else
-      status = false;
-  }
-  if(!status && mLibHandle){
-    dlclose(mLibHandle);
+    c2dcc = NULL;
     mLibHandle = NULL;
     mConvertOpen = NULL;
     mConvertClose = NULL;
-  }
-  return status;
+    src_format = NV12_128m;
+    pthread_mutex_init(&c_lock, NULL);
+}
+
+bool omx_video::omx_c2d_conv::init()
+{
+    bool status = true;
+    if (mLibHandle || mConvertOpen || mConvertClose) {
+        DEBUG_PRINT_ERROR("\n omx_c2d_conv::init called twice");
+        status = false;
+    }
+    if (status) {
+        mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY);
+        if (mLibHandle) {
+            mConvertOpen = (createC2DColorConverter_t *)
+                dlsym(mLibHandle,"createC2DColorConverter");
+            mConvertClose = (destroyC2DColorConverter_t *)
+                dlsym(mLibHandle,"destroyC2DColorConverter");
+            if (!mConvertOpen || !mConvertClose)
+                status = false;
+        } else
+            status = false;
+    }
+    if (!status && mLibHandle) {
+        dlclose(mLibHandle);
+        mLibHandle = NULL;
+        mConvertOpen = NULL;
+        mConvertClose = NULL;
+    }
+    return status;
 }
 
 bool omx_video::omx_c2d_conv::convert(int src_fd, void *src_base, void *src_viraddr,
-     int dest_fd, void *dest_base, void *dest_viraddr)
+        int dest_fd, void *dest_base, void *dest_viraddr)
 {
-  int result;
-  if(!src_viraddr || !dest_viraddr || !c2dcc || !src_base || !dest_base){
-    DEBUG_PRINT_ERROR("\n Invalid arguments omx_c2d_conv::convert");
-    return false;
-  }
-  pthread_mutex_lock(&c_lock);
-  result =  c2dcc->convertC2D(src_fd, src_base, src_viraddr,
-                              dest_fd, dest_base, dest_viraddr);
-  pthread_mutex_unlock(&c_lock);
-  DEBUG_PRINT_LOW("\n Color convert status %d",result);
-  return ((result < 0)?false:true);
+    int result;
+    if (!src_viraddr || !dest_viraddr || !c2dcc || !src_base || !dest_base) {
+        DEBUG_PRINT_ERROR("\n Invalid arguments omx_c2d_conv::convert");
+        return false;
+    }
+    pthread_mutex_lock(&c_lock);
+    result =  c2dcc->convertC2D(src_fd, src_base, src_viraddr,
+            dest_fd, dest_base, dest_viraddr);
+    pthread_mutex_unlock(&c_lock);
+    DEBUG_PRINT_LOW("\n Color convert status %d",result);
+    return ((result < 0)?false:true);
 }
 
 bool omx_video::omx_c2d_conv::open(unsigned int height,unsigned int width,
-     ColorConvertFormat src, ColorConvertFormat dest,unsigned int src_stride)
+        ColorConvertFormat src, ColorConvertFormat dest,unsigned int src_stride)
 {
-  bool status = false;
-  pthread_mutex_lock(&c_lock);
-  if(!c2dcc) {
-     c2dcc = mConvertOpen(width, height, width, height,
-             src,dest,0,src_stride);
-     if(c2dcc) {
-       src_format = src;
-       status = true;
-     } else
-       DEBUG_PRINT_ERROR("\n mConvertOpen failed");
-  }
-  pthread_mutex_unlock(&c_lock);
-  return status;
+    bool status = false;
+    pthread_mutex_lock(&c_lock);
+    if (!c2dcc) {
+        c2dcc = mConvertOpen(width, height, width, height,
+                src,dest,0,src_stride);
+        if (c2dcc) {
+            src_format = src;
+            status = true;
+        } else
+            DEBUG_PRINT_ERROR("\n mConvertOpen failed");
+    }
+    pthread_mutex_unlock(&c_lock);
+    return status;
 }
 
 void omx_video::omx_c2d_conv::close()
 {
-  if(mLibHandle) {
-    pthread_mutex_lock(&c_lock);
-    if(mConvertClose && c2dcc)
-     mConvertClose(c2dcc);
-    pthread_mutex_unlock(&c_lock);
-    c2dcc = NULL;
-  }
+    if (mLibHandle) {
+        pthread_mutex_lock(&c_lock);
+        if (mConvertClose && c2dcc)
+            mConvertClose(c2dcc);
+        pthread_mutex_unlock(&c_lock);
+        c2dcc = NULL;
+    }
 }
 omx_video::omx_c2d_conv::~omx_c2d_conv()
 {
-  DEBUG_PRINT_HIGH("\n Destroy C2D instance");
-  if(mLibHandle) {
-    if(mConvertClose && c2dcc) {
-      pthread_mutex_lock(&c_lock);
-      mConvertClose(c2dcc);
-      pthread_mutex_unlock(&c_lock);
+    DEBUG_PRINT_HIGH("\n Destroy C2D instance");
+    if (mLibHandle) {
+        if (mConvertClose && c2dcc) {
+            pthread_mutex_lock(&c_lock);
+            mConvertClose(c2dcc);
+            pthread_mutex_unlock(&c_lock);
+        }
+        dlclose(mLibHandle);
     }
-    dlclose(mLibHandle);
-  }
-  c2dcc = NULL;
-  mLibHandle = NULL;
-  mConvertOpen = NULL;
-  mConvertClose = NULL;
-  pthread_mutex_destroy(&c_lock);
+    c2dcc = NULL;
+    mLibHandle = NULL;
+    mConvertOpen = NULL;
+    mConvertClose = NULL;
+    pthread_mutex_destroy(&c_lock);
 }
 
 int omx_video::omx_c2d_conv::get_src_format()
 {
-  int format = -1;
-  if(src_format == NV12_128m) {
-    format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE;
-  } else if(src_format == RGBA8888) {
-    format = HAL_PIXEL_FORMAT_RGBA_8888;
-  }
-  return format;
+    int format = -1;
+    if (src_format == NV12_128m) {
+        format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE;
+    } else if (src_format == RGBA8888) {
+        format = HAL_PIXEL_FORMAT_RGBA_8888;
+    }
+    return format;
 }
 
 bool omx_video::omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size)
 {
-  int cret = 0;
-  bool ret = false;
-  C2DBuffReq bufferreq;
-  if(c2dcc){
-    bufferreq.size = 0;
-    pthread_mutex_lock(&c_lock);
-    cret = c2dcc->getBuffReq(port,&bufferreq);
-    pthread_mutex_unlock(&c_lock);
-    DEBUG_PRINT_LOW("\n Status of getbuffer is %d", cret);
-    ret = (cret)?false:true;
-    buf_size = bufferreq.size;
-  }
-  return ret;
+    int cret = 0;
+    bool ret = false;
+    C2DBuffReq bufferreq;
+    if (c2dcc) {
+        bufferreq.size = 0;
+        pthread_mutex_lock(&c_lock);
+        cret = c2dcc->getBuffReq(port,&bufferreq);
+        pthread_mutex_unlock(&c_lock);
+        DEBUG_PRINT_LOW("\n Status of getbuffer is %d", cret);
+        ret = (cret)?false:true;
+        buf_size = bufferreq.size;
+    }
+    return ret;
 }
 
 OMX_ERRORTYPE  omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp,
-                                                  OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
 {
-  unsigned nBufIndex = 0;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  encoder_media_buffer_type *media_buffer;
-  DEBUG_PRINT_LOW("\n ETBProxyOpaque: buffer[%p]\n", buffer);
+    unsigned nBufIndex = 0;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    encoder_media_buffer_type *media_buffer;
+    DEBUG_PRINT_LOW("\n ETBProxyOpaque: buffer[%p]\n", buffer);
 
-  if(buffer == NULL) {
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxyA: Invalid buffer[%p]\n",buffer);
-    return OMX_ErrorBadParameter;
-  }
-  nBufIndex = buffer - meta_buffer_hdr;
-  if(nBufIndex >= m_sInPortDef.nBufferCountActual) {
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxyA: Invalid bufindex = %u\n",
-                      nBufIndex);
-    return OMX_ErrorBadParameter;
-  }
-  media_buffer = (encoder_media_buffer_type *)buffer->pBuffer;
-  private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
-  /*Enable following code once private handle color format is
-    updated correctly*/
-
-  if(c2d_opened && handle->format != c2d_conv.get_src_format()) {
-    c2d_conv.close();
-    c2d_opened = false;
-  }
-  if (!c2d_opened) {
-      if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888) {
-        DEBUG_PRINT_ERROR("\n open Color conv for RGBA888 W: %d, H: %d\n",
-                          m_sInPortDef.format.video.nFrameWidth,
-                          m_sInPortDef.format.video.nFrameHeight);
-        if(!c2d_conv.open(m_sInPortDef.format.video.nFrameHeight,
-             m_sInPortDef.format.video.nFrameWidth,RGBA8888,NV12_128m,handle->width)){
-           m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
-           DEBUG_PRINT_ERROR("\n Color conv open failed");
-           return OMX_ErrorBadParameter;
-        }
-        c2d_opened = true;
-#ifdef _MSM8974_
-        if(!dev_set_format(handle->format))
-          DEBUG_PRINT_ERROR("cannot set color format for RGBA8888\n");
-#endif
-      } else if(handle->format != HAL_PIXEL_FORMAT_NV12_ENCODEABLE) {
-        DEBUG_PRINT_ERROR("\n Incorrect color format");
-        m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR: ETBProxyA: Invalid buffer[%p]\n",buffer);
         return OMX_ErrorBadParameter;
-      }
-  }
-  if(input_flush_progress == true)
-  {
-    m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
-    DEBUG_PRINT_ERROR("\nERROR: ETBProxyA: Input flush in progress");
-    return OMX_ErrorNone;
-  }
-
-  if(!psource_frame) {
-    psource_frame = buffer;
-    ret = push_input_buffer(hComp);
-  } else {
-    if (!m_opq_meta_q.insert_entry((unsigned)buffer,0,0)) {
-      DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Queue is full");
-      ret = OMX_ErrorBadParameter;
     }
-  }
-  if(ret != OMX_ErrorNone) {
-    m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
-    DEBUG_PRINT_LOW("\nERROR: ETBOpaque failed:");
-  }
-  return ret;
+    nBufIndex = buffer - meta_buffer_hdr;
+    if (nBufIndex >= m_sInPortDef.nBufferCountActual) {
+        DEBUG_PRINT_ERROR("\nERROR: ETBProxyA: Invalid bufindex = %u\n",
+                nBufIndex);
+        return OMX_ErrorBadParameter;
+    }
+    media_buffer = (encoder_media_buffer_type *)buffer->pBuffer;
+    private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
+    /*Enable following code once private handle color format is
+      updated correctly*/
+
+    if (c2d_opened && handle->format != c2d_conv.get_src_format()) {
+        c2d_conv.close();
+        c2d_opened = false;
+    }
+    if (!c2d_opened) {
+        if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888) {
+            DEBUG_PRINT_ERROR("\n open Color conv for RGBA888 W: %d, H: %d\n",
+                    m_sInPortDef.format.video.nFrameWidth,
+                    m_sInPortDef.format.video.nFrameHeight);
+            if (!c2d_conv.open(m_sInPortDef.format.video.nFrameHeight,
+                        m_sInPortDef.format.video.nFrameWidth,RGBA8888,NV12_128m,handle->width)) {
+                m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
+                DEBUG_PRINT_ERROR("\n Color conv open failed");
+                return OMX_ErrorBadParameter;
+            }
+            c2d_opened = true;
+#ifdef _MSM8974_
+            if (!dev_set_format(handle->format))
+                DEBUG_PRINT_ERROR("cannot set color format for RGBA8888\n");
+#endif
+        } else if (handle->format != HAL_PIXEL_FORMAT_NV12_ENCODEABLE) {
+            DEBUG_PRINT_ERROR("\n Incorrect color format");
+            m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
+            return OMX_ErrorBadParameter;
+        }
+    }
+    if (input_flush_progress == true) {
+        m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
+        DEBUG_PRINT_ERROR("\nERROR: ETBProxyA: Input flush in progress");
+        return OMX_ErrorNone;
+    }
+
+    if (!psource_frame) {
+        psource_frame = buffer;
+        ret = push_input_buffer(hComp);
+    } else {
+        if (!m_opq_meta_q.insert_entry((unsigned)buffer,0,0)) {
+            DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Queue is full");
+            ret = OMX_ErrorBadParameter;
+        }
+    }
+    if (ret != OMX_ErrorNone) {
+        m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer);
+        DEBUG_PRINT_LOW("\nERROR: ETBOpaque failed:");
+    }
+    return ret;
 }
 
 OMX_ERRORTYPE omx_video::queue_meta_buffer(OMX_HANDLETYPE hComp,
-     struct pmem &Input_pmem_info) {
+        struct pmem &Input_pmem_info)
+{
 
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  unsigned address = 0,p2,id;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    unsigned address = 0,p2,id;
 
-  DEBUG_PRINT_LOW("\n In queue Meta Buffer");
-  if(!psource_frame || !pdest_frame) {
-    DEBUG_PRINT_ERROR("\n convert_queue_buffer invalid params");
-    return OMX_ErrorBadParameter;
-  }
-
-  if(dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,0) != true) {
-    DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
-    post_event ((unsigned int)psource_frame,0,OMX_COMPONENT_GENERATE_EBD);
-    ret = OMX_ErrorBadParameter;
-  }
-
-  if(ret == OMX_ErrorNone)
-    ret = empty_this_buffer_proxy(hComp,psource_frame);
-
-  if(ret == OMX_ErrorNone) {
-    psource_frame = NULL;
-    if(!psource_frame && m_opq_meta_q.m_size) {
-      m_opq_meta_q.pop_entry(&address,&p2,&id);
-      psource_frame = (OMX_BUFFERHEADERTYPE* ) address;
+    DEBUG_PRINT_LOW("\n In queue Meta Buffer");
+    if (!psource_frame || !pdest_frame) {
+        DEBUG_PRINT_ERROR("\n convert_queue_buffer invalid params");
+        return OMX_ErrorBadParameter;
     }
-  }
-  return ret;
+
+    if (dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,0) != true) {
+        DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
+        post_event ((unsigned int)psource_frame,0,OMX_COMPONENT_GENERATE_EBD);
+        ret = OMX_ErrorBadParameter;
+    }
+
+    if (ret == OMX_ErrorNone)
+        ret = empty_this_buffer_proxy(hComp,psource_frame);
+
+    if (ret == OMX_ErrorNone) {
+        psource_frame = NULL;
+        if (!psource_frame && m_opq_meta_q.m_size) {
+            m_opq_meta_q.pop_entry(&address,&p2,&id);
+            psource_frame = (OMX_BUFFERHEADERTYPE* ) address;
+        }
+    }
+    return ret;
 }
 
 OMX_ERRORTYPE omx_video::convert_queue_buffer(OMX_HANDLETYPE hComp,
-     struct pmem &Input_pmem_info,unsigned &index){
+        struct pmem &Input_pmem_info,unsigned &index)
+{
 
-  unsigned char *uva;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
-  unsigned address = 0,p2,id;
+    unsigned char *uva;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    unsigned address = 0,p2,id;
 
-  DEBUG_PRINT_LOW("\n In Convert and queue Meta Buffer");
-  if(!psource_frame || !pdest_frame) {
-    DEBUG_PRINT_ERROR("\n convert_queue_buffer invalid params");
-    return OMX_ErrorBadParameter;
-  }
+    DEBUG_PRINT_LOW("\n In Convert and queue Meta Buffer");
+    if (!psource_frame || !pdest_frame) {
+        DEBUG_PRINT_ERROR("\n convert_queue_buffer invalid params");
+        return OMX_ErrorBadParameter;
+    }
 
-  if(!psource_frame->nFilledLen){
-    pdest_frame->nOffset = 0;
-    pdest_frame->nFilledLen = 0;
-    pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
-    pdest_frame->nFlags = psource_frame->nFlags;
-    DEBUG_PRINT_LOW("\n Buffer header %p Filled len size %d",
-         pdest_frame,pdest_frame->nFilledLen);
-  } else {
-     uva = (unsigned char *)mmap(NULL, Input_pmem_info.size,
-                           PROT_READ|PROT_WRITE,
-                           MAP_SHARED,Input_pmem_info.fd,0);
-     if(uva == MAP_FAILED) {
-       ret = OMX_ErrorBadParameter;
-     } else {
-       if(!c2d_conv.convert(Input_pmem_info.fd, uva, uva,
-          m_pInput_pmem[index].fd, pdest_frame->pBuffer, pdest_frame->pBuffer)) {
-          DEBUG_PRINT_ERROR("\n Color Conversion failed");
-          ret = OMX_ErrorBadParameter;
-       } else {
-          unsigned int buf_size = 0;
-          if (!c2d_conv.get_buffer_size(C2D_OUTPUT,buf_size))
+    if (!psource_frame->nFilledLen) {
+        pdest_frame->nOffset = 0;
+        pdest_frame->nFilledLen = 0;
+        pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
+        pdest_frame->nFlags = psource_frame->nFlags;
+        DEBUG_PRINT_LOW("\n Buffer header %p Filled len size %d",
+                pdest_frame,pdest_frame->nFilledLen);
+    } else {
+        uva = (unsigned char *)mmap(NULL, Input_pmem_info.size,
+                PROT_READ|PROT_WRITE,
+                MAP_SHARED,Input_pmem_info.fd,0);
+        if (uva == MAP_FAILED) {
             ret = OMX_ErrorBadParameter;
-          else {
-            pdest_frame->nOffset = 0;
-            pdest_frame->nFilledLen = buf_size;
-            pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
-            pdest_frame->nFlags = psource_frame->nFlags;
-            DEBUG_PRINT_LOW("\n Buffer header %p Filled len size %d",
-               pdest_frame,pdest_frame->nFilledLen);
-           }
-         }
-         munmap(uva,Input_pmem_info.size);
-      }
+        } else {
+            if (!c2d_conv.convert(Input_pmem_info.fd, uva, uva,
+                        m_pInput_pmem[index].fd, pdest_frame->pBuffer, pdest_frame->pBuffer)) {
+                DEBUG_PRINT_ERROR("\n Color Conversion failed");
+                ret = OMX_ErrorBadParameter;
+            } else {
+                unsigned int buf_size = 0;
+                if (!c2d_conv.get_buffer_size(C2D_OUTPUT,buf_size))
+                    ret = OMX_ErrorBadParameter;
+                else {
+                    pdest_frame->nOffset = 0;
+                    pdest_frame->nFilledLen = buf_size;
+                    pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
+                    pdest_frame->nFlags = psource_frame->nFlags;
+                    DEBUG_PRINT_LOW("\n Buffer header %p Filled len size %d",
+                            pdest_frame,pdest_frame->nFilledLen);
+                }
+            }
+            munmap(uva,Input_pmem_info.size);
+        }
     }
-    if(dev_use_buf(&m_pInput_pmem[index],PORT_INDEX_IN,0) != true) {
-      DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
-      post_event ((unsigned int)pdest_frame,0,OMX_COMPONENT_GENERATE_EBD);
-      ret = OMX_ErrorBadParameter;
+    if (dev_use_buf(&m_pInput_pmem[index],PORT_INDEX_IN,0) != true) {
+        DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
+        post_event ((unsigned int)pdest_frame,0,OMX_COMPONENT_GENERATE_EBD);
+        ret = OMX_ErrorBadParameter;
     }
-    if(ret == OMX_ErrorNone)
-      ret = empty_this_buffer_proxy(hComp,pdest_frame);
-    if(ret == OMX_ErrorNone) {
-      m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, psource_frame);
-      psource_frame = NULL;
-      pdest_frame = NULL;
-      if(!psource_frame && m_opq_meta_q.m_size) {
-        m_opq_meta_q.pop_entry(&address,&p2,&id);
-        psource_frame = (OMX_BUFFERHEADERTYPE* ) address;
-      }
-      if(!pdest_frame && m_opq_pmem_q.m_size) {
-        m_opq_pmem_q.pop_entry(&address,&p2,&id);
-        pdest_frame = (OMX_BUFFERHEADERTYPE* ) address;
-        DEBUG_PRINT_LOW("\n pdest_frame pop address is %p",pdest_frame);
-      }
+    if (ret == OMX_ErrorNone)
+        ret = empty_this_buffer_proxy(hComp,pdest_frame);
+    if (ret == OMX_ErrorNone) {
+        m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, psource_frame);
+        psource_frame = NULL;
+        pdest_frame = NULL;
+        if (!psource_frame && m_opq_meta_q.m_size) {
+            m_opq_meta_q.pop_entry(&address,&p2,&id);
+            psource_frame = (OMX_BUFFERHEADERTYPE* ) address;
+        }
+        if (!pdest_frame && m_opq_pmem_q.m_size) {
+            m_opq_pmem_q.pop_entry(&address,&p2,&id);
+            pdest_frame = (OMX_BUFFERHEADERTYPE* ) address;
+            DEBUG_PRINT_LOW("\n pdest_frame pop address is %p",pdest_frame);
+        }
     }
     return ret;
 }
 
 OMX_ERRORTYPE omx_video::push_input_buffer(OMX_HANDLETYPE hComp)
 {
-  unsigned address = 0,p2,id, index = 0;
-  OMX_ERRORTYPE ret = OMX_ErrorNone;
+    unsigned address = 0,p2,id, index = 0;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
 
-  if(!psource_frame && m_opq_meta_q.m_size) {
-    m_opq_meta_q.pop_entry(&address,&p2,&id);
-    psource_frame = (OMX_BUFFERHEADERTYPE* ) address;
-  }
-  if(!pdest_frame && m_opq_pmem_q.m_size) {
-    m_opq_pmem_q.pop_entry(&address,&p2,&id);
-    pdest_frame = (OMX_BUFFERHEADERTYPE* ) address;
-  }
-  while(psource_frame != NULL && pdest_frame != NULL &&
-        ret == OMX_ErrorNone) {
-    struct pmem Input_pmem_info;
-    encoder_media_buffer_type *media_buffer;
-    index = pdest_frame - m_inp_mem_ptr;
-    if(index >= m_sInPortDef.nBufferCountActual){
-       DEBUG_PRINT_ERROR("\n Output buffer index is wrong %d act count %d",
-                         index,m_sInPortDef.nBufferCountActual);
-       return OMX_ErrorBadParameter;
+    if (!psource_frame && m_opq_meta_q.m_size) {
+        m_opq_meta_q.pop_entry(&address,&p2,&id);
+        psource_frame = (OMX_BUFFERHEADERTYPE* ) address;
     }
-    media_buffer = (encoder_media_buffer_type *)psource_frame->pBuffer;
-    /*Will enable to verify camcorder in current TIPS can be removed*/
-    if(media_buffer->buffer_type == kMetadataBufferTypeCameraSource) {
-      Input_pmem_info.buffer = media_buffer;
-      Input_pmem_info.fd = media_buffer->meta_handle->data[0];
-      Input_pmem_info.offset = media_buffer->meta_handle->data[1];
-      Input_pmem_info.size = media_buffer->meta_handle->data[2];
-      DEBUG_PRINT_LOW("ETB fd = %d, offset = %d, size = %d",Input_pmem_info.fd,
-                        Input_pmem_info.offset,
-                        Input_pmem_info.size);
-      ret = queue_meta_buffer(hComp,Input_pmem_info);
-    } else {
-      private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
-      Input_pmem_info.buffer = media_buffer;
-      Input_pmem_info.fd = handle->fd;
-      Input_pmem_info.offset = 0;
-      Input_pmem_info.size = handle->size;
-      if(handle->format == HAL_PIXEL_FORMAT_RGBA_8888)
-        ret = convert_queue_buffer(hComp,Input_pmem_info,index);
-      else if(handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE)
-        ret = queue_meta_buffer(hComp,Input_pmem_info);
-      else
-        ret = OMX_ErrorBadParameter;
+    if (!pdest_frame && m_opq_pmem_q.m_size) {
+        m_opq_pmem_q.pop_entry(&address,&p2,&id);
+        pdest_frame = (OMX_BUFFERHEADERTYPE* ) address;
     }
-   }
-  return ret;
+    while (psource_frame != NULL && pdest_frame != NULL &&
+            ret == OMX_ErrorNone) {
+        struct pmem Input_pmem_info;
+        encoder_media_buffer_type *media_buffer;
+        index = pdest_frame - m_inp_mem_ptr;
+        if (index >= m_sInPortDef.nBufferCountActual) {
+            DEBUG_PRINT_ERROR("\n Output buffer index is wrong %d act count %d",
+                    index,m_sInPortDef.nBufferCountActual);
+            return OMX_ErrorBadParameter;
+        }
+        media_buffer = (encoder_media_buffer_type *)psource_frame->pBuffer;
+        /*Will enable to verify camcorder in current TIPS can be removed*/
+        if (media_buffer->buffer_type == kMetadataBufferTypeCameraSource) {
+            Input_pmem_info.buffer = media_buffer;
+            Input_pmem_info.fd = media_buffer->meta_handle->data[0];
+            Input_pmem_info.offset = media_buffer->meta_handle->data[1];
+            Input_pmem_info.size = media_buffer->meta_handle->data[2];
+            DEBUG_PRINT_LOW("ETB fd = %d, offset = %d, size = %d",Input_pmem_info.fd,
+                    Input_pmem_info.offset,
+                    Input_pmem_info.size);
+            ret = queue_meta_buffer(hComp,Input_pmem_info);
+        } else {
+            private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
+            Input_pmem_info.buffer = media_buffer;
+            Input_pmem_info.fd = handle->fd;
+            Input_pmem_info.offset = 0;
+            Input_pmem_info.size = handle->size;
+            if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888)
+                ret = convert_queue_buffer(hComp,Input_pmem_info,index);
+            else if (handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE)
+                ret = queue_meta_buffer(hComp,Input_pmem_info);
+            else
+                ret = OMX_ErrorBadParameter;
+        }
+    }
+    return ret;
 }
diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
index bc94ddd..6433dd9 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
@@ -40,21 +40,21 @@
 #define strlcpy g_strlcpy
 #endif
 /*----------------------------------------------------------------------------
-* Preprocessor Definitions and Constants
-* -------------------------------------------------------------------------*/
+ * Preprocessor Definitions and Constants
+ * -------------------------------------------------------------------------*/
 
 #define OMX_SPEC_VERSION 0x00000101
 #define OMX_INIT_STRUCT(_s_, _name_)            \
-   memset((_s_), 0x0, sizeof(_name_));          \
-   (_s_)->nSize = sizeof(_name_);               \
-   (_s_)->nVersion.nVersion = OMX_SPEC_VERSION
+    memset((_s_), 0x0, sizeof(_name_));          \
+(_s_)->nSize = sizeof(_name_);               \
+(_s_)->nVersion.nVersion = OMX_SPEC_VERSION
 
 extern int m_pipe;
 
 // factory function executed by the core to create instances
 void *get_omx_component_factory_fn(void)
 {
-  return(new omx_venc);
+    return(new omx_venc);
 }
 
 //constructor
@@ -62,1872 +62,1661 @@
 omx_venc::omx_venc()
 {
 #ifdef _ANDROID_ICS_
-  meta_mode_enable = false;
-  memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
-  memset(meta_buffers,0,sizeof(meta_buffers));
-  memset(opaque_buffer_hdr,0,sizeof(opaque_buffer_hdr));
-  mUseProxyColorFormat = false;
-  get_syntaxhdr_enable = false;
+    meta_mode_enable = false;
+    memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
+    memset(meta_buffers,0,sizeof(meta_buffers));
+    memset(opaque_buffer_hdr,0,sizeof(opaque_buffer_hdr));
+    mUseProxyColorFormat = false;
+    get_syntaxhdr_enable = false;
 #endif
 }
 
 omx_venc::~omx_venc()
 {
-  get_syntaxhdr_enable = false;
-  //nothing to do
+    get_syntaxhdr_enable = false;
+    //nothing to do
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::ComponentInit
+   FUNCTION
+   omx_venc::ComponentInit
 
-DESCRIPTION
-  Initialize the component.
+   DESCRIPTION
+   Initialize the component.
 
-PARAMETERS
-  ctxt -- Context information related to the self.
-  id   -- Event identifier. This could be any of the following:
-          1. Command completion event
-          2. Buffer done callback event
-          3. Frame done callback event
+   PARAMETERS
+   ctxt -- Context information related to the self.
+   id   -- Event identifier. This could be any of the following:
+   1. Command completion event
+   2. Buffer done callback event
+   3. Frame done callback event
 
-RETURN VALUE
-  None.
+   RETURN VALUE
+   None.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
 {
 
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
-  int fds[2];
-  int r;
+    int fds[2];
+    int r;
 
-  OMX_VIDEO_CODINGTYPE codec_type;
+    OMX_VIDEO_CODINGTYPE codec_type;
 
-  DEBUG_PRINT_HIGH("\n omx_venc(): Inside component_init()");
-  // Copy the role information which provides the decoder m_nkind
-  strlcpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
+    DEBUG_PRINT_HIGH("\n omx_venc(): Inside component_init()");
+    // Copy the role information which provides the decoder m_nkind
+    strlcpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
 
-  if(!strncmp((char *)m_nkind,"OMX.qcom.video.encoder.mpeg4",\
-              OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_encoder.mpeg4",\
-            OMX_MAX_STRINGNAME_SIZE);
-    codec_type = OMX_VIDEO_CodingMPEG4;
-  }
-  else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
-                   OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
-    codec_type = OMX_VIDEO_CodingH263;
-  }
-  else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
-                   OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
-    codec_type = OMX_VIDEO_CodingAVC;
-  }
+    if (!strncmp((char *)m_nkind,"OMX.qcom.video.encoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_encoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE);
+        codec_type = OMX_VIDEO_CodingMPEG4;
+    } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
+        codec_type = OMX_VIDEO_CodingH263;
+    } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
+        codec_type = OMX_VIDEO_CodingAVC;
+    }
 #ifdef _MSM8974_
-  else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",	\
-                   OMX_MAX_STRINGNAME_SIZE))
-  {
-    strlcpy((char *)m_cRole, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-    codec_type = OMX_VIDEO_CodingVPX;
-  }
+    else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",    \
+                OMX_MAX_STRINGNAME_SIZE)) {
+        strlcpy((char *)m_cRole, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+        codec_type = OMX_VIDEO_CodingVPX;
+    }
 #endif
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Unknown Component\n");
-    eRet = OMX_ErrorInvalidComponentName;
-  }
+    else {
+        DEBUG_PRINT_ERROR("\nERROR: Unknown Component\n");
+        eRet = OMX_ErrorInvalidComponentName;
+    }
 
 
-  if(eRet != OMX_ErrorNone)
-  {
-    return eRet;
-  }
+    if (eRet != OMX_ErrorNone) {
+        return eRet;
+    }
 #ifdef ENABLE_GET_SYNTAX_HDR
-  get_syntaxhdr_enable = true;
-  DEBUG_PRINT_HIGH("Get syntax header enabled");
+    get_syntaxhdr_enable = true;
+    DEBUG_PRINT_HIGH("Get syntax header enabled");
 #endif
 
-  handle = new venc_dev(this);
+    handle = new venc_dev(this);
 
-  if(handle == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: handle is NULL");
-    return OMX_ErrorInsufficientResources;
-  }
-
-  if(handle->venc_open(codec_type) != true)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: venc_open failed");
-    return OMX_ErrorInsufficientResources;
-  }
-
-  //Intialise the OMX layer variables
-  memset(&m_pCallbacks,0,sizeof(OMX_CALLBACKTYPE));
-
-  OMX_INIT_STRUCT(&m_sPortParam, OMX_PORT_PARAM_TYPE);
-  m_sPortParam.nPorts = 0x2;
-  m_sPortParam.nStartPortNumber = (OMX_U32) PORT_INDEX_IN;
-
-  OMX_INIT_STRUCT(&m_sPortParam_audio, OMX_PORT_PARAM_TYPE);
-  m_sPortParam_audio.nPorts = 0;
-  m_sPortParam_audio.nStartPortNumber = 0;
-
-  OMX_INIT_STRUCT(&m_sPortParam_img, OMX_PORT_PARAM_TYPE);
-  m_sPortParam_img.nPorts = 0;
-  m_sPortParam_img.nStartPortNumber = 0;
-
-  OMX_INIT_STRUCT(&m_sParamBitrate, OMX_VIDEO_PARAM_BITRATETYPE);
-  m_sParamBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sParamBitrate.eControlRate = OMX_Video_ControlRateVariableSkipFrames;
-  m_sParamBitrate.nTargetBitrate = 64000;
-
-  OMX_INIT_STRUCT(&m_sConfigBitrate, OMX_VIDEO_CONFIG_BITRATETYPE);
-  m_sConfigBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sConfigBitrate.nEncodeBitrate = 64000;
-
-  OMX_INIT_STRUCT(&m_sConfigFramerate, OMX_CONFIG_FRAMERATETYPE);
-  m_sConfigFramerate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sConfigFramerate.xEncodeFramerate = 30 << 16;
-
-  OMX_INIT_STRUCT(&m_sConfigIntraRefreshVOP, OMX_CONFIG_INTRAREFRESHVOPTYPE);
-  m_sConfigIntraRefreshVOP.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
-
-  OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
-  m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_IN;
-  m_sConfigFrameRotation.nRotation = 0;
-
-  OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
-  m_sSessionQuantization.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sSessionQuantization.nQpI = 9;
-  m_sSessionQuantization.nQpP = 6;
-  m_sSessionQuantization.nQpB = 2;
-
-  OMX_INIT_STRUCT(&m_sSessionQPRange, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
-  m_sSessionQPRange.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sSessionQPRange.minQP = 2;
-  if(codec_type == OMX_VIDEO_CodingAVC)
-    m_sSessionQPRange.maxQP = 51;
-  else
-    m_sSessionQPRange.maxQP = 31;
-
-  OMX_INIT_STRUCT(&m_sAVCSliceFMO, OMX_VIDEO_PARAM_AVCSLICEFMO);
-  m_sAVCSliceFMO.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sAVCSliceFMO.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
-  m_sAVCSliceFMO.nNumSliceGroups = 0;
-  m_sAVCSliceFMO.nSliceGroupMapType = 0;
-  OMX_INIT_STRUCT(&m_sParamProfileLevel, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
-  m_sParamProfileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-
-  OMX_INIT_STRUCT(&m_sIntraperiod, QOMX_VIDEO_INTRAPERIODTYPE);
-  m_sIntraperiod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sIntraperiod.nPFrames = (m_sConfigFramerate.xEncodeFramerate * 2) - 1;
-
-  OMX_INIT_STRUCT(&m_sErrorCorrection, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
-  m_sErrorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sErrorCorrection.bEnableDataPartitioning = OMX_FALSE;
-  m_sErrorCorrection.bEnableHEC = OMX_FALSE;
-  m_sErrorCorrection.bEnableResync = OMX_FALSE;
-  m_sErrorCorrection.bEnableRVLC = OMX_FALSE;
-  m_sErrorCorrection.nResynchMarkerSpacing = 0;
-
-  OMX_INIT_STRUCT(&m_sIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
-  m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax;
-
-  if(codec_type == OMX_VIDEO_CodingMPEG4)
-  {
-    m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple;
-    m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_MPEG4Level0;
-  }
-  else if(codec_type == OMX_VIDEO_CodingH263)
-  {
-    m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_H263ProfileBaseline;
-    m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_H263Level10;
-  }
-  else if(codec_type == OMX_VIDEO_CodingAVC)
-  {
-    m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_AVCProfileBaseline;
-    m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_AVCLevel1;
-  }
-
-  // Initialize the video parameters for input port
-  OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
-  m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN;
-  m_sInPortDef.bEnabled = OMX_TRUE;
-  m_sInPortDef.bPopulated = OMX_FALSE;
-  m_sInPortDef.eDomain = OMX_PortDomainVideo;
-  m_sInPortDef.eDir = OMX_DirInput;
-  m_sInPortDef.format.video.cMIMEType = "YUV420";
-  m_sInPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
-  m_sInPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
-  m_sInPortDef.format.video.nStride = OMX_CORE_QCIF_WIDTH;
-  m_sInPortDef.format.video.nSliceHeight = OMX_CORE_QCIF_HEIGHT;
-  m_sInPortDef.format.video.nBitrate = 64000;
-  m_sInPortDef.format.video.xFramerate = 15 << 16;
-  m_sInPortDef.format.video.eColorFormat =  OMX_COLOR_FormatYUV420SemiPlanar;
-  m_sInPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingUnused;
-
-  if(dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
-                     &m_sInPortDef.nBufferCountActual,
-                     &m_sInPortDef.nBufferSize,
-                     m_sInPortDef.nPortIndex) != true)
-  {
-    eRet = OMX_ErrorUndefined;
-
-  }
-
-  // Initialize the video parameters for output port
-  OMX_INIT_STRUCT(&m_sOutPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
-  m_sOutPortDef.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sOutPortDef.bEnabled = OMX_TRUE;
-  m_sOutPortDef.bPopulated = OMX_FALSE;
-  m_sOutPortDef.eDomain = OMX_PortDomainVideo;
-  m_sOutPortDef.eDir = OMX_DirOutput;
-  m_sOutPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
-  m_sOutPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
-  m_sOutPortDef.format.video.nBitrate = 64000;
-  m_sOutPortDef.format.video.xFramerate = 15 << 16;
-  m_sOutPortDef.format.video.eColorFormat =  OMX_COLOR_FormatUnused;
-  if(codec_type == OMX_VIDEO_CodingMPEG4)
-  {
-    m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
-  }
-  else if(codec_type == OMX_VIDEO_CodingH263)
-  {
-    m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingH263;
-  }
-  else
-  {
-    m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingAVC;
-  }
-  if(dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
-                     &m_sOutPortDef.nBufferCountActual,
-                     &m_sOutPortDef.nBufferSize,
-                     m_sOutPortDef.nPortIndex) != true)
-  {
-    eRet = OMX_ErrorUndefined;
-  }
-
-  // Initialize the video color format for input port
-  OMX_INIT_STRUCT(&m_sInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
-  m_sInPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_IN;
-  m_sInPortFormat.nIndex = 0;
-  m_sInPortFormat.eColorFormat =  OMX_COLOR_FormatYUV420SemiPlanar;
-  m_sInPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
-
-
-  // Initialize the compression format for output port
-  OMX_INIT_STRUCT(&m_sOutPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
-  m_sOutPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sOutPortFormat.nIndex = 0;
-  m_sOutPortFormat.eColorFormat = OMX_COLOR_FormatUnused;
-  if(codec_type == OMX_VIDEO_CodingMPEG4)
-  {
-    m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
-  }
-  else if(codec_type == OMX_VIDEO_CodingH263)
-  {
-    m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingH263;
-  }
-  else
-  {
-    m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingAVC;
-  }
-
-  // mandatory Indices for kronos test suite
-  OMX_INIT_STRUCT(&m_sPriorityMgmt, OMX_PRIORITYMGMTTYPE);
-
-  OMX_INIT_STRUCT(&m_sInBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
-  m_sInBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_IN;
-
-  OMX_INIT_STRUCT(&m_sOutBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
-  m_sOutBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-
-
-  // mp4 specific init
-  OMX_INIT_STRUCT(&m_sParamMPEG4, OMX_VIDEO_PARAM_MPEG4TYPE);
-  m_sParamMPEG4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sParamMPEG4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-  m_sParamMPEG4.eLevel = OMX_VIDEO_MPEG4Level0;
-  m_sParamMPEG4.nSliceHeaderSpacing = 0;
-  m_sParamMPEG4.bSVH = OMX_FALSE;
-  m_sParamMPEG4.bGov = OMX_FALSE;
-  m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1);  // 2 second intra period for default outport fps
-  m_sParamMPEG4.bACPred = OMX_TRUE;
-  m_sParamMPEG4.nTimeIncRes = 30; // delta = 2 @ 15 fps
-  m_sParamMPEG4.nAllowedPictureTypes = 2; // pframe and iframe
-  m_sParamMPEG4.nHeaderExtension = 1; // number of video packet headers per vop
-  m_sParamMPEG4.bReversibleVLC = OMX_FALSE;
-
-  // h263 specific init
-  OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE);
-  m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
-  m_sParamH263.nBFrames = 0;
-  m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
-  m_sParamH263.eLevel = OMX_VIDEO_H263Level10;
-  m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE;
-  m_sParamH263.nAllowedPictureTypes = 2;
-  m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE;
-  m_sParamH263.nPictureHeaderRepetition = 0;
-  m_sParamH263.nGOBHeaderInterval = 1;
-
-  // h264 specific init
-  OMX_INIT_STRUCT(&m_sParamAVC, OMX_VIDEO_PARAM_AVCTYPE);
-  m_sParamAVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sParamAVC.nSliceHeaderSpacing = 0;
-  m_sParamAVC.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
-  m_sParamAVC.nBFrames = 0;
-  m_sParamAVC.bUseHadamard = OMX_FALSE;
-  m_sParamAVC.nRefFrames = 1;
-  m_sParamAVC.nRefIdx10ActiveMinus1 = 1;
-  m_sParamAVC.nRefIdx11ActiveMinus1 = 0;
-  m_sParamAVC.bEnableUEP = OMX_FALSE;
-  m_sParamAVC.bEnableFMO = OMX_FALSE;
-  m_sParamAVC.bEnableASO = OMX_FALSE;
-  m_sParamAVC.bEnableRS = OMX_FALSE;
-  m_sParamAVC.eProfile = OMX_VIDEO_AVCProfileBaseline;
-  m_sParamAVC.eLevel = OMX_VIDEO_AVCLevel1;
-  m_sParamAVC.nAllowedPictureTypes = 2;
-  m_sParamAVC.bFrameMBsOnly = OMX_FALSE;
-  m_sParamAVC.bMBAFF = OMX_FALSE;
-  m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE;
-  m_sParamAVC.bWeightedPPrediction = OMX_FALSE;
-  m_sParamAVC.nWeightedBipredicitonMode = 0;
-  m_sParamAVC.bconstIpred = OMX_FALSE;
-  m_sParamAVC.bDirect8x8Inference = OMX_FALSE;
-  m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE;
-  m_sParamAVC.nCabacInitIdc = 0;
-  m_sParamAVC.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
-
-  OMX_INIT_STRUCT(&m_sParamLTRMode, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
-  m_sParamLTRMode.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-  m_sParamLTRMode.eLTRMode = QOMX_VIDEO_LTRMode_Disable;
-
-  m_state                   = OMX_StateLoaded;
-  m_sExtraData = 0;
-
-  if(eRet == OMX_ErrorNone)
-  {
-    if(pipe(fds))
-    {
-      DEBUG_PRINT_ERROR("ERROR: pipe creation failed\n");
-      eRet = OMX_ErrorInsufficientResources;
+    if (handle == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR: handle is NULL");
+        return OMX_ErrorInsufficientResources;
     }
+
+    if (handle->venc_open(codec_type) != true) {
+        DEBUG_PRINT_ERROR("\nERROR: venc_open failed");
+        return OMX_ErrorInsufficientResources;
+    }
+
+    //Intialise the OMX layer variables
+    memset(&m_pCallbacks,0,sizeof(OMX_CALLBACKTYPE));
+
+    OMX_INIT_STRUCT(&m_sPortParam, OMX_PORT_PARAM_TYPE);
+    m_sPortParam.nPorts = 0x2;
+    m_sPortParam.nStartPortNumber = (OMX_U32) PORT_INDEX_IN;
+
+    OMX_INIT_STRUCT(&m_sPortParam_audio, OMX_PORT_PARAM_TYPE);
+    m_sPortParam_audio.nPorts = 0;
+    m_sPortParam_audio.nStartPortNumber = 0;
+
+    OMX_INIT_STRUCT(&m_sPortParam_img, OMX_PORT_PARAM_TYPE);
+    m_sPortParam_img.nPorts = 0;
+    m_sPortParam_img.nStartPortNumber = 0;
+
+    OMX_INIT_STRUCT(&m_sParamBitrate, OMX_VIDEO_PARAM_BITRATETYPE);
+    m_sParamBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sParamBitrate.eControlRate = OMX_Video_ControlRateVariableSkipFrames;
+    m_sParamBitrate.nTargetBitrate = 64000;
+
+    OMX_INIT_STRUCT(&m_sConfigBitrate, OMX_VIDEO_CONFIG_BITRATETYPE);
+    m_sConfigBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sConfigBitrate.nEncodeBitrate = 64000;
+
+    OMX_INIT_STRUCT(&m_sConfigFramerate, OMX_CONFIG_FRAMERATETYPE);
+    m_sConfigFramerate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sConfigFramerate.xEncodeFramerate = 30 << 16;
+
+    OMX_INIT_STRUCT(&m_sConfigIntraRefreshVOP, OMX_CONFIG_INTRAREFRESHVOPTYPE);
+    m_sConfigIntraRefreshVOP.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
+
+    OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
+    m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_IN;
+    m_sConfigFrameRotation.nRotation = 0;
+
+    OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
+    m_sSessionQuantization.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sSessionQuantization.nQpI = 9;
+    m_sSessionQuantization.nQpP = 6;
+    m_sSessionQuantization.nQpB = 2;
+
+    OMX_INIT_STRUCT(&m_sSessionQPRange, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
+    m_sSessionQPRange.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sSessionQPRange.minQP = 2;
+    if (codec_type == OMX_VIDEO_CodingAVC)
+        m_sSessionQPRange.maxQP = 51;
     else
-    {
-      if(fds[0] == 0 || fds[1] == 0)
-      {
-        if(pipe(fds))
-        {
-          DEBUG_PRINT_ERROR("ERROR: pipe creation failed\n");
-          eRet = OMX_ErrorInsufficientResources;
+        m_sSessionQPRange.maxQP = 31;
+
+    OMX_INIT_STRUCT(&m_sAVCSliceFMO, OMX_VIDEO_PARAM_AVCSLICEFMO);
+    m_sAVCSliceFMO.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sAVCSliceFMO.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
+    m_sAVCSliceFMO.nNumSliceGroups = 0;
+    m_sAVCSliceFMO.nSliceGroupMapType = 0;
+    OMX_INIT_STRUCT(&m_sParamProfileLevel, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
+    m_sParamProfileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+
+    OMX_INIT_STRUCT(&m_sIntraperiod, QOMX_VIDEO_INTRAPERIODTYPE);
+    m_sIntraperiod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sIntraperiod.nPFrames = (m_sConfigFramerate.xEncodeFramerate * 2) - 1;
+
+    OMX_INIT_STRUCT(&m_sErrorCorrection, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
+    m_sErrorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sErrorCorrection.bEnableDataPartitioning = OMX_FALSE;
+    m_sErrorCorrection.bEnableHEC = OMX_FALSE;
+    m_sErrorCorrection.bEnableResync = OMX_FALSE;
+    m_sErrorCorrection.bEnableRVLC = OMX_FALSE;
+    m_sErrorCorrection.nResynchMarkerSpacing = 0;
+
+    OMX_INIT_STRUCT(&m_sIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
+    m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax;
+
+    if (codec_type == OMX_VIDEO_CodingMPEG4) {
+        m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple;
+        m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_MPEG4Level0;
+    } else if (codec_type == OMX_VIDEO_CodingH263) {
+        m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_H263ProfileBaseline;
+        m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_H263Level10;
+    } else if (codec_type == OMX_VIDEO_CodingAVC) {
+        m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_AVCProfileBaseline;
+        m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_AVCLevel1;
+    }
+
+    // Initialize the video parameters for input port
+    OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
+    m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN;
+    m_sInPortDef.bEnabled = OMX_TRUE;
+    m_sInPortDef.bPopulated = OMX_FALSE;
+    m_sInPortDef.eDomain = OMX_PortDomainVideo;
+    m_sInPortDef.eDir = OMX_DirInput;
+    m_sInPortDef.format.video.cMIMEType = "YUV420";
+    m_sInPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
+    m_sInPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
+    m_sInPortDef.format.video.nStride = OMX_CORE_QCIF_WIDTH;
+    m_sInPortDef.format.video.nSliceHeight = OMX_CORE_QCIF_HEIGHT;
+    m_sInPortDef.format.video.nBitrate = 64000;
+    m_sInPortDef.format.video.xFramerate = 15 << 16;
+    m_sInPortDef.format.video.eColorFormat =  OMX_COLOR_FormatYUV420SemiPlanar;
+    m_sInPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingUnused;
+
+    if (dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
+                &m_sInPortDef.nBufferCountActual,
+                &m_sInPortDef.nBufferSize,
+                m_sInPortDef.nPortIndex) != true) {
+        eRet = OMX_ErrorUndefined;
+
+    }
+
+    // Initialize the video parameters for output port
+    OMX_INIT_STRUCT(&m_sOutPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
+    m_sOutPortDef.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sOutPortDef.bEnabled = OMX_TRUE;
+    m_sOutPortDef.bPopulated = OMX_FALSE;
+    m_sOutPortDef.eDomain = OMX_PortDomainVideo;
+    m_sOutPortDef.eDir = OMX_DirOutput;
+    m_sOutPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
+    m_sOutPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
+    m_sOutPortDef.format.video.nBitrate = 64000;
+    m_sOutPortDef.format.video.xFramerate = 15 << 16;
+    m_sOutPortDef.format.video.eColorFormat =  OMX_COLOR_FormatUnused;
+    if (codec_type == OMX_VIDEO_CodingMPEG4) {
+        m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
+    } else if (codec_type == OMX_VIDEO_CodingH263) {
+        m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingH263;
+    } else {
+        m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingAVC;
+    }
+    if (dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
+                &m_sOutPortDef.nBufferCountActual,
+                &m_sOutPortDef.nBufferSize,
+                m_sOutPortDef.nPortIndex) != true) {
+        eRet = OMX_ErrorUndefined;
+    }
+
+    // Initialize the video color format for input port
+    OMX_INIT_STRUCT(&m_sInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
+    m_sInPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_IN;
+    m_sInPortFormat.nIndex = 0;
+    m_sInPortFormat.eColorFormat =  OMX_COLOR_FormatYUV420SemiPlanar;
+    m_sInPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
+
+
+    // Initialize the compression format for output port
+    OMX_INIT_STRUCT(&m_sOutPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
+    m_sOutPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sOutPortFormat.nIndex = 0;
+    m_sOutPortFormat.eColorFormat = OMX_COLOR_FormatUnused;
+    if (codec_type == OMX_VIDEO_CodingMPEG4) {
+        m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
+    } else if (codec_type == OMX_VIDEO_CodingH263) {
+        m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingH263;
+    } else {
+        m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingAVC;
+    }
+
+    // mandatory Indices for kronos test suite
+    OMX_INIT_STRUCT(&m_sPriorityMgmt, OMX_PRIORITYMGMTTYPE);
+
+    OMX_INIT_STRUCT(&m_sInBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
+    m_sInBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_IN;
+
+    OMX_INIT_STRUCT(&m_sOutBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
+    m_sOutBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+
+
+    // mp4 specific init
+    OMX_INIT_STRUCT(&m_sParamMPEG4, OMX_VIDEO_PARAM_MPEG4TYPE);
+    m_sParamMPEG4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sParamMPEG4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+    m_sParamMPEG4.eLevel = OMX_VIDEO_MPEG4Level0;
+    m_sParamMPEG4.nSliceHeaderSpacing = 0;
+    m_sParamMPEG4.bSVH = OMX_FALSE;
+    m_sParamMPEG4.bGov = OMX_FALSE;
+    m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1);  // 2 second intra period for default outport fps
+    m_sParamMPEG4.bACPred = OMX_TRUE;
+    m_sParamMPEG4.nTimeIncRes = 30; // delta = 2 @ 15 fps
+    m_sParamMPEG4.nAllowedPictureTypes = 2; // pframe and iframe
+    m_sParamMPEG4.nHeaderExtension = 1; // number of video packet headers per vop
+    m_sParamMPEG4.bReversibleVLC = OMX_FALSE;
+
+    // h263 specific init
+    OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE);
+    m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
+    m_sParamH263.nBFrames = 0;
+    m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
+    m_sParamH263.eLevel = OMX_VIDEO_H263Level10;
+    m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE;
+    m_sParamH263.nAllowedPictureTypes = 2;
+    m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE;
+    m_sParamH263.nPictureHeaderRepetition = 0;
+    m_sParamH263.nGOBHeaderInterval = 1;
+
+    // h264 specific init
+    OMX_INIT_STRUCT(&m_sParamAVC, OMX_VIDEO_PARAM_AVCTYPE);
+    m_sParamAVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sParamAVC.nSliceHeaderSpacing = 0;
+    m_sParamAVC.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
+    m_sParamAVC.nBFrames = 0;
+    m_sParamAVC.bUseHadamard = OMX_FALSE;
+    m_sParamAVC.nRefFrames = 1;
+    m_sParamAVC.nRefIdx10ActiveMinus1 = 1;
+    m_sParamAVC.nRefIdx11ActiveMinus1 = 0;
+    m_sParamAVC.bEnableUEP = OMX_FALSE;
+    m_sParamAVC.bEnableFMO = OMX_FALSE;
+    m_sParamAVC.bEnableASO = OMX_FALSE;
+    m_sParamAVC.bEnableRS = OMX_FALSE;
+    m_sParamAVC.eProfile = OMX_VIDEO_AVCProfileBaseline;
+    m_sParamAVC.eLevel = OMX_VIDEO_AVCLevel1;
+    m_sParamAVC.nAllowedPictureTypes = 2;
+    m_sParamAVC.bFrameMBsOnly = OMX_FALSE;
+    m_sParamAVC.bMBAFF = OMX_FALSE;
+    m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE;
+    m_sParamAVC.bWeightedPPrediction = OMX_FALSE;
+    m_sParamAVC.nWeightedBipredicitonMode = 0;
+    m_sParamAVC.bconstIpred = OMX_FALSE;
+    m_sParamAVC.bDirect8x8Inference = OMX_FALSE;
+    m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE;
+    m_sParamAVC.nCabacInitIdc = 0;
+    m_sParamAVC.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
+
+    OMX_INIT_STRUCT(&m_sParamLTRMode, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
+    m_sParamLTRMode.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sParamLTRMode.eLTRMode = QOMX_VIDEO_LTRMode_Disable;
+
+    m_state                   = OMX_StateLoaded;
+    m_sExtraData = 0;
+
+    if (eRet == OMX_ErrorNone) {
+        if (pipe(fds)) {
+            DEBUG_PRINT_ERROR("ERROR: pipe creation failed\n");
+            eRet = OMX_ErrorInsufficientResources;
+        } else {
+            if (fds[0] == 0 || fds[1] == 0) {
+                if (pipe(fds)) {
+                    DEBUG_PRINT_ERROR("ERROR: pipe creation failed\n");
+                    eRet = OMX_ErrorInsufficientResources;
+                }
+            }
+            if (eRet == OMX_ErrorNone) {
+                m_pipe_in = fds[0];
+                m_pipe_out = fds[1];
+            }
         }
-      }
-      if(eRet == OMX_ErrorNone)
-      {
-        m_pipe_in = fds[0];
-        m_pipe_out = fds[1];
-      }
+        msg_thread_created = true;
+        r = pthread_create(&msg_thread_id,0, message_thread, this);
+        if (r < 0) {
+            eRet = OMX_ErrorInsufficientResources;
+            msg_thread_created = false;
+        } else {
+            async_thread_created = true;
+            r = pthread_create(&async_thread_id,0, venc_dev::async_venc_message_thread, this);
+            if (r < 0) {
+                eRet = OMX_ErrorInsufficientResources;
+                async_thread_created = false;
+            } else
+                dev_set_message_thread_id(async_thread_id);
+        }
     }
-    msg_thread_created = true;
-    r = pthread_create(&msg_thread_id,0, message_thread, this);
-    if(r < 0)
-    {
-      eRet = OMX_ErrorInsufficientResources;
-      msg_thread_created = false;
-    }
-    else
-    {
-      async_thread_created = true;
-      r = pthread_create(&async_thread_id,0, venc_dev::async_venc_message_thread, this);
-      if(r < 0)
-      {
-        eRet = OMX_ErrorInsufficientResources;
-		async_thread_created = false;
-      } else
-		  dev_set_message_thread_id(async_thread_id);
-    }
-  }
 
-  DEBUG_PRINT_HIGH("\n Component_init return value = 0x%x", eRet);
-  return eRet;
+    DEBUG_PRINT_HIGH("\n Component_init return value = 0x%x", eRet);
+    return eRet;
 }
 
 
 /* ======================================================================
-FUNCTION
-  omx_venc::Setparameter
+   FUNCTION
+   omx_venc::Setparameter
 
-DESCRIPTION
-  OMX Set Parameter method implementation.
+   DESCRIPTION
+   OMX Set Parameter method implementation.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
+   RETURN VALUE
+   OMX Error None if successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
-                                       OMX_IN OMX_INDEXTYPE paramIndex,
-                                       OMX_IN OMX_PTR        paramData)
+        OMX_IN OMX_INDEXTYPE paramIndex,
+        OMX_IN OMX_PTR        paramData)
 {
-  OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
 
 
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Set Param in Invalid State\n");
-    return OMX_ErrorInvalidState;
-  }
-  if(paramData == NULL)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData \n");
-    return OMX_ErrorBadParameter;
-  }
-
-  /*set_parameter can be called in loaded state
-  or disabled port */
-  if(m_state == OMX_StateLoaded
-     || m_sInPortDef.bEnabled == OMX_FALSE
-     || m_sOutPortDef.bEnabled == OMX_FALSE)
-  {
-    DEBUG_PRINT_LOW("Set Parameter called in valid state");
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State\n");
-    return OMX_ErrorIncorrectStateOperation;
-  }
-
-  switch(paramIndex)
-  {
-  case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
-           (int)portDefn->format.video.nFrameHeight,
-           (int)portDefn->format.video.nFrameWidth);
-
-      if(PORT_INDEX_IN == portDefn->nPortIndex)
-      {
-        if (!dev_is_video_session_supported(portDefn->format.video.nFrameWidth,
-                   portDefn->format.video.nFrameHeight)) {
-            DEBUG_PRINT_ERROR("video session not supported\n");
-            omx_report_unsupported_setting();
-            return OMX_ErrorUnsupportedSetting;
-        }
-        DEBUG_PRINT_LOW("\n i/p actual cnt requested = %d\n", portDefn->nBufferCountActual);
-        DEBUG_PRINT_LOW("\n i/p min cnt requested = %d\n", portDefn->nBufferCountMin);
-        DEBUG_PRINT_LOW("\n i/p buffersize requested = %d\n", portDefn->nBufferSize);
-        if(portDefn->nBufferCountMin > portDefn->nBufferCountActual)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: (In_PORT) Min buffers (%d) > actual count (%d)\n",
-                            portDefn->nBufferCountMin, portDefn->nBufferCountActual);
-          return OMX_ErrorUnsupportedSetting;
-        }
-        if(handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: venc_set_param input failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-
-        DEBUG_PRINT_LOW("\n i/p previous actual cnt = %d\n", m_sInPortDef.nBufferCountActual);
-        DEBUG_PRINT_LOW("\n i/p previous min cnt = %d\n", m_sInPortDef.nBufferCountMin);
-        memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
-
-#ifdef _ANDROID_ICS_
-        if (portDefn->format.video.eColorFormat == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
-            m_sInPortDef.format.video.eColorFormat =
-                OMX_COLOR_FormatYUV420SemiPlanar;
-            if(!mUseProxyColorFormat){
-              if (!c2d_conv.init()) {
-                DEBUG_PRINT_ERROR("\n C2D init failed");
-                return OMX_ErrorUnsupportedSetting;
-              }
-              DEBUG_PRINT_ERROR("\nC2D init is successful");
-            }
-            mUseProxyColorFormat = true;
-            m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
-        } else
-          mUseProxyColorFormat = false;
-#endif
-        /*Query Input Buffer Requirements*/
-        dev_get_buf_req   (&m_sInPortDef.nBufferCountMin,
-                           &m_sInPortDef.nBufferCountActual,
-                           &m_sInPortDef.nBufferSize,
-                           m_sInPortDef.nPortIndex);
-
-        /*Query ouput Buffer Requirements*/
-        dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
-                           &m_sOutPortDef.nBufferCountActual,
-                           &m_sOutPortDef.nBufferSize,
-                           m_sOutPortDef.nPortIndex);
-        m_sInPortDef.nBufferCountActual = portDefn->nBufferCountActual;
-      }
-      else if(PORT_INDEX_OUT == portDefn->nPortIndex)
-      {
-        DEBUG_PRINT_LOW("\n o/p actual cnt requested = %d\n", portDefn->nBufferCountActual);
-        DEBUG_PRINT_LOW("\n o/p min cnt requested = %d\n", portDefn->nBufferCountMin);
-        DEBUG_PRINT_LOW("\n o/p buffersize requested = %d\n", portDefn->nBufferSize);
-        if(portDefn->nBufferCountMin > portDefn->nBufferCountActual)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: (Out_PORT) Min buffers (%d) > actual count (%d)\n",
-                            portDefn->nBufferCountMin, portDefn->nBufferCountActual);
-          return OMX_ErrorUnsupportedSetting;
-        }
-        if(handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: venc_set_param output failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-#ifdef _MSM8974_
-        /*Query ouput Buffer Requirements*/
-        dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
-                        &m_sOutPortDef.nBufferCountActual,
-                        &m_sOutPortDef.nBufferSize,
-                        m_sOutPortDef.nPortIndex);
-#endif
-        memcpy(&m_sOutPortDef,portDefn,sizeof(struct OMX_PARAM_PORTDEFINITIONTYPE));
-        update_profile_level(); //framerate , bitrate
-
-        DEBUG_PRINT_LOW("\n o/p previous actual cnt = %d\n", m_sOutPortDef.nBufferCountActual);
-        DEBUG_PRINT_LOW("\n o/p previous min cnt = %d\n", m_sOutPortDef.nBufferCountMin);
-        m_sOutPortDef.nBufferCountActual = portDefn->nBufferCountActual;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Set_parameter: Bad Port idx %d",
-                    (int)portDefn->nPortIndex);
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      m_sConfigFramerate.xEncodeFramerate = portDefn->format.video.xFramerate;
-      m_sConfigBitrate.nEncodeBitrate = portDefn->format.video.nBitrate;
-      m_sParamBitrate.nTargetBitrate = portDefn->format.video.nBitrate;
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: Set Param in Invalid State\n");
+        return OMX_ErrorInvalidState;
     }
-    break;
-
-  case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
-      (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
-                  portFmt->eColorFormat);
-      //set the driver with the corresponding values
-      if(PORT_INDEX_IN == portFmt->nPortIndex)
-      {
-        if(handle->venc_set_param(paramData,OMX_IndexParamVideoPortFormat) != true)
-        {
-          return OMX_ErrorUnsupportedSetting;
-        }
-
-        DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
-            portFmt->eColorFormat);
-        update_profile_level(); //framerate
-
-#ifdef _ANDROID_ICS_
-        if (portFmt->eColorFormat ==
-            (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
-            m_sInPortFormat.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
-            if(!mUseProxyColorFormat){
-              if (!c2d_conv.init()) {
-                DEBUG_PRINT_ERROR("\n C2D init failed");
-                return OMX_ErrorUnsupportedSetting;
-              }
-              DEBUG_PRINT_ERROR("\nC2D init is successful");
-            }
-            mUseProxyColorFormat = true;
-            m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
-        }
-        else
-#endif
-        {
-            m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
-            m_input_msg_id = OMX_COMPONENT_GENERATE_ETB;
-            mUseProxyColorFormat = false;
-        }
-        m_sInPortFormat.xFramerate = portFmt->xFramerate;
-      }
-      //TODO if no use case for O/P port,delet m_sOutPortFormat
-    }
-    break;
-  case OMX_IndexParamVideoInit:
-    {  //TODO, do we need this index set param
-      OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData);
-      DEBUG_PRINT_LOW("\n Set OMX_IndexParamVideoInit called");
-      break;
+    if (paramData == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData \n");
+        return OMX_ErrorBadParameter;
     }
 
-  case OMX_IndexParamVideoBitrate:
-    {
-      OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate");
-      if(handle->venc_set_param(paramData,OMX_IndexParamVideoBitrate) != true)
-      {
-        return OMX_ErrorUnsupportedSetting;
-      }
-      m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate;
-      m_sParamBitrate.eControlRate = pParam->eControlRate;
-      update_profile_level(); //bitrate
-      m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate;
-	  m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate;
-      m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate;
-      DEBUG_PRINT_LOW("\nbitrate = %u", m_sOutPortDef.format.video.nBitrate);
-      break;
-    }
-  case OMX_IndexParamVideoMpeg4:
-    {
-      OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
-      OMX_VIDEO_PARAM_MPEG4TYPE mp4_param;
-      memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4");
-      if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-      {
-#ifdef MAX_RES_1080P
-        if(pParam->nBFrames)
-        {
-          DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-          mp4_param.nBFrames = 1;
-        }
-#else
-        if(pParam->nBFrames)
-        {
-          DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-          mp4_param.nBFrames = 0;
-        }
-#endif
-      }
-      else
-      {
-        if(pParam->nBFrames)
-        {
-          DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-          mp4_param.nBFrames = 0;
-        }
-      }
-      if(handle->venc_set_param(&mp4_param,OMX_IndexParamVideoMpeg4) != true)
-      {
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
-      m_sIntraperiod.nPFrames = m_sParamMPEG4.nPFrames;
-      m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames;
-      break;
-    }
-  case OMX_IndexParamVideoH263:
-    {
-      OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263");
-      if(handle->venc_set_param(paramData,OMX_IndexParamVideoH263) != true)
-      {
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE));
-      m_sIntraperiod.nPFrames = m_sParamH263.nPFrames;
-      m_sIntraperiod.nBFrames = m_sParamH263.nBFrames;
-      break;
-    }
-  case OMX_IndexParamVideoAvc:
-    {
-      OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
-      OMX_VIDEO_PARAM_AVCTYPE avc_param;
-      memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE));
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc");
-
-      if((pParam->eProfile == OMX_VIDEO_AVCProfileHigh)||
-         (pParam->eProfile == OMX_VIDEO_AVCProfileMain))
-      {
-#ifdef MAX_RES_1080P
-        if(pParam->nBFrames)
-        {
-          DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-          avc_param.nBFrames = 1;
-        }
-        if(pParam->nRefFrames != 2)
-        {
-          DEBUG_PRINT_ERROR("Warning: 2 RefFrames are needed, changing RefFrames from %lu to 2", pParam->nRefFrames);
-          avc_param.nRefFrames = 2;
-        }
-#else
-       if(pParam->nBFrames)
-       {
-         DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-         avc_param.nBFrames = 0;
-       }
-       if(pParam->nRefFrames != 1)
-       {
-         DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %lu to 1)", pParam->nRefFrames);
-         avc_param.nRefFrames = 1;
-       }
-#endif
-      }
-      else
-      {
-       if(pParam->nRefFrames != 1)
-       {
-         DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %lu to 1)", pParam->nRefFrames);
-         avc_param.nRefFrames = 1;
-       }
-       if(pParam->nBFrames)
-       {
-         DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-         avc_param.nBFrames = 0;
-       }
-      }
-      if(handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true)
-      {
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sParamAVC,pParam, sizeof(struct OMX_VIDEO_PARAM_AVCTYPE));
-      m_sIntraperiod.nPFrames = m_sParamAVC.nPFrames;
-      m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames;
-      break;
-    }
-  case OMX_IndexParamVideoProfileLevelCurrent:
-    {
-      OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
-      if(handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true)
-      {
-        DEBUG_PRINT_ERROR("set_parameter: OMX_IndexParamVideoProfileLevelCurrent failed for Profile: %lu "
-                          "Level :%lu", pParam->eProfile, pParam->eLevel);
-        return OMX_ErrorUnsupportedSetting;
-      }
-      m_sParamProfileLevel.eProfile = pParam->eProfile;
-      m_sParamProfileLevel.eLevel = pParam->eLevel;
-
-      if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
-          OMX_MAX_STRINGNAME_SIZE))
-      {
-          m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)m_sParamProfileLevel.eProfile;
-          m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)m_sParamProfileLevel.eLevel;
-          DEBUG_PRINT_LOW("\n MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
-              m_sParamMPEG4.eLevel);
-      }
-      else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
-          OMX_MAX_STRINGNAME_SIZE))
-      {
-          m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)m_sParamProfileLevel.eProfile;
-          m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)m_sParamProfileLevel.eLevel;
-          DEBUG_PRINT_LOW("\n H263 profile = %d, level = %d", m_sParamH263.eProfile,
-              m_sParamH263.eLevel);
-      }
-      else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
-          OMX_MAX_STRINGNAME_SIZE))
-      {
-          m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
-          m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
-          DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
-              m_sParamAVC.eLevel);
-      }
-      break;
-    }
-  case OMX_IndexParamStandardComponentRole:
-    {
-      OMX_PARAM_COMPONENTROLETYPE *comp_role;
-      comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
-                  comp_role->cRole);
-
-      if((m_state == OMX_StateLoaded)&&
-          !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
-      {
-         DEBUG_PRINT_LOW("Set Parameter called in valid state");
-      }
-      else
-      {
-         DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
-         return OMX_ErrorIncorrectStateOperation;
-      }
-
-      if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE))
-      {
-        if(!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE))
-        {
-          strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
-          eRet =OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-      {
-        if(!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
-        {
-          strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
-          eRet = OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE))
-      {
-        if(!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE))
-        {
-          strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
-          eRet =OMX_ErrorUnsupportedSetting;
-        }
-      }
-#ifdef _MSM8974_
-      else if(!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-      {
-        if(!strncmp((const char*)comp_role->cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE))
-        {
-          strlcpy((char*)m_cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
-          eRet =OMX_ErrorUnsupportedSetting;
-        }
-      }
-#endif
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s\n", m_nkind);
-        eRet = OMX_ErrorInvalidComponentName;
-      }
-      break;
-    }
-
-  case OMX_IndexParamPriorityMgmt:
-    {
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt");
-      if(m_state != OMX_StateLoaded)
-      {
+    /*set_parameter can be called in loaded state
+      or disabled port */
+    if (m_state == OMX_StateLoaded
+            || m_sInPortDef.bEnabled == OMX_FALSE
+            || m_sOutPortDef.bEnabled == OMX_FALSE) {
+        DEBUG_PRINT_LOW("Set Parameter called in valid state");
+    } else {
         DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State\n");
         return OMX_ErrorIncorrectStateOperation;
-      }
-      OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
-                  priorityMgmtype->nGroupID);
-
-      DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
-                  priorityMgmtype->nGroupPriority);
-
-      m_sPriorityMgmt.nGroupID = priorityMgmtype->nGroupID;
-      m_sPriorityMgmt.nGroupPriority = priorityMgmtype->nGroupPriority;
-
-      break;
     }
 
-  case OMX_IndexParamCompBufferSupplier:
-    {
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier");
-      OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
-                  bufferSupplierType->eBufferSupplier);
-      if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
-        m_sInBufSupplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
-
-      else
-
-        eRet = OMX_ErrorBadPortIndex;
-
-      break;
-
-    }
-  case OMX_IndexParamVideoQuantization:
-    {
-      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization\n");
-      OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
-      if(session_qp->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(handle->venc_set_param(paramData, OMX_IndexParamVideoQuantization) != true)
-        {
-          return OMX_ErrorUnsupportedSetting;
-        }
-        m_sSessionQuantization.nQpI = session_qp->nQpI;
-        m_sSessionQuantization.nQpP = session_qp->nQpP;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Unsupported port Index for Session QP setting\n");
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-
-  case OMX_QcomIndexParamVideoQPRange:
-    {
-      DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange\n");
-      OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
-      if(qp_range->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(handle->venc_set_param(paramData,
-              (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPRange) != true)
-        {
-          return OMX_ErrorUnsupportedSetting;
-        }
-        m_sSessionQPRange.minQP= qp_range->minQP;
-        m_sSessionQPRange.maxQP= qp_range->maxQP;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Unsupported port Index for QP range setting\n");
-        eRet = OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-
-  case OMX_QcomIndexPortDefn:
-    {
-      OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam =
-          (OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData;
-      DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn");
-      if(pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN)
-      {
-        if(pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
-          pParam->nMemRegion < OMX_QCOM_MemRegionMax)
-        {
-          m_use_input_pmem = OMX_TRUE;
-        }
-        else
-        {
-          m_use_input_pmem = OMX_FALSE;
-        }
-      }
-      else if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
-          pParam->nMemRegion < OMX_QCOM_MemRegionMax)
-        {
-          m_use_output_pmem = OMX_TRUE;
-        }
-        else
-        {
-          m_use_output_pmem = OMX_FALSE;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: SetParameter called on unsupported Port Index for QcomPortDefn");
-        return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-
-  case OMX_IndexParamVideoErrorCorrection:
-    {
-	    DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection\n");
-      OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
-          (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
-      if(!handle->venc_set_param(paramData, OMX_IndexParamVideoErrorCorrection))
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Request for setting Error Resilience failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection));
-      break;
-    }
-  case OMX_IndexParamVideoIntraRefresh:
-    {
-      DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh\n");
-      OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
-          (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
-      if(!handle->venc_set_param(paramData,OMX_IndexParamVideoIntraRefresh))
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra refresh failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh));
-      break;
-    }
-#ifdef _ANDROID_ICS_
-  case OMX_QcomIndexParamVideoEncodeMetaBufferMode:
-    {
-      StoreMetaDataInBuffersParams *pParam =
-        (StoreMetaDataInBuffersParams*)paramData;
-      DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoEncodeMetaBufferMode: "
-         "port_index = %lu, meta_mode = %d", pParam->nPortIndex, pParam->bStoreMetaData);
-      if(pParam->nPortIndex == PORT_INDEX_IN)
-      {
-        if(pParam->bStoreMetaData != meta_mode_enable)
-        {
-          if(!handle->venc_set_meta_mode(pParam->bStoreMetaData))
-          {
-            DEBUG_PRINT_ERROR("\nERROR: set Metabuffer mode %d fail",
-                         pParam->bStoreMetaData);
-            return OMX_ErrorUnsupportedSetting;
-          }
-          meta_mode_enable = pParam->bStoreMetaData;
-          if(meta_mode_enable) {
-            m_sInPortDef.nBufferCountActual = m_sInPortDef.nBufferCountMin;
-            if(handle->venc_set_param(&m_sInPortDef,OMX_IndexParamPortDefinition) != true)
+    switch (paramIndex) {
+        case OMX_IndexParamPortDefinition:
             {
-              DEBUG_PRINT_ERROR("\nERROR: venc_set_param input failed");
-              return OMX_ErrorUnsupportedSetting;
-            }
-          } else {
-            /*TODO: reset encoder driver Meta mode*/
-            dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
-                               &m_sOutPortDef.nBufferCountActual,
-                               &m_sOutPortDef.nBufferSize,
-                               m_sOutPortDef.nPortIndex);
-          }
-        }
-      }
-      else
-      {
-         DEBUG_PRINT_ERROR("set_parameter: metamode is "
-            "valid for input port only");
-         eRet = OMX_ErrorUnsupportedIndex;
-      }
-    }
-    break;
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
+                        (int)portDefn->format.video.nFrameHeight,
+                        (int)portDefn->format.video.nFrameWidth);
+
+                if (PORT_INDEX_IN == portDefn->nPortIndex) {
+                    if (!dev_is_video_session_supported(portDefn->format.video.nFrameWidth,
+                                portDefn->format.video.nFrameHeight)) {
+                        DEBUG_PRINT_ERROR("video session not supported\n");
+                        omx_report_unsupported_setting();
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    DEBUG_PRINT_LOW("\n i/p actual cnt requested = %d\n", portDefn->nBufferCountActual);
+                    DEBUG_PRINT_LOW("\n i/p min cnt requested = %d\n", portDefn->nBufferCountMin);
+                    DEBUG_PRINT_LOW("\n i/p buffersize requested = %d\n", portDefn->nBufferSize);
+                    if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
+                        DEBUG_PRINT_ERROR("\nERROR: (In_PORT) Min buffers (%d) > actual count (%d)\n",
+                                portDefn->nBufferCountMin, portDefn->nBufferCountActual);
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
+                        DEBUG_PRINT_ERROR("\nERROR: venc_set_param input failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+
+                    DEBUG_PRINT_LOW("\n i/p previous actual cnt = %d\n", m_sInPortDef.nBufferCountActual);
+                    DEBUG_PRINT_LOW("\n i/p previous min cnt = %d\n", m_sInPortDef.nBufferCountMin);
+                    memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+
+#ifdef _ANDROID_ICS_
+                    if (portDefn->format.video.eColorFormat == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
+                        m_sInPortDef.format.video.eColorFormat =
+                            OMX_COLOR_FormatYUV420SemiPlanar;
+                        if (!mUseProxyColorFormat) {
+                            if (!c2d_conv.init()) {
+                                DEBUG_PRINT_ERROR("\n C2D init failed");
+                                return OMX_ErrorUnsupportedSetting;
+                            }
+                            DEBUG_PRINT_ERROR("\nC2D init is successful");
+                        }
+                        mUseProxyColorFormat = true;
+                        m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
+                    } else
+                        mUseProxyColorFormat = false;
 #endif
-#if !defined(MAX_RES_720P) || defined(_MSM8974_)
-  case OMX_QcomIndexParamIndexExtraDataType:
-    {
-      DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
-      QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
-      if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo)
-      {
-        if (pParam->nPortIndex == PORT_INDEX_OUT)
-        {
-          if (pParam->bEnabled == OMX_TRUE)
-            m_sExtraData |= VEN_EXTRADATA_SLICEINFO;
-          else
-            m_sExtraData &= ~VEN_EXTRADATA_SLICEINFO;
-          DEBUG_PRINT_HIGH("SliceInfo extradata %s",
-             ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
-          if(handle->venc_set_param(&m_sExtraData,
-              (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) != true)
-          {
-            DEBUG_PRINT_ERROR("ERROR: Setting "
-               "OMX_ExtraDataVideoEncoderSliceInfo failed");
-            return OMX_ErrorUnsupportedSetting;
-          }
-          else
-          {
-            m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
-            dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
-                            &m_sOutPortDef.nBufferCountActual,
-                            &m_sOutPortDef.nBufferSize,
-                             m_sOutPortDef.nPortIndex);
-            DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%lu, "
-                "count min=%lu, buffer size=%lu",
-                m_sOutPortDef.nBufferCountActual,
-                m_sOutPortDef.nBufferCountMin,
-                m_sOutPortDef.nBufferSize);
-          }
-        }
-      }
-#ifndef _MSM8974_
-      else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo)
-      {
-        if (pParam->nPortIndex == PORT_INDEX_OUT)
-        {
-          if (pParam->bEnabled == OMX_TRUE)
-            m_sExtraData |= VEN_EXTRADATA_LTRINFO;
-          else
-            m_sExtraData &= ~VEN_EXTRADATA_LTRINFO;
-          DEBUG_PRINT_HIGH("LTRInfo extradata %s",
-             ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
-          if(handle->venc_set_param(&m_sExtraData,
-            (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) != true)
-          {
-            DEBUG_PRINT_ERROR("ERROR: Setting "
-                "OMX_ExtraDataVideoLTRInfo failed");
-            return OMX_ErrorUnsupportedSetting;
-          }
-          else
-          {
-            m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
-            dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
+                    /*Query Input Buffer Requirements*/
+                    dev_get_buf_req   (&m_sInPortDef.nBufferCountMin,
+                            &m_sInPortDef.nBufferCountActual,
+                            &m_sInPortDef.nBufferSize,
+                            m_sInPortDef.nPortIndex);
+
+                    /*Query ouput Buffer Requirements*/
+                    dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
                             &m_sOutPortDef.nBufferCountActual,
                             &m_sOutPortDef.nBufferSize,
                             m_sOutPortDef.nPortIndex);
-            DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%d, "
-                "count min=%d, buffer size=%d",
-                m_sOutPortDef.nBufferCountActual,
-                m_sOutPortDef.nBufferCountMin,
-                m_sOutPortDef.nBufferSize);
-          }
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("set_parameter: LTR information is "
-              "valid for output port only");
-          eRet = OMX_ErrorUnsupportedIndex;
-        }
-      }
+                    m_sInPortDef.nBufferCountActual = portDefn->nBufferCountActual;
+                } else if (PORT_INDEX_OUT == portDefn->nPortIndex) {
+                    DEBUG_PRINT_LOW("\n o/p actual cnt requested = %d\n", portDefn->nBufferCountActual);
+                    DEBUG_PRINT_LOW("\n o/p min cnt requested = %d\n", portDefn->nBufferCountMin);
+                    DEBUG_PRINT_LOW("\n o/p buffersize requested = %d\n", portDefn->nBufferSize);
+                    if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
+                        DEBUG_PRINT_ERROR("\nERROR: (Out_PORT) Min buffers (%d) > actual count (%d)\n",
+                                portDefn->nBufferCountMin, portDefn->nBufferCountActual);
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
+                        DEBUG_PRINT_ERROR("\nERROR: venc_set_param output failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+#ifdef _MSM8974_
+                    /*Query ouput Buffer Requirements*/
+                    dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
+                            &m_sOutPortDef.nBufferCountActual,
+                            &m_sOutPortDef.nBufferSize,
+                            m_sOutPortDef.nPortIndex);
 #endif
-      else
-      {
-        DEBUG_PRINT_ERROR("set_parameter: unsupported extrdata index (%x)",
-            pParam->nIndex);
-        eRet = OMX_ErrorUnsupportedIndex;
-      }
-      break;
-    }
-  case QOMX_IndexParamVideoLTRMode:
-    {
-      QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
-          (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
-      if(!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRMode))
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Setting LTR mode failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sParamLTRMode, pParam, sizeof(m_sParamLTRMode));
-      break;
-    }
-  case QOMX_IndexParamVideoLTRCount:
-    {
-      QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
-          (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
-      if(!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRCount))
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Setting LTR count failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sParamLTRCount, pParam, sizeof(m_sParamLTRCount));
-      break;
-    }
+                    memcpy(&m_sOutPortDef,portDefn,sizeof(struct OMX_PARAM_PORTDEFINITIONTYPE));
+                    update_profile_level(); //framerate , bitrate
+
+                    DEBUG_PRINT_LOW("\n o/p previous actual cnt = %d\n", m_sOutPortDef.nBufferCountActual);
+                    DEBUG_PRINT_LOW("\n o/p previous min cnt = %d\n", m_sOutPortDef.nBufferCountMin);
+                    m_sOutPortDef.nBufferCountActual = portDefn->nBufferCountActual;
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: Set_parameter: Bad Port idx %d",
+                            (int)portDefn->nPortIndex);
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                m_sConfigFramerate.xEncodeFramerate = portDefn->format.video.xFramerate;
+                m_sConfigBitrate.nEncodeBitrate = portDefn->format.video.nBitrate;
+                m_sParamBitrate.nTargetBitrate = portDefn->format.video.nBitrate;
+            }
+            break;
+
+        case OMX_IndexParamVideoPortFormat:
+            {
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
+                        portFmt->eColorFormat);
+                //set the driver with the corresponding values
+                if (PORT_INDEX_IN == portFmt->nPortIndex) {
+                    if (handle->venc_set_param(paramData,OMX_IndexParamVideoPortFormat) != true) {
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+
+                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
+                            portFmt->eColorFormat);
+                    update_profile_level(); //framerate
+
+#ifdef _ANDROID_ICS_
+                    if (portFmt->eColorFormat ==
+                            (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
+                        m_sInPortFormat.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+                        if (!mUseProxyColorFormat) {
+                            if (!c2d_conv.init()) {
+                                DEBUG_PRINT_ERROR("\n C2D init failed");
+                                return OMX_ErrorUnsupportedSetting;
+                            }
+                            DEBUG_PRINT_ERROR("\nC2D init is successful");
+                        }
+                        mUseProxyColorFormat = true;
+                        m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
+                    } else
 #endif
-  case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
-    {
-      QOMX_EXTNINDEX_PARAMTYPE* pParam =
-         (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        handle->m_max_allowed_bitrate_check =
-           ((pParam->bEnable == OMX_TRUE) ? true : false);
-        DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s",
-           ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled"));
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck "
-           " called on wrong port(%lu)", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
+                    {
+                        m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
+                        m_input_msg_id = OMX_COMPONENT_GENERATE_ETB;
+                        mUseProxyColorFormat = false;
+                    }
+                    m_sInPortFormat.xFramerate = portFmt->xFramerate;
+                }
+                //TODO if no use case for O/P port,delet m_sOutPortFormat
+            }
+            break;
+        case OMX_IndexParamVideoInit:
+            { //TODO, do we need this index set param
+                OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData);
+                DEBUG_PRINT_LOW("\n Set OMX_IndexParamVideoInit called");
+                break;
+            }
+
+        case OMX_IndexParamVideoBitrate:
+            {
+                OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate");
+                if (handle->venc_set_param(paramData,OMX_IndexParamVideoBitrate) != true) {
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate;
+                m_sParamBitrate.eControlRate = pParam->eControlRate;
+                update_profile_level(); //bitrate
+                m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate;
+                m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate;
+                m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate;
+                DEBUG_PRINT_LOW("\nbitrate = %u", m_sOutPortDef.format.video.nBitrate);
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
+                OMX_VIDEO_PARAM_MPEG4TYPE mp4_param;
+                memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4");
+                if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
 #ifdef MAX_RES_1080P
-  case OMX_QcomIndexEnableSliceDeliveryMode:
-    {
-      QOMX_EXTNINDEX_PARAMTYPE* pParam =
-         (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!handle->venc_set_param(paramData,
-              (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode))
-        {
-          DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode "
-           "called on wrong port(%lu)", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
+                    if (pParam->nBFrames) {
+                        DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+                        mp4_param.nBFrames = 1;
+                    }
+#else
+                    if (pParam->nBFrames) {
+                        DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                        mp4_param.nBFrames = 0;
+                    }
 #endif
-  case OMX_QcomIndexEnableH263PlusPType:
-    {
-      QOMX_EXTNINDEX_PARAMTYPE* pParam =
-         (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
-      DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!handle->venc_set_param(paramData,
-              (OMX_INDEXTYPE)OMX_QcomIndexEnableH263PlusPType))
-        {
-          DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType "
-           "called on wrong port(%lu)", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
-      break;
+                } else {
+                    if (pParam->nBFrames) {
+                        DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                        mp4_param.nBFrames = 0;
+                    }
+                }
+                if (handle->venc_set_param(&mp4_param,OMX_IndexParamVideoMpeg4) != true) {
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
+                m_sIntraperiod.nPFrames = m_sParamMPEG4.nPFrames;
+                m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames;
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263");
+                if (handle->venc_set_param(paramData,OMX_IndexParamVideoH263) != true) {
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE));
+                m_sIntraperiod.nPFrames = m_sParamH263.nPFrames;
+                m_sIntraperiod.nBFrames = m_sParamH263.nBFrames;
+                break;
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+                OMX_VIDEO_PARAM_AVCTYPE avc_param;
+                memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE));
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc");
+
+                if ((pParam->eProfile == OMX_VIDEO_AVCProfileHigh)||
+                        (pParam->eProfile == OMX_VIDEO_AVCProfileMain)) {
+#ifdef MAX_RES_1080P
+                    if (pParam->nBFrames) {
+                        DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+                        avc_param.nBFrames = 1;
+                    }
+                    if (pParam->nRefFrames != 2) {
+                        DEBUG_PRINT_ERROR("Warning: 2 RefFrames are needed, changing RefFrames from %lu to 2", pParam->nRefFrames);
+                        avc_param.nRefFrames = 2;
+                    }
+#else
+                    if (pParam->nBFrames) {
+                        DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                        avc_param.nBFrames = 0;
+                    }
+                    if (pParam->nRefFrames != 1) {
+                        DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %lu to 1)", pParam->nRefFrames);
+                        avc_param.nRefFrames = 1;
+                    }
+#endif
+                } else {
+                    if (pParam->nRefFrames != 1) {
+                        DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %lu to 1)", pParam->nRefFrames);
+                        avc_param.nRefFrames = 1;
+                    }
+                    if (pParam->nBFrames) {
+                        DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                        avc_param.nBFrames = 0;
+                    }
+                }
+                if (handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true) {
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sParamAVC,pParam, sizeof(struct OMX_VIDEO_PARAM_AVCTYPE));
+                m_sIntraperiod.nPFrames = m_sParamAVC.nPFrames;
+                m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames;
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelCurrent:
+            {
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
+                if (handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true) {
+                    DEBUG_PRINT_ERROR("set_parameter: OMX_IndexParamVideoProfileLevelCurrent failed for Profile: %lu "
+                            "Level :%lu", pParam->eProfile, pParam->eLevel);
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                m_sParamProfileLevel.eProfile = pParam->eProfile;
+                m_sParamProfileLevel.eLevel = pParam->eLevel;
+
+                if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
+                            OMX_MAX_STRINGNAME_SIZE)) {
+                    m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)m_sParamProfileLevel.eProfile;
+                    m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)m_sParamProfileLevel.eLevel;
+                    DEBUG_PRINT_LOW("\n MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
+                            m_sParamMPEG4.eLevel);
+                } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
+                            OMX_MAX_STRINGNAME_SIZE)) {
+                    m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)m_sParamProfileLevel.eProfile;
+                    m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)m_sParamProfileLevel.eLevel;
+                    DEBUG_PRINT_LOW("\n H263 profile = %d, level = %d", m_sParamH263.eProfile,
+                            m_sParamH263.eLevel);
+                } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
+                            OMX_MAX_STRINGNAME_SIZE)) {
+                    m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
+                    m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
+                    DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
+                            m_sParamAVC.eLevel);
+                }
+                break;
+            }
+        case OMX_IndexParamStandardComponentRole:
+            {
+                OMX_PARAM_COMPONENTROLETYPE *comp_role;
+                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
+                        comp_role->cRole);
+
+                if ((m_state == OMX_StateLoaded)&&
+                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
+                } else {
+                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+                    return OMX_ErrorIncorrectStateOperation;
+                }
+
+                if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet = OMX_ErrorUnsupportedSetting;
+                    }
+                } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                }
+#ifdef _MSM8974_
+                else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+                    if (!strncmp((const char*)comp_role->cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+                        strlcpy((char*)m_cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+                    } else {
+                        DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
+                        eRet =OMX_ErrorUnsupportedSetting;
+                    }
+                }
+#endif
+                else {
+                    DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s\n", m_nkind);
+                    eRet = OMX_ErrorInvalidComponentName;
+                }
+                break;
+            }
+
+        case OMX_IndexParamPriorityMgmt:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt");
+                if (m_state != OMX_StateLoaded) {
+                    DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State\n");
+                    return OMX_ErrorIncorrectStateOperation;
+                }
+                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
+                        priorityMgmtype->nGroupID);
+
+                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
+                        priorityMgmtype->nGroupPriority);
+
+                m_sPriorityMgmt.nGroupID = priorityMgmtype->nGroupID;
+                m_sPriorityMgmt.nGroupPriority = priorityMgmtype->nGroupPriority;
+
+                break;
+            }
+
+        case OMX_IndexParamCompBufferSupplier:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier");
+                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
+                        bufferSupplierType->eBufferSupplier);
+                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
+                    m_sInBufSupplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
+
+                else
+
+                    eRet = OMX_ErrorBadPortIndex;
+
+                break;
+
+            }
+        case OMX_IndexParamVideoQuantization:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization\n");
+                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
+                if (session_qp->nPortIndex == PORT_INDEX_OUT) {
+                    if (handle->venc_set_param(paramData, OMX_IndexParamVideoQuantization) != true) {
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    m_sSessionQuantization.nQpI = session_qp->nQpI;
+                    m_sSessionQuantization.nQpP = session_qp->nQpP;
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Unsupported port Index for Session QP setting\n");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+
+        case OMX_QcomIndexParamVideoQPRange:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange\n");
+                OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
+                if (qp_range->nPortIndex == PORT_INDEX_OUT) {
+                    if (handle->venc_set_param(paramData,
+                                (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPRange) != true) {
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    m_sSessionQPRange.minQP= qp_range->minQP;
+                    m_sSessionQPRange.maxQP= qp_range->maxQP;
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Unsupported port Index for QP range setting\n");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+
+        case OMX_QcomIndexPortDefn:
+            {
+                OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam =
+                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData;
+                DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn");
+                if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) {
+                    if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
+                            pParam->nMemRegion < OMX_QCOM_MemRegionMax) {
+                        m_use_input_pmem = OMX_TRUE;
+                    } else {
+                        m_use_input_pmem = OMX_FALSE;
+                    }
+                } else if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
+                            pParam->nMemRegion < OMX_QCOM_MemRegionMax) {
+                        m_use_output_pmem = OMX_TRUE;
+                    } else {
+                        m_use_output_pmem = OMX_FALSE;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: SetParameter called on unsupported Port Index for QcomPortDefn");
+                    return OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+
+        case OMX_IndexParamVideoErrorCorrection:
+            {
+                DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection\n");
+                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
+                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
+                if (!handle->venc_set_param(paramData, OMX_IndexParamVideoErrorCorrection)) {
+                    DEBUG_PRINT_ERROR("\nERROR: Request for setting Error Resilience failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection));
+                break;
+            }
+        case OMX_IndexParamVideoIntraRefresh:
+            {
+                DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh\n");
+                OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
+                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
+                if (!handle->venc_set_param(paramData,OMX_IndexParamVideoIntraRefresh)) {
+                    DEBUG_PRINT_ERROR("\nERROR: Request for setting intra refresh failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh));
+                break;
+            }
+#ifdef _ANDROID_ICS_
+        case OMX_QcomIndexParamVideoEncodeMetaBufferMode:
+            {
+                StoreMetaDataInBuffersParams *pParam =
+                    (StoreMetaDataInBuffersParams*)paramData;
+                DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoEncodeMetaBufferMode: "
+                        "port_index = %lu, meta_mode = %d", pParam->nPortIndex, pParam->bStoreMetaData);
+                if (pParam->nPortIndex == PORT_INDEX_IN) {
+                    if (pParam->bStoreMetaData != meta_mode_enable) {
+                        if (!handle->venc_set_meta_mode(pParam->bStoreMetaData)) {
+                            DEBUG_PRINT_ERROR("\nERROR: set Metabuffer mode %d fail",
+                                    pParam->bStoreMetaData);
+                            return OMX_ErrorUnsupportedSetting;
+                        }
+                        meta_mode_enable = pParam->bStoreMetaData;
+                        if (meta_mode_enable) {
+                            m_sInPortDef.nBufferCountActual = m_sInPortDef.nBufferCountMin;
+                            if (handle->venc_set_param(&m_sInPortDef,OMX_IndexParamPortDefinition) != true) {
+                                DEBUG_PRINT_ERROR("\nERROR: venc_set_param input failed");
+                                return OMX_ErrorUnsupportedSetting;
+                            }
+                        } else {
+                            /*TODO: reset encoder driver Meta mode*/
+                            dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
+                                    &m_sOutPortDef.nBufferCountActual,
+                                    &m_sOutPortDef.nBufferSize,
+                                    m_sOutPortDef.nPortIndex);
+                        }
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("set_parameter: metamode is "
+                            "valid for input port only");
+                    eRet = OMX_ErrorUnsupportedIndex;
+                }
+            }
+            break;
+#endif
+#if !defined(MAX_RES_720P) || defined(_MSM8974_)
+        case OMX_QcomIndexParamIndexExtraDataType:
+            {
+                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
+                QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
+                if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) {
+                    if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                        if (pParam->bEnabled == OMX_TRUE)
+                            m_sExtraData |= VEN_EXTRADATA_SLICEINFO;
+                        else
+                            m_sExtraData &= ~VEN_EXTRADATA_SLICEINFO;
+                        DEBUG_PRINT_HIGH("SliceInfo extradata %s",
+                                ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
+                        if (handle->venc_set_param(&m_sExtraData,
+                                    (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) != true) {
+                            DEBUG_PRINT_ERROR("ERROR: Setting "
+                                    "OMX_ExtraDataVideoEncoderSliceInfo failed");
+                            return OMX_ErrorUnsupportedSetting;
+                        } else {
+                            m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
+                            dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
+                                    &m_sOutPortDef.nBufferCountActual,
+                                    &m_sOutPortDef.nBufferSize,
+                                    m_sOutPortDef.nPortIndex);
+                            DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%lu, "
+                                    "count min=%lu, buffer size=%lu",
+                                    m_sOutPortDef.nBufferCountActual,
+                                    m_sOutPortDef.nBufferCountMin,
+                                    m_sOutPortDef.nBufferSize);
+                        }
+                    }
+                }
+#ifndef _MSM8974_
+                else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) {
+                    if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                        if (pParam->bEnabled == OMX_TRUE)
+                            m_sExtraData |= VEN_EXTRADATA_LTRINFO;
+                        else
+                            m_sExtraData &= ~VEN_EXTRADATA_LTRINFO;
+                        DEBUG_PRINT_HIGH("LTRInfo extradata %s",
+                                ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
+                        if (handle->venc_set_param(&m_sExtraData,
+                                    (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) != true) {
+                            DEBUG_PRINT_ERROR("ERROR: Setting "
+                                    "OMX_ExtraDataVideoLTRInfo failed");
+                            return OMX_ErrorUnsupportedSetting;
+                        } else {
+                            m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
+                            dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
+                                    &m_sOutPortDef.nBufferCountActual,
+                                    &m_sOutPortDef.nBufferSize,
+                                    m_sOutPortDef.nPortIndex);
+                            DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%d, "
+                                    "count min=%d, buffer size=%d",
+                                    m_sOutPortDef.nBufferCountActual,
+                                    m_sOutPortDef.nBufferCountMin,
+                                    m_sOutPortDef.nBufferSize);
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("set_parameter: LTR information is "
+                                "valid for output port only");
+                        eRet = OMX_ErrorUnsupportedIndex;
+                    }
+                }
+#endif
+                else {
+                    DEBUG_PRINT_ERROR("set_parameter: unsupported extrdata index (%x)",
+                            pParam->nIndex);
+                    eRet = OMX_ErrorUnsupportedIndex;
+                }
+                break;
+            }
+        case QOMX_IndexParamVideoLTRMode:
+            {
+                QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
+                    (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
+                if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRMode)) {
+                    DEBUG_PRINT_ERROR("\nERROR: Setting LTR mode failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sParamLTRMode, pParam, sizeof(m_sParamLTRMode));
+                break;
+            }
+        case QOMX_IndexParamVideoLTRCount:
+            {
+                QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
+                    (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
+                if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRCount)) {
+                    DEBUG_PRINT_ERROR("\nERROR: Setting LTR count failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sParamLTRCount, pParam, sizeof(m_sParamLTRCount));
+                break;
+            }
+#endif
+        case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
+            {
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    handle->m_max_allowed_bitrate_check =
+                        ((pParam->bEnable == OMX_TRUE) ? true : false);
+                    DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s",
+                            ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled"));
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck "
+                            " called on wrong port(%lu)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+#ifdef MAX_RES_1080P
+        case OMX_QcomIndexEnableSliceDeliveryMode:
+            {
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (!handle->venc_set_param(paramData,
+                                (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode)) {
+                        DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode "
+                            "called on wrong port(%lu)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+#endif
+        case OMX_QcomIndexEnableH263PlusPType:
+            {
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+                DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (!handle->venc_set_param(paramData,
+                                (OMX_INDEXTYPE)OMX_QcomIndexEnableH263PlusPType)) {
+                        DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType "
+                            "called on wrong port(%lu)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+        case OMX_IndexParamVideoSliceFMO:
+        default:
+            {
+                DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d\n", paramIndex);
+                eRet = OMX_ErrorUnsupportedIndex;
+                break;
+            }
     }
-  case OMX_IndexParamVideoSliceFMO:
-  default:
-    {
-      DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d\n", paramIndex);
-      eRet = OMX_ErrorUnsupportedIndex;
-      break;
-    }
-  }
-  return eRet;
+    return eRet;
 }
 
 bool omx_venc::update_profile_level()
 {
-  OMX_U32 eProfile, eLevel;
+    OMX_U32 eProfile, eLevel;
 
-  if(!handle->venc_get_profile_level(&eProfile,&eLevel))
-  {
-    DEBUG_PRINT_ERROR("\nFailed to update the profile_level\n");
-    return false;
-  }
+    if (!handle->venc_get_profile_level(&eProfile,&eLevel)) {
+        DEBUG_PRINT_ERROR("\nFailed to update the profile_level\n");
+        return false;
+    }
 
-  m_sParamProfileLevel.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
-  m_sParamProfileLevel.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
+    m_sParamProfileLevel.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
+    m_sParamProfileLevel.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
 
-  if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
-              OMX_MAX_STRINGNAME_SIZE))
-  {
-    m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
-    m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
-    DEBUG_PRINT_LOW("\n MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
-                    m_sParamMPEG4.eLevel);
-  }
-  else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
-                   OMX_MAX_STRINGNAME_SIZE))
-  {
-    m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
-    m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
-    DEBUG_PRINT_LOW("\n H263 profile = %d, level = %d", m_sParamH263.eProfile,
-                    m_sParamH263.eLevel);
-  }
-  else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
-                   OMX_MAX_STRINGNAME_SIZE))
-  {
-    m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
-    m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
-    DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
-                    m_sParamAVC.eLevel);
-  }
-  return true;
+    if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
+        m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
+        DEBUG_PRINT_LOW("\n MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
+                m_sParamMPEG4.eLevel);
+    } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
+        m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
+        DEBUG_PRINT_LOW("\n H263 profile = %d, level = %d", m_sParamH263.eProfile,
+                m_sParamH263.eLevel);
+    } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
+                OMX_MAX_STRINGNAME_SIZE)) {
+        m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
+        m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
+        DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
+                m_sParamAVC.eLevel);
+    }
+    return true;
 }
 /* ======================================================================
-FUNCTION
-  omx_video::SetConfig
+   FUNCTION
+   omx_video::SetConfig
 
-DESCRIPTION
-  OMX Set Config method implementation
+   DESCRIPTION
+   OMX Set Config method implementation
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if successful.
-========================================================================== */
+   RETURN VALUE
+   OMX Error None if successful.
+   ========================================================================== */
 OMX_ERRORTYPE  omx_venc::set_config(OMX_IN OMX_HANDLETYPE      hComp,
-                                     OMX_IN OMX_INDEXTYPE configIndex,
-                                     OMX_IN OMX_PTR        configData)
+        OMX_IN OMX_INDEXTYPE configIndex,
+        OMX_IN OMX_PTR        configData)
 {
-  if(configData == NULL)
-  {
-    DEBUG_PRINT_ERROR("ERROR: param is null");
-    return OMX_ErrorBadParameter;
-  }
-
-  if(m_state == OMX_StateInvalid)
-  {
-    DEBUG_PRINT_ERROR("ERROR: config called in Invalid state");
-    return OMX_ErrorIncorrectStateOperation;
-  }
-
-  // params will be validated prior to venc_init
-  switch(configIndex)
-  {
-  case OMX_IndexConfigVideoBitrate:
-    {
-      OMX_VIDEO_CONFIG_BITRATETYPE* pParam =
-        reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
-      DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%lu)", pParam->nEncodeBitrate);
-
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(handle->venc_set_config(configData, OMX_IndexConfigVideoBitrate) != true)
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoBitrate failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-
-        m_sConfigBitrate.nEncodeBitrate = pParam->nEncodeBitrate;
-        m_sParamBitrate.nTargetBitrate = pParam->nEncodeBitrate;
-        m_sOutPortDef.format.video.nBitrate = pParam->nEncodeBitrate;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
-      break;
+    if (configData == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: param is null");
+        return OMX_ErrorBadParameter;
     }
-  case OMX_IndexConfigVideoFramerate:
-    {
-      OMX_CONFIG_FRAMERATETYPE* pParam =
-        reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
-      DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%lx)", pParam->xEncodeFramerate);
 
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(handle->venc_set_config(configData, OMX_IndexConfigVideoFramerate) != true)
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoFramerate failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-
-        m_sConfigFramerate.xEncodeFramerate = pParam->xEncodeFramerate;
-        m_sOutPortDef.format.video.xFramerate = pParam->xEncodeFramerate;
-        m_sOutPortFormat.xFramerate = pParam->xEncodeFramerate;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
-
-      break;
+    if (m_state == OMX_StateInvalid) {
+        DEBUG_PRINT_ERROR("ERROR: config called in Invalid state");
+        return OMX_ErrorIncorrectStateOperation;
     }
-  case QOMX_IndexConfigVideoIntraperiod:
-    {
-      QOMX_VIDEO_INTRAPERIODTYPE* pParam =
-        reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
 
-      DEBUG_PRINT_HIGH("set_config(): QOMX_IndexConfigVideoIntraperiod");
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
+    // params will be validated prior to venc_init
+    switch (configIndex) {
+        case OMX_IndexConfigVideoBitrate:
+            {
+                OMX_VIDEO_CONFIG_BITRATETYPE* pParam =
+                    reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
+                DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%lu)", pParam->nEncodeBitrate);
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (handle->venc_set_config(configData, OMX_IndexConfigVideoBitrate) != true) {
+                        DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoBitrate failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+
+                    m_sConfigBitrate.nEncodeBitrate = pParam->nEncodeBitrate;
+                    m_sParamBitrate.nTargetBitrate = pParam->nEncodeBitrate;
+                    m_sOutPortDef.format.video.nBitrate = pParam->nEncodeBitrate;
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+        case OMX_IndexConfigVideoFramerate:
+            {
+                OMX_CONFIG_FRAMERATETYPE* pParam =
+                    reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
+                DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%lx)", pParam->xEncodeFramerate);
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (handle->venc_set_config(configData, OMX_IndexConfigVideoFramerate) != true) {
+                        DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoFramerate failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+
+                    m_sConfigFramerate.xEncodeFramerate = pParam->xEncodeFramerate;
+                    m_sOutPortDef.format.video.xFramerate = pParam->xEncodeFramerate;
+                    m_sOutPortFormat.xFramerate = pParam->xEncodeFramerate;
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case QOMX_IndexConfigVideoIntraperiod:
+            {
+                QOMX_VIDEO_INTRAPERIODTYPE* pParam =
+                    reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
+
+                DEBUG_PRINT_HIGH("set_config(): QOMX_IndexConfigVideoIntraperiod");
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
 #ifdef MAX_RES_720P
-        if(pParam->nBFrames > 0)
-        {
-          DEBUG_PRINT_ERROR("B frames not supported\n");
-          return OMX_ErrorUnsupportedSetting;
-        }
+                    if (pParam->nBFrames > 0) {
+                        DEBUG_PRINT_ERROR("B frames not supported\n");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
 #endif
-        DEBUG_PRINT_HIGH("Old: P/B frames = %lu/%lu, New: P/B frames = %lu/%lu",
-            m_sIntraperiod.nPFrames, m_sIntraperiod.nBFrames,
-            pParam->nPFrames, pParam->nBFrames);
-        if (m_sIntraperiod.nBFrames != pParam->nBFrames)
-        {
-          DEBUG_PRINT_HIGH("Dynamically changing B-frames not supported");
-          return OMX_ErrorUnsupportedSetting;
-        }
-        if(handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true)
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-        m_sIntraperiod.nPFrames = pParam->nPFrames;
-        m_sIntraperiod.nBFrames = pParam->nBFrames;
-        m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod;
+                    DEBUG_PRINT_HIGH("Old: P/B frames = %lu/%lu, New: P/B frames = %lu/%lu",
+                            m_sIntraperiod.nPFrames, m_sIntraperiod.nBFrames,
+                            pParam->nPFrames, pParam->nBFrames);
+                    if (m_sIntraperiod.nBFrames != pParam->nBFrames) {
+                        DEBUG_PRINT_HIGH("Dynamically changing B-frames not supported");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    if (handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true) {
+                        DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    m_sIntraperiod.nPFrames = pParam->nPFrames;
+                    m_sIntraperiod.nBFrames = pParam->nBFrames;
+                    m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod;
 
-        if(m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
-        {
-          m_sParamMPEG4.nPFrames = pParam->nPFrames;
-          if(m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple)
-            m_sParamMPEG4.nBFrames = pParam->nBFrames;
-          else
-            m_sParamMPEG4.nBFrames = 0;
-        }
-        else if(m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263)
-        {
-          m_sParamH263.nPFrames = pParam->nPFrames;
-        }
-        else
-        {
-          m_sParamAVC.nPFrames = pParam->nPFrames;
-          if(m_sParamAVC.eProfile != OMX_VIDEO_AVCProfileBaseline)
-            m_sParamAVC.nBFrames = pParam->nBFrames;
-          else
-            m_sParamAVC.nBFrames = 0;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %lu", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
+                    if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4) {
+                        m_sParamMPEG4.nPFrames = pParam->nPFrames;
+                        if (m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple)
+                            m_sParamMPEG4.nBFrames = pParam->nBFrames;
+                        else
+                            m_sParamMPEG4.nBFrames = 0;
+                    } else if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263) {
+                        m_sParamH263.nPFrames = pParam->nPFrames;
+                    } else {
+                        m_sParamAVC.nPFrames = pParam->nPFrames;
+                        if (m_sParamAVC.eProfile != OMX_VIDEO_AVCProfileBaseline)
+                            m_sParamAVC.nBFrames = pParam->nBFrames;
+                        else
+                            m_sParamAVC.nBFrames = 0;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %lu", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
 
-      break;
+                break;
+            }
+
+        case OMX_IndexConfigVideoIntraVOPRefresh:
+            {
+                OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
+                    reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);
+
+                DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoIntraVOPRefresh");
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (handle->venc_set_config(configData,
+                                OMX_IndexConfigVideoIntraVOPRefresh) != true) {
+                        DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoIntraVOPRefresh failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+
+                    m_sConfigIntraRefreshVOP.IntraRefreshVOP = pParam->IntraRefreshVOP;
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case OMX_IndexConfigCommonRotate:
+            {
+                OMX_CONFIG_ROTATIONTYPE *pParam =
+                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+                OMX_S32 nRotation;
+
+                if (pParam->nPortIndex != PORT_INDEX_IN) {
+                    DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+                if ( pParam->nRotation == 0   ||
+                        pParam->nRotation == 90  ||
+                        pParam->nRotation == 180 ||
+                        pParam->nRotation == 270 ) {
+                    DEBUG_PRINT_HIGH("\nset_config: Rotation Angle %lu", pParam->nRotation);
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: un supported Rotation %lu", pParam->nRotation);
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                nRotation = pParam->nRotation - m_sConfigFrameRotation.nRotation;
+                if (nRotation < 0)
+                    nRotation = -nRotation;
+                if (nRotation == 90 || nRotation == 270) {
+                    DEBUG_PRINT_HIGH("\nset_config: updating device Dims");
+                    if (handle->venc_set_config(configData,
+                                OMX_IndexConfigCommonRotate) != true) {
+                        DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonRotate failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    } else {
+                        OMX_U32 nFrameWidth;
+
+                        DEBUG_PRINT_HIGH("\nset_config: updating port Dims");
+
+                        nFrameWidth = m_sInPortDef.format.video.nFrameWidth;
+                        m_sInPortDef.format.video.nFrameWidth =
+                            m_sInPortDef.format.video.nFrameHeight;
+                        m_sInPortDef.format.video.nFrameHeight = nFrameWidth;
+
+                        m_sOutPortDef.format.video.nFrameWidth  =
+                            m_sInPortDef.format.video.nFrameWidth;
+                        m_sOutPortDef.format.video.nFrameHeight =
+                            m_sInPortDef.format.video.nFrameHeight;
+                        m_sConfigFrameRotation.nRotation = pParam->nRotation;
+                    }
+                } else {
+                    m_sConfigFrameRotation.nRotation = pParam->nRotation;
+                }
+                break;
+            }
+        case OMX_QcomIndexConfigVideoFramePackingArrangement:
+            {
+                DEBUG_PRINT_HIGH("set_config(): OMX_QcomIndexConfigVideoFramePackingArrangement");
+                if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC) {
+                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
+                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
+                    extra_data_handle.set_frame_pack_data(configFmt);
+                } else {
+                    DEBUG_PRINT_ERROR("ERROR: FramePackingData not supported for non AVC compression");
+                }
+                break;
+            }
+        case QOMX_IndexConfigVideoLTRPeriod:
+            {
+                QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
+                if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRPeriod)) {
+                    DEBUG_PRINT_ERROR("\nERROR: Setting LTR period failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sConfigLTRPeriod, pParam, sizeof(m_sConfigLTRPeriod));
+                break;
+            }
+        case QOMX_IndexConfigVideoLTRUse:
+            {
+                QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
+                if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse)) {
+                    DEBUG_PRINT_ERROR("\nERROR: Setting LTR use failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sConfigLTRUse, pParam, sizeof(m_sConfigLTRUse));
+                break;
+            }
+        case QOMX_IndexConfigVideoLTRMark:
+            {
+                QOMX_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRMARK_TYPE*)configData;
+                DEBUG_PRINT_ERROR("Setting ltr mark is not supported");
+                return OMX_ErrorUnsupportedSetting;
+                break;
+            }
+        case OMX_IndexConfigVideoAVCIntraPeriod:
+            {
+                OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
+                DEBUG_PRINT_LOW("set_config: OMX_IndexConfigVideoAVCIntraPeriod");
+                if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigVideoAVCIntraPeriod)) {
+                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoAVCIntraPeriod failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                memcpy(&m_sConfigAVCIDRPeriod, pParam, sizeof(m_sConfigAVCIDRPeriod));
+                break;
+            }
+        default:
+            DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
+            break;
     }
 
-  case OMX_IndexConfigVideoIntraVOPRefresh:
-    {
-      OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
-        reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);
-
-      DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoIntraVOPRefresh");
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(handle->venc_set_config(configData,
-            OMX_IndexConfigVideoIntraVOPRefresh) != true)
-        {
-          DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoIntraVOPRefresh failed");
-          return OMX_ErrorUnsupportedSetting;
-        }
-
-        m_sConfigIntraRefreshVOP.IntraRefreshVOP = pParam->IntraRefreshVOP;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
-        return OMX_ErrorBadPortIndex;
-      }
-
-      break;
-    }
-  case OMX_IndexConfigCommonRotate:
-    {
-      OMX_CONFIG_ROTATIONTYPE *pParam =
-         reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
-      OMX_S32 nRotation;
-
-      if(pParam->nPortIndex != PORT_INDEX_IN){
-           DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %lu", pParam->nPortIndex);
-           return OMX_ErrorBadPortIndex;
-      }
-      if( pParam->nRotation == 0   ||
-          pParam->nRotation == 90  ||
-          pParam->nRotation == 180 ||
-          pParam->nRotation == 270 ) {
-          DEBUG_PRINT_HIGH("\nset_config: Rotation Angle %lu", pParam->nRotation);
-      } else {
-          DEBUG_PRINT_ERROR("ERROR: un supported Rotation %lu", pParam->nRotation);
-          return OMX_ErrorUnsupportedSetting;
-      }
-      nRotation = pParam->nRotation - m_sConfigFrameRotation.nRotation;
-      if(nRotation < 0)
-        nRotation = -nRotation;
-      if(nRotation == 90 || nRotation == 270) {
-          DEBUG_PRINT_HIGH("\nset_config: updating device Dims");
-          if(handle->venc_set_config(configData,
-             OMX_IndexConfigCommonRotate) != true) {
-             DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonRotate failed");
-             return OMX_ErrorUnsupportedSetting;
-          } else {
-                  OMX_U32 nFrameWidth;
-
-                  DEBUG_PRINT_HIGH("\nset_config: updating port Dims");
-
-                  nFrameWidth = m_sInPortDef.format.video.nFrameWidth;
-	          m_sInPortDef.format.video.nFrameWidth =
-                      m_sInPortDef.format.video.nFrameHeight;
-                  m_sInPortDef.format.video.nFrameHeight = nFrameWidth;
-
-                  m_sOutPortDef.format.video.nFrameWidth  =
-                      m_sInPortDef.format.video.nFrameWidth;
-                  m_sOutPortDef.format.video.nFrameHeight =
-                      m_sInPortDef.format.video.nFrameHeight;
-                  m_sConfigFrameRotation.nRotation = pParam->nRotation;
-           }
-       } else {
-          m_sConfigFrameRotation.nRotation = pParam->nRotation;
-      }
-      break;
-    }
-  case OMX_QcomIndexConfigVideoFramePackingArrangement:
-    {
-      DEBUG_PRINT_HIGH("set_config(): OMX_QcomIndexConfigVideoFramePackingArrangement");
-      if(m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC)
-      {
-        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
-          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
-        extra_data_handle.set_frame_pack_data(configFmt);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("ERROR: FramePackingData not supported for non AVC compression");
-      }
-      break;
-    }
-  case QOMX_IndexConfigVideoLTRPeriod:
-    {
-      QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
-      if(!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRPeriod))
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Setting LTR period failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sConfigLTRPeriod, pParam, sizeof(m_sConfigLTRPeriod));
-      break;
-    }
-  case QOMX_IndexConfigVideoLTRUse:
-    {
-      QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
-      if(!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse))
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Setting LTR use failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sConfigLTRUse, pParam, sizeof(m_sConfigLTRUse));
-      break;
-    }
-  case QOMX_IndexConfigVideoLTRMark:
-    {
-      QOMX_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRMARK_TYPE*)configData;
-      DEBUG_PRINT_ERROR("Setting ltr mark is not supported");
-      return OMX_ErrorUnsupportedSetting;
-      break;
-    }
-  case OMX_IndexConfigVideoAVCIntraPeriod:
-    {
-      OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
-      DEBUG_PRINT_LOW("set_config: OMX_IndexConfigVideoAVCIntraPeriod");
-      if(!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigVideoAVCIntraPeriod))
-      {
-        DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoAVCIntraPeriod failed");
-        return OMX_ErrorUnsupportedSetting;
-      }
-      memcpy(&m_sConfigAVCIDRPeriod, pParam, sizeof(m_sConfigAVCIDRPeriod));
-      break;
-    }
-  default:
-    DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
-    break;
-  }
-
-  return OMX_ErrorNone;
+    return OMX_ErrorNone;
 }
 
 /* ======================================================================
-FUNCTION
-  omx_venc::ComponentDeInit
+   FUNCTION
+   omx_venc::ComponentDeInit
 
-DESCRIPTION
-  Destroys the component and release memory allocated to the heap.
+   DESCRIPTION
+   Destroys the component and release memory allocated to the heap.
 
-PARAMETERS
-  <TBD>.
+   PARAMETERS
+   <TBD>.
 
-RETURN VALUE
-  OMX Error None if everything successful.
+   RETURN VALUE
+   OMX Error None if everything successful.
 
-========================================================================== */
+   ========================================================================== */
 OMX_ERRORTYPE  omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
 {
-  OMX_U32 i = 0;
-  DEBUG_PRINT_HIGH("\n omx_venc(): Inside component_deinit()");
-  if(OMX_StateLoaded != m_state)
-  {
-    DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
-                      m_state);
-  }
-  if(m_out_mem_ptr)
-  {
-    DEBUG_PRINT_LOW("Freeing the Output Memory\n");
-    for(i=0; i< m_sOutPortDef.nBufferCountActual; i++ )
-    {
-      free_output_buffer (&m_out_mem_ptr[i]);
+    OMX_U32 i = 0;
+    DEBUG_PRINT_HIGH("\n omx_venc(): Inside component_deinit()");
+    if (OMX_StateLoaded != m_state) {
+        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
+                m_state);
     }
-    free(m_out_mem_ptr);
-    m_out_mem_ptr = NULL;
-  }
+    if (m_out_mem_ptr) {
+        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
+        for (i=0; i< m_sOutPortDef.nBufferCountActual; i++ ) {
+            free_output_buffer (&m_out_mem_ptr[i]);
+        }
+        free(m_out_mem_ptr);
+        m_out_mem_ptr = NULL;
+    }
 
-  /*Check if the input buffers have to be cleaned up*/
-  if(m_inp_mem_ptr
+    /*Check if the input buffers have to be cleaned up*/
+    if (m_inp_mem_ptr
 #ifdef _ANDROID_ICS_
-     && !meta_mode_enable
+            && !meta_mode_enable
 #endif
-     )
-  {
-    DEBUG_PRINT_LOW("Freeing the Input Memory\n");
-    for(i=0; i<m_sInPortDef.nBufferCountActual; i++ )
-    {
-      free_input_buffer (&m_inp_mem_ptr[i]);
+       ) {
+        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
+        for (i=0; i<m_sInPortDef.nBufferCountActual; i++ ) {
+            free_input_buffer (&m_inp_mem_ptr[i]);
+        }
+
+
+        free(m_inp_mem_ptr);
+        m_inp_mem_ptr = NULL;
     }
 
-
-    free(m_inp_mem_ptr);
-    m_inp_mem_ptr = NULL;
-  }
-
-  // Reset counters in mesg queues
-  m_ftb_q.m_size=0;
-  m_cmd_q.m_size=0;
-  m_etb_q.m_size=0;
-  m_ftb_q.m_read = m_ftb_q.m_write =0;
-  m_cmd_q.m_read = m_cmd_q.m_write =0;
-  m_etb_q.m_read = m_etb_q.m_write =0;
+    // Reset counters in mesg queues
+    m_ftb_q.m_size=0;
+    m_cmd_q.m_size=0;
+    m_etb_q.m_size=0;
+    m_ftb_q.m_read = m_ftb_q.m_write =0;
+    m_cmd_q.m_read = m_cmd_q.m_write =0;
+    m_etb_q.m_read = m_etb_q.m_write =0;
 
 #ifdef _ANDROID_
-  // Clear the strong reference
-  DEBUG_PRINT_HIGH("Calling m_heap_ptr.clear()\n");
-  m_heap_ptr.clear();
+    // Clear the strong reference
+    DEBUG_PRINT_HIGH("Calling m_heap_ptr.clear()\n");
+    m_heap_ptr.clear();
 #endif // _ANDROID_
-  DEBUG_PRINT_HIGH("Calling venc_close()\n");
-  handle->venc_close();
-  DEBUG_PRINT_HIGH("Deleting HANDLE[%p]\n", handle);
-  delete (handle);
-  DEBUG_PRINT_HIGH("OMX_Venc:Component Deinit\n");
-  return OMX_ErrorNone;
+    DEBUG_PRINT_HIGH("Calling venc_close()\n");
+    handle->venc_close();
+    DEBUG_PRINT_HIGH("Deleting HANDLE[%p]\n", handle);
+    delete (handle);
+    DEBUG_PRINT_HIGH("OMX_Venc:Component Deinit\n");
+    return OMX_ErrorNone;
 }
 
 
 OMX_U32 omx_venc::dev_stop( void)
 {
-  return handle->venc_stop();
+    return handle->venc_stop();
 }
 
 
 OMX_U32 omx_venc::dev_pause(void)
 {
-  return handle->venc_pause();
+    return handle->venc_pause();
 }
 
 OMX_U32 omx_venc::dev_start(void)
 {
-  return handle->venc_start();
+    return handle->venc_start();
 }
 
 OMX_U32 omx_venc::dev_flush(unsigned port)
 {
-  return handle->venc_flush(port);
+    return handle->venc_flush(port);
 }
 OMX_U32 omx_venc::dev_resume(void)
 {
-  return handle->venc_resume();
+    return handle->venc_resume();
 }
 
 OMX_U32 omx_venc::dev_start_done(void)
 {
-  return handle->venc_start_done();
+    return handle->venc_start_done();
 }
 
 OMX_U32 omx_venc::dev_set_message_thread_id(pthread_t tid)
 {
-  return handle->venc_set_message_thread_id(tid);
+    return handle->venc_set_message_thread_id(tid);
 }
 
 bool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned index)
 {
-  return handle->venc_use_buf(buf_addr,port,index);
+    return handle->venc_use_buf(buf_addr,port,index);
 }
 
 bool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
 {
-  return handle->venc_free_buf(buf_addr,port);
+    return handle->venc_free_buf(buf_addr,port);
 }
 
 bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
 {
-  return  handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
+    return  handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
 }
 
 bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
 {
-  return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd);
+    return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd);
 }
 
 bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen)
 {
-  return handle->venc_get_seq_hdr(buffer, size, hdrlen);
+    return handle->venc_get_seq_hdr(buffer, size, hdrlen);
 }
 
 bool omx_venc::dev_get_capability_ltrcount(OMX_U32 *min, OMX_U32 *max, OMX_U32 *step_size)
 {
 #ifdef _MSM8974_
-   DEBUG_PRINT_ERROR("Get Capability LTR Count is not supported");
-   return false;
+    DEBUG_PRINT_ERROR("Get Capability LTR Count is not supported");
+    return false;
 #else
-   return handle->venc_get_capability_ltrcount(min, max, step_size);
+    return handle->venc_get_capability_ltrcount(min, max, step_size);
 #endif
 }
 
 bool omx_venc::dev_loaded_start()
 {
-  return handle->venc_loaded_start();
+    return handle->venc_loaded_start();
 }
 
 bool omx_venc::dev_loaded_stop()
 {
-  return handle->venc_loaded_stop();
+    return handle->venc_loaded_stop();
 }
 
 bool omx_venc::dev_loaded_start_done()
 {
-  return handle->venc_loaded_start_done();
+    return handle->venc_loaded_start_done();
 }
 
 bool omx_venc::dev_loaded_stop_done()
 {
-  return handle->venc_loaded_stop_done();
+    return handle->venc_loaded_stop_done();
 }
 
 bool omx_venc::dev_get_buf_req(OMX_U32 *min_buff_count,
-                               OMX_U32 *actual_buff_count,
-                               OMX_U32 *buff_size,
-                               OMX_U32 port)
+        OMX_U32 *actual_buff_count,
+        OMX_U32 *buff_size,
+        OMX_U32 port)
 {
-  return handle->venc_get_buf_req(min_buff_count,
-                                  actual_buff_count,
-                                  buff_size,
-                                  port);
+    return handle->venc_get_buf_req(min_buff_count,
+            actual_buff_count,
+            buff_size,
+            port);
 
 }
 
 bool omx_venc::dev_set_buf_req(OMX_U32 *min_buff_count,
-                               OMX_U32 *actual_buff_count,
-                               OMX_U32 *buff_size,
-                               OMX_U32 port)
+        OMX_U32 *actual_buff_count,
+        OMX_U32 *buff_size,
+        OMX_U32 port)
 {
-  return handle->venc_set_buf_req(min_buff_count,
-                                  actual_buff_count,
-                                  buff_size,
-                                  port);
+    return handle->venc_set_buf_req(min_buff_count,
+            actual_buff_count,
+            buff_size,
+            port);
 
 }
 
 bool omx_venc::dev_is_video_session_supported(OMX_U32 width, OMX_U32 height)
 {
 #ifdef _MSM8974_
-  return handle->venc_is_video_session_supported(width,height);
+    return handle->venc_is_video_session_supported(width,height);
 #else
-  DEBUG_PRINT_LOW("Check against video capability not supported");
-  return true;
+    DEBUG_PRINT_LOW("Check against video capability not supported");
+    return true;
 #endif
 }
 
 #ifdef _MSM8974_
 int omx_venc::dev_handle_extradata(void *buffer, int index)
 {
-  return handle->handle_extradata(buffer, index);
+    return handle->handle_extradata(buffer, index);
 }
 
 int omx_venc::dev_set_format(int color)
 {
-  return handle->venc_set_format(color);
+    return handle->venc_set_format(color);
 }
 #endif
 
 int omx_venc::async_message_process (void *context, void* message)
 {
-  omx_video* omx = NULL;
-  struct venc_msg *m_sVenc_msg = NULL;
-  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
-  struct venc_buffer *temp_buff = NULL;
+    omx_video* omx = NULL;
+    struct venc_msg *m_sVenc_msg = NULL;
+    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+    struct venc_buffer *temp_buff = NULL;
 
-  if(context == NULL || message == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: omx_venc::async_message_process invalid i/p params");
-    return -1;
-  }
-  m_sVenc_msg = (struct venc_msg *)message;
-
-  omx = reinterpret_cast<omx_video*>(context);
-
-  if(m_sVenc_msg->statuscode != VEN_S_SUCCESS)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: async_msg_process() - Error statuscode = %lu\n",
-        m_sVenc_msg->statuscode);
-    omx->omx_report_error();
-  }
-
-  DEBUG_PRINT_LOW("\n omx_venc::async_message_process- msgcode = %d\n",
-               m_sVenc_msg->msgcode);
-  switch(m_sVenc_msg->msgcode)
-  {
-  case VEN_MSG_START:
-    omx->post_event (NULL,m_sVenc_msg->statuscode,\
-                     OMX_COMPONENT_GENERATE_START_DONE);
-    break;
-  case VEN_MSG_STOP:
-    omx->post_event (NULL,m_sVenc_msg->statuscode,\
-                     OMX_COMPONENT_GENERATE_STOP_DONE);
-    break;
-  case VEN_MSG_RESUME:
-    omx->post_event (NULL,m_sVenc_msg->statuscode,\
-                     OMX_COMPONENT_GENERATE_RESUME_DONE);
-    break;
-  case VEN_MSG_PAUSE:
-    omx->post_event (NULL,m_sVenc_msg->statuscode,\
-                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
-    break;
-  case VEN_MSG_FLUSH_INPUT_DONE:
-
-    omx->post_event (NULL,m_sVenc_msg->statuscode,\
-                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
-    break;
-  case VEN_MSG_FLUSH_OUPUT_DONE:
-    omx->post_event (NULL,m_sVenc_msg->statuscode,\
-                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
-    break;
-  case VEN_MSG_INPUT_BUFFER_DONE:
-    omxhdr = (OMX_BUFFERHEADERTYPE* )\
-             m_sVenc_msg->buf.clientdata;
-
-    if(omxhdr == NULL ||
-       (((OMX_U32)(omxhdr - omx->m_inp_mem_ptr) > omx->m_sInPortDef.nBufferCountActual) &&
-        ((OMX_U32)(omxhdr - omx->meta_buffer_hdr) > omx->m_sInPortDef.nBufferCountActual)))
-    {
-      omxhdr = NULL;
-      m_sVenc_msg->statuscode = VEN_S_EFAIL;
+    if (context == NULL || message == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR: omx_venc::async_message_process invalid i/p params");
+        return -1;
     }
+    m_sVenc_msg = (struct venc_msg *)message;
+
+    omx = reinterpret_cast<omx_video*>(context);
+
+    if (m_sVenc_msg->statuscode != VEN_S_SUCCESS) {
+        DEBUG_PRINT_ERROR("\nERROR: async_msg_process() - Error statuscode = %lu\n",
+                m_sVenc_msg->statuscode);
+        omx->omx_report_error();
+    }
+
+    DEBUG_PRINT_LOW("\n omx_venc::async_message_process- msgcode = %d\n",
+            m_sVenc_msg->msgcode);
+    switch (m_sVenc_msg->msgcode) {
+        case VEN_MSG_START:
+            omx->post_event (NULL,m_sVenc_msg->statuscode,\
+                    OMX_COMPONENT_GENERATE_START_DONE);
+            break;
+        case VEN_MSG_STOP:
+            omx->post_event (NULL,m_sVenc_msg->statuscode,\
+                    OMX_COMPONENT_GENERATE_STOP_DONE);
+            break;
+        case VEN_MSG_RESUME:
+            omx->post_event (NULL,m_sVenc_msg->statuscode,\
+                    OMX_COMPONENT_GENERATE_RESUME_DONE);
+            break;
+        case VEN_MSG_PAUSE:
+            omx->post_event (NULL,m_sVenc_msg->statuscode,\
+                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
+            break;
+        case VEN_MSG_FLUSH_INPUT_DONE:
+
+            omx->post_event (NULL,m_sVenc_msg->statuscode,\
+                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
+            break;
+        case VEN_MSG_FLUSH_OUPUT_DONE:
+            omx->post_event (NULL,m_sVenc_msg->statuscode,\
+                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
+            break;
+        case VEN_MSG_INPUT_BUFFER_DONE:
+            omxhdr = (OMX_BUFFERHEADERTYPE* )\
+                     m_sVenc_msg->buf.clientdata;
+
+            if (omxhdr == NULL ||
+                    (((OMX_U32)(omxhdr - omx->m_inp_mem_ptr) > omx->m_sInPortDef.nBufferCountActual) &&
+                     ((OMX_U32)(omxhdr - omx->meta_buffer_hdr) > omx->m_sInPortDef.nBufferCountActual))) {
+                omxhdr = NULL;
+                m_sVenc_msg->statuscode = VEN_S_EFAIL;
+            }
 
 #ifdef _ANDROID_ICS_
-      omx->omx_release_meta_buffer(omxhdr);
+            omx->omx_release_meta_buffer(omxhdr);
 #endif
-    omx->post_event ((unsigned int)omxhdr,m_sVenc_msg->statuscode,
-                     OMX_COMPONENT_GENERATE_EBD);
-    break;
-  case VEN_MSG_OUTPUT_BUFFER_DONE:
-    omxhdr = (OMX_BUFFERHEADERTYPE*)m_sVenc_msg->buf.clientdata;
+            omx->post_event ((unsigned int)omxhdr,m_sVenc_msg->statuscode,
+                    OMX_COMPONENT_GENERATE_EBD);
+            break;
+        case VEN_MSG_OUTPUT_BUFFER_DONE:
+            omxhdr = (OMX_BUFFERHEADERTYPE*)m_sVenc_msg->buf.clientdata;
 
-    if( (omxhdr != NULL) &&
-        ((OMX_U32)(omxhdr - omx->m_out_mem_ptr)  < omx->m_sOutPortDef.nBufferCountActual))
-    {
-      if(m_sVenc_msg->buf.len <=  omxhdr->nAllocLen)
-      {
-        omxhdr->nFilledLen = m_sVenc_msg->buf.len;
-        omxhdr->nOffset = m_sVenc_msg->buf.offset;
-        omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
-        DEBUG_PRINT_LOW("\n o/p TS = %u", (OMX_U32)m_sVenc_msg->buf.timestamp);
-        omxhdr->nFlags = m_sVenc_msg->buf.flags;
+            if ( (omxhdr != NULL) &&
+                    ((OMX_U32)(omxhdr - omx->m_out_mem_ptr)  < omx->m_sOutPortDef.nBufferCountActual)) {
+                if (m_sVenc_msg->buf.len <=  omxhdr->nAllocLen) {
+                    omxhdr->nFilledLen = m_sVenc_msg->buf.len;
+                    omxhdr->nOffset = m_sVenc_msg->buf.offset;
+                    omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
+                    DEBUG_PRINT_LOW("\n o/p TS = %u", (OMX_U32)m_sVenc_msg->buf.timestamp);
+                    omxhdr->nFlags = m_sVenc_msg->buf.flags;
 
-        /*Use buffer case*/
-        if(omx->output_use_buffer && !omx->m_use_output_pmem)
-        {
-          DEBUG_PRINT_LOW("\n memcpy() for o/p Heap UseBuffer");
-          memcpy(omxhdr->pBuffer,
-                 (m_sVenc_msg->buf.ptrbuffer),
-                  m_sVenc_msg->buf.len);
-        }
-      }
-      else
-      {
-        omxhdr->nFilledLen = 0;
-      }
+                    /*Use buffer case*/
+                    if (omx->output_use_buffer && !omx->m_use_output_pmem) {
+                        DEBUG_PRINT_LOW("\n memcpy() for o/p Heap UseBuffer");
+                        memcpy(omxhdr->pBuffer,
+                                (m_sVenc_msg->buf.ptrbuffer),
+                                m_sVenc_msg->buf.len);
+                    }
+                } else {
+                    omxhdr->nFilledLen = 0;
+                }
 
-    }
-    else
-    {
-      omxhdr = NULL;
-      m_sVenc_msg->statuscode = VEN_S_EFAIL;
-    }
-    omx->post_event ((unsigned int)omxhdr,m_sVenc_msg->statuscode,
-                     OMX_COMPONENT_GENERATE_FBD);
-    break;
-  case VEN_MSG_NEED_OUTPUT_BUFFER:
-    //TBD what action needs to be done here??
-    break;
+            } else {
+                omxhdr = NULL;
+                m_sVenc_msg->statuscode = VEN_S_EFAIL;
+            }
+            omx->post_event ((unsigned int)omxhdr,m_sVenc_msg->statuscode,
+                    OMX_COMPONENT_GENERATE_FBD);
+            break;
+        case VEN_MSG_NEED_OUTPUT_BUFFER:
+            //TBD what action needs to be done here??
+            break;
 #ifndef _MSM8974_
-  case VEN_MSG_LTRUSE_FAILED:
-    DEBUG_PRINT_ERROR("LTRUSE Failed!");
-    omx->post_event (NULL,m_sVenc_msg->statuscode,
-                     OMX_COMPONENT_GENERATE_LTRUSE_FAILED);
-    break;
+        case VEN_MSG_LTRUSE_FAILED:
+            DEBUG_PRINT_ERROR("LTRUSE Failed!");
+            omx->post_event (NULL,m_sVenc_msg->statuscode,
+                    OMX_COMPONENT_GENERATE_LTRUSE_FAILED);
+            break;
 #endif
-  default:
-    break;
-  }
-  return 0;
+        default:
+            break;
+    }
+    return 0;
 }
diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device.cpp
index 7b56d33..f5890f5 100644
--- a/mm-video-v4l2/vidc/venc/src/video_encoder_device.cpp
+++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device.cpp
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------------
-Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -46,8 +46,7 @@
 #define H264_MP_START (H264_BP_START + 26)
 
 /* MPEG4 profile and level table*/
-static const unsigned int mpeg4_profile_level_table[][5]=
-{
+static const unsigned int mpeg4_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
     {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
@@ -68,9 +67,8 @@
 };
 
 /* H264 profile and level table*/
-static const unsigned int h264_profile_level_table[][5]=
-{
-     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
+static const unsigned int h264_profile_level_table[][5]= {
+    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
     {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
     {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
@@ -116,8 +114,7 @@
 };
 
 /* H263 profile and level table*/
-static const unsigned int h263_profile_level_table[][5]=
-{
+static const unsigned int h263_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
     {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
@@ -144,1137 +141,1095 @@
 //constructor
 venc_dev::venc_dev(class omx_venc *venc_class)
 {
-  m_max_allowed_bitrate_check = false;
-  m_eLevel = 0;
-  m_eProfile = 0;
-  pthread_mutex_init(&loaded_start_stop_mlock, NULL);
-  pthread_cond_init (&loaded_start_stop_cond, NULL);
-  DEBUG_PRINT_LOW("venc_dev constructor");
+    m_max_allowed_bitrate_check = false;
+    m_eLevel = 0;
+    m_eProfile = 0;
+    pthread_mutex_init(&loaded_start_stop_mlock, NULL);
+    pthread_cond_init (&loaded_start_stop_cond, NULL);
+    DEBUG_PRINT_LOW("venc_dev constructor");
 }
 
 venc_dev::~venc_dev()
 {
-  pthread_cond_destroy(&loaded_start_stop_cond);
-  pthread_mutex_destroy(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("venc_dev distructor");
+    pthread_cond_destroy(&loaded_start_stop_cond);
+    pthread_mutex_destroy(&loaded_start_stop_mlock);
+    DEBUG_PRINT_LOW("venc_dev distructor");
 }
 
 void* async_venc_message_thread (void *input)
 {
-  struct venc_ioctl_msg ioctl_msg ={NULL,NULL};
-  struct venc_timeout timeout;
-  struct venc_msg venc_msg;
-  int error_code = 0;
-  omx_venc *omx = reinterpret_cast<omx_venc*>(input);
+    struct venc_ioctl_msg ioctl_msg ={NULL,NULL};
+    struct venc_timeout timeout;
+    struct venc_msg venc_msg;
+    int error_code = 0;
+    omx_venc *omx = reinterpret_cast<omx_venc*>(input);
 
-  prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
-  timeout.millisec = VEN_TIMEOUT_INFINITE;
-  while(1)
-  {
-    ioctl_msg.in = NULL;
-    ioctl_msg.out = (void*)&venc_msg;
+    prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
+    timeout.millisec = VEN_TIMEOUT_INFINITE;
 
-    /*Wait for a message from the video decoder driver*/
-    error_code = ioctl(omx->handle->m_nDriver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,(void *)&ioctl_msg);
-    if (error_code == -512)  // ERESTARTSYS
-    {
-        DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
+    while (1) {
+        ioctl_msg.in = NULL;
+        ioctl_msg.out = (void*)&venc_msg;
+
+        /*Wait for a message from the video decoder driver*/
+        error_code = ioctl(omx->handle->m_nDriver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,(void *)&ioctl_msg);
+
+        if (error_code == -512) { // ERESTARTSYS
+            DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
+        } else if (error_code <0) {
+            DEBUG_PRINT_LOW("\nioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed");
+            break;
+        } else if (omx->async_message_process(input,&venc_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+            break;
+        }
     }
-    else if (error_code <0)
-    {
-        DEBUG_PRINT_LOW("\nioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed");
-        break;
-    }
-    else if(omx->async_message_process(input,&venc_msg) < 0)
-    {
-        DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
-        break;
-    }
-  }
-  DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
-  return NULL;
+
+    DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
+    return NULL;
 }
 
 bool venc_dev::venc_open(OMX_U32 codec)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  int r;
-  unsigned int   alignment = 0,buffer_size = 0, temp =0;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    int r;
+    unsigned int   alignment = 0,buffer_size = 0, temp =0;
 
-  m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
-  if(m_nDriver_fd == 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
     m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
-  }
 
-  if((int)m_nDriver_fd < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
-    return false;
-  }
+    if (m_nDriver_fd == 0) {
+        DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
+        m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
+    }
 
-  DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
+    if ((int)m_nDriver_fd < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
 #ifdef SINGLE_ENCODER_INSTANCE
-  OMX_U32 num_instances = 0;
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = &num_instances;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < 0 )
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request number of encoder instances failed");
-  }
-  else if (num_instances > 1)
-  {
-    DEBUG_PRINT_ERROR("\nSecond encoder instance rejected!");
-    venc_close();
-    return false;
-  }
+    OMX_U32 num_instances = 0;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = &num_instances;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < 0 ) {
+        DEBUG_PRINT_ERROR("\nERROR: Request number of encoder instances failed");
+    } else if (num_instances > 1) {
+        DEBUG_PRINT_ERROR("\nSecond encoder instance rejected!");
+        venc_close();
+        return false;
+    }
+
 #endif
-  // set the basic configuration of the video encoder driver
-  m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
-  m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
-  m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
-  m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
-  m_sVenc_cfg.fps_num = 30;
-  m_sVenc_cfg.fps_den = 1;
-  m_sVenc_cfg.targetbitrate = 64000;
+    // set the basic configuration of the video encoder driver
+    m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
+    m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
+    m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
+    m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
+    m_sVenc_cfg.fps_num = 30;
+    m_sVenc_cfg.fps_den = 1;
+    m_sVenc_cfg.targetbitrate = 64000;
 #ifdef MAX_RES_1080P
-  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
 #else
-  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12;
+    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12;
 #endif
-// initializing QP range parameters
-  qp_range.minqp = 2;
-  if(codec == OMX_VIDEO_CodingAVC)
-    qp_range.maxqp = 51;
-  else
-    qp_range.maxqp = 31;
+    // initializing QP range parameters
+    qp_range.minqp = 2;
 
-  if(codec == OMX_VIDEO_CodingMPEG4)
-  {
-    m_sVenc_cfg.codectype = VEN_CODEC_MPEG4;
-    codec_profile.profile = VEN_PROFILE_MPEG4_SP;
-    profile_level.level = VEN_LEVEL_MPEG4_2;
+    if (codec == OMX_VIDEO_CodingAVC)
+        qp_range.maxqp = 51;
+    else
+        qp_range.maxqp = 31;
+
+    if (codec == OMX_VIDEO_CodingMPEG4) {
+        m_sVenc_cfg.codectype = VEN_CODEC_MPEG4;
+        codec_profile.profile = VEN_PROFILE_MPEG4_SP;
+        profile_level.level = VEN_LEVEL_MPEG4_2;
 #ifdef OUTPUT_BUFFER_LOG
-    strcat(outputfilename, "m4v");
+        strcat(outputfilename, "m4v");
 #endif
-  }
-  else if(codec == OMX_VIDEO_CodingH263)
-  {
-    m_sVenc_cfg.codectype = VEN_CODEC_H263;
-    codec_profile.profile = VEN_PROFILE_H263_BASELINE;
-    profile_level.level = VEN_LEVEL_H263_20;
+    } else if (codec == OMX_VIDEO_CodingH263) {
+        m_sVenc_cfg.codectype = VEN_CODEC_H263;
+        codec_profile.profile = VEN_PROFILE_H263_BASELINE;
+        profile_level.level = VEN_LEVEL_H263_20;
 #ifdef OUTPUT_BUFFER_LOG
-    strcat(outputfilename, "263");
+        strcat(outputfilename, "263");
 #endif
-  }
-  if(codec == OMX_VIDEO_CodingAVC)
-  {
-    m_sVenc_cfg.codectype = VEN_CODEC_H264;
-    codec_profile.profile = VEN_PROFILE_H264_BASELINE;
-    profile_level.level = VEN_LEVEL_H264_1p1;
+    }
+
+    if (codec == OMX_VIDEO_CodingAVC) {
+        m_sVenc_cfg.codectype = VEN_CODEC_H264;
+        codec_profile.profile = VEN_PROFILE_H264_BASELINE;
+        profile_level.level = VEN_LEVEL_H264_1p1;
 #ifdef OUTPUT_BUFFER_LOG
-    strcat(outputfilename, "264");
+        strcat(outputfilename, "264");
 #endif
-  }
-  ioctl_msg.in = (void*)&m_sVenc_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0 )
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting base configuration failed");
-    return false;
-  }
+    }
+
+    ioctl_msg.in = (void*)&m_sVenc_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0 ) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting base configuration failed");
+        return false;
+    }
+
 #ifdef INPUT_BUFFER_LOG
-  inputBufferFile1 = fopen (inputfilename, "ab");
+    inputBufferFile1 = fopen (inputfilename, "ab");
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-  outputBufferFile1 = fopen (outputfilename, "ab");
+    outputBufferFile1 = fopen (outputfilename, "ab");
 #endif
-  // Get the I/P and O/P buffer requirements
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = (void*)&m_sInput_buff_property;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
-    return false;
-  }
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = (void*)&m_sOutput_buff_property;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
-    return false;
-  }
+    // Get the I/P and O/P buffer requirements
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = (void*)&m_sInput_buff_property;
 
-  m_profile_set = false;
-  m_level_set = false;
-  if(venc_set_profile_level(0, 0))
-  {
-    DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
-        __func__);
-  }
-  recon_buffers_count = MAX_RECON_BUFFERS;
-  ltrmode.ltr_mode = 0;
-  ltrcount.ltr_count = 0;
-  ltrperiod.ltr_period = 0;
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
+        return false;
+    }
 
-  return true;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = (void*)&m_sOutput_buff_property;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
+        return false;
+    }
+
+    m_profile_set = false;
+    m_level_set = false;
+
+    if (venc_set_profile_level(0, 0)) {
+        DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
+                __func__);
+    }
+
+    recon_buffers_count = MAX_RECON_BUFFERS;
+    ltrmode.ltr_mode = 0;
+    ltrcount.ltr_count = 0;
+    ltrperiod.ltr_period = 0;
+
+    return true;
 }
 
 void venc_dev::venc_close()
 {
-  DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
-  if((int)m_nDriver_fd >= 0)
-  {
-    DEBUG_PRINT_HIGH("\n venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
-    (void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
-        NULL);
-    DEBUG_PRINT_LOW("\nCalling close()\n");
-    close(m_nDriver_fd);
-    m_nDriver_fd = -1;
-  }
+    DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
+
+    if ((int)m_nDriver_fd >= 0) {
+        DEBUG_PRINT_HIGH("\n venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
+        (void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
+                NULL);
+        DEBUG_PRINT_LOW("\nCalling close()\n");
+        close(m_nDriver_fd);
+        m_nDriver_fd = -1;
+    }
+
 #ifdef INPUT_BUFFER_LOG
-  fclose (inputBufferFile1);
+    fclose (inputBufferFile1);
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-  fclose (outputBufferFile1);
+    fclose (outputBufferFile1);
 #endif
 }
 
 bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
-                                unsigned long *actual_buff_count,
-                                unsigned long *buff_size,
-                                unsigned long port)
+        unsigned long *actual_buff_count,
+        unsigned long *buff_size,
+        unsigned long port)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  unsigned long temp_count = 0;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    unsigned long temp_count = 0;
 
-  if(port == 0)
-  {
-    if(*actual_buff_count > m_sInput_buff_property.mincount)
-    {
-      temp_count = m_sInput_buff_property.actualcount;
-      m_sInput_buff_property.actualcount = *actual_buff_count;
-      ioctl_msg.in = (void*)&m_sInput_buff_property;
-      ioctl_msg.out = NULL;
-      if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirement failed");
-        m_sInput_buff_property.actualcount = temp_count;
-        return false;
-      }
-      DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
-    }
-  }
-  else
-  {
-    if(*actual_buff_count > m_sOutput_buff_property.mincount)
-    {
-	  temp_count = m_sOutput_buff_property.actualcount;
-      m_sOutput_buff_property.actualcount = *actual_buff_count;
-      ioctl_msg.in = (void*)&m_sOutput_buff_property;
-      ioctl_msg.out = NULL;
-      if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer requirement failed");
-		m_sOutput_buff_property.actualcount = temp_count;
-        return false;
-      }
-      DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
-    }
-  }
+    if (port == 0) {
+        if (*actual_buff_count > m_sInput_buff_property.mincount) {
+            temp_count = m_sInput_buff_property.actualcount;
+            m_sInput_buff_property.actualcount = *actual_buff_count;
+            ioctl_msg.in = (void*)&m_sInput_buff_property;
+            ioctl_msg.out = NULL;
 
-  return true;
+            if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirement failed");
+                m_sInput_buff_property.actualcount = temp_count;
+                return false;
+            }
+
+            DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
+        }
+    } else {
+        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
+            temp_count = m_sOutput_buff_property.actualcount;
+            m_sOutput_buff_property.actualcount = *actual_buff_count;
+            ioctl_msg.in = (void*)&m_sOutput_buff_property;
+            ioctl_msg.out = NULL;
+
+            if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer requirement failed");
+                m_sOutput_buff_property.actualcount = temp_count;
+                return false;
+            }
+
+            DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
+        }
+    }
+
+    return true;
 
 }
 
 bool venc_dev::venc_loaded_start()
 {
-  struct timespec ts;
-  int status = 0;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_START, NULL) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_START failed");
-    return false;
-  }
-  if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
-  {
-    DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
-    return false;
-  }
-  ts.tv_sec += 1;
-  pthread_mutex_lock(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("%s: wait on start done", __func__);
-  status = pthread_cond_timedwait(&loaded_start_stop_cond,
-                &loaded_start_stop_mlock, &ts);
-  if (status != 0)
-  {
-    DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
-        status, strerror(status));
+    struct timespec ts;
+    int status = 0;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_START, NULL) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_START failed");
+        return false;
+    }
+
+    if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
+        DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
+        return false;
+    }
+
+    ts.tv_sec += 1;
+    pthread_mutex_lock(&loaded_start_stop_mlock);
+    DEBUG_PRINT_LOW("%s: wait on start done", __func__);
+    status = pthread_cond_timedwait(&loaded_start_stop_cond,
+            &loaded_start_stop_mlock, &ts);
+
+    if (status != 0) {
+        DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
+                status, strerror(status));
+        pthread_mutex_unlock(&loaded_start_stop_mlock);
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("%s: wait over on start done", __func__);
     pthread_mutex_unlock(&loaded_start_stop_mlock);
-    return false;
-  }
-  DEBUG_PRINT_LOW("%s: wait over on start done", __func__);
-  pthread_mutex_unlock(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("%s: venc_loaded_start success", __func__);
-  return true;
+    DEBUG_PRINT_LOW("%s: venc_loaded_start success", __func__);
+    return true;
 }
 
 bool venc_dev::venc_loaded_stop()
 {
-  struct timespec ts;
-  int status = 0;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_STOP, NULL) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_STOP failed");
-    return false;
-  }
-  if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
-  {
-    DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
-    return false;
-  }
-  ts.tv_sec += 1;
-  pthread_mutex_lock(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("%s: wait on stop done", __func__);
-  status = pthread_cond_timedwait(&loaded_start_stop_cond,
-                &loaded_start_stop_mlock, &ts);
-  if (status != 0)
-  {
-    DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
-        status, strerror(status));
+    struct timespec ts;
+    int status = 0;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_STOP, NULL) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_STOP failed");
+        return false;
+    }
+
+    if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
+        DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
+        return false;
+    }
+
+    ts.tv_sec += 1;
+    pthread_mutex_lock(&loaded_start_stop_mlock);
+    DEBUG_PRINT_LOW("%s: wait on stop done", __func__);
+    status = pthread_cond_timedwait(&loaded_start_stop_cond,
+            &loaded_start_stop_mlock, &ts);
+
+    if (status != 0) {
+        DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
+                status, strerror(status));
+        pthread_mutex_unlock(&loaded_start_stop_mlock);
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("%s: wait over on stop done", __func__);
     pthread_mutex_unlock(&loaded_start_stop_mlock);
-    return false;
-  }
-  DEBUG_PRINT_LOW("%s: wait over on stop done", __func__);
-  pthread_mutex_unlock(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("%s: venc_loaded_stop success", __func__);
-  return true;
+    DEBUG_PRINT_LOW("%s: venc_loaded_stop success", __func__);
+    return true;
 }
 
 bool venc_dev::venc_loaded_start_done()
 {
-  pthread_mutex_lock(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("%s: signal start done", __func__);
-  pthread_cond_signal(&loaded_start_stop_cond);
-  pthread_mutex_unlock(&loaded_start_stop_mlock);
-  return true;
+    pthread_mutex_lock(&loaded_start_stop_mlock);
+    DEBUG_PRINT_LOW("%s: signal start done", __func__);
+    pthread_cond_signal(&loaded_start_stop_cond);
+    pthread_mutex_unlock(&loaded_start_stop_mlock);
+    return true;
 }
 
 bool venc_dev::venc_loaded_stop_done()
 {
-  pthread_mutex_lock(&loaded_start_stop_mlock);
-  DEBUG_PRINT_LOW("%s: signal stop done", __func__);
-  pthread_cond_signal(&loaded_start_stop_cond);
-  pthread_mutex_unlock(&loaded_start_stop_mlock);
-  return true;
+    pthread_mutex_lock(&loaded_start_stop_mlock);
+    DEBUG_PRINT_LOW("%s: signal stop done", __func__);
+    pthread_cond_signal(&loaded_start_stop_cond);
+    pthread_mutex_unlock(&loaded_start_stop_mlock);
+    return true;
 }
 
 bool venc_dev::venc_get_seq_hdr(void *buffer,
-    unsigned buffer_size, unsigned *header_len)
+        unsigned buffer_size, unsigned *header_len)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  int i = 0;
-  DEBUG_PRINT_HIGH("venc_dev::venc_get_seq_hdr");
-  venc_seqheader seq_in, seq_out;
-  seq_in.hdrlen = 0;
-  seq_in.bufsize = buffer_size;
-  seq_in.hdrbufptr = (unsigned char*)buffer;
-  if (seq_in.hdrbufptr == NULL) {
-    DEBUG_PRINT_ERROR("ERROR: malloc for sequence header failed");
-    return false;
-  }
-  DEBUG_PRINT_LOW("seq_in: buf=%x, sz=%d, hdrlen=%d", seq_in.hdrbufptr,
-    seq_in.bufsize, seq_in.hdrlen);
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    int i = 0;
+    DEBUG_PRINT_HIGH("venc_dev::venc_get_seq_hdr");
+    venc_seqheader seq_in, seq_out;
+    seq_in.hdrlen = 0;
+    seq_in.bufsize = buffer_size;
+    seq_in.hdrbufptr = (unsigned char*)buffer;
 
-  ioctl_msg.in = (void*)&seq_in;
-  ioctl_msg.out = (void*)&seq_out;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_SEQUENCE_HDR,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Request for getting sequence header failed");
-    return false;
-  }
-  if (seq_out.hdrlen == 0) {
-    DEBUG_PRINT_ERROR("ERROR: Seq header returned zero length header");
-    DEBUG_PRINT_ERROR("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
-      seq_out.bufsize, seq_out.hdrlen);
-    return false;
-  }
-  *header_len = seq_out.hdrlen;
-  DEBUG_PRINT_LOW("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
-    seq_out.bufsize, seq_out.hdrlen);
+    if (seq_in.hdrbufptr == NULL) {
+        DEBUG_PRINT_ERROR("ERROR: malloc for sequence header failed");
+        return false;
+    }
 
-  return true;
+    DEBUG_PRINT_LOW("seq_in: buf=%x, sz=%d, hdrlen=%d", seq_in.hdrbufptr,
+            seq_in.bufsize, seq_in.hdrlen);
+
+    ioctl_msg.in = (void*)&seq_in;
+    ioctl_msg.out = (void*)&seq_out;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_SEQUENCE_HDR,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Request for getting sequence header failed");
+        return false;
+    }
+
+    if (seq_out.hdrlen == 0) {
+        DEBUG_PRINT_ERROR("ERROR: Seq header returned zero length header");
+        DEBUG_PRINT_ERROR("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
+                seq_out.bufsize, seq_out.hdrlen);
+        return false;
+    }
+
+    *header_len = seq_out.hdrlen;
+    DEBUG_PRINT_LOW("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
+            seq_out.bufsize, seq_out.hdrlen);
+
+    return true;
 }
 
 bool venc_dev::venc_get_capability_ltrcount(unsigned long *min,
-    unsigned long *max, unsigned long *step_size)
+        unsigned long *max, unsigned long *step_size)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  venc_range  cap_ltr_count;
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = (void*)&cap_ltr_count;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_CAPABILITY_LTRCOUNT,
-            (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Get LTR Capability failed");
-    return false;
-  }
-  else
-  {
-    *min = cap_ltr_count.min;
-    *max = cap_ltr_count.max;
-    *step_size = cap_ltr_count.step_size;
-    DEBUG_PRINT_HIGH("LTR Capability: min=%x, max=%d, step_size=%d",
-      *min, *max, *step_size);
-  }
-  return true;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    venc_range  cap_ltr_count;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = (void*)&cap_ltr_count;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_CAPABILITY_LTRCOUNT,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Get LTR Capability failed");
+        return false;
+    } else {
+        *min = cap_ltr_count.min;
+        *max = cap_ltr_count.max;
+        *step_size = cap_ltr_count.step_size;
+        DEBUG_PRINT_HIGH("LTR Capability: min=%x, max=%d, step_size=%d",
+                *min, *max, *step_size);
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
-                                unsigned long *actual_buff_count,
-                                unsigned long *buff_size,
-                                unsigned long port)
+        unsigned long *actual_buff_count,
+        unsigned long *buff_size,
+        unsigned long port)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
 
-  if(port == 0)
-  {
-    ioctl_msg.in = NULL;
-    ioctl_msg.out = (void*)&m_sInput_buff_property;
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
-      return false;
-    }
-    *min_buff_count = m_sInput_buff_property.mincount;
-    *actual_buff_count = m_sInput_buff_property.actualcount;
+    if (port == 0) {
+        ioctl_msg.in = NULL;
+        ioctl_msg.out = (void*)&m_sInput_buff_property;
+
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
+            return false;
+        }
+
+        *min_buff_count = m_sInput_buff_property.mincount;
+        *actual_buff_count = m_sInput_buff_property.actualcount;
 #ifdef USE_ION
-    // For ION memory allocations of the allocated buffer size
-    // must be 4k aligned, hence aligning the input buffer
-    // size to 4k.
-    m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
-                                       & (~4095);
+        // For ION memory allocations of the allocated buffer size
+        // must be 4k aligned, hence aligning the input buffer
+        // size to 4k.
+        m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
+            & (~4095);
 #endif
-    *buff_size = m_sInput_buff_property.datasize;
-  }
-  else
-  {
-    ioctl_msg.in = NULL;
-    ioctl_msg.out = (void*)&m_sOutput_buff_property;
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
-      return false;
-    }
-    *min_buff_count = m_sOutput_buff_property.mincount;
-    *actual_buff_count = m_sOutput_buff_property.actualcount;
-    *buff_size = m_sOutput_buff_property.datasize;
-  }
+        *buff_size = m_sInput_buff_property.datasize;
+    } else {
+        ioctl_msg.in = NULL;
+        ioctl_msg.out = (void*)&m_sOutput_buff_property;
 
-  return true;
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
+            return false;
+        }
+
+        *min_buff_count = m_sOutput_buff_property.mincount;
+        *actual_buff_count = m_sOutput_buff_property.actualcount;
+        *buff_size = m_sOutput_buff_property.datasize;
+    }
+
+    return true;
 
 }
 
 bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
-  switch(index)
-  {
-  case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      DEBUG_PRINT_HIGH("venc_set_param: OMX_IndexParamPortDefinition");
-      if(portDefn->nPortIndex == PORT_INDEX_IN)
-      {
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
 
-        if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
-        {
-          return false;
-        }
+    switch (index) {
+        case OMX_IndexParamPortDefinition:
+            {
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                DEBUG_PRINT_HIGH("venc_set_param: OMX_IndexParamPortDefinition");
 
-        if(!venc_set_color_format(portDefn->format.video.eColorFormat))
-        {
-          return false;
-        }
+                if (portDefn->nPortIndex == PORT_INDEX_IN) {
 
-        DEBUG_PRINT_LOW("Basic parameter has changed");
-        m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
-        m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
+                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
+                        return false;
+                    }
 
-        ioctl_msg.in = (void*)&m_sVenc_cfg;
-        ioctl_msg.out = NULL;
-        if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
-            DEBUG_PRINT_ERROR("\nERROR: Request for setting base config failed");
-            return false;
-        }
-        DEBUG_PRINT_HIGH("WxH (%dx%d), codec (%d), fps(nr/dr) (%d/%d), bitrate (%d), "
-            "color_format (%d)", m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
-            m_sVenc_cfg.codectype, m_sVenc_cfg.fps_num, m_sVenc_cfg.fps_den,
-            m_sVenc_cfg.targetbitrate, m_sVenc_cfg.inputformat);
+                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
+                        return false;
+                    }
 
-        DEBUG_PRINT_LOW("Updating the buffer count/size for the new resolution");
-        ioctl_msg.in = NULL;
-        ioctl_msg.out = (void*)&m_sInput_buff_property;
-        if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
-            DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p bufreq failed");
-            return false;
-        }
-        DEBUG_PRINT_HIGH("Got updated m_sInput_buff_property values: "
-                        "datasize = %u, maxcount = %u, actualcnt = %u, "
-                        "mincount = %u", m_sInput_buff_property.datasize,
-                        m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
-                        m_sInput_buff_property.mincount);
+                    DEBUG_PRINT_LOW("Basic parameter has changed");
+                    m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
+                    m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
 
-        ioctl_msg.in = NULL;
-        ioctl_msg.out = (void*)&m_sOutput_buff_property;
-        if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
-            DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p bufreq failed");
-            return false;
-        }
+                    ioctl_msg.in = (void*)&m_sVenc_cfg;
+                    ioctl_msg.out = NULL;
 
-        DEBUG_PRINT_HIGH("Got updated m_sOutput_buff_property values: "
-                        "datasize = %u, maxcount = %u, actualcnt = %u, "
-                        "mincount = %u", m_sOutput_buff_property.datasize,
-                        m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
-                        m_sOutput_buff_property.mincount);
-        ioctl_msg.in = (void*)&m_sOutput_buff_property;
-        ioctl_msg.out = NULL;
+                    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting base config failed");
+                        return false;
+                    }
 
-        if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
-            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p bufreq failed");
-            return false;
-        }
+                    DEBUG_PRINT_HIGH("WxH (%dx%d), codec (%d), fps(nr/dr) (%d/%d), bitrate (%d), "
+                            "color_format (%d)", m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
+                            m_sVenc_cfg.codectype, m_sVenc_cfg.fps_num, m_sVenc_cfg.fps_den,
+                            m_sVenc_cfg.targetbitrate, m_sVenc_cfg.inputformat);
 
-        if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
-           (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount)) {
-            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
-            ioctl_msg.in = (void*)&m_sInput_buff_property;
-            ioctl_msg.out = NULL;
-            if(ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
-              DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirements failed");
-              return false;
+                    DEBUG_PRINT_LOW("Updating the buffer count/size for the new resolution");
+                    ioctl_msg.in = NULL;
+                    ioctl_msg.out = (void*)&m_sInput_buff_property;
+
+                    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p bufreq failed");
+                        return false;
+                    }
+
+                    DEBUG_PRINT_HIGH("Got updated m_sInput_buff_property values: "
+                            "datasize = %u, maxcount = %u, actualcnt = %u, "
+                            "mincount = %u", m_sInput_buff_property.datasize,
+                            m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
+                            m_sInput_buff_property.mincount);
+
+                    ioctl_msg.in = NULL;
+                    ioctl_msg.out = (void*)&m_sOutput_buff_property;
+
+                    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p bufreq failed");
+                        return false;
+                    }
+
+                    DEBUG_PRINT_HIGH("Got updated m_sOutput_buff_property values: "
+                            "datasize = %u, maxcount = %u, actualcnt = %u, "
+                            "mincount = %u", m_sOutput_buff_property.datasize,
+                            m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
+                            m_sOutput_buff_property.mincount);
+                    ioctl_msg.in = (void*)&m_sOutput_buff_property;
+                    ioctl_msg.out = NULL;
+
+                    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p bufreq failed");
+                        return false;
+                    }
+
+                    if ((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
+                            (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount)) {
+                        m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
+                        ioctl_msg.in = (void*)&m_sInput_buff_property;
+                        ioctl_msg.out = NULL;
+
+                        if (ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                            DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirements failed");
+                            return false;
+                        }
+                    }
+
+                    if (m_sInput_buff_property.datasize != portDefn->nBufferSize) {
+                        DEBUG_PRINT_ERROR("\nWARNING: Requested i/p bufsize[%u],"
+                                "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
+                                m_sInput_buff_property.datasize);
+                    }
+
+                    m_level_set = false;
+
+                    if (venc_set_profile_level(0, 0)) {
+                        DEBUG_PRINT_LOW("%s(): Profile/Level setting success", __func__);
+                    }
+                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
+                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
+                        return false;
+                    }
+
+                    if ( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
+                            &&
+                            (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
+                            &&
+                            (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
+                       ) {
+                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
+                        ioctl_msg.in = (void*)&m_sOutput_buff_property;
+                        ioctl_msg.out = NULL;
+
+                        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                            DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
+                            return false;
+                        }
+                    } else {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
+                }
+
+                break;
             }
-        }
-        if(m_sInput_buff_property.datasize != portDefn->nBufferSize) {
-            DEBUG_PRINT_ERROR("\nWARNING: Requested i/p bufsize[%u],"
-                              "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
-                              m_sInput_buff_property.datasize);
-        }
-        m_level_set = false;
-        if(venc_set_profile_level(0, 0)) {
-          DEBUG_PRINT_LOW("%s(): Profile/Level setting success", __func__);
-        }
-      }
-      else if(portDefn->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0))
-        {
-          return false;
-        }
+        case OMX_IndexParamVideoPortFormat:
+            {
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
+                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
 
-        if( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
-            &&
-            (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
-            &&
-            (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
-          )
-        {
-          m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
-          ioctl_msg.in = (void*)&m_sOutput_buff_property;
-          ioctl_msg.out = NULL;
-          if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-          {
-            DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
-            return false;
-          }
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
-      portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
+                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
+                    if (!venc_set_color_format(portFmt->eColorFormat)) {
+                        return false;
+                    }
+                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
+                }
 
-      if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
-      {
-        if(!venc_set_color_format(portFmt->eColorFormat))
-        {
-          return false;
-        }
-      }
-      else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(!venc_set_encode_framerate(portFmt->xFramerate, 0))
-        {
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoBitrate:
-    {
-      OMX_VIDEO_PARAM_BITRATETYPE* pParam;
-      pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
+                break;
+            }
+        case OMX_IndexParamVideoBitrate:
+            {
+                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
+                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
 
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(!venc_set_target_bitrate(pParam->nTargetBitrate, 0))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
-          return false;
-        }
-        if(!venc_set_ratectrl_cfg(pParam->eControlRate))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoMpeg4:
-    {
-      OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
-      OMX_U32 bFrames = 0;
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
+                        return false;
+                    }
 
-      pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(!venc_set_voptiming_cfg(pParam->nTimeIncRes))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
-          return false;
-        }
-        m_profile_set = false;
-        m_level_set = false;
-        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
-          return false;
-        }
+                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoMpeg4:
+            {
+                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
+                OMX_U32 bFrames = 0;
+
+                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
+
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
+                        return false;
+                    }
+
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+                        return false;
+                    }
+
 #ifdef MAX_RES_1080P
-        else {
-          if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-          {
-            if(pParam->nBFrames)
-            {
-              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-              bFrames = 1;
-            }
-          }
-        else
-          {
-            if(pParam->nBFrames)
-            {
-              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-              bFrames = 0;
-            }
-          }
-        }
+                    else {
+                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+                                bFrames = 1;
+                            }
+                        } else {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                                bFrames = 0;
+                            }
+                        }
+                    }
+
 #endif
-        if(!venc_set_intra_period (pParam->nPFrames,bFrames))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-        if(!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoH263:
-    {
-      OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
-      OMX_U32 bFrames = 0;
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        m_profile_set = false;
-        m_level_set = false;
-        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
-          return false;
-        }
-        if (pParam->nBFrames)
-          DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
 
-        if(venc_set_intra_period (pParam->nPFrames, bFrames) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoAvc:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
-      OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
-      OMX_U32 bFrames = 0;
+                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
 
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
-            pParam->eProfile,pParam->eLevel);
+                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
+                }
 
-        m_profile_set = false;
-        m_level_set = false;
+                break;
+            }
+        case OMX_IndexParamVideoH263:
+            {
+                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
+                OMX_U32 bFrames = 0;
 
-        if(!venc_set_profile_level (pParam->eProfile,pParam->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
-                            pParam->eProfile, pParam->eLevel);
-          return false;
-        }
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+                        return false;
+                    }
+
+                    if (pParam->nBFrames)
+                        DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
+
+                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
+                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+                OMX_U32 bFrames = 0;
+
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
+                            pParam->eProfile,pParam->eLevel);
+
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
+                                pParam->eProfile, pParam->eLevel);
+                        return false;
+                    }
+
 #ifdef MAX_RES_1080P
-        else {
-          if(pParam->eProfile != OMX_VIDEO_AVCProfileBaseline)
-          {
-            if(pParam->nBFrames)
-            {
-              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-              bFrames = 1;
-            }
-          }
-        else
-          {
-            if(pParam->nBFrames)
-            {
-              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-              bFrames = 0;
-            }
-          }
-        }
+                    else {
+                        if (pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+                                bFrames = 1;
+                            }
+                        } else {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                                bFrames = 0;
+                            }
+                        }
+                    }
+
 #endif
-        if(!venc_set_intra_period (pParam->nPFrames, bFrames))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-        if(!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
-          return false;
-        }
-        if(!venc_set_inloop_filter (pParam->eLoopFilterMode))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
-          return false;
-        }
-        if(!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing))
-        {
-          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
-      }
-      //TBD, lot of other variables to be updated, yet to decide
-      break;
-    }
-  case OMX_IndexParamVideoIntraRefresh:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
-      OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
-        (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
-      if(intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoErrorCorrection:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
-      OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
-        (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
-      if(error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_error_resilience(error_resilience) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoProfileLevelCurrent:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
-      OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
-      (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
-      if(profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        m_profile_set = false;
-        m_level_set = false;
-        if(!venc_set_profile_level (profile_level->eProfile,
-                                   profile_level->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoQuantization:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
-      OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
-        (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
-      if(session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_session_qp (session_qp->nQpI,
-                                session_qp->nQpP) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
-      }
-      break;
+
+                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+
+                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
+                        return false;
+                    }
+
+                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
+                        return false;
+                    }
+
+                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
+                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
+                }
+
+                //TBD, lot of other variables to be updated, yet to decide
+                break;
+            }
+        case OMX_IndexParamVideoIntraRefresh:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
+                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
+                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
+
+                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoErrorCorrection:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
+                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
+                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
+
+                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_error_resilience(error_resilience) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelCurrent:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
+                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+
+                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (profile_level->eProfile,
+                                profile_level->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoQuantization:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
+                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
+                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
+
+                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_session_qp (session_qp->nQpI,
+                                session_qp->nQpP) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
+                }
+
+                break;
+            }
+
+        case OMX_QcomIndexParamVideoQPRange:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoQPRange\n");
+                OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range =
+                    (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *)paramData;
+
+                if (qp_range->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_qp_range (qp_range->minQP,
+                                qp_range->maxQP) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting QP Range failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_QcomIndexParamVideoQPRange");
+                }
+
+                break;
+            }
+
+        case OMX_ExtraDataVideoEncoderSliceInfo:
+            {
+                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
+                OMX_U32 extra_data = *(OMX_U32 *)paramData;
+
+                if (venc_set_extradata(extra_data) == false) {
+                    DEBUG_PRINT_ERROR("ERROR: Setting "
+                            "OMX_ExtraDataVideoEncoderSliceInfo failed");
+                    return false;
+                }
+
+                break;
+            }
+        case OMX_ExtraDataVideoLTRInfo:
+            {
+                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoLTRInfo");
+                OMX_U32 extra_data = *(OMX_U32 *)paramData;
+
+                if (venc_set_extradata(extra_data) == false) {
+                    DEBUG_PRINT_ERROR("ERROR: Setting "
+                            "OMX_ExtraDataVideoLTRInfo failed");
+                    return false;
+                }
+
+                break;
+            }
+        case OMX_QcomIndexEnableSliceDeliveryMode:
+            {
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
+                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case OMX_QcomIndexEnableH263PlusPType:
+            {
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+                DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (venc_set_plusptype(pParam->bEnable) == false) {
+                        DEBUG_PRINT_ERROR("Setting PlusPType failed for H263");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableH263PlusPType "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case QOMX_IndexParamVideoLTRMode:
+            {
+                QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
+                    (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (!venc_set_ltrmode(pParam->eLTRMode)) {
+                        DEBUG_PRINT_ERROR("Setting ltr mode failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRMode "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case QOMX_IndexParamVideoLTRCount:
+            {
+                QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
+                    (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (!venc_set_ltrcount(pParam->nCount)) {
+                        DEBUG_PRINT_ERROR("Setting ltr count failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRCount "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoSliceFMO:
+        default:
+            DEBUG_PRINT_ERROR("venc_set_param: Unsupported index 0x%x", index);
+            break;
     }
 
-  case OMX_QcomIndexParamVideoQPRange:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoQPRange\n");
-      OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range =
-        (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *)paramData;
-      if(qp_range->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_qp_range (qp_range->minQP,
-                                qp_range->maxQP) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting QP Range failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_QcomIndexParamVideoQPRange");
-      }
-      break;
-    }
-
-  case OMX_ExtraDataVideoEncoderSliceInfo:
-    {
-      DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
-      OMX_U32 extra_data = *(OMX_U32 *)paramData;
-      if(venc_set_extradata(extra_data) == false)
-      {
-         DEBUG_PRINT_ERROR("ERROR: Setting "
-            "OMX_ExtraDataVideoEncoderSliceInfo failed");
-         return false;
-      }
-      break;
-    }
-  case OMX_ExtraDataVideoLTRInfo:
-    {
-      DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoLTRInfo");
-      OMX_U32 extra_data = *(OMX_U32 *)paramData;
-      if(venc_set_extradata(extra_data) == false)
-      {
-         DEBUG_PRINT_ERROR("ERROR: Setting "
-            "OMX_ExtraDataVideoLTRInfo failed");
-         return false;
-      }
-      break;
-    }
-  case OMX_QcomIndexEnableSliceDeliveryMode:
-    {
-       QOMX_EXTNINDEX_PARAMTYPE* pParam =
-          (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
-       if(pParam->nPortIndex == PORT_INDEX_OUT)
-       {
-         if(venc_set_slice_delivery_mode(pParam->bEnable) == false)
-         {
-           DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
-           return OMX_ErrorUnsupportedSetting;
-         }
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
-            "called on wrong port(%d)", pParam->nPortIndex);
-         return OMX_ErrorBadPortIndex;
-       }
-       break;
-    }
-  case OMX_QcomIndexEnableH263PlusPType:
-    {
-       QOMX_EXTNINDEX_PARAMTYPE* pParam =
-          (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
-       DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
-       if(pParam->nPortIndex == PORT_INDEX_OUT)
-       {
-         if(venc_set_plusptype(pParam->bEnable) == false)
-         {
-           DEBUG_PRINT_ERROR("Setting PlusPType failed for H263");
-           return OMX_ErrorUnsupportedSetting;
-         }
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("OMX_QcomIndexEnableH263PlusPType "
-            "called on wrong port(%d)", pParam->nPortIndex);
-         return OMX_ErrorBadPortIndex;
-       }
-       break;
-    }
-  case QOMX_IndexParamVideoLTRMode:
-    {
-      QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
-          (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!venc_set_ltrmode(pParam->eLTRMode))
-        {
-            DEBUG_PRINT_ERROR("Setting ltr mode failed");
-            return OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRMode "
-            "called on wrong port(%d)", pParam->nPortIndex);
-            return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-  case QOMX_IndexParamVideoLTRCount:
-    {
-      QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
-          (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!venc_set_ltrcount(pParam->nCount))
-        {
-            DEBUG_PRINT_ERROR("Setting ltr count failed");
-            return OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRCount "
-            "called on wrong port(%d)", pParam->nPortIndex);
-            return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-  case OMX_IndexParamVideoSliceFMO:
-  default:
-    DEBUG_PRINT_ERROR("venc_set_param: Unsupported index 0x%x", index);
-    break;
-  }
-
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  DEBUG_PRINT_LOW("\n Inside venc_set_config");
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    DEBUG_PRINT_LOW("\n Inside venc_set_config");
 
-  switch(index)
-  {
-  case OMX_IndexConfigVideoBitrate:
-    {
-      OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
-        configData;
-      if(m_max_allowed_bitrate_check &&
-         !venc_max_allowed_bitrate_check(bit_rate->nEncodeBitrate))
-      {
-        DEBUG_PRINT_ERROR("Max Allowed Bitrate Check failed");
-        return false;
-      }
-      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
-      if(bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
-      }
-      break;
-    }
-  case OMX_IndexConfigVideoFramerate:
-    {
-      OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
-        configData;
-      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
-      if(frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
-      }
-      break;
-    }
-  case QOMX_IndexConfigVideoIntraperiod:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
-      QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
-      (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
-      if(intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-      }
-      break;
-    }
-  case OMX_IndexConfigVideoIntraVOPRefresh:
-    {
-      OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
-        configData;
-      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
-      if(intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
-      }
-      break;
-    }
-  case OMX_IndexConfigCommonRotate:
-    {
-      OMX_CONFIG_ROTATIONTYPE *config_rotation =
-         reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
-      venc_ioctl_msg ioctl_msg = {NULL,NULL};
-      OMX_U32 nFrameWidth;
+    switch (index) {
+        case OMX_IndexConfigVideoBitrate:
+            {
+                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
+                    configData;
 
-      DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
-      nFrameWidth = m_sVenc_cfg.input_width;
-      m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
-      m_sVenc_cfg.input_height = nFrameWidth;
-      ioctl_msg.in = (void*)&m_sVenc_cfg;
-      ioctl_msg.out = NULL;
-      if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
-          DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
-          return false;
-      }
-      break;
-    }
-  case QOMX_IndexConfigVideoLTRPeriod:
-    {
-      QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam =
-          (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!venc_set_ltrperiod(pParam->nFrames))
-        {
-            DEBUG_PRINT_ERROR("Setting ltr period failed");
-            return OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRPeriod "
-            "called on wrong port(%d)", pParam->nPortIndex);
-            return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-  case QOMX_IndexConfigVideoLTRUse:
-    {
-      QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam =
-          (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
-      if(pParam->nPortIndex == PORT_INDEX_OUT)
-      {
-        if(!venc_set_ltruse(pParam->nID, pParam->nFrames))
-        {
-            DEBUG_PRINT_ERROR("Setting ltr use failed");
-            return OMX_ErrorUnsupportedSetting;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRUse "
-            "called on wrong port(%d)", pParam->nPortIndex);
-            return OMX_ErrorBadPortIndex;
-      }
-      break;
-    }
-  default:
-    DEBUG_PRINT_ERROR("venc_set_config: Unsupported index = 0x%x", index);
-    break;
-  }
+                if (m_max_allowed_bitrate_check &&
+                        !venc_max_allowed_bitrate_check(bit_rate->nEncodeBitrate)) {
+                    DEBUG_PRINT_ERROR("Max Allowed Bitrate Check failed");
+                    return false;
+                }
 
-  return true;
+                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
+
+                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
+                }
+
+                break;
+            }
+        case OMX_IndexConfigVideoFramerate:
+            {
+                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
+                    configData;
+                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
+
+                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
+                }
+
+                break;
+            }
+        case QOMX_IndexConfigVideoIntraperiod:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
+                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
+                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
+
+                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+                }
+
+                break;
+            }
+        case OMX_IndexConfigVideoIntraVOPRefresh:
+            {
+                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
+                    configData;
+                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
+
+                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
+                }
+
+                break;
+            }
+        case OMX_IndexConfigCommonRotate:
+            {
+                OMX_CONFIG_ROTATIONTYPE *config_rotation =
+                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+                venc_ioctl_msg ioctl_msg = {NULL,NULL};
+                OMX_U32 nFrameWidth;
+
+                DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
+                nFrameWidth = m_sVenc_cfg.input_width;
+                m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
+                m_sVenc_cfg.input_height = nFrameWidth;
+                ioctl_msg.in = (void*)&m_sVenc_cfg;
+                ioctl_msg.out = NULL;
+
+                if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
+                    return false;
+                }
+
+                break;
+            }
+        case QOMX_IndexConfigVideoLTRPeriod:
+            {
+                QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam =
+                    (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (!venc_set_ltrperiod(pParam->nFrames)) {
+                        DEBUG_PRINT_ERROR("Setting ltr period failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRPeriod "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case QOMX_IndexConfigVideoLTRUse:
+            {
+                QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam =
+                    (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (!venc_set_ltruse(pParam->nID, pParam->nFrames)) {
+                        DEBUG_PRINT_ERROR("Setting ltr use failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRUse "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        default:
+            DEBUG_PRINT_ERROR("venc_set_config: Unsupported index = 0x%x", index);
+            break;
+    }
+
+    return true;
 }
 
 unsigned venc_dev::venc_stop( void)
@@ -1282,75 +1237,72 @@
 #ifdef MAX_RES_1080P
     pmem_free();
 #endif
-  return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_STOP,NULL);
+    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_STOP,NULL);
 }
 
 unsigned venc_dev::venc_pause(void)
 {
-  return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_PAUSE,NULL);
+    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_PAUSE,NULL);
 }
 
 unsigned venc_dev::venc_resume(void)
 {
-  return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_RESUME,NULL) ;
+    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_RESUME,NULL) ;
 }
 
 unsigned venc_dev::venc_start_done(void)
 {
-  return 0;
+    return 0;
 }
 
 unsigned venc_dev::venc_set_message_thread_id(pthread_t)
 {
-  return 0;
+    return 0;
 }
 
 unsigned venc_dev::venc_start(void)
 {
-  DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
-        __func__);
-  if (!venc_set_profile_level(0, 0))
-  {
-    DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
-      __func__);
-  }
-  else
-  {
-    DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
-      __func__, codec_profile.profile, profile_level.level);
-  }
+    DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
+            __func__);
 
-  if(m_max_allowed_bitrate_check &&
-     !venc_max_allowed_bitrate_check(bitrate.target_bitrate))
-  {
-    DEBUG_PRINT_ERROR("Maximum Allowed Bitrate Check failed");
-    return -1;
-  }
+    if (!venc_set_profile_level(0, 0)) {
+        DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
+                __func__);
+    } else {
+        DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
+                __func__, codec_profile.profile, profile_level.level);
+    }
 
-  venc_config_print();
+    if (m_max_allowed_bitrate_check &&
+            !venc_max_allowed_bitrate_check(bitrate.target_bitrate)) {
+        DEBUG_PRINT_ERROR("Maximum Allowed Bitrate Check failed");
+        return -1;
+    }
+
+    venc_config_print();
 
 #ifdef MAX_RES_1080P
-  if((codec_profile.profile == VEN_PROFILE_MPEG4_SP) ||
-     (codec_profile.profile == VEN_PROFILE_H264_BASELINE) ||
-     (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
-    recon_buffers_count = MAX_RECON_BUFFERS - 2;
-  else
-    recon_buffers_count = MAX_RECON_BUFFERS;
 
-  if (ltrmode.ltr_mode == (unsigned long)QOMX_VIDEO_LTRMode_Auto)
-  {
-    recon_buffers_count = MAX_RECON_BUFFERS;
-    DEBUG_PRINT_HIGH("ltr mode enabled, so set recon buffers "
-       "count to %d", recon_buffers_count);
-  }
+    if ((codec_profile.profile == VEN_PROFILE_MPEG4_SP) ||
+            (codec_profile.profile == VEN_PROFILE_H264_BASELINE) ||
+            (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
+        recon_buffers_count = MAX_RECON_BUFFERS - 2;
+    else
+        recon_buffers_count = MAX_RECON_BUFFERS;
 
-  if (!venc_allocate_recon_buffers())
-    return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
-  else
-  {
-    DEBUG_PRINT_ERROR("Failed in creating Recon buffers\n");
-    return -1;
-  }
+    if (ltrmode.ltr_mode == (unsigned long)QOMX_VIDEO_LTRMode_Auto) {
+        recon_buffers_count = MAX_RECON_BUFFERS;
+        DEBUG_PRINT_HIGH("ltr mode enabled, so set recon buffers "
+                "count to %d", recon_buffers_count);
+    }
+
+    if (!venc_allocate_recon_buffers())
+        return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
+    else {
+        DEBUG_PRINT_ERROR("Failed in creating Recon buffers\n");
+        return -1;
+    }
+
 #else
     return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
 #endif
@@ -1359,258 +1311,258 @@
 #ifdef MAX_RES_1080P
 OMX_U32 venc_dev::venc_allocate_recon_buffers()
 {
-  OMX_U32 yuv_size;
-  struct venc_ioctl_msg ioctl_msg;
-  struct venc_recon_buff_size recon_buff_size;
+    OMX_U32 yuv_size;
+    struct venc_ioctl_msg ioctl_msg;
+    struct venc_recon_buff_size recon_buff_size;
 
-  recon_buff_size.width =  ((m_sVenc_cfg.input_width + 15) / 16) * 16;
-  recon_buff_size.height = ((m_sVenc_cfg.input_height + 15) / 16 ) * 16;
+    recon_buff_size.width =  ((m_sVenc_cfg.input_width + 15) / 16) * 16;
+    recon_buff_size.height = ((m_sVenc_cfg.input_height + 15) / 16 ) * 16;
 
-  DEBUG_PRINT_LOW("Width %d, Height %d, w_round %d, h_round %d\n", m_sVenc_cfg.input_width,
-                    m_sVenc_cfg.input_height, recon_buff_size.width, recon_buff_size.height);
+    DEBUG_PRINT_LOW("Width %d, Height %d, w_round %d, h_round %d\n", m_sVenc_cfg.input_width,
+            m_sVenc_cfg.input_height, recon_buff_size.width, recon_buff_size.height);
 
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = (void*)&recon_buff_size;
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = (void*)&recon_buff_size;
 
-  if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_RECON_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n VEN_IOCTL_GET_RECON_BUFFER_SIZE Failed for width: %d, Height %d" ,
-      recon_buff_size.width, recon_buff_size.height);
-    return OMX_ErrorInsufficientResources;
-  }
-
-  DEBUG_PRINT_HIGH("Width %d, Height %d, w_round %d, h_round %d, yuv_size %d alignment %d count %d\n",
-                   m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, recon_buff_size.width,
-                   recon_buff_size.height, recon_buff_size.size, recon_buff_size.alignment,
-                   recon_buffers_count);
-
-  for(int i = 0; i < recon_buffers_count; i++)
-  {
-    if(pmem_allocate(recon_buff_size.size, recon_buff_size.alignment,i))
-    {
-      DEBUG_PRINT_ERROR("Error returned in allocating recon buffers\n");
-      return -1;
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_RECON_BUFFER_SIZE, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\n VEN_IOCTL_GET_RECON_BUFFER_SIZE Failed for width: %d, Height %d" ,
+                recon_buff_size.width, recon_buff_size.height);
+        return OMX_ErrorInsufficientResources;
     }
-  }
-  return 0;
+
+    DEBUG_PRINT_HIGH("Width %d, Height %d, w_round %d, h_round %d, yuv_size %d alignment %d count %d\n",
+            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, recon_buff_size.width,
+            recon_buff_size.height, recon_buff_size.size, recon_buff_size.alignment,
+            recon_buffers_count);
+
+    for (int i = 0; i < recon_buffers_count; i++) {
+        if (pmem_allocate(recon_buff_size.size, recon_buff_size.alignment,i)) {
+            DEBUG_PRINT_ERROR("Error returned in allocating recon buffers\n");
+            return -1;
+        }
+    }
+
+    return 0;
 }
 OMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
 {
-  OMX_U32 pmem_fd = -1;
-  OMX_U32 width, height;
-  void *buf_addr = NULL;
-  struct venc_ioctl_msg ioctl_msg;
-  struct venc_recon_addr recon_addr;
-  int rc = 0;
+    OMX_U32 pmem_fd = -1;
+    OMX_U32 width, height;
+    void *buf_addr = NULL;
+    struct venc_ioctl_msg ioctl_msg;
+    struct venc_recon_addr recon_addr;
+    int rc = 0;
 
 #ifdef USE_ION
-  recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY);
-  if(recon_buff[count].ion_device_fd < 0)
-  {
-      DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
-      return -1;
-  }
+    recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY);
 
-  recon_buff[count].alloc_data.len = size;
+    if (recon_buff[count].ion_device_fd < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
+        return -1;
+    }
+
+    recon_buff[count].alloc_data.len = size;
 #ifdef MAX_RES_720P
-  recon_buff[count].alloc_data.heap_mask = ION_HEAP(MEM_HEAP_ID);
+    recon_buff[count].alloc_data.heap_mask = ION_HEAP(MEM_HEAP_ID);
 #else
-  recon_buff[count].alloc_data.heap_mask = (ION_HEAP(MEM_HEAP_ID) |
-                                        ION_HEAP(ION_IOMMU_HEAP_ID));
+    recon_buff[count].alloc_data.heap_mask = (ION_HEAP(MEM_HEAP_ID) |
+            ION_HEAP(ION_IOMMU_HEAP_ID));
 #endif
-  recon_buff[count].alloc_data.flags = ION_FLAG_CACHED;
-  recon_buff[count].alloc_data.align = clip2(alignment);
-  if (recon_buff[count].alloc_data.align != 8192)
-    recon_buff[count].alloc_data.align = 8192;
+    recon_buff[count].alloc_data.flags = ION_FLAG_CACHED;
+    recon_buff[count].alloc_data.align = clip2(alignment);
 
-  rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
-  if(rc || !recon_buff[count].alloc_data.handle) {
-         DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
-         recon_buff[count].alloc_data.handle=NULL;
-         return -1;
-  }
+    if (recon_buff[count].alloc_data.align != 8192)
+        recon_buff[count].alloc_data.align = 8192;
 
-  recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
-  rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
-  if(rc) {
+    rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
+
+    if (rc || !recon_buff[count].alloc_data.handle) {
+        DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+        recon_buff[count].alloc_data.handle=NULL;
+        return -1;
+    }
+
+    recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
+    rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
+
+    if (rc) {
         DEBUG_PRINT_ERROR("\n ION MAP failed ");
         recon_buff[count].ion_alloc_fd.fd =-1;
         recon_buff[count].ion_alloc_fd.fd =-1;
         return -1;
-  }
-  pmem_fd = recon_buff[count].ion_alloc_fd.fd;
-#else
-  struct pmem_allocation allocation;
-  pmem_fd = open(MEM_DEVICE, O_RDWR);
-
-  if ((int)(pmem_fd) < 0)
-  {
-	DEBUG_PRINT_ERROR("\n Failed to get an pmem handle");
-	return -1;
-  }
-
-  allocation.size = size;
-  allocation.align = clip2(alignment);
-
-  if (allocation.align != 8192)
-    allocation.align = 8192;
-
-  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
-  {
-    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
-      allocation.align, allocation.size);
-    return -1;
-  }
-#endif
-  buf_addr = mmap(NULL, size,
-               PROT_READ | PROT_WRITE,
-               MAP_SHARED, pmem_fd, 0);
-
-  if (buf_addr == (void*) MAP_FAILED)
-  {
-    close(pmem_fd);
-    pmem_fd = -1;
-    DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
-#ifdef USE_ION
-    if(ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
-       &recon_buff[count].alloc_data.handle)) {
-      DEBUG_PRINT_LOW("ion recon buffer free failed");
     }
-    recon_buff[count].alloc_data.handle = NULL;
-    recon_buff[count].ion_alloc_fd.fd =-1;
-    close(recon_buff[count].ion_device_fd);
-    recon_buff[count].ion_device_fd =-1;
+
+    pmem_fd = recon_buff[count].ion_alloc_fd.fd;
+#else
+    struct pmem_allocation allocation;
+    pmem_fd = open(MEM_DEVICE, O_RDWR);
+
+    if ((int)(pmem_fd) < 0) {
+        DEBUG_PRINT_ERROR("\n Failed to get an pmem handle");
+        return -1;
+    }
+
+    allocation.size = size;
+    allocation.align = clip2(alignment);
+
+    if (allocation.align != 8192)
+        allocation.align = 8192;
+
+    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+                allocation.align, allocation.size);
+        return -1;
+    }
+
 #endif
-    return -1;
-  }
+    buf_addr = mmap(NULL, size,
+            PROT_READ | PROT_WRITE,
+            MAP_SHARED, pmem_fd, 0);
 
-  DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
+    if (buf_addr == (void*) MAP_FAILED) {
+        close(pmem_fd);
+        pmem_fd = -1;
+        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+#ifdef USE_ION
 
-  recon_addr.buffer_size = size;
-  recon_addr.pmem_fd = pmem_fd;
-  recon_addr.offset = 0;
-  recon_addr.pbuffer = (unsigned char *)buf_addr;
+        if (ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
+                    &recon_buff[count].alloc_data.handle)) {
+            DEBUG_PRINT_LOW("ion recon buffer free failed");
+        }
 
-  ioctl_msg.in = (void*)&recon_addr;
-  ioctl_msg.out = NULL;
+        recon_buff[count].alloc_data.handle = NULL;
+        recon_buff[count].ion_alloc_fd.fd =-1;
+        close(recon_buff[count].ion_device_fd);
+        recon_buff[count].ion_device_fd =-1;
+#endif
+        return -1;
+    }
 
-  if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("Failed to set the Recon_buffers\n");
-    return -1;
-  }
+    DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
 
-  recon_buff[count].virtual_address = (unsigned char *) buf_addr;
-  recon_buff[count].size = size;
-  recon_buff[count].offset = 0;
-  recon_buff[count].pmem_fd = pmem_fd;
+    recon_addr.buffer_size = size;
+    recon_addr.pmem_fd = pmem_fd;
+    recon_addr.offset = 0;
+    recon_addr.pbuffer = (unsigned char *)buf_addr;
 
-  DEBUG_PRINT_ERROR("\n Allocated virt:%p, FD: %d of size %d at index: %d\n", recon_buff[count].virtual_address,
-                     recon_buff[count].pmem_fd, recon_buff[count].size, count);
-  return 0;
+    ioctl_msg.in = (void*)&recon_addr;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("Failed to set the Recon_buffers\n");
+        return -1;
+    }
+
+    recon_buff[count].virtual_address = (unsigned char *) buf_addr;
+    recon_buff[count].size = size;
+    recon_buff[count].offset = 0;
+    recon_buff[count].pmem_fd = pmem_fd;
+
+    DEBUG_PRINT_ERROR("\n Allocated virt:%p, FD: %d of size %d at index: %d\n", recon_buff[count].virtual_address,
+            recon_buff[count].pmem_fd, recon_buff[count].size, count);
+    return 0;
 }
 
 OMX_U32 venc_dev::pmem_free()
 {
-  int cnt = 0;
-  struct venc_ioctl_msg ioctl_msg;
-  struct venc_recon_addr recon_addr;
-  for (cnt = 0; cnt < recon_buffers_count; cnt++)
-  {
-    if(recon_buff[cnt].pmem_fd)
-    {
-      recon_addr.pbuffer = recon_buff[cnt].virtual_address;
-      recon_addr.offset = recon_buff[cnt].offset;
-      recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
-      recon_addr.buffer_size = recon_buff[cnt].size;
-      ioctl_msg.in = (void*)&recon_addr;
-      ioctl_msg.out = NULL;
-      if(ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < 0)
-        DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
-      munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
-      close(recon_buff[cnt].pmem_fd);
+    int cnt = 0;
+    struct venc_ioctl_msg ioctl_msg;
+    struct venc_recon_addr recon_addr;
+
+    for (cnt = 0; cnt < recon_buffers_count; cnt++) {
+        if (recon_buff[cnt].pmem_fd) {
+            recon_addr.pbuffer = recon_buff[cnt].virtual_address;
+            recon_addr.offset = recon_buff[cnt].offset;
+            recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
+            recon_addr.buffer_size = recon_buff[cnt].size;
+            ioctl_msg.in = (void*)&recon_addr;
+            ioctl_msg.out = NULL;
+
+            if (ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < 0)
+                DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
+
+            munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
+            close(recon_buff[cnt].pmem_fd);
 #ifdef USE_ION
-      if(ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
-         &recon_buff[cnt].alloc_data.handle)) {
-        DEBUG_PRINT_LOW("ion recon buffer free failed");
-      }
-      recon_buff[cnt].alloc_data.handle = NULL;
-      recon_buff[cnt].ion_alloc_fd.fd =-1;
-      close(recon_buff[cnt].ion_device_fd);
-      recon_buff[cnt].ion_device_fd =-1;
+
+            if (ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
+                        &recon_buff[cnt].alloc_data.handle)) {
+                DEBUG_PRINT_LOW("ion recon buffer free failed");
+            }
+
+            recon_buff[cnt].alloc_data.handle = NULL;
+            recon_buff[cnt].ion_alloc_fd.fd =-1;
+            close(recon_buff[cnt].ion_device_fd);
+            recon_buff[cnt].ion_device_fd =-1;
 #endif
-      DEBUG_PRINT_LOW("\n cleaning Index %d of size %d \n",cnt,recon_buff[cnt].size);
-      recon_buff[cnt].pmem_fd = -1;
-      recon_buff[cnt].virtual_address = NULL;
-      recon_buff[cnt].offset = 0;
-      recon_buff[cnt].alignment = 0;
-      recon_buff[cnt].size = 0;
+            DEBUG_PRINT_LOW("\n cleaning Index %d of size %d \n",cnt,recon_buff[cnt].size);
+            recon_buff[cnt].pmem_fd = -1;
+            recon_buff[cnt].virtual_address = NULL;
+            recon_buff[cnt].offset = 0;
+            recon_buff[cnt].alignment = 0;
+            recon_buff[cnt].size = 0;
+        }
     }
-  }
-  return 0;
+
+    return 0;
 }
 #endif
 
 void venc_dev::venc_config_print()
 {
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %d, Profile %d, level : %d",
-                   m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %d, Profile %d, level : %d",
+            m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
 
-  DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
-                   m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
-                   m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
+    DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
+            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
+            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
-                   bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
+            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %d, qpP: %d, qpb: 0",
-                   session_qp.iframeqp, session_qp.pframqp);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %d, qpP: %d, qpb: 0",
+            session_qp.iframeqp, session_qp.pframqp);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: minQP: %d, maxQP: %d",
-                   qp_range.minqp, qp_range.maxqp);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: minQP: %d, maxQP: %d",
+            qp_range.minqp, qp_range.maxqp);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
-                   voptimecfg.voptime_resolution, multislice.mslice_mode,
-                   multislice.mslice_size);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
+            voptimecfg.voptime_resolution, multislice.mslice_mode,
+            multislice.mslice_size);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %d",
-                   entropy.longentropysel, entropy.cabacmodel);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %d",
+            entropy.longentropysel, entropy.cabacmodel);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d\n",
-                   dbkfilter.db_mode, dbkfilter.slicealpha_offset,
-                   dbkfilter.slicebeta_offset);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d\n",
+            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
+            dbkfilter.slicebeta_offset);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %d, HEC: %d\n",
-                   intra_refresh.mbcount, hec.header_extension);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %d, HEC: %d\n",
+            intra_refresh.mbcount, hec.header_extension);
 }
 
 unsigned venc_dev::venc_flush( unsigned port)
 {
-  struct venc_ioctl_msg ioctl_msg;
-  struct venc_bufferflush buffer_index;
+    struct venc_ioctl_msg ioctl_msg;
+    struct venc_bufferflush buffer_index;
 
-  if(port == PORT_INDEX_IN)
-  {
-    DEBUG_PRINT_HIGH("Calling Input Flush");
-    buffer_index.flush_mode = VEN_FLUSH_INPUT;
-    ioctl_msg.in = (void*)&buffer_index;
-    ioctl_msg.out = NULL;
+    if (port == PORT_INDEX_IN) {
+        DEBUG_PRINT_HIGH("Calling Input Flush");
+        buffer_index.flush_mode = VEN_FLUSH_INPUT;
+        ioctl_msg.in = (void*)&buffer_index;
+        ioctl_msg.out = NULL;
 
-    return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    DEBUG_PRINT_HIGH("Calling Output Flush");
-    buffer_index.flush_mode = VEN_FLUSH_OUTPUT;
-    ioctl_msg.in = (void*)&buffer_index;
-    ioctl_msg.out = NULL;
-    return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
-  }
-  else
-  {
-    return -1;
-  }
+        return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
+    } else if (port == PORT_INDEX_OUT) {
+        DEBUG_PRINT_HIGH("Calling Output Flush");
+        buffer_index.flush_mode = VEN_FLUSH_OUTPUT;
+        ioctl_msg.in = (void*)&buffer_index;
+        ioctl_msg.out = NULL;
+        return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
+    } else {
+        return -1;
+    }
 }
 
 //allocating I/P memory from pmem and register with the device
@@ -1618,1618 +1570,1499 @@
 
 bool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct pmem *pmem_tmp;
-  struct venc_bufferpayload dev_buffer = {0};
-  struct venc_allocatorproperty buff_alloc_property = {0};
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct pmem *pmem_tmp;
+    struct venc_bufferpayload dev_buffer = {0};
+    struct venc_allocatorproperty buff_alloc_property = {0};
 
-  pmem_tmp = (struct pmem *)buf_addr;
+    pmem_tmp = (struct pmem *)buf_addr;
 
-  DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
+    DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
 
-  if(port == PORT_INDEX_IN)
-  {
-    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
-    dev_buffer.fd  = pmem_tmp->fd;
-    dev_buffer.maped_size = pmem_tmp->size;
-    dev_buffer.sz = pmem_tmp->size;
-    dev_buffer.offset = pmem_tmp->offset;
+    if (port == PORT_INDEX_IN) {
+        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+        dev_buffer.fd  = pmem_tmp->fd;
+        dev_buffer.maped_size = pmem_tmp->size;
+        dev_buffer.sz = pmem_tmp->size;
+        dev_buffer.offset = pmem_tmp->offset;
 
-    if((m_sVenc_cfg.input_height %16 !=0) || (m_sVenc_cfg.input_width%16 != 0))
-    {
-      unsigned long ht = m_sVenc_cfg.input_height;
-      unsigned long wd = m_sVenc_cfg.input_width;
-      unsigned int luma_size, luma_size_2k;
+        if ((m_sVenc_cfg.input_height %16 !=0) || (m_sVenc_cfg.input_width%16 != 0)) {
+            unsigned long ht = m_sVenc_cfg.input_height;
+            unsigned long wd = m_sVenc_cfg.input_width;
+            unsigned int luma_size, luma_size_2k;
 
-      ht = (ht + 15) & ~15;
-      wd = (wd + 15) & ~15;
+            ht = (ht + 15) & ~15;
+            wd = (wd + 15) & ~15;
 
-      luma_size = ht * wd;
-      luma_size_2k = (luma_size + 2047) & ~2047;
+            luma_size = ht * wd;
+            luma_size_2k = (luma_size + 2047) & ~2047;
 
-      dev_buffer.sz = luma_size_2k + ((luma_size/2 + 2047) & ~2047);
+            dev_buffer.sz = luma_size_2k + ((luma_size/2 + 2047) & ~2047);
 #ifdef USE_ION
-      ioctl_msg.in = NULL;
-      ioctl_msg.out = (void*)&buff_alloc_property;
-      if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
-      {
-         DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:get input buffer failed ");
-         return false;
-      }
-      if(buff_alloc_property.alignment < 4096)
-      {
-         dev_buffer.sz = ((dev_buffer.sz + 4095) & ~4095);
-      }
-      else
-      {
-         dev_buffer.sz = ((dev_buffer.sz + (buff_alloc_property.alignment - 1)) &
-                                           ~(buff_alloc_property.alignment - 1));
-      }
+            ioctl_msg.in = NULL;
+            ioctl_msg.out = (void*)&buff_alloc_property;
+
+            if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:get input buffer failed ");
+                return false;
+            }
+
+            if (buff_alloc_property.alignment < 4096) {
+                dev_buffer.sz = ((dev_buffer.sz + 4095) & ~4095);
+            } else {
+                dev_buffer.sz = ((dev_buffer.sz + (buff_alloc_property.alignment - 1)) &
+                        ~(buff_alloc_property.alignment - 1));
+            }
+
 #endif
-      dev_buffer.maped_size = dev_buffer.sz;
-    }
+            dev_buffer.maped_size = dev_buffer.sz;
+        }
 
-    ioctl_msg.in  = (void*)&dev_buffer;
-    ioctl_msg.out = NULL;
+        ioctl_msg.in  = (void*)&dev_buffer;
+        ioctl_msg.out = NULL;
 
-    DEBUG_PRINT_LOW("\n venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+        DEBUG_PRINT_LOW("\n venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
                 dev_buffer.pbuffer, \
                 dev_buffer.fd, \
                 dev_buffer.offset, \
                 dev_buffer.maped_size);
 
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set input buffer failed ");
-      return false;
-    }
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
-    dev_buffer.fd  = pmem_tmp->fd;
-    dev_buffer.sz = pmem_tmp->size;
-    dev_buffer.maped_size = pmem_tmp->size;
-    dev_buffer.offset = pmem_tmp->offset;
-    ioctl_msg.in  = (void*)&dev_buffer;
-    ioctl_msg.out = NULL;
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set input buffer failed ");
+            return false;
+        }
+    } else if (port == PORT_INDEX_OUT) {
+        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+        dev_buffer.fd  = pmem_tmp->fd;
+        dev_buffer.sz = pmem_tmp->size;
+        dev_buffer.maped_size = pmem_tmp->size;
+        dev_buffer.offset = pmem_tmp->offset;
+        ioctl_msg.in  = (void*)&dev_buffer;
+        ioctl_msg.out = NULL;
 
-    DEBUG_PRINT_LOW("\n venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+        DEBUG_PRINT_LOW("\n venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
                 dev_buffer.pbuffer, \
                 dev_buffer.fd, \
                 dev_buffer.offset, \
                 dev_buffer.maped_size);
 
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set output buffer failed ");
-      return false;
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set output buffer failed ");
+            return false;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
+        return false;
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
-    return false;
-  }
 
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct pmem *pmem_tmp;
-  struct venc_bufferpayload dev_buffer = {0};
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct pmem *pmem_tmp;
+    struct venc_bufferpayload dev_buffer = {0};
 
-  pmem_tmp = (struct pmem *)buf_addr;
+    pmem_tmp = (struct pmem *)buf_addr;
 
-  DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
+    DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
 
-  if(port == PORT_INDEX_IN)
-  {
-    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
-    dev_buffer.fd  = pmem_tmp->fd;
-    dev_buffer.maped_size = pmem_tmp->size;
-    dev_buffer.sz = pmem_tmp->size;
-    dev_buffer.offset = pmem_tmp->offset;
-    ioctl_msg.in  = (void*)&dev_buffer;
-    ioctl_msg.out = NULL;
+    if (port == PORT_INDEX_IN) {
+        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+        dev_buffer.fd  = pmem_tmp->fd;
+        dev_buffer.maped_size = pmem_tmp->size;
+        dev_buffer.sz = pmem_tmp->size;
+        dev_buffer.offset = pmem_tmp->offset;
+        ioctl_msg.in  = (void*)&dev_buffer;
+        ioctl_msg.out = NULL;
 
-    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
                 dev_buffer.pbuffer, \
                 dev_buffer.fd, \
                 dev_buffer.offset, \
                 dev_buffer.maped_size);
 
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free input buffer failed ");
-      return false;
-    }
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
-    dev_buffer.fd  = pmem_tmp->fd;
-    dev_buffer.sz = pmem_tmp->size;
-    dev_buffer.maped_size = pmem_tmp->size;
-    dev_buffer.offset = pmem_tmp->offset;
-    ioctl_msg.in  = (void*)&dev_buffer;
-    ioctl_msg.out = NULL;
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free input buffer failed ");
+            return false;
+        }
+    } else if (port == PORT_INDEX_OUT) {
+        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+        dev_buffer.fd  = pmem_tmp->fd;
+        dev_buffer.sz = pmem_tmp->size;
+        dev_buffer.maped_size = pmem_tmp->size;
+        dev_buffer.offset = pmem_tmp->offset;
+        ioctl_msg.in  = (void*)&dev_buffer;
+        ioctl_msg.out = NULL;
 
-    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
                 dev_buffer.pbuffer, \
                 dev_buffer.fd, \
                 dev_buffer.offset, \
                 dev_buffer.maped_size);
 
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free output buffer failed ");
-      return false;
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free output buffer failed ");
+            return false;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
+        return false;
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
-    return false;
-  }
 
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
 {
-  struct venc_buffer frameinfo;
-  struct pmem *temp_buffer;
-  struct venc_ioctl_msg ioctl_msg;
-  struct OMX_BUFFERHEADERTYPE *bufhdr;
+    struct venc_buffer frameinfo;
+    struct pmem *temp_buffer;
+    struct venc_ioctl_msg ioctl_msg;
+    struct OMX_BUFFERHEADERTYPE *bufhdr;
 
-  if(buffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
-    return false;
-  }
-  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
+        return false;
+    }
 
-  DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
+    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
 
-  if(pmem_data_buf)
-  {
-    DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
-    frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
-    frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
-  }
+    DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
 
-  frameinfo.clientdata = (void *) buffer;
-  frameinfo.sz = bufhdr->nFilledLen;
-  frameinfo.len = bufhdr->nFilledLen;
-  frameinfo.flags = bufhdr->nFlags;
-  frameinfo.offset = bufhdr->nOffset;
-  frameinfo.timestamp = bufhdr->nTimeStamp;
-  DEBUG_PRINT_LOW("\n i/p TS = %u", (OMX_U32)frameinfo.timestamp);
-  ioctl_msg.in = &frameinfo;
-  ioctl_msg.out = NULL;
+    if (pmem_data_buf) {
+        DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
+        frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
+    } else {
+        DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+        frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
+    }
 
-  DEBUG_PRINT_LOW("DBG: i/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
-      bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
-  if(ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0)
-  {
-    /*Generate an async error and move to invalid state*/
-    return false;
-  }
+    frameinfo.clientdata = (void *) buffer;
+    frameinfo.sz = bufhdr->nFilledLen;
+    frameinfo.len = bufhdr->nFilledLen;
+    frameinfo.flags = bufhdr->nFlags;
+    frameinfo.offset = bufhdr->nOffset;
+    frameinfo.timestamp = bufhdr->nTimeStamp;
+    DEBUG_PRINT_LOW("\n i/p TS = %u", (OMX_U32)frameinfo.timestamp);
+    ioctl_msg.in = &frameinfo;
+    ioctl_msg.out = NULL;
+
+    DEBUG_PRINT_LOW("DBG: i/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
+            bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
+
+    if (ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0) {
+        /*Generate an async error and move to invalid state*/
+        return false;
+    }
+
 #ifdef INPUT_BUFFER_LOG
 #ifdef MAX_RES_1080P
 
-  int y_size = 0;
-  int c_offset = 0;
-  unsigned char *buf_addr = NULL;
+    int y_size = 0;
+    int c_offset = 0;
+    unsigned char *buf_addr = NULL;
 
-  y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
-  //chroma offset is y_size aligned to the 2k boundary
-  c_offset= (y_size + 2047) & (~(2047));
+    y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
+    //chroma offset is y_size aligned to the 2k boundary
+    c_offset= (y_size + 2047) & (~(2047));
 
-  if(pmem_data_buf)
-  {
-    DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
-    buf_addr = (OMX_U8 *)pmem_data_buf;
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
-    buf_addr = (unsigned char *)mmap(NULL,
-          ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[2],
-          PROT_READ|PROT_WRITE, MAP_SHARED,
-          ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[0], 0);
-  }
+    if (pmem_data_buf) {
+        DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
+        buf_addr = (OMX_U8 *)pmem_data_buf;
+    } else {
+        DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+        buf_addr = (unsigned char *)mmap(NULL,
+                ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[2],
+                PROT_READ|PROT_WRITE, MAP_SHARED,
+                ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[0], 0);
+    }
 
-  if(inputBufferFile1)
-  {
-    fwrite((const char *)buf_addr, y_size, 1,inputBufferFile1);
-    fwrite((const char *)(buf_addr + c_offset), (y_size>>1), 1,inputBufferFile1);
-  }
+    if (inputBufferFile1) {
+        fwrite((const char *)buf_addr, y_size, 1,inputBufferFile1);
+        fwrite((const char *)(buf_addr + c_offset), (y_size>>1), 1,inputBufferFile1);
+    }
 
-  munmap (buf_addr, ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[2]);
+    munmap (buf_addr, ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[2]);
 #else
-  if(inputBufferFile1)
-  {
-    fwrite((const char *)frameinfo.ptrbuffer, frameinfo.len, 1,inputBufferFile1);
-  }
+
+    if (inputBufferFile1) {
+        fwrite((const char *)frameinfo.ptrbuffer, frameinfo.len, 1,inputBufferFile1);
+    }
+
 #endif
 
 #endif
-  return true;
+    return true;
 }
 bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
 {
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct pmem *temp_buffer = NULL;
-  struct venc_buffer  frameinfo;
-  struct OMX_BUFFERHEADERTYPE *bufhdr;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct pmem *temp_buffer = NULL;
+    struct venc_buffer  frameinfo;
+    struct OMX_BUFFERHEADERTYPE *bufhdr;
 
-  if(buffer == NULL)
-  {
-    return false;
-  }
-  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+    if (buffer == NULL) {
+        return false;
+    }
 
-  if(pmem_data_buf)
-  {
-    DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
-    frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
-    frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
-  }
+    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
 
-  frameinfo.clientdata = buffer;
-  frameinfo.sz = bufhdr->nAllocLen;
-  frameinfo.flags = bufhdr->nFlags;
-  frameinfo.offset = bufhdr->nOffset;
+    if (pmem_data_buf) {
+        DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
+        frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
+    } else {
+        DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+        frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
+    }
 
-  ioctl_msg.in = &frameinfo;
-  ioctl_msg.out = NULL;
-  DEBUG_PRINT_LOW("DBG: o/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
-      bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
-    return false;
-  }
+    frameinfo.clientdata = buffer;
+    frameinfo.sz = bufhdr->nAllocLen;
+    frameinfo.flags = bufhdr->nFlags;
+    frameinfo.offset = bufhdr->nOffset;
 
-  return true;
+    ioctl_msg.in = &frameinfo;
+    ioctl_msg.out = NULL;
+    DEBUG_PRINT_LOW("DBG: o/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
+            bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_slice_delivery_mode(OMX_BOOL enable)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  DEBUG_PRINT_HIGH("Set slice_delivery_mode: %d", enable);
-  if(multislice.mslice_mode == VEN_MSLICE_CNT_MB)
-  {
-    if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_SLICE_DELIVERY_MODE) < 0)
-    {
-      DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
-      return false;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    DEBUG_PRINT_HIGH("Set slice_delivery_mode: %d", enable);
+
+    if (multislice.mslice_mode == VEN_MSLICE_CNT_MB) {
+        if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_SLICE_DELIVERY_MODE) < 0) {
+            DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
+            return false;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("WARNING: slice_mode[%d] is not VEN_MSLICE_CNT_MB to set "
+                "slice delivery mode to the driver.", multislice.mslice_mode);
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("WARNING: slice_mode[%d] is not VEN_MSLICE_CNT_MB to set "
-       "slice delivery mode to the driver.", multislice.mslice_mode);
-  }
-  return true;
+
+    return true;
 }
 
 bool venc_dev::venc_set_plusptype(OMX_BOOL enable)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_plusptype plusptype = {0};
-  DEBUG_PRINT_LOW("Set plusptype: %d", enable);
-  plusptype.plusptype_enable = enable;
-  ioctl_msg.in = (void*)&plusptype;
-  ioctl_msg.out = NULL;
-  if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_H263_PLUSPTYPE,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("Request for setting plusptype for h263 failed");
-    return false;
-  }
-  return true;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_plusptype plusptype = {0};
+    DEBUG_PRINT_LOW("Set plusptype: %d", enable);
+    plusptype.plusptype_enable = enable;
+    ioctl_msg.in = (void*)&plusptype;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_H263_PLUSPTYPE,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("Request for setting plusptype for h263 failed");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_ltrmode(QOMX_VIDEO_LTRMODETYPE mode)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  venc_ltrmode ltr_mode;
-  ltr_mode.ltr_mode = (unsigned long)mode;
-  DEBUG_PRINT_HIGH("Set ltr mode: %d", mode);
-  ioctl_msg.in = (void*)&ltr_mode;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRMODE, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Setting ltrmode failed");
-    return false;
-  }
-  ltrmode.ltr_mode = (unsigned long)mode;
-  return true;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    venc_ltrmode ltr_mode;
+    ltr_mode.ltr_mode = (unsigned long)mode;
+    DEBUG_PRINT_HIGH("Set ltr mode: %d", mode);
+    ioctl_msg.in = (void*)&ltr_mode;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRMODE, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Setting ltrmode failed");
+        return false;
+    }
+
+    ltrmode.ltr_mode = (unsigned long)mode;
+    return true;
 }
 
 bool venc_dev::venc_set_ltrcount(OMX_U32 count)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  venc_ltrcount ltr_count;
-  ltr_count.ltr_count = (unsigned long)count;
-  DEBUG_PRINT_HIGH("Set ltr count: %d", count);
-  ioctl_msg.in = (void*)&ltr_count;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRCOUNT, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Setting ltrcount failed");
-    return false;
-  }
-  ltrcount.ltr_count = (unsigned long)count;
-  return true;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    venc_ltrcount ltr_count;
+    ltr_count.ltr_count = (unsigned long)count;
+    DEBUG_PRINT_HIGH("Set ltr count: %d", count);
+    ioctl_msg.in = (void*)&ltr_count;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRCOUNT, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Setting ltrcount failed");
+        return false;
+    }
+
+    ltrcount.ltr_count = (unsigned long)count;
+    return true;
 }
 
 bool venc_dev::venc_set_ltrperiod(OMX_U32 period)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  venc_ltrperiod ltr_period;
-  ltr_period.ltr_period = (unsigned long)period;
-  DEBUG_PRINT_HIGH("Set ltr period: %d", period);
-  ioctl_msg.in = (void*)&ltr_period;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRPERIOD, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Setting ltrperiod failed");
-    return false;
-  }
-  ltrperiod.ltr_period = (unsigned long)period;
-  return true;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    venc_ltrperiod ltr_period;
+    ltr_period.ltr_period = (unsigned long)period;
+    DEBUG_PRINT_HIGH("Set ltr period: %d", period);
+    ioctl_msg.in = (void*)&ltr_period;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRPERIOD, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Setting ltrperiod failed");
+        return false;
+    }
+
+    ltrperiod.ltr_period = (unsigned long)period;
+    return true;
 }
 
 bool venc_dev::venc_set_ltruse(OMX_U32 id, OMX_U32 frames)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  venc_ltruse ltr_use;
-  ltr_use.ltr_id = (unsigned long)id;
-  ltr_use.ltr_frames = (unsigned long)frames;
-  DEBUG_PRINT_HIGH("Set ltr use: id = %d, ltr_frames = %d", id, frames);
-  ioctl_msg.in = (void*)&ltr_use;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRUSE, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Setting ltruse failed");
-    return false;
-  }
-  return true;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    venc_ltruse ltr_use;
+    ltr_use.ltr_id = (unsigned long)id;
+    ltr_use.ltr_frames = (unsigned long)frames;
+    DEBUG_PRINT_HIGH("Set ltr use: id = %d, ltr_frames = %d", id, frames);
+    ioctl_msg.in = (void*)&ltr_use;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRUSE, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Setting ltruse failed");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_extradata(OMX_U32 extra_data)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  DEBUG_PRINT_HIGH("venc_set_extradata:: %x", extra_data);
-  ioctl_msg.in = (void*)&extra_data;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_EXTRADATA, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
-    return false;
-  }
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", extra_data);
+    ioctl_msg.in = (void*)&extra_data;
+    ioctl_msg.out = NULL;
 
-  return true;
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_EXTRADATA, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_sessionqp qp = {0, 0};
-  DEBUG_PRINT_HIGH("venc_set_session_qp:: i_frame_qp = %d, p_frame_qp = %d", i_frame_qp,
-    p_frame_qp);
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_sessionqp qp = {0, 0};
+    DEBUG_PRINT_HIGH("venc_set_session_qp:: i_frame_qp = %d, p_frame_qp = %d", i_frame_qp,
+            p_frame_qp);
 
-  qp.iframeqp = i_frame_qp;
-  qp.pframqp = p_frame_qp;
+    qp.iframeqp = i_frame_qp;
+    qp.pframqp = p_frame_qp;
 
-  ioctl_msg.in = (void*)&qp;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting session qp failed");
-    return false;
-  }
+    ioctl_msg.in = (void*)&qp;
+    ioctl_msg.out = NULL;
 
-  session_qp.iframeqp = i_frame_qp;
-  session_qp.pframqp = p_frame_qp;
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting session qp failed");
+        return false;
+    }
 
-  return true;
+    session_qp.iframeqp = i_frame_qp;
+    session_qp.pframqp = p_frame_qp;
+
+    return true;
 }
 
 bool venc_dev::venc_set_qp_range(OMX_U32 min_qp, OMX_U32 max_qp)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_qprange qp = {0, 0};
-  DEBUG_PRINT_LOW("venc_set_qp_range:: min_qp = %d, max_qp = %d", min_qp,
-    max_qp);
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_qprange qp = {0, 0};
+    DEBUG_PRINT_LOW("venc_set_qp_range:: min_qp = %d, max_qp = %d", min_qp,
+            max_qp);
 
-  qp.minqp = min_qp;
-  qp.maxqp = max_qp;
+    qp.minqp = min_qp;
+    qp.maxqp = max_qp;
 
-  ioctl_msg.in = (void*)&qp;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_QP_RANGE,(void*)&ioctl_msg)< 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting qp range failed");
-    return false;
-  }
+    ioctl_msg.in = (void*)&qp;
+    ioctl_msg.out = NULL;
 
-  qp_range.minqp= min_qp;
-  qp_range.maxqp= max_qp;
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_QP_RANGE,(void*)&ioctl_msg)< 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting qp range failed");
+        return false;
+    }
 
-  return true;
+    qp_range.minqp= min_qp;
+    qp_range.maxqp= max_qp;
+
+    return true;
 }
 
 bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_profile requested_profile;
-  struct ven_profilelevel requested_level;
-  unsigned const int *profile_tbl = NULL;
-  unsigned long mb_per_frame = 0, mb_per_sec = 0;
-  DEBUG_PRINT_HIGH("venc_set_profile_level:: eProfile = %d, Level = %d",
-    eProfile, eLevel);
-  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
-                  ((m_sVenc_cfg.input_width + 15) >> 4);
-  if((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set)
-  {
-    DEBUG_PRINT_HIGH("Set profile/level was done already");
-    return true;
-  }
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_profile requested_profile;
+    struct ven_profilelevel requested_level;
+    unsigned const int *profile_tbl = NULL;
+    unsigned long mb_per_frame = 0, mb_per_sec = 0;
+    DEBUG_PRINT_HIGH("venc_set_profile_level:: eProfile = %d, Level = %d",
+            eProfile, eLevel);
+    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+        ((m_sVenc_cfg.input_width + 15) >> 4);
 
-  if(eProfile && eLevel)
-  {
-    /* non-zero values will be set by user, saving the same*/
-    m_eProfile = eProfile;
-    m_eLevel = eLevel;
-    DEBUG_PRINT_HIGH("Save profile/level (%d/%d) for max allowed bitrate check",
-      m_eProfile, m_eLevel);
-  }
-
-  DEBUG_PRINT_LOW("Validating Profile/Level from table");
-  if(!venc_validate_profile_level(&eProfile, &eLevel))
-  {
-    DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
-    return false;
-  }
-
-  if(m_sVenc_cfg.codectype == VEN_CODEC_MPEG4)
-  {
-    DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
-      "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
-      OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
-    if(eProfile == OMX_VIDEO_MPEG4ProfileSimple)
-    {
-      requested_profile.profile = VEN_PROFILE_MPEG4_SP;
-      profile_tbl = (unsigned int const *)
-          (&mpeg4_profile_level_table[MPEG4_SP_START]);
-      profile_tbl += MPEG4_720P_LEVEL*5;
-    }
-    else if(eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-    {
-      requested_profile.profile = VEN_PROFILE_MPEG4_ASP;
-      profile_tbl = (unsigned int const *)
-          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
-      profile_tbl += MPEG4_720P_LEVEL*5;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
-        eProfile);
-      return false;
+    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
+        DEBUG_PRINT_HIGH("Set profile/level was done already");
+        return true;
     }
 
-    DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
-      "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
-      "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
-      OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
-
-    if(mb_per_frame >= 3600)
-    {
-      if(requested_profile.profile == VEN_PROFILE_MPEG4_ASP)
-        requested_level.level = VEN_LEVEL_MPEG4_5;
-      if(requested_profile.profile == VEN_PROFILE_MPEG4_SP)
-        requested_level.level = VEN_LEVEL_MPEG4_6;
+    if (eProfile && eLevel) {
+        /* non-zero values will be set by user, saving the same*/
+        m_eProfile = eProfile;
+        m_eLevel = eLevel;
+        DEBUG_PRINT_HIGH("Save profile/level (%d/%d) for max allowed bitrate check",
+                m_eProfile, m_eLevel);
     }
-    else
-    {
-      switch(eLevel)
-      {
-      case OMX_VIDEO_MPEG4Level0:
-        requested_level.level = VEN_LEVEL_MPEG4_0;
-        break;
-      case OMX_VIDEO_MPEG4Level1:
-        requested_level.level = VEN_LEVEL_MPEG4_1;
-        break;
-      case OMX_VIDEO_MPEG4Level2:
-        requested_level.level = VEN_LEVEL_MPEG4_2;
-        break;
-      case OMX_VIDEO_MPEG4Level3:
-        requested_level.level = VEN_LEVEL_MPEG4_3;
-        break;
-      case OMX_VIDEO_MPEG4Level4a:
-        requested_level.level = VEN_LEVEL_MPEG4_4;
-        break;
-      case OMX_VIDEO_MPEG4Level5:
-        mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
-		if((requested_profile.profile == VEN_PROFILE_MPEG4_SP) && (mb_per_frame >= profile_tbl[0]) &&
-           (mb_per_sec >= profile_tbl[1]))
-        {
-          DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
-          requested_level.level = VEN_LEVEL_MPEG4_6;
-        }
-        else
-        {
-          DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
-          requested_level.level = VEN_LEVEL_MPEG4_5;
-        }
-        break;
-      default:
+
+    DEBUG_PRINT_LOW("Validating Profile/Level from table");
+
+    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
+        DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
         return false;
-        // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
-        break;
-      }
     }
-  }
-  else if(m_sVenc_cfg.codectype == VEN_CODEC_H263)
-  {
-    if(eProfile == OMX_VIDEO_H263ProfileBaseline)
-    {
-      requested_profile.profile = VEN_PROFILE_H263_BASELINE;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
-        requested_profile.profile);
-      return false;
-    }
-    //profile level
-    switch(eLevel)
-    {
-    case OMX_VIDEO_H263Level10:
-      requested_level.level = VEN_LEVEL_H263_10;
-      break;
-    case OMX_VIDEO_H263Level20:
-      requested_level.level = VEN_LEVEL_H263_20;
-      break;
-    case OMX_VIDEO_H263Level30:
-      requested_level.level = VEN_LEVEL_H263_30;
-      break;
-    case OMX_VIDEO_H263Level40:
-      requested_level.level = VEN_LEVEL_H263_40;
-      break;
-    case OMX_VIDEO_H263Level45:
-      requested_level.level = VEN_LEVEL_H263_45;
-      break;
-    case OMX_VIDEO_H263Level50:
-      requested_level.level = VEN_LEVEL_H263_50;
-      break;
-    case OMX_VIDEO_H263Level60:
-      requested_level.level = VEN_LEVEL_H263_60;
-      break;
-    case OMX_VIDEO_H263Level70:
-      requested_level.level = VEN_LEVEL_H263_70;
-      break;
-    default:
-      return false;
-      break;
-    }
-  }
-  else if(m_sVenc_cfg.codectype == VEN_CODEC_H264)
-  {
-    if(eProfile == OMX_VIDEO_AVCProfileBaseline)
-    {
-      requested_profile.profile = VEN_PROFILE_H264_BASELINE;
-    }
-    else if(eProfile == OMX_VIDEO_AVCProfileMain)
-    {
-      requested_profile.profile = VEN_PROFILE_H264_MAIN;
-    }
-    else if(eProfile == OMX_VIDEO_AVCProfileHigh)
-    {
-      requested_profile.profile = VEN_PROFILE_H264_HIGH;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
-        requested_profile.profile);
-      return false;
-    }
-    //profile level
-    switch(eLevel)
-    {
-    case OMX_VIDEO_AVCLevel1:
-      requested_level.level = VEN_LEVEL_H264_1;
-      break;
-    case OMX_VIDEO_AVCLevel1b:
-      requested_level.level = VEN_LEVEL_H264_1b;
-      break;
-    case OMX_VIDEO_AVCLevel11:
-      requested_level.level = VEN_LEVEL_H264_1p1;
-      break;
-    case OMX_VIDEO_AVCLevel12:
-      requested_level.level = VEN_LEVEL_H264_1p2;
-      break;
-    case OMX_VIDEO_AVCLevel13:
-      requested_level.level = VEN_LEVEL_H264_1p3;
-      break;
-    case OMX_VIDEO_AVCLevel2:
-      requested_level.level = VEN_LEVEL_H264_2;
-      break;
-    case OMX_VIDEO_AVCLevel21:
-      requested_level.level = VEN_LEVEL_H264_2p1;
-      break;
-    case OMX_VIDEO_AVCLevel22:
-      requested_level.level = VEN_LEVEL_H264_2p2;
-      break;
-    case OMX_VIDEO_AVCLevel3:
-      requested_level.level = VEN_LEVEL_H264_3;
-      break;
-    case OMX_VIDEO_AVCLevel31:
-      requested_level.level = VEN_LEVEL_H264_3p1;
-      break;
-    case OMX_VIDEO_AVCLevel32:
-      requested_level.level = VEN_LEVEL_H264_3p2;
-      break;
-    case OMX_VIDEO_AVCLevel4:
-      requested_level.level = VEN_LEVEL_H264_4;
-      break;
-    default :
-      DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %u",
-        requested_level.level);
-      return false;
-      break;
-    }
-  }
-  if(!m_profile_set)
-  {
-    ioctl_msg.in = (void*)&requested_profile;
-    ioctl_msg.out = NULL;
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Request for setting profile failed");
-      return false;
-    }
-    codec_profile.profile = requested_profile.profile;
-    m_profile_set = true;
-    DEBUG_PRINT_HIGH("Set codec profile = 0x%x", codec_profile.profile);
-  }
 
-  if(!m_level_set)
-  {
-    ioctl_msg.in = (void*)&requested_level;
-    ioctl_msg.out = NULL;
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Request for setting profile level failed");
-      return false;
-    }
-    profile_level.level = requested_level.level;
-    m_level_set = true;
-    DEBUG_PRINT_HIGH("Set codec level = 0x%x", profile_level.level);
-  }
+    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
+        DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
+                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
+                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
 
-  return true;
+        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
+            requested_profile.profile = VEN_PROFILE_MPEG4_SP;
+            profile_tbl = (unsigned int const *)
+                (&mpeg4_profile_level_table[MPEG4_SP_START]);
+            profile_tbl += MPEG4_720P_LEVEL*5;
+        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+            requested_profile.profile = VEN_PROFILE_MPEG4_ASP;
+            profile_tbl = (unsigned int const *)
+                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+            profile_tbl += MPEG4_720P_LEVEL*5;
+        } else {
+            DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
+                    eProfile);
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
+                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
+                "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
+                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
+
+        if (mb_per_frame >= 3600) {
+            if (requested_profile.profile == VEN_PROFILE_MPEG4_ASP)
+                requested_level.level = VEN_LEVEL_MPEG4_5;
+
+            if (requested_profile.profile == VEN_PROFILE_MPEG4_SP)
+                requested_level.level = VEN_LEVEL_MPEG4_6;
+        } else {
+            switch (eLevel) {
+                case OMX_VIDEO_MPEG4Level0:
+                    requested_level.level = VEN_LEVEL_MPEG4_0;
+                    break;
+                case OMX_VIDEO_MPEG4Level1:
+                    requested_level.level = VEN_LEVEL_MPEG4_1;
+                    break;
+                case OMX_VIDEO_MPEG4Level2:
+                    requested_level.level = VEN_LEVEL_MPEG4_2;
+                    break;
+                case OMX_VIDEO_MPEG4Level3:
+                    requested_level.level = VEN_LEVEL_MPEG4_3;
+                    break;
+                case OMX_VIDEO_MPEG4Level4a:
+                    requested_level.level = VEN_LEVEL_MPEG4_4;
+                    break;
+                case OMX_VIDEO_MPEG4Level5:
+                    mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
+
+                    if ((requested_profile.profile == VEN_PROFILE_MPEG4_SP) && (mb_per_frame >= profile_tbl[0]) &&
+                            (mb_per_sec >= profile_tbl[1])) {
+                        DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
+                        requested_level.level = VEN_LEVEL_MPEG4_6;
+                    } else {
+                        DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
+                        requested_level.level = VEN_LEVEL_MPEG4_5;
+                    }
+
+                    break;
+                default:
+                    return false;
+                    // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
+                    break;
+            }
+        }
+    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
+        if (eProfile == OMX_VIDEO_H263ProfileBaseline) {
+            requested_profile.profile = VEN_PROFILE_H263_BASELINE;
+        } else {
+            DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
+                    requested_profile.profile);
+            return false;
+        }
+
+        //profile level
+        switch (eLevel) {
+            case OMX_VIDEO_H263Level10:
+                requested_level.level = VEN_LEVEL_H263_10;
+                break;
+            case OMX_VIDEO_H263Level20:
+                requested_level.level = VEN_LEVEL_H263_20;
+                break;
+            case OMX_VIDEO_H263Level30:
+                requested_level.level = VEN_LEVEL_H263_30;
+                break;
+            case OMX_VIDEO_H263Level40:
+                requested_level.level = VEN_LEVEL_H263_40;
+                break;
+            case OMX_VIDEO_H263Level45:
+                requested_level.level = VEN_LEVEL_H263_45;
+                break;
+            case OMX_VIDEO_H263Level50:
+                requested_level.level = VEN_LEVEL_H263_50;
+                break;
+            case OMX_VIDEO_H263Level60:
+                requested_level.level = VEN_LEVEL_H263_60;
+                break;
+            case OMX_VIDEO_H263Level70:
+                requested_level.level = VEN_LEVEL_H263_70;
+                break;
+            default:
+                return false;
+                break;
+        }
+    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
+        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
+            requested_profile.profile = VEN_PROFILE_H264_BASELINE;
+        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
+            requested_profile.profile = VEN_PROFILE_H264_MAIN;
+        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
+            requested_profile.profile = VEN_PROFILE_H264_HIGH;
+        } else {
+            DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
+                    requested_profile.profile);
+            return false;
+        }
+
+        //profile level
+        switch (eLevel) {
+            case OMX_VIDEO_AVCLevel1:
+                requested_level.level = VEN_LEVEL_H264_1;
+                break;
+            case OMX_VIDEO_AVCLevel1b:
+                requested_level.level = VEN_LEVEL_H264_1b;
+                break;
+            case OMX_VIDEO_AVCLevel11:
+                requested_level.level = VEN_LEVEL_H264_1p1;
+                break;
+            case OMX_VIDEO_AVCLevel12:
+                requested_level.level = VEN_LEVEL_H264_1p2;
+                break;
+            case OMX_VIDEO_AVCLevel13:
+                requested_level.level = VEN_LEVEL_H264_1p3;
+                break;
+            case OMX_VIDEO_AVCLevel2:
+                requested_level.level = VEN_LEVEL_H264_2;
+                break;
+            case OMX_VIDEO_AVCLevel21:
+                requested_level.level = VEN_LEVEL_H264_2p1;
+                break;
+            case OMX_VIDEO_AVCLevel22:
+                requested_level.level = VEN_LEVEL_H264_2p2;
+                break;
+            case OMX_VIDEO_AVCLevel3:
+                requested_level.level = VEN_LEVEL_H264_3;
+                break;
+            case OMX_VIDEO_AVCLevel31:
+                requested_level.level = VEN_LEVEL_H264_3p1;
+                break;
+            case OMX_VIDEO_AVCLevel32:
+                requested_level.level = VEN_LEVEL_H264_3p2;
+                break;
+            case OMX_VIDEO_AVCLevel4:
+                requested_level.level = VEN_LEVEL_H264_4;
+                break;
+            default :
+                DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %u",
+                        requested_level.level);
+                return false;
+                break;
+        }
+    }
+
+    if (!m_profile_set) {
+        ioctl_msg.in = (void*)&requested_profile;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for setting profile failed");
+            return false;
+        }
+
+        codec_profile.profile = requested_profile.profile;
+        m_profile_set = true;
+        DEBUG_PRINT_HIGH("Set codec profile = 0x%x", codec_profile.profile);
+    }
+
+    if (!m_level_set) {
+        ioctl_msg.in = (void*)&requested_level;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for setting profile level failed");
+            return false;
+        }
+
+        profile_level.level = requested_level.level;
+        m_level_set = true;
+        DEBUG_PRINT_HIGH("Set codec level = 0x%x", profile_level.level);
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_voptimingcfg vop_timing_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_voptimingcfg vop_timing_cfg;
 
-  DEBUG_PRINT_HIGH("venc_set_voptiming_cfg: TimeRes = %u",
-    TimeIncRes);
+    DEBUG_PRINT_HIGH("venc_set_voptiming_cfg: TimeRes = %u",
+            TimeIncRes);
 
-  vop_timing_cfg.voptime_resolution = TimeIncRes;
+    vop_timing_cfg.voptime_resolution = TimeIncRes;
 
-  ioctl_msg.in = (void*)&vop_timing_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting Vop Timing failed");
-    return false;
-  }
+    ioctl_msg.in = (void*)&vop_timing_cfg;
+    ioctl_msg.out = NULL;
 
-  voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
-  return true;
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting Vop Timing failed");
+        return false;
+    }
+
+    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
+    return true;
 }
 
 bool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_intraperiod intraperiod_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_intraperiod intraperiod_cfg;
 
-  DEBUG_PRINT_LOW("venc_set_intra_period: nPFrames = %u",
-    nPFrames);
-  intraperiod_cfg.num_pframes = nPFrames;
-  if((codec_profile.profile == VEN_PROFILE_MPEG4_ASP) ||
-     (codec_profile.profile == VEN_PROFILE_H264_MAIN) ||
-     (codec_profile.profile == VEN_PROFILE_H264_HIGH))
-  {
+    DEBUG_PRINT_LOW("venc_set_intra_period: nPFrames = %u",
+            nPFrames);
+    intraperiod_cfg.num_pframes = nPFrames;
+
+    if ((codec_profile.profile == VEN_PROFILE_MPEG4_ASP) ||
+            (codec_profile.profile == VEN_PROFILE_H264_MAIN) ||
+            (codec_profile.profile == VEN_PROFILE_H264_HIGH)) {
 #ifdef MAX_RES_1080P
-    if (nBFrames)
-    {
-      DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-      intraperiod_cfg.num_bframes = 1;
-    }
-    else
-      intraperiod_cfg.num_bframes = 0;
+
+        if (nBFrames) {
+            DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+            intraperiod_cfg.num_bframes = 1;
+        } else
+            intraperiod_cfg.num_bframes = 0;
+
 #else
-    if(nBFrames)
-    {
-      DEBUG_PRINT_ERROR("B frames not supported");
-      intraperiod_cfg.num_bframes = 0;
-    }
-    else
-    {
-      DEBUG_PRINT_ERROR("B frames not supported");
-      intraperiod_cfg.num_bframes = 0;
-    }
+
+        if (nBFrames) {
+            DEBUG_PRINT_ERROR("B frames not supported");
+            intraperiod_cfg.num_bframes = 0;
+        } else {
+            DEBUG_PRINT_ERROR("B frames not supported");
+            intraperiod_cfg.num_bframes = 0;
+        }
+
 #endif
-  }
-  else
-    intraperiod_cfg.num_bframes = 0;
+    } else
+        intraperiod_cfg.num_bframes = 0;
 
-  DEBUG_PRINT_HIGH("venc_set_intra_period: nPFrames = %u nBFrames = %u",
-                    intraperiod_cfg.num_pframes, intraperiod_cfg.num_bframes);
-  ioctl_msg.in = (void*)&intraperiod_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-    return false;
-  }
+    DEBUG_PRINT_HIGH("venc_set_intra_period: nPFrames = %u nBFrames = %u",
+            intraperiod_cfg.num_pframes, intraperiod_cfg.num_bframes);
+    ioctl_msg.in = (void*)&intraperiod_cfg;
+    ioctl_msg.out = NULL;
 
-  intra_period.num_pframes = intraperiod_cfg.num_pframes;
-  intra_period.num_bframes = intraperiod_cfg.num_bframes;
-  return true;
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+        return false;
+    }
+
+    intra_period.num_pframes = intraperiod_cfg.num_pframes;
+    intra_period.num_bframes = intraperiod_cfg.num_bframes;
+    return true;
 }
 
 bool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_entropycfg entropy_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_entropycfg entropy_cfg;
 
-  memset(&entropy_cfg,0,sizeof(entropy_cfg));
-  DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
+    memset(&entropy_cfg,0,sizeof(entropy_cfg));
+    DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
 
-  if(enable &&(codec_profile.profile != VEN_PROFILE_H264_BASELINE)){
-    entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CABAC;
-      if (i_cabac_level == 0) {
-         entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
-      }
+    if (enable &&(codec_profile.profile != VEN_PROFILE_H264_BASELINE)) {
+        entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CABAC;
+
+        if (i_cabac_level == 0) {
+            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
+        }
+
 #ifdef MAX_RES_1080P
-      else
-      {
-        DEBUG_PRINT_HIGH("Invalid model set (%d) defaulting to  model 0",i_cabac_level);
-        entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
-      }
-#else
-      else if (i_cabac_level == 1) {
-         entropy_cfg.cabacmodel = VEN_CABAC_MODEL_1;
-      }
-      else if (i_cabac_level == 2) {
-         entropy_cfg.cabacmodel = VEN_CABAC_MODEL_2;
-      }
-#endif
-  }
-  else if(!enable){
-    entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CAVLC;
-    }
-  else{
-    DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
-    return false;
-  }
+        else {
+            DEBUG_PRINT_HIGH("Invalid model set (%d) defaulting to  model 0",i_cabac_level);
+            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
+        }
 
-  ioctl_msg.in = (void*)&entropy_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting entropy config failed");
-    return false;
-  }
-  entropy.longentropysel = entropy_cfg.longentropysel;
-  entropy.cabacmodel  = entropy_cfg.cabacmodel;
-  return true;
+#else
+        else if (i_cabac_level == 1) {
+            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_1;
+        } else if (i_cabac_level == 2) {
+            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_2;
+        }
+
+#endif
+    } else if (!enable) {
+        entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CAVLC;
+    } else {
+        DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
+        return false;
+    }
+
+    ioctl_msg.in = (void*)&entropy_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting entropy config failed");
+        return false;
+    }
+
+    entropy.longentropysel = entropy_cfg.longentropysel;
+    entropy.cabacmodel  = entropy_cfg.cabacmodel;
+    return true;
 }
 
 bool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
 {
- venc_ioctl_msg ioctl_msg = {NULL, NULL};
-  bool status = true;
-  struct venc_multiclicecfg multislice_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL, NULL};
+    bool status = true;
+    struct venc_multiclicecfg multislice_cfg;
 
-  if((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)){
-    multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
-    multislice_cfg.mslice_size = nSlicesize;
+    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
+        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
+        multislice_cfg.mslice_size = nSlicesize;
+    } else {
+        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+        multislice_cfg.mslice_size = 0;
     }
-  else{
-    multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
-    multislice_cfg.mslice_size = 0;
-  }
 
-  DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
-                  multislice_cfg.mslice_size);
+    DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
+            multislice_cfg.mslice_size);
 
-  ioctl_msg.in = (void*)&multislice_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
-    status = false;
-  }
-  else
-  {
-    multislice.mslice_mode = multislice_cfg.mslice_mode;
-    multislice.mslice_size = nSlicesize;
-  }
-  return status;
+    ioctl_msg.in = (void*)&multislice_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
+        status = false;
+    } else {
+        multislice.mslice_mode = multislice_cfg.mslice_mode;
+        multislice.mslice_size = nSlicesize;
+    }
+
+    return status;
 }
 
 bool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
 {
- venc_ioctl_msg ioctl_msg = {NULL, NULL};
-  bool status = true;
-  struct venc_intrarefresh intraRefresh_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL, NULL};
+    bool status = true;
+    struct venc_intrarefresh intraRefresh_cfg;
 
-  // There is no disabled mode.  Disabled mode is indicated by a 0 count.
-  if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax)
-  {
-    intraRefresh_cfg.irmode = VEN_IR_OFF;
-    intraRefresh_cfg.mbcount = 0;
-  }
-  else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
-           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
-  {
-    intraRefresh_cfg.irmode = VEN_IR_CYCLIC;
-    intraRefresh_cfg.mbcount = irMBs;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
-                      "mb count: %d, mb mode:%d", irMBs, ir_mode);
-    return false;
-  }
+    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
+    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
+        intraRefresh_cfg.irmode = VEN_IR_OFF;
+        intraRefresh_cfg.mbcount = 0;
+    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
+            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
+        intraRefresh_cfg.irmode = VEN_IR_CYCLIC;
+        intraRefresh_cfg.mbcount = irMBs;
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
+                "mb count: %d, mb mode:%d", irMBs, ir_mode);
+        return false;
+    }
 
-  ioctl_msg.in = (void*)&intraRefresh_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra Refresh failed");
-    status = false;
-  }
-  else
-  {
-    intra_refresh.irmode = intraRefresh_cfg.irmode;
-    intra_refresh.mbcount = intraRefresh_cfg.mbcount;
-  }
-  return status;
+    ioctl_msg.in = (void*)&intraRefresh_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra Refresh failed");
+        status = false;
+    } else {
+        intra_refresh.irmode = intraRefresh_cfg.irmode;
+        intra_refresh.mbcount = intraRefresh_cfg.mbcount;
+    }
+
+    return status;
 }
 
 bool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
 {
-   venc_ioctl_msg ioctl_msg = {NULL, NULL};
-   bool status = true;
-   struct venc_headerextension hec_cfg;
-   struct venc_multiclicecfg multislice_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL, NULL};
+    bool status = true;
+    struct venc_headerextension hec_cfg;
+    struct venc_multiclicecfg multislice_cfg;
 
-   if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingMPEG4) {
-      if (error_resilience->bEnableHEC) {
-         hec_cfg.header_extension = 1;
-      }
-      else {
-         hec_cfg.header_extension = 0;
-      }
+    if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingMPEG4) {
+        if (error_resilience->bEnableHEC) {
+            hec_cfg.header_extension = 1;
+        } else {
+            hec_cfg.header_extension = 0;
+        }
 
-      ioctl_msg.in = (void*)&hec_cfg;
-      ioctl_msg.out = NULL;
-      if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < 0) {
-         DEBUG_PRINT_ERROR("\nERROR: Request for setting HEader Error correction failed");
-         return false;
-      }
-      hec.header_extension = error_resilience->bEnableHEC;
-   }
+        ioctl_msg.in = (void*)&hec_cfg;
+        ioctl_msg.out = NULL;
 
-   if (error_resilience->bEnableRVLC) {
-     DEBUG_PRINT_ERROR("\n RVLC is not Supported");
-     return false;
-   }
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for setting HEader Error correction failed");
+            return false;
+        }
 
-   if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
-       (error_resilience->bEnableDataPartitioning)) {
-     DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
-     return false;
-     }
+        hec.header_extension = error_resilience->bEnableHEC;
+    }
 
-   if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
+    if (error_resilience->bEnableRVLC) {
+        DEBUG_PRINT_ERROR("\n RVLC is not Supported");
+        return false;
+    }
+
+    if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
+            (error_resilience->bEnableDataPartitioning)) {
+        DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
+        return false;
+    }
+
+    if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
             (error_resilience->nResynchMarkerSpacing)) {
-     multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
-       multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
-     }
-   else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
+        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
+        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
+    } else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
             error_resilience->bEnableDataPartitioning) {
-      multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
-      multislice_cfg.mslice_size = 0;
-      }
-      else {
+        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
+        multislice_cfg.mslice_size = 0;
+    } else {
         multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
         multislice_cfg.mslice_size = 0;
-        }
-   DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
-                   multislice_cfg.mslice_size);
-   ioctl_msg.in = (void*)&multislice_cfg;
-   ioctl_msg.out = NULL;
-   if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
-      DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
-      status = false;
-   }
-   else
-   {
-     multislice.mslice_mode = multislice_cfg.mslice_mode ;
-     multislice.mslice_size = multislice_cfg.mslice_size;
+    }
 
-   }
-   return status;
+    DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
+            multislice_cfg.mslice_size);
+    ioctl_msg.in = (void*)&multislice_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
+        status = false;
+    } else {
+        multislice.mslice_mode = multislice_cfg.mslice_mode ;
+        multislice.mslice_size = multislice_cfg.mslice_size;
+
+    }
+
+    return status;
 }
 
 bool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_dbcfg filter_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_dbcfg filter_cfg;
 
-  memset(&filter_cfg, 0, sizeof(filter_cfg));
-  DEBUG_PRINT_LOW("\n venc_set_inloop_filter: %u",loopfilter);
+    memset(&filter_cfg, 0, sizeof(filter_cfg));
+    DEBUG_PRINT_LOW("\n venc_set_inloop_filter: %u",loopfilter);
 
-  if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable){
-    filter_cfg.db_mode = VEN_DB_ALL_BLKG_BNDRY;
-  }
-  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisable){
-    filter_cfg.db_mode = VEN_DB_DISABLE;
-  }
-  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary){
-    filter_cfg.db_mode = VEN_DB_SKIP_SLICE_BNDRY;
-  }
-  filter_cfg.slicealpha_offset = filter_cfg.slicebeta_offset = 0;
+    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
+        filter_cfg.db_mode = VEN_DB_ALL_BLKG_BNDRY;
+    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
+        filter_cfg.db_mode = VEN_DB_DISABLE;
+    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
+        filter_cfg.db_mode = VEN_DB_SKIP_SLICE_BNDRY;
+    }
 
-  ioctl_msg.in = (void*)&filter_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting inloop filter failed");
-    return false;
-  }
+    filter_cfg.slicealpha_offset = filter_cfg.slicebeta_offset = 0;
 
-  dbkfilter.db_mode = filter_cfg.db_mode;
-  dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
-  return true;
+    ioctl_msg.in = (void*)&filter_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting inloop filter failed");
+        return false;
+    }
+
+    dbkfilter.db_mode = filter_cfg.db_mode;
+    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
+    return true;
 }
 
 bool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
 {
-  venc_ioctl_msg ioctl_msg = {NULL, NULL};
-  struct venc_targetbitrate bitrate_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL, NULL};
+    struct venc_targetbitrate bitrate_cfg;
 
-  DEBUG_PRINT_HIGH("venc_set_target_bitrate: bitrate = %u",
-    nTargetBitrate);
-  bitrate_cfg.target_bitrate = nTargetBitrate ;
-  ioctl_msg.in = (void*)&bitrate_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
-    return false;
-  }
-  m_sVenc_cfg.targetbitrate = nTargetBitrate;
-  bitrate.target_bitrate = nTargetBitrate;
-  if(!config)
-  {
-    m_level_set = false;
-    if(venc_set_profile_level(0, 0))
-    {
-      DEBUG_PRINT_LOW("Calling set level (Bitrate) with %d\n",profile_level.level);
+    DEBUG_PRINT_HIGH("venc_set_target_bitrate: bitrate = %u",
+            nTargetBitrate);
+    bitrate_cfg.target_bitrate = nTargetBitrate ;
+    ioctl_msg.in = (void*)&bitrate_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
+        return false;
     }
-  }
-  return true;
+
+    m_sVenc_cfg.targetbitrate = nTargetBitrate;
+    bitrate.target_bitrate = nTargetBitrate;
+
+    if (!config) {
+        m_level_set = false;
+
+        if (venc_set_profile_level(0, 0)) {
+            DEBUG_PRINT_LOW("Calling set level (Bitrate) with %d\n",profile_level.level);
+        }
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
 {
-  venc_ioctl_msg ioctl_msg = {NULL, NULL};
-  struct venc_framerate frame_rate_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL, NULL};
+    struct venc_framerate frame_rate_cfg;
 
-  Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
+    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
 
-  DEBUG_PRINT_HIGH("venc_set_encode_framerate: framerate(Q16) = %u, NR: %d, DR: %d",
-                  encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
+    DEBUG_PRINT_HIGH("venc_set_encode_framerate: framerate(Q16) = %u, NR: %d, DR: %d",
+            encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
 
-  ioctl_msg.in = (void*)&frame_rate_cfg;
-  ioctl_msg.out = NULL;
-  if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
-      (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting framerate failed");
-    return false;
-  }
+    ioctl_msg.in = (void*)&frame_rate_cfg;
+    ioctl_msg.out = NULL;
 
-  m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
-  m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
-  if(!config)
-  {
-    m_level_set = false;
-    if(venc_set_profile_level(0, 0))
-    {
-      DEBUG_PRINT_LOW("Calling set level (Framerate) with %d",profile_level.level);
+    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting framerate failed");
+        return false;
     }
-  }
-  return true;
+
+    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
+    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
+
+    if (!config) {
+        m_level_set = false;
+
+        if (venc_set_profile_level(0, 0)) {
+            DEBUG_PRINT_LOW("Calling set level (Framerate) with %d",profile_level.level);
+        }
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
 {
-  venc_ioctl_msg ioctl_msg = {NULL, NULL};
-  if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
-  {
+    venc_ioctl_msg ioctl_msg = {NULL, NULL};
+
+    if (color_format == OMX_COLOR_FormatYUV420SemiPlanar) {
 #ifdef MAX_RES_1080P
-  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+        m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
 #else
-    m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
+        m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
 #endif
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
+    } else {
+        DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
 #ifdef MAX_RES_1080P
-    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+        m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
 #else
-    m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
+        m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
 #endif
-    DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
-  }
-  ioctl_msg.in = (void*)&m_sVenc_cfg;
-  ioctl_msg.out = NULL;
-  if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Request for setting color format failed");
-    return false;
-  }
-  return true;
+        DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
+    }
+
+    ioctl_msg.in = (void*)&m_sVenc_cfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting color format failed");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
 {
-  DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
-  if(intra_vop_refresh == OMX_TRUE)
-  {
-    if(ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra VOP Refresh failed");
-      return false;
+    DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
+
+    if (intra_vop_refresh == OMX_TRUE) {
+        if (ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra VOP Refresh failed");
+            return false;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
     }
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
-  }
-  return true;
+
+    return true;
 }
 
 bool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  bool status = true;
-  struct venc_ratectrlcfg ratectrl_cfg;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    bool status = true;
+    struct venc_ratectrlcfg ratectrl_cfg;
 
-  //rate control
-  switch(eControlRate)
-  {
-  case OMX_Video_ControlRateDisable:
-    ratectrl_cfg.rcmode = VEN_RC_OFF;
-    break;
-  case OMX_Video_ControlRateVariableSkipFrames:
-    ratectrl_cfg.rcmode = VEN_RC_VBR_VFR;
-    break;
-  case OMX_Video_ControlRateVariable:
-    ratectrl_cfg.rcmode = VEN_RC_VBR_CFR;
-    break;
-  case OMX_Video_ControlRateConstantSkipFrames:
-    ratectrl_cfg.rcmode = VEN_RC_CBR_VFR;
-    break;
-  case OMX_Video_ControlRateConstant:
-    ratectrl_cfg.rcmode = VEN_RC_CBR_CFR;
-    break;
-  default:
-    status = false;
-    break;
-  }
-
-  if(status)
-  {
-    ioctl_msg.in = (void*)&ratectrl_cfg;
-    ioctl_msg.out = NULL;
-    if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT_ERROR("\nERROR: Request for setting rate control failed");
-      status = false;
+    //rate control
+    switch (eControlRate) {
+        case OMX_Video_ControlRateDisable:
+            ratectrl_cfg.rcmode = VEN_RC_OFF;
+            break;
+        case OMX_Video_ControlRateVariableSkipFrames:
+            ratectrl_cfg.rcmode = VEN_RC_VBR_VFR;
+            break;
+        case OMX_Video_ControlRateVariable:
+            ratectrl_cfg.rcmode = VEN_RC_VBR_CFR;
+            break;
+        case OMX_Video_ControlRateConstantSkipFrames:
+            ratectrl_cfg.rcmode = VEN_RC_CBR_VFR;
+            break;
+        case OMX_Video_ControlRateConstant:
+            ratectrl_cfg.rcmode = VEN_RC_CBR_CFR;
+            break;
+        default:
+            status = false;
+            break;
     }
-    else
-      rate_ctrl.rcmode = ratectrl_cfg.rcmode;
-  }
-  return status;
+
+    if (status) {
+        ioctl_msg.in = (void*)&ratectrl_cfg;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT_ERROR("\nERROR: Request for setting rate control failed");
+            status = false;
+        } else
+            rate_ctrl.rcmode = ratectrl_cfg.rcmode;
+    }
+
+    return status;
 }
 
 bool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
 {
-  bool status = true;
-  if(eProfile == NULL || eLevel == NULL)
-  {
-    return false;
-  }
+    bool status = true;
 
-  if(m_sVenc_cfg.codectype == VEN_CODEC_MPEG4)
-  {
-    switch(codec_profile.profile)
-    {
-    case VEN_PROFILE_MPEG4_SP:
-      *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-      break;
-    case VEN_PROFILE_MPEG4_ASP:
-      *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-      break;
-    default:
-      *eProfile = OMX_VIDEO_MPEG4ProfileMax;
-      status = false;
-      break;
+    if (eProfile == NULL || eLevel == NULL) {
+        return false;
     }
 
-    if(!status)
-    {
-      return status;
+    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
+        switch (codec_profile.profile) {
+            case VEN_PROFILE_MPEG4_SP:
+                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                break;
+            case VEN_PROFILE_MPEG4_ASP:
+                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                break;
+            default:
+                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
+                status = false;
+                break;
+        }
+
+        if (!status) {
+            return status;
+        }
+
+        //profile level
+        switch (profile_level.level) {
+            case VEN_LEVEL_MPEG4_0:
+                *eLevel = OMX_VIDEO_MPEG4Level0;
+                break;
+            case VEN_LEVEL_MPEG4_1:
+                *eLevel = OMX_VIDEO_MPEG4Level1;
+                break;
+            case VEN_LEVEL_MPEG4_2:
+                *eLevel = OMX_VIDEO_MPEG4Level2;
+                break;
+            case VEN_LEVEL_MPEG4_3:
+                *eLevel = OMX_VIDEO_MPEG4Level3;
+                break;
+            case VEN_LEVEL_MPEG4_4:
+                *eLevel = OMX_VIDEO_MPEG4Level4a;
+                break;
+            case VEN_LEVEL_MPEG4_5:
+            case VEN_LEVEL_MPEG4_6:
+                *eLevel = OMX_VIDEO_MPEG4Level5;
+                break;
+            default:
+                *eLevel = OMX_VIDEO_MPEG4LevelMax;
+                status =  false;
+                break;
+        }
+    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
+        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
+            *eProfile = OMX_VIDEO_H263ProfileBaseline;
+        } else {
+            *eProfile = OMX_VIDEO_H263ProfileMax;
+            return false;
+        }
+
+        switch (profile_level.level) {
+            case VEN_LEVEL_H263_10:
+                *eLevel = OMX_VIDEO_H263Level10;
+                break;
+            case VEN_LEVEL_H263_20:
+                *eLevel = OMX_VIDEO_H263Level20;
+                break;
+            case VEN_LEVEL_H263_30:
+                *eLevel = OMX_VIDEO_H263Level30;
+                break;
+            case VEN_LEVEL_H263_40:
+                *eLevel = OMX_VIDEO_H263Level40;
+                break;
+            case VEN_LEVEL_H263_45:
+                *eLevel = OMX_VIDEO_H263Level45;
+                break;
+            case VEN_LEVEL_H263_50:
+                *eLevel = OMX_VIDEO_H263Level50;
+                break;
+            case VEN_LEVEL_H263_60:
+                *eLevel = OMX_VIDEO_H263Level60;
+                break;
+            case VEN_LEVEL_H263_70:
+                *eLevel = OMX_VIDEO_H263Level70;
+                break;
+            default:
+                *eLevel = OMX_VIDEO_H263LevelMax;
+                status = false;
+                break;
+        }
+    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
+        switch (codec_profile.profile) {
+            case VEN_PROFILE_H264_BASELINE:
+                *eProfile = OMX_VIDEO_AVCProfileBaseline;
+                break;
+            case VEN_PROFILE_H264_MAIN:
+                *eProfile = OMX_VIDEO_AVCProfileMain;
+                break;
+            case VEN_PROFILE_H264_HIGH:
+                *eProfile = OMX_VIDEO_AVCProfileHigh;
+                break;
+            default:
+                *eProfile = OMX_VIDEO_AVCProfileMax;
+                status = false;
+                break;
+        }
+
+        if (!status) {
+            return status;
+        }
+
+        switch (profile_level.level) {
+            case VEN_LEVEL_H264_1:
+                *eLevel = OMX_VIDEO_AVCLevel1;
+                break;
+            case VEN_LEVEL_H264_1b:
+                *eLevel = OMX_VIDEO_AVCLevel1b;
+                break;
+            case VEN_LEVEL_H264_1p1:
+                *eLevel = OMX_VIDEO_AVCLevel11;
+                break;
+            case VEN_LEVEL_H264_1p2:
+                *eLevel = OMX_VIDEO_AVCLevel12;
+                break;
+            case VEN_LEVEL_H264_1p3:
+                *eLevel = OMX_VIDEO_AVCLevel13;
+                break;
+            case VEN_LEVEL_H264_2:
+                *eLevel = OMX_VIDEO_AVCLevel2;
+                break;
+            case VEN_LEVEL_H264_2p1:
+                *eLevel = OMX_VIDEO_AVCLevel21;
+                break;
+            case VEN_LEVEL_H264_2p2:
+                *eLevel = OMX_VIDEO_AVCLevel22;
+                break;
+            case VEN_LEVEL_H264_3:
+                *eLevel = OMX_VIDEO_AVCLevel3;
+                break;
+            case VEN_LEVEL_H264_3p1:
+                *eLevel = OMX_VIDEO_AVCLevel31;
+                break;
+            case VEN_LEVEL_H264_3p2:
+                *eLevel = OMX_VIDEO_AVCLevel32;
+                break;
+            case VEN_LEVEL_H264_4:
+                *eLevel = OMX_VIDEO_AVCLevel4;
+                break;
+            default :
+                *eLevel = OMX_VIDEO_AVCLevelMax;
+                status = false;
+                break;
+        }
     }
 
-    //profile level
-    switch(profile_level.level)
-    {
-    case VEN_LEVEL_MPEG4_0:
-      *eLevel = OMX_VIDEO_MPEG4Level0;
-      break;
-    case VEN_LEVEL_MPEG4_1:
-      *eLevel = OMX_VIDEO_MPEG4Level1;
-      break;
-    case VEN_LEVEL_MPEG4_2:
-      *eLevel = OMX_VIDEO_MPEG4Level2;
-      break;
-    case VEN_LEVEL_MPEG4_3:
-      *eLevel = OMX_VIDEO_MPEG4Level3;
-      break;
-    case VEN_LEVEL_MPEG4_4:
-      *eLevel = OMX_VIDEO_MPEG4Level4a;
-      break;
-    case VEN_LEVEL_MPEG4_5:
-    case VEN_LEVEL_MPEG4_6:
-      *eLevel = OMX_VIDEO_MPEG4Level5;
-      break;
-    default:
-      *eLevel = OMX_VIDEO_MPEG4LevelMax;
-      status =  false;
-      break;
-    }
-  }
-  else if(m_sVenc_cfg.codectype == VEN_CODEC_H263)
-  {
-    if(codec_profile.profile == VEN_PROFILE_H263_BASELINE)
-    {
-      *eProfile = OMX_VIDEO_H263ProfileBaseline;
-    }
-    else
-    {
-      *eProfile = OMX_VIDEO_H263ProfileMax;
-      return false;
-    }
-    switch(profile_level.level)
-    {
-    case VEN_LEVEL_H263_10:
-      *eLevel = OMX_VIDEO_H263Level10;
-      break;
-    case VEN_LEVEL_H263_20:
-      *eLevel = OMX_VIDEO_H263Level20;
-      break;
-    case VEN_LEVEL_H263_30:
-      *eLevel = OMX_VIDEO_H263Level30;
-      break;
-    case VEN_LEVEL_H263_40:
-      *eLevel = OMX_VIDEO_H263Level40;
-      break;
-    case VEN_LEVEL_H263_45:
-      *eLevel = OMX_VIDEO_H263Level45;
-      break;
-    case VEN_LEVEL_H263_50:
-      *eLevel = OMX_VIDEO_H263Level50;
-      break;
-    case VEN_LEVEL_H263_60:
-      *eLevel = OMX_VIDEO_H263Level60;
-      break;
-    case VEN_LEVEL_H263_70:
-      *eLevel = OMX_VIDEO_H263Level70;
-      break;
-    default:
-      *eLevel = OMX_VIDEO_H263LevelMax;
-      status = false;
-      break;
-    }
-  }
-  else if(m_sVenc_cfg.codectype == VEN_CODEC_H264)
-  {
-    switch(codec_profile.profile)
-    {
-    case VEN_PROFILE_H264_BASELINE:
-      *eProfile = OMX_VIDEO_AVCProfileBaseline;
-      break;
-    case VEN_PROFILE_H264_MAIN:
-      *eProfile = OMX_VIDEO_AVCProfileMain;
-      break;
-    case VEN_PROFILE_H264_HIGH:
-      *eProfile = OMX_VIDEO_AVCProfileHigh;
-      break;
-    default:
-      *eProfile = OMX_VIDEO_AVCProfileMax;
-      status = false;
-      break;
-    }
-
-    if(!status)
-    {
-      return status;
-    }
-
-    switch(profile_level.level)
-    {
-    case VEN_LEVEL_H264_1:
-      *eLevel = OMX_VIDEO_AVCLevel1;
-      break;
-    case VEN_LEVEL_H264_1b:
-      *eLevel = OMX_VIDEO_AVCLevel1b;
-      break;
-    case VEN_LEVEL_H264_1p1:
-      *eLevel = OMX_VIDEO_AVCLevel11;
-      break;
-    case VEN_LEVEL_H264_1p2:
-      *eLevel = OMX_VIDEO_AVCLevel12;
-      break;
-    case VEN_LEVEL_H264_1p3:
-      *eLevel = OMX_VIDEO_AVCLevel13;
-      break;
-    case VEN_LEVEL_H264_2:
-      *eLevel = OMX_VIDEO_AVCLevel2;
-      break;
-    case VEN_LEVEL_H264_2p1:
-      *eLevel = OMX_VIDEO_AVCLevel21;
-      break;
-    case VEN_LEVEL_H264_2p2:
-      *eLevel = OMX_VIDEO_AVCLevel22;
-      break;
-    case VEN_LEVEL_H264_3:
-      *eLevel = OMX_VIDEO_AVCLevel3;
-      break;
-    case VEN_LEVEL_H264_3p1:
-      *eLevel = OMX_VIDEO_AVCLevel31;
-      break;
-    case VEN_LEVEL_H264_3p2:
-      *eLevel = OMX_VIDEO_AVCLevel32;
-      break;
-    case VEN_LEVEL_H264_4:
-      *eLevel = OMX_VIDEO_AVCLevel4;
-      break;
-	  default :
-      *eLevel = OMX_VIDEO_AVCLevelMax;
-      status = false;
-      break;
-    }
-  }
-  return status;
+    return status;
 }
 
 bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
 {
-  OMX_U32 new_profile = 0, new_level = 0;
-  unsigned const int *profile_tbl = NULL;
-  OMX_U32 mb_per_frame, mb_per_sec;
-  bool profile_level_found = false;
+    OMX_U32 new_profile = 0, new_level = 0;
+    unsigned const int *profile_tbl = NULL;
+    OMX_U32 mb_per_frame, mb_per_sec;
+    bool profile_level_found = false;
 
-  DEBUG_PRINT_LOW("\n Init profile table for respective codec");
-  //validate the ht,width,fps,bitrate and set the appropriate profile and level
-  if(m_sVenc_cfg.codectype == VEN_CODEC_MPEG4)
-  {
-      if(*eProfile == 0)
-      {
-        if(!m_profile_set)
-        {
-          *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+    DEBUG_PRINT_LOW("\n Init profile table for respective codec");
+
+    //validate the ht,width,fps,bitrate and set the appropriate profile and level
+    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
+        if (*eProfile == 0) {
+            if (!m_profile_set) {
+                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+            } else {
+                switch (codec_profile.profile) {
+                    case VEN_PROFILE_MPEG4_ASP:
+                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                        break;
+                    case VEN_PROFILE_MPEG4_SP:
+                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                        break;
+                    default:
+                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+                        return false;
+                }
+            }
         }
-        else
-        {
-          switch(codec_profile.profile)
-          {
-          case VEN_PROFILE_MPEG4_ASP:
-              *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-            break;
-          case VEN_PROFILE_MPEG4_SP:
-              *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-            break;
-          default:
-            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+
+        if (*eLevel == 0 && !m_level_set) {
+            *eLevel = OMX_VIDEO_MPEG4LevelMax;
+        }
+
+        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
+            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+            profile_tbl = (unsigned int const *)
+                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+        } else {
+            DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
             return false;
-          }
         }
-      }
-
-      if(*eLevel == 0 && !m_level_set)
-      {
-        *eLevel = OMX_VIDEO_MPEG4LevelMax;
-      }
-
-      if(*eProfile == OMX_VIDEO_MPEG4ProfileSimple)
-      {
-        profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
-      }
-      else if(*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-      {
-        profile_tbl = (unsigned int const *)
-          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
-        return false;
-      }
-  }
-  else if(m_sVenc_cfg.codectype == VEN_CODEC_H264)
-  {
-      if(*eProfile == 0)
-      {
-        if(!m_profile_set)
-        {
-          *eProfile = OMX_VIDEO_AVCProfileBaseline;
+    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
+        if (*eProfile == 0) {
+            if (!m_profile_set) {
+                *eProfile = OMX_VIDEO_AVCProfileBaseline;
+            } else {
+                switch (codec_profile.profile) {
+                    case VEN_PROFILE_H264_BASELINE:
+                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
+                        break;
+                    case VEN_PROFILE_H264_MAIN:
+                        *eProfile = OMX_VIDEO_AVCProfileMain;
+                        break;
+                    case VEN_PROFILE_H264_HIGH:
+                        *eProfile = OMX_VIDEO_AVCProfileHigh;
+                        break;
+                    default:
+                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+                        return false;
+                }
+            }
         }
-        else
-        {
-          switch(codec_profile.profile)
-          {
-          case VEN_PROFILE_H264_BASELINE:
-            *eProfile = OMX_VIDEO_AVCProfileBaseline;
-            break;
-          case VEN_PROFILE_H264_MAIN:
-            *eProfile = OMX_VIDEO_AVCProfileMain;
-            break;
-          case VEN_PROFILE_H264_HIGH:
-            *eProfile = OMX_VIDEO_AVCProfileHigh;
-            break;
-          default:
-            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+
+        if (*eLevel == 0 && !m_level_set) {
+            *eLevel = OMX_VIDEO_AVCLevelMax;
+        }
+
+        if (*eProfile == OMX_VIDEO_AVCProfileBaseline) {
+            profile_tbl = (unsigned int const *)h264_profile_level_table;
+        } else if (*eProfile == OMX_VIDEO_AVCProfileHigh) {
+            profile_tbl = (unsigned int const *)
+                (&h264_profile_level_table[H264_HP_START]);
+        } else if (*eProfile == OMX_VIDEO_AVCProfileMain) {
+            profile_tbl = (unsigned int const *)
+                (&h264_profile_level_table[H264_MP_START]);
+        } else {
+            DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
             return false;
-          }
         }
-      }
-
-      if(*eLevel == 0 && !m_level_set)
-      {
-        *eLevel = OMX_VIDEO_AVCLevelMax;
-      }
-
-      if(*eProfile == OMX_VIDEO_AVCProfileBaseline)
-      {
-        profile_tbl = (unsigned int const *)h264_profile_level_table;
-      }
-      else if(*eProfile == OMX_VIDEO_AVCProfileHigh)
-      {
-        profile_tbl = (unsigned int const *)
-          (&h264_profile_level_table[H264_HP_START]);
-      }
-      else if(*eProfile == OMX_VIDEO_AVCProfileMain)
-      {
-        profile_tbl = (unsigned int const *)
-          (&h264_profile_level_table[H264_MP_START]);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
-        return false;
-      }
-  }
-  else if(m_sVenc_cfg.codectype == VEN_CODEC_H263)
-  {
-      if(*eProfile == 0)
-      {
-        if(!m_profile_set)
-        {
-          *eProfile = OMX_VIDEO_H263ProfileBaseline;
+    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
+        if (*eProfile == 0) {
+            if (!m_profile_set) {
+                *eProfile = OMX_VIDEO_H263ProfileBaseline;
+            } else {
+                switch (codec_profile.profile) {
+                    case VEN_PROFILE_H263_BASELINE:
+                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
+                        break;
+                    default:
+                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+                        return false;
+                }
+            }
         }
-        else
-        {
-          switch(codec_profile.profile)
-          {
-          case VEN_PROFILE_H263_BASELINE:
-            *eProfile = OMX_VIDEO_H263ProfileBaseline;
-            break;
-          default:
-            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+
+        if (*eLevel == 0 && !m_level_set) {
+            *eLevel = OMX_VIDEO_H263LevelMax;
+        }
+
+        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
+            profile_tbl = (unsigned int const *)h263_profile_level_table;
+        } else {
+            DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
             return false;
-          }
         }
-      }
-
-      if(*eLevel == 0 && !m_level_set)
-      {
-        *eLevel = OMX_VIDEO_H263LevelMax;
-      }
-
-      if(*eProfile == OMX_VIDEO_H263ProfileBaseline)
-      {
-        profile_tbl = (unsigned int const *)h263_profile_level_table;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
+    } else {
+        DEBUG_PRINT_LOW("\n Invalid codec type");
         return false;
-      }
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Invalid codec type");
-    return false;
-  }
-
-  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
-                   ((m_sVenc_cfg.input_width + 15)>> 4);
-
-  if((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4))
-  {
-    if(codec_profile.profile == VEN_PROFILE_MPEG4_ASP)
-      profile_level.level = VEN_LEVEL_MPEG4_5;
-    if(codec_profile.profile == VEN_PROFILE_MPEG4_SP)
-      profile_level.level = VEN_LEVEL_MPEG4_6;
-    {
-      new_level = profile_level.level;
-      new_profile = codec_profile.profile;
-      return true;
     }
-  }
 
-  mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
+    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+        ((m_sVenc_cfg.input_width + 15)>> 4);
 
-  do{
-      if(mb_per_frame <= (int)profile_tbl[0])
-      {
-        if(mb_per_sec <= (int)profile_tbl[1])
+    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4)) {
+        if (codec_profile.profile == VEN_PROFILE_MPEG4_ASP)
+            profile_level.level = VEN_LEVEL_MPEG4_5;
+
+        if (codec_profile.profile == VEN_PROFILE_MPEG4_SP)
+            profile_level.level = VEN_LEVEL_MPEG4_6;
+
         {
-          if(m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2])
-          {
-              new_level = (int)profile_tbl[3];
-              new_profile = (int)profile_tbl[4];
-              profile_level_found = true;
-              DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
-              break;
-          }
+            new_level = profile_level.level;
+            new_profile = codec_profile.profile;
+            return true;
         }
-      }
-      profile_tbl = profile_tbl + 5;
-  }while(profile_tbl[0] != 0);
+    }
 
-  if (profile_level_found != true)
-  {
-    DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
-    return false;
-  }
+    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
 
-  if((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
-     || (*eLevel == OMX_VIDEO_H263LevelMax))
-  {
-    *eLevel = new_level;
-  }
-  DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu"
-      "Level = %lu", __func__, *eProfile, *eLevel);
+    do {
+        if (mb_per_frame <= (int)profile_tbl[0]) {
+            if (mb_per_sec <= (int)profile_tbl[1]) {
+                if (m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2]) {
+                    new_level = (int)profile_tbl[3];
+                    new_profile = (int)profile_tbl[4];
+                    profile_level_found = true;
+                    DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
+                    break;
+                }
+            }
+        }
 
-  return true;
+        profile_tbl = profile_tbl + 5;
+    } while (profile_tbl[0] != 0);
+
+    if (profile_level_found != true) {
+        DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
+        return false;
+    }
+
+    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
+            || (*eLevel == OMX_VIDEO_H263LevelMax)) {
+        *eLevel = new_level;
+    }
+
+    DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu"
+            "Level = %lu", __func__, *eProfile, *eLevel);
+
+    return true;
 }
 
 bool venc_dev::venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate)
 {
-  unsigned const int *profile_tbl = NULL;
+    unsigned const int *profile_tbl = NULL;
 
-  switch(m_sVenc_cfg.codectype)
-  {
-    case VEN_CODEC_MPEG4:
-      if(m_eProfile == OMX_VIDEO_MPEG4ProfileSimple)
-      {
-        profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
-      }
-      else if(m_eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-      {
-        profile_tbl = (unsigned int const *)
-          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("Unsupported MPEG4 profile type %lu", m_eProfile);
-        return false;
-      }
-      break;
-    case VEN_CODEC_H264:
-      if(m_eProfile == OMX_VIDEO_AVCProfileBaseline)
-      {
-        profile_tbl = (unsigned int const *)h264_profile_level_table;
-      }
-      else if(m_eProfile == OMX_VIDEO_AVCProfileHigh)
-      {
-        profile_tbl = (unsigned int const *)
-          (&h264_profile_level_table[H264_HP_START]);
-      }
-      else if(m_eProfile == OMX_VIDEO_AVCProfileMain)
-      {
-        profile_tbl = (unsigned int const *)
-          (&h264_profile_level_table[H264_MP_START]);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("Unsupported AVC profile type %lu", m_eProfile);
-        return false;
-      }
+    switch (m_sVenc_cfg.codectype) {
+        case VEN_CODEC_MPEG4:
 
-      break;
-    case VEN_CODEC_H263:
-      if(m_eProfile == OMX_VIDEO_H263ProfileBaseline)
-      {
-        profile_tbl = (unsigned int const *)h263_profile_level_table;
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("Unsupported H.263 profile type %lu", m_eProfile);
-        return false;
-      }
-      break;
-    default:
-      DEBUG_PRINT_ERROR("%s: unknown codec type", __func__);
-      return false;
-  }
-  while(profile_tbl[0] != 0)
-  {
-    if(profile_tbl[3] == m_eLevel)
-    {
-      if(nTargetBitrate > profile_tbl[2])
-      {
-         DEBUG_PRINT_ERROR("Max. supported bitrate for Profile[%d] & Level[%d]"
-            " is %u", m_eProfile, m_eLevel, profile_tbl[2]);
-        return false;
-      }
+            if (m_eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
+                profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+            } else if (m_eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+                profile_tbl = (unsigned int const *)
+                    (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+            } else {
+                DEBUG_PRINT_ERROR("Unsupported MPEG4 profile type %lu", m_eProfile);
+                return false;
+            }
+
+            break;
+        case VEN_CODEC_H264:
+
+            if (m_eProfile == OMX_VIDEO_AVCProfileBaseline) {
+                profile_tbl = (unsigned int const *)h264_profile_level_table;
+            } else if (m_eProfile == OMX_VIDEO_AVCProfileHigh) {
+                profile_tbl = (unsigned int const *)
+                    (&h264_profile_level_table[H264_HP_START]);
+            } else if (m_eProfile == OMX_VIDEO_AVCProfileMain) {
+                profile_tbl = (unsigned int const *)
+                    (&h264_profile_level_table[H264_MP_START]);
+            } else {
+                DEBUG_PRINT_ERROR("Unsupported AVC profile type %lu", m_eProfile);
+                return false;
+            }
+
+            break;
+        case VEN_CODEC_H263:
+
+            if (m_eProfile == OMX_VIDEO_H263ProfileBaseline) {
+                profile_tbl = (unsigned int const *)h263_profile_level_table;
+            } else {
+                DEBUG_PRINT_ERROR("Unsupported H.263 profile type %lu", m_eProfile);
+                return false;
+            }
+
+            break;
+        default:
+            DEBUG_PRINT_ERROR("%s: unknown codec type", __func__);
+            return false;
     }
-    profile_tbl += 5;
-  }
-  return true;
+
+    while (profile_tbl[0] != 0) {
+        if (profile_tbl[3] == m_eLevel) {
+            if (nTargetBitrate > profile_tbl[2]) {
+                DEBUG_PRINT_ERROR("Max. supported bitrate for Profile[%d] & Level[%d]"
+                        " is %u", m_eProfile, m_eLevel, profile_tbl[2]);
+                return false;
+            }
+        }
+
+        profile_tbl += 5;
+    }
+
+    return true;
 }
 
 #ifdef _ANDROID_ICS_
 bool venc_dev::venc_set_meta_mode(bool mode)
 {
-  venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  ioctl_msg.in = &mode;
-  DEBUG_PRINT_HIGH("Set meta buffer mode: %d", mode);
-  if(ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
-    return false;
-  }
-  return true;
+    venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    ioctl_msg.in = &mode;
+    DEBUG_PRINT_HIGH("Set meta buffer mode: %d", mode);
+
+    if (ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < 0) {
+        DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
+        return false;
+    }
+
+    return true;
 }
 #endif
diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
index bddd8e4..46e85d0 100644
--- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
+++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
@@ -52,8 +52,7 @@
 #define MAX_SUPPORTED_SLICES_PER_FRAME 28 /* Max supported slices with 32 output buffers */
 
 /* MPEG4 profile and level table*/
-static const unsigned int mpeg4_profile_level_table[][5]=
-{
+static const unsigned int mpeg4_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
     {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
@@ -78,9 +77,8 @@
 };
 
 /* H264 profile and level table*/
-static const unsigned int h264_profile_level_table[][5]=
-{
-     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
+static const unsigned int h264_profile_level_table[][5]= {
+    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
     {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
     {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
@@ -138,8 +136,7 @@
 };
 
 /* H263 profile and level table*/
-static const unsigned int h263_profile_level_table[][5]=
-{
+static const unsigned int h263_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
     {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
@@ -169,1390 +166,1429 @@
 //constructor
 venc_dev::venc_dev(class omx_venc *venc_class)
 {
-	//nothing to do
-	int i = 0;
-	venc_handle = venc_class;
-	etb = ebd = ftb = fbd = 0;
-	for (i = 0; i < MAX_PORT; i++)
-		streaming[i] = false;
+    //nothing to do
+    int i = 0;
+    venc_handle = venc_class;
+    etb = ebd = ftb = fbd = 0;
 
-	paused = false;
-	async_thread_created = false;
-	color_format = 0;
-	pthread_mutex_init(&pause_resume_mlock, NULL);
-	pthread_cond_init(&pause_resume_cond, NULL);
-	memset(&extradata_info, 0, sizeof(extradata_info));
-	memset(&idrperiod, 0, sizeof(idrperiod));
-	memset(&multislice, 0, sizeof(multislice));
-	memset (&slice_mode, 0 , sizeof(slice_mode));
-	memset(&m_sVenc_cfg, 0, sizeof(m_sVenc_cfg));
-	memset(&rate_ctrl, 0, sizeof(rate_ctrl));
-	memset(&bitrate, 0, sizeof(bitrate));
-	memset(&intra_period, 0, sizeof(intra_period));
-	memset(&codec_profile, 0, sizeof(codec_profile));
-	memset(&set_param, 0, sizeof(set_param));
-	memset(&time_inc, 0, sizeof(time_inc));
-	memset(&m_sInput_buff_property, 0, sizeof(m_sInput_buff_property));
-	memset(&m_sOutput_buff_property, 0, sizeof(m_sOutput_buff_property));
-	memset(&session_qp, 0, sizeof(session_qp));
-	memset(&entropy, 0, sizeof(entropy));
-	memset(&dbkfilter, 0, sizeof(dbkfilter));
-	memset(&intra_refresh, 0, sizeof(intra_refresh));
-	memset(&hec, 0, sizeof(hec));
-	memset(&voptimecfg, 0, sizeof(voptimecfg));
-	memset(&capability, 0, sizeof(capability));
+    for (i = 0; i < MAX_PORT; i++)
+        streaming[i] = false;
+
+    paused = false;
+    async_thread_created = false;
+    color_format = 0;
+    pthread_mutex_init(&pause_resume_mlock, NULL);
+    pthread_cond_init(&pause_resume_cond, NULL);
+    memset(&extradata_info, 0, sizeof(extradata_info));
+    memset(&idrperiod, 0, sizeof(idrperiod));
+    memset(&multislice, 0, sizeof(multislice));
+    memset (&slice_mode, 0 , sizeof(slice_mode));
+    memset(&m_sVenc_cfg, 0, sizeof(m_sVenc_cfg));
+    memset(&rate_ctrl, 0, sizeof(rate_ctrl));
+    memset(&bitrate, 0, sizeof(bitrate));
+    memset(&intra_period, 0, sizeof(intra_period));
+    memset(&codec_profile, 0, sizeof(codec_profile));
+    memset(&set_param, 0, sizeof(set_param));
+    memset(&time_inc, 0, sizeof(time_inc));
+    memset(&m_sInput_buff_property, 0, sizeof(m_sInput_buff_property));
+    memset(&m_sOutput_buff_property, 0, sizeof(m_sOutput_buff_property));
+    memset(&session_qp, 0, sizeof(session_qp));
+    memset(&entropy, 0, sizeof(entropy));
+    memset(&dbkfilter, 0, sizeof(dbkfilter));
+    memset(&intra_refresh, 0, sizeof(intra_refresh));
+    memset(&hec, 0, sizeof(hec));
+    memset(&voptimecfg, 0, sizeof(voptimecfg));
+    memset(&capability, 0, sizeof(capability));
 }
 
 venc_dev::~venc_dev()
 {
-  //nothing to do
+    //nothing to do
 }
 
 void* venc_dev::async_venc_message_thread (void *input)
 {
-  struct venc_msg venc_msg;
-  omx_video* omx_venc_base = NULL;
-  omx_venc *omx = reinterpret_cast<omx_venc*>(input);
-  omx_venc_base = reinterpret_cast<omx_video*>(input);
-  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+    struct venc_msg venc_msg;
+    omx_video* omx_venc_base = NULL;
+    omx_venc *omx = reinterpret_cast<omx_venc*>(input);
+    omx_venc_base = reinterpret_cast<omx_video*>(input);
+    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
 
-  prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
-  struct v4l2_plane plane[VIDEO_MAX_PLANES];
-  struct pollfd pfd;
-  struct v4l2_buffer v4l2_buf;
-  struct v4l2_event dqevent;
-  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
-  pfd.fd = omx->handle->m_nDriver_fd;
-  int error_code = 0,rc=0;
+    prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    struct pollfd pfd;
+    struct v4l2_buffer v4l2_buf;
+    struct v4l2_event dqevent;
+    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
+    pfd.fd = omx->handle->m_nDriver_fd;
+    int error_code = 0,rc=0;
 
-  memset(&v4l2_buf, 0, sizeof(v4l2_buf));
-  while(1)
-  {
-	  pthread_mutex_lock(&omx->handle->pause_resume_mlock);
-	  if (omx->handle->paused) {
-		  venc_msg.msgcode = VEN_MSG_PAUSE;
-		  venc_msg.statuscode = VEN_S_SUCCESS;
-		  if(omx->async_message_process(input, &venc_msg) < 0)
-		  {
-			  DEBUG_PRINT_ERROR("\nERROR: Failed to process pause msg");
-			  pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
-			  break;
-		  }
+    memset(&v4l2_buf, 0, sizeof(v4l2_buf));
 
-		  /* Block here until the IL client resumes us again */
-		  pthread_cond_wait(&omx->handle->pause_resume_cond,
-				  &omx->handle->pause_resume_mlock);
+    while (1) {
+        pthread_mutex_lock(&omx->handle->pause_resume_mlock);
 
-		  venc_msg.msgcode = VEN_MSG_RESUME;
-		  venc_msg.statuscode = VEN_S_SUCCESS;
-		  if(omx->async_message_process(input, &venc_msg) < 0)
-		  {
-			  DEBUG_PRINT_ERROR("\nERROR: Failed to process resume msg");
-			  pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
-			  break;
-		  }
-	  }
-	  pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
+        if (omx->handle->paused) {
+            venc_msg.msgcode = VEN_MSG_PAUSE;
+            venc_msg.statuscode = VEN_S_SUCCESS;
 
-	  rc = poll(&pfd, 1, POLL_TIMEOUT);
-		if (!rc) {
-			DEBUG_PRINT_HIGH("Poll timedout, pipeline stalled due to client/firmware ETB: %d, EBD: %d, FTB: %d, FBD: %d\n",
-							 omx->handle->etb, omx->handle->ebd, omx->handle->ftb, omx->handle->fbd);
-			continue;
-		} else if (rc < 0) {
-			DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
-			break;
-		}
-		
-		if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
-			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
-			v4l2_buf.length = omx->handle->num_planes;
-			v4l2_buf.m.planes = plane;
-			while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
-				venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
-				venc_msg.statuscode=VEN_S_SUCCESS;
-				omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
-				venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
-				venc_msg.buf.offset = 0;
-				venc_msg.buf.flags = 0;
-				venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
-				venc_msg.buf.clientdata=(void*)omxhdr;
-				venc_msg.buf.timestamp = (uint64_t) v4l2_buf.timestamp.tv_sec * (uint64_t) 1000000 + (uint64_t) v4l2_buf.timestamp.tv_usec;
-				/* TODO: ideally report other types of frames as well
-				 * for now it doesn't look like IL client cares about
-				 * other types
-				 */
-				if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_IDRFRAME)
-					venc_msg.buf.flags |= QOMX_VIDEO_PictureTypeIDR;
-				if (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME)
-					venc_msg.buf.flags |= OMX_BUFFERFLAG_SYNCFRAME;
-				if(v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_CODECCONFIG)
-					venc_msg.buf.flags |= OMX_BUFFERFLAG_CODECCONFIG;
-				if(v4l2_buf.flags & V4L2_BUF_FLAG_EOS)
-					venc_msg.buf.flags |= OMX_BUFFERFLAG_EOS;
-				if(omx->handle->num_planes > 1 && v4l2_buf.m.planes->bytesused)
-					venc_msg.buf.flags |= OMX_BUFFERFLAG_EXTRADATA;
-				omx->handle->fbd++;
-				if(omx->async_message_process(input,&venc_msg) < 0)
-				{
-					DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
-					break;
-				}
-			}
-		}
-		if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
-			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
-			v4l2_buf.m.planes = plane;
-			v4l2_buf.length = 1;
-			while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
-				venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
-				venc_msg.statuscode=VEN_S_SUCCESS;
-				omxhdr=omx_venc_base->m_inp_mem_ptr+v4l2_buf.index;
-				venc_msg.buf.clientdata=(void*)omxhdr;
-				omx->handle->ebd++;
-				if(omx->async_message_process(input,&venc_msg) < 0)
-				{
-					DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
-					break;
-				}
-			}
-		}
-		if (pfd.revents & POLLPRI) {
-			rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
-			if(dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
-				DEBUG_PRINT_HIGH("CLOSE DONE\n");
-				break;
-			} else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
-				venc_msg.msgcode = VEN_MSG_FLUSH_INPUT_DONE;
-				venc_msg.statuscode = VEN_S_SUCCESS;
-				if (omx->async_message_process(input,&venc_msg) < 0) {
-					DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
-					break;
-				}
-				venc_msg.msgcode = VEN_MSG_FLUSH_OUPUT_DONE;
-				venc_msg.statuscode = VEN_S_SUCCESS;
-				if (omx->async_message_process(input,&venc_msg) < 0) {
-					DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
-					break;
-				}
-			} else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR){
-                                DEBUG_PRINT_ERROR("\n HW Error recieved \n");
-                                venc_msg.statuscode=VEN_S_EFAIL;
-				if (omx->async_message_process(input,&venc_msg) < 0) {
-                                        DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
-                                        break;
-                                }
-                        }
-		}
-  }
-  DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
-  return NULL;
+            if (omx->async_message_process(input, &venc_msg) < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: Failed to process pause msg");
+                pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
+                break;
+            }
+
+            /* Block here until the IL client resumes us again */
+            pthread_cond_wait(&omx->handle->pause_resume_cond,
+                    &omx->handle->pause_resume_mlock);
+
+            venc_msg.msgcode = VEN_MSG_RESUME;
+            venc_msg.statuscode = VEN_S_SUCCESS;
+
+            if (omx->async_message_process(input, &venc_msg) < 0) {
+                DEBUG_PRINT_ERROR("\nERROR: Failed to process resume msg");
+                pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
+                break;
+            }
+        }
+
+        pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
+
+        rc = poll(&pfd, 1, POLL_TIMEOUT);
+
+        if (!rc) {
+            DEBUG_PRINT_HIGH("Poll timedout, pipeline stalled due to client/firmware ETB: %d, EBD: %d, FTB: %d, FBD: %d\n",
+                    omx->handle->etb, omx->handle->ebd, omx->handle->ftb, omx->handle->fbd);
+            continue;
+        } else if (rc < 0) {
+            DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
+            break;
+        }
+
+        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
+            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+            v4l2_buf.length = omx->handle->num_planes;
+            v4l2_buf.m.planes = plane;
+
+            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+                venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
+                venc_msg.statuscode=VEN_S_SUCCESS;
+                omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
+                venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
+                venc_msg.buf.offset = 0;
+                venc_msg.buf.flags = 0;
+                venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
+                venc_msg.buf.clientdata=(void*)omxhdr;
+                venc_msg.buf.timestamp = (uint64_t) v4l2_buf.timestamp.tv_sec * (uint64_t) 1000000 + (uint64_t) v4l2_buf.timestamp.tv_usec;
+
+                /* TODO: ideally report other types of frames as well
+                 * for now it doesn't look like IL client cares about
+                 * other types
+                 */
+                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_IDRFRAME)
+                    venc_msg.buf.flags |= QOMX_VIDEO_PictureTypeIDR;
+
+                if (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME)
+                    venc_msg.buf.flags |= OMX_BUFFERFLAG_SYNCFRAME;
+
+                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_CODECCONFIG)
+                    venc_msg.buf.flags |= OMX_BUFFERFLAG_CODECCONFIG;
+
+                if (v4l2_buf.flags & V4L2_BUF_FLAG_EOS)
+                    venc_msg.buf.flags |= OMX_BUFFERFLAG_EOS;
+
+                if (omx->handle->num_planes > 1 && v4l2_buf.m.planes->bytesused)
+                    venc_msg.buf.flags |= OMX_BUFFERFLAG_EXTRADATA;
+
+                omx->handle->fbd++;
+
+                if (omx->async_message_process(input,&venc_msg) < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+                    break;
+                }
+            }
+        }
+
+        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
+            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+            v4l2_buf.m.planes = plane;
+            v4l2_buf.length = 1;
+
+            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+                venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
+                venc_msg.statuscode=VEN_S_SUCCESS;
+                omxhdr=omx_venc_base->m_inp_mem_ptr+v4l2_buf.index;
+                venc_msg.buf.clientdata=(void*)omxhdr;
+                omx->handle->ebd++;
+
+                if (omx->async_message_process(input,&venc_msg) < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+                    break;
+                }
+            }
+        }
+
+        if (pfd.revents & POLLPRI) {
+            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+
+            if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
+                DEBUG_PRINT_HIGH("CLOSE DONE\n");
+                break;
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
+                venc_msg.msgcode = VEN_MSG_FLUSH_INPUT_DONE;
+                venc_msg.statuscode = VEN_S_SUCCESS;
+
+                if (omx->async_message_process(input,&venc_msg) < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+                    break;
+                }
+
+                venc_msg.msgcode = VEN_MSG_FLUSH_OUPUT_DONE;
+                venc_msg.statuscode = VEN_S_SUCCESS;
+
+                if (omx->async_message_process(input,&venc_msg) < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+                    break;
+                }
+            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
+                DEBUG_PRINT_ERROR("\n HW Error recieved \n");
+                venc_msg.statuscode=VEN_S_EFAIL;
+
+                if (omx->async_message_process(input,&venc_msg) < 0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+                    break;
+                }
+            }
+        }
+    }
+
+    DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
+    return NULL;
 }
 
 static const int event_type[] = {
-	V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
-	V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
-	V4L2_EVENT_MSM_VIDC_SYS_ERROR
+    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
+    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
+    V4L2_EVENT_MSM_VIDC_SYS_ERROR
 };
 
 static OMX_ERRORTYPE subscribe_to_events(int fd)
 {
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_event_subscription sub;
-	int array_sz = sizeof(event_type)/sizeof(int);
-	int i,rc;
-	memset(&sub, 0, sizeof(sub));
-	if (fd < 0) {
-		printf("Invalid input: %d\n", fd);
-		return OMX_ErrorBadParameter;
-	}
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_event_subscription sub;
+    int array_sz = sizeof(event_type)/sizeof(int);
+    int i,rc;
+    memset(&sub, 0, sizeof(sub));
 
-	for (i = 0; i < array_sz; ++i) {
-		memset(&sub, 0, sizeof(sub));
-		sub.type = event_type[i];
-		rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
-		if (rc) {
-			printf("Failed to subscribe event: 0x%x\n", sub.type);
-			break;
-		}
-	}
-	if (i < array_sz) {
-		for (--i; i >=0 ; i--) {
-			memset(&sub, 0, sizeof(sub));
-			sub.type = event_type[i];
-			rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
-			if (rc)
-				printf("Failed to unsubscribe event: 0x%x\n", sub.type);
-		}
-		eRet = OMX_ErrorNotImplemented;
-	}
-	return eRet;
+    if (fd < 0) {
+        printf("Invalid input: %d\n", fd);
+        return OMX_ErrorBadParameter;
+    }
+
+    for (i = 0; i < array_sz; ++i) {
+        memset(&sub, 0, sizeof(sub));
+        sub.type = event_type[i];
+        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+
+        if (rc) {
+            printf("Failed to subscribe event: 0x%x\n", sub.type);
+            break;
+        }
+    }
+
+    if (i < array_sz) {
+        for (--i; i >=0 ; i--) {
+            memset(&sub, 0, sizeof(sub));
+            sub.type = event_type[i];
+            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+
+            if (rc)
+                printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+        }
+
+        eRet = OMX_ErrorNotImplemented;
+    }
+
+    return eRet;
 }
 
 bool venc_dev::handle_extradata(void *buffer, int index)
 {
-	OMX_BUFFERHEADERTYPE *p_bufhdr = (OMX_BUFFERHEADERTYPE *) buffer;
-	OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
-	if (!extradata_info.uaddr) {
-		DEBUG_PRINT_ERROR("Extradata buffers not allocated\n");
-		return false;
-	}
-	p_extra = (OMX_OTHER_EXTRADATATYPE *) ((unsigned)(p_bufhdr->pBuffer + p_bufhdr->nOffset + p_bufhdr->nFilledLen + 3)&(~3));
-	char *p_extradata = extradata_info.uaddr + index * extradata_info.buffer_size;
-	if ((OMX_U8*)p_extra > (p_bufhdr->pBuffer + p_bufhdr->nAllocLen)){
-		DEBUG_PRINT_ERROR("Insufficient buffer size\n");
-		p_extra = NULL;
-		return false;
-	}
-	memcpy(p_extra, p_extradata, extradata_info.buffer_size);
-	return true;
+    OMX_BUFFERHEADERTYPE *p_bufhdr = (OMX_BUFFERHEADERTYPE *) buffer;
+    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
+
+    if (!extradata_info.uaddr) {
+        DEBUG_PRINT_ERROR("Extradata buffers not allocated\n");
+        return false;
+    }
+
+    p_extra = (OMX_OTHER_EXTRADATATYPE *) ((unsigned)(p_bufhdr->pBuffer + p_bufhdr->nOffset + p_bufhdr->nFilledLen + 3)&(~3));
+    char *p_extradata = extradata_info.uaddr + index * extradata_info.buffer_size;
+
+    if ((OMX_U8*)p_extra > (p_bufhdr->pBuffer + p_bufhdr->nAllocLen)) {
+        DEBUG_PRINT_ERROR("Insufficient buffer size\n");
+        p_extra = NULL;
+        return false;
+    }
+
+    memcpy(p_extra, p_extradata, extradata_info.buffer_size);
+    return true;
 }
 
 int venc_dev::venc_set_format(int format)
 {
-	int rc = true;
-	if (format)
-		color_format = format;
-	else
-	{
-		color_format = 0;
-		rc = false;
-	}
-	return rc;
+    int rc = true;
+
+    if (format)
+        color_format = format;
+    else {
+        color_format = 0;
+        rc = false;
+    }
+
+    return rc;
 }
 
 OMX_ERRORTYPE venc_dev::allocate_extradata()
 {
-	if (extradata_info.allocated) {
-		DEBUG_PRINT_ERROR("2nd allocation return");
-		return OMX_ErrorNone;
-	}
-#ifdef USE_ION
-  if (extradata_info.buffer_size) {
-    if (extradata_info.ion.ion_alloc_data.handle) {
-      munmap((void *)extradata_info.uaddr, extradata_info.size);
-      close(extradata_info.ion.fd_ion_data.fd);
-      free_ion_memory(&extradata_info.ion);
+    if (extradata_info.allocated) {
+        DEBUG_PRINT_ERROR("2nd allocation return");
+        return OMX_ErrorNone;
     }
-    extradata_info.size = (extradata_info.size + 4095) & (~4095);
 
-    extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
-        extradata_info.size,
-        &extradata_info.ion.ion_alloc_data,
-        &extradata_info.ion.fd_ion_data, 0);
-    if (extradata_info.ion.ion_device_fd < 0) {
-      DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
-      return OMX_ErrorInsufficientResources;
+#ifdef USE_ION
+
+    if (extradata_info.buffer_size) {
+        if (extradata_info.ion.ion_alloc_data.handle) {
+            munmap((void *)extradata_info.uaddr, extradata_info.size);
+            close(extradata_info.ion.fd_ion_data.fd);
+            free_ion_memory(&extradata_info.ion);
+        }
+
+        extradata_info.size = (extradata_info.size + 4095) & (~4095);
+
+        extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
+                extradata_info.size,
+                &extradata_info.ion.ion_alloc_data,
+                &extradata_info.ion.fd_ion_data, 0);
+
+        if (extradata_info.ion.ion_device_fd < 0) {
+            DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
+            return OMX_ErrorInsufficientResources;
+        }
+
+        extradata_info.uaddr = (char *)mmap(NULL,
+                extradata_info.size,
+                PROT_READ|PROT_WRITE, MAP_SHARED,
+                extradata_info.ion.fd_ion_data.fd , 0);
+
+        if (extradata_info.uaddr == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
+            close(extradata_info.ion.fd_ion_data.fd);
+            free_ion_memory(&extradata_info.ion);
+            return OMX_ErrorInsufficientResources;
+        }
     }
-    extradata_info.uaddr = (char *)mmap(NULL,
-        extradata_info.size,
-        PROT_READ|PROT_WRITE, MAP_SHARED,
-        extradata_info.ion.fd_ion_data.fd , 0);
-    if (extradata_info.uaddr == MAP_FAILED) {
-      DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
-      close(extradata_info.ion.fd_ion_data.fd);
-      free_ion_memory(&extradata_info.ion);
-      return OMX_ErrorInsufficientResources;
-    }
-  }
+
 #endif
-  extradata_info.allocated = 1;
-  return OMX_ErrorNone;
+    extradata_info.allocated = 1;
+    return OMX_ErrorNone;
 }
 
-void venc_dev::free_extradata() {
+void venc_dev::free_extradata()
+{
 #ifdef USE_ION
-  if (extradata_info.uaddr) {
-    munmap((void *)extradata_info.uaddr, extradata_info.size);
-    close(extradata_info.ion.fd_ion_data.fd);
-    free_ion_memory(&extradata_info.ion);
-  }
-  memset(&extradata_info, 0, sizeof(extradata_info));
+
+    if (extradata_info.uaddr) {
+        munmap((void *)extradata_info.uaddr, extradata_info.size);
+        close(extradata_info.ion.fd_ion_data.fd);
+        free_ion_memory(&extradata_info.ion);
+    }
+
+    memset(&extradata_info, 0, sizeof(extradata_info));
 #endif
 }
 
 bool venc_dev::venc_open(OMX_U32 codec)
 {
-  int r;
-  unsigned int alignment = 0,buffer_size = 0, temp =0;
-  struct v4l2_control control;
-  OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_enc";
+    int r;
+    unsigned int alignment = 0,buffer_size = 0, temp =0;
+    struct v4l2_control control;
+    OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_enc";
 
-  char platform_name[64];
-  property_get("ro.board.platform", platform_name, "0");
-  if (!strncmp(platform_name, "msm8610", 7)) {
-    device_name = (OMX_STRING)"/dev/video/q6_enc";
-  }
+    char platform_name[64];
+    property_get("ro.board.platform", platform_name, "0");
 
-  m_nDriver_fd = open (device_name, O_RDWR);
-  if(m_nDriver_fd == 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
+    if (!strncmp(platform_name, "msm8610", 7)) {
+        device_name = (OMX_STRING)"/dev/video/q6_enc";
+    }
+
     m_nDriver_fd = open (device_name, O_RDWR);
-  }
 
-  if((int)m_nDriver_fd < 0)
-  {
-    DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
-    return false;
-  }
+    if (m_nDriver_fd == 0) {
+        DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
+        m_nDriver_fd = open (device_name, O_RDWR);
+    }
 
-  DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
-  // set the basic configuration of the video encoder driver
-  m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
-  m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
-  m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
-  m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
-  m_sVenc_cfg.fps_num = 30;
-  m_sVenc_cfg.fps_den = 1;
-  m_sVenc_cfg.targetbitrate = 64000;
-  m_sVenc_cfg.inputformat= V4L2_PIX_FMT_NV12;
-  if(codec == OMX_VIDEO_CodingMPEG4)
-  {
-    m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
-    codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
-    profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
+    if ((int)m_nDriver_fd < 0) {
+        DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
+    // set the basic configuration of the video encoder driver
+    m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
+    m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
+    m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
+    m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
+    m_sVenc_cfg.fps_num = 30;
+    m_sVenc_cfg.fps_den = 1;
+    m_sVenc_cfg.targetbitrate = 64000;
+    m_sVenc_cfg.inputformat= V4L2_PIX_FMT_NV12;
+
+    if (codec == OMX_VIDEO_CodingMPEG4) {
+        m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
+        codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
+        profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
 #ifdef OUTPUT_BUFFER_LOG
-    strcat(outputfilename, "m4v");
+        strcat(outputfilename, "m4v");
 #endif
-  }
-  else if(codec == OMX_VIDEO_CodingH263)
-  {
-    m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
-    codec_profile.profile = VEN_PROFILE_H263_BASELINE;
-    profile_level.level = VEN_LEVEL_H263_20;
+    } else if (codec == OMX_VIDEO_CodingH263) {
+        m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
+        codec_profile.profile = VEN_PROFILE_H263_BASELINE;
+        profile_level.level = VEN_LEVEL_H263_20;
 #ifdef OUTPUT_BUFFER_LOG
-    strcat(outputfilename, "263");
+        strcat(outputfilename, "263");
 #endif
-  }
-  if(codec == OMX_VIDEO_CodingAVC)
-  {
-    m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
-    codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
-    profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
+    }
+
+    if (codec == OMX_VIDEO_CodingAVC) {
+        m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
+        codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
+        profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
 #ifdef OUTPUT_BUFFER_LOG
-    strcat(outputfilename, "264");
+        strcat(outputfilename, "264");
 #endif
-  }
-if (codec == OMX_VIDEO_CodingVPX)
-	{
-		m_sVenc_cfg.codectype = V4L2_PIX_FMT_VP8;
-		codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
-		profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
+    }
+
+    if (codec == OMX_VIDEO_CodingVPX) {
+        m_sVenc_cfg.codectype = V4L2_PIX_FMT_VP8;
+        codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
+        profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
 #ifdef OUTPUT_BUFFER_LOG
-		strcat(outputfilename, "ivf");
+        strcat(outputfilename, "ivf");
 #endif
-	}
+    }
+
 #ifdef INPUT_BUFFER_LOG
-  inputBufferFile1 = fopen (inputfilename, "ab");
-  if (!inputBufferFile1)
-	  DEBUG_PRINT_ERROR("Input File open failed");
+    inputBufferFile1 = fopen (inputfilename, "ab");
+
+    if (!inputBufferFile1)
+        DEBUG_PRINT_ERROR("Input File open failed");
+
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-  outputBufferFile1 = fopen (outputfilename, "ab");
+    outputBufferFile1 = fopen (outputfilename, "ab");
 #endif
-	int ret;	
-	ret = subscribe_to_events(m_nDriver_fd);
-	if (ret) {
-		DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
-		return false;
-	}
-	struct v4l2_capability cap;
-	struct v4l2_fmtdesc fdesc;
-	struct v4l2_format fmt;
-	struct v4l2_requestbuffers bufreq;
+    int ret;
+    ret = subscribe_to_events(m_nDriver_fd);
 
-		ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
-		if (ret) {
-		  DEBUG_PRINT_ERROR("Failed to query capabilities\n");
-		} else {
-		  DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
-				" version = %d, capabilities = %x\n", cap.driver, cap.card,
-				cap.bus_info, cap.version, cap.capabilities);
-		}
-		ret=0;
-		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fdesc.index=0;
-		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
-			DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
-					fdesc.pixelformat, fdesc.flags);
-			fdesc.index++;
-		}
-		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fdesc.index=0;
-		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
-			DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
-					fdesc.pixelformat, fdesc.flags);
-			fdesc.index++;
-		}
-		
-		m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
-		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-		fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
+    if (ret) {
+        DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
+        return false;
+    }
 
-		/*TODO: Return values not handled properly in this function anywhere.
-		 * Need to handle those.*/
-		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
-		if (ret) {
-			DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
-			return false;
-		}
-		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+    struct v4l2_capability cap;
 
-		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
-		
-		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
-		m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+    struct v4l2_fmtdesc fdesc;
 
-		bufreq.memory = V4L2_MEMORY_USERPTR;
-		bufreq.count = 2;
+    struct v4l2_format fmt;
 
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
-		m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
+    struct v4l2_requestbuffers bufreq;
 
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		bufreq.count = 2;
-		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
-		m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
+    ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
+
+    if (ret) {
+        DEBUG_PRINT_ERROR("Failed to query capabilities\n");
+    } else {
+        DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
+                " version = %d, capabilities = %x\n", cap.driver, cap.card,
+                cap.bus_info, cap.version, cap.capabilities);
+    }
+
+    ret=0;
+    fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    fdesc.index=0;
+
+    while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+        DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+                fdesc.pixelformat, fdesc.flags);
+        fdesc.index++;
+    }
+
+    fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    fdesc.index=0;
+
+    while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+        DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+                fdesc.pixelformat, fdesc.flags);
+        fdesc.index++;
+    }
+
+    m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
+    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
+
+    /*TODO: Return values not handled properly in this function anywhere.
+     * Need to handle those.*/
+    ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+
+    if (ret) {
+        DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
+        return false;
+    }
+
+    m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+
+    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+    fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+
+    ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+    m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+
+    bufreq.memory = V4L2_MEMORY_USERPTR;
+    bufreq.count = 2;
+
+    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+    m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
+
+    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    bufreq.count = 2;
+    ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+    m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
 
 
-  stopped = 0;
-  metadatamode = 0;
+    stopped = 0;
+    metadatamode = 0;
 
-  control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE;
-  control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE;
+    control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE;
+    control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE;
 
-  DEBUG_PRINT_LOW("Calling IOCTL to disable seq_hdr in sync_frame id=%d, val=%d\n", control.id, control.value);
-  if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control))
-	  DEBUG_PRINT_ERROR("Failed to set control\n");
+    DEBUG_PRINT_LOW("Calling IOCTL to disable seq_hdr in sync_frame id=%d, val=%d\n", control.id, control.value);
 
-  struct v4l2_frmsizeenum frmsize;
+    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control))
+        DEBUG_PRINT_ERROR("Failed to set control\n");
 
-  //Get the hardware capabilities
-  memset((void *)&frmsize,0,sizeof(frmsize));
-  frmsize.index = 0;
-  frmsize.pixel_format = m_sVenc_cfg.codectype;
-  ret = ioctl(m_nDriver_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
-  if(ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
-      DEBUG_PRINT_ERROR("Failed to get framesizes\n");
-      return false;
-  }
+    struct v4l2_frmsizeenum frmsize;
 
-  if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
-      capability.min_width = frmsize.stepwise.min_width;
-      capability.max_width = frmsize.stepwise.max_width;
-      capability.min_height = frmsize.stepwise.min_height;
-      capability.max_height = frmsize.stepwise.max_height;
-  }
+    //Get the hardware capabilities
+    memset((void *)&frmsize,0,sizeof(frmsize));
+    frmsize.index = 0;
+    frmsize.pixel_format = m_sVenc_cfg.codectype;
+    ret = ioctl(m_nDriver_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
 
-  return true;
+    if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
+        DEBUG_PRINT_ERROR("Failed to get framesizes\n");
+        return false;
+    }
+
+    if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
+        capability.min_width = frmsize.stepwise.min_width;
+        capability.max_width = frmsize.stepwise.max_width;
+        capability.min_height = frmsize.stepwise.min_height;
+        capability.max_height = frmsize.stepwise.max_height;
+    }
+
+    return true;
 }
 
 
 static OMX_ERRORTYPE unsubscribe_to_events(int fd)
 {
-	OMX_ERRORTYPE eRet = OMX_ErrorNone;
-	struct v4l2_event_subscription sub;
-	int array_sz = sizeof(event_type)/sizeof(int);
-	int i,rc;
-	if (fd < 0) {
-		printf("Invalid input: %d\n", fd);
-		return OMX_ErrorBadParameter;
-	}
+    OMX_ERRORTYPE eRet = OMX_ErrorNone;
+    struct v4l2_event_subscription sub;
+    int array_sz = sizeof(event_type)/sizeof(int);
+    int i,rc;
 
-	for (i = 0; i < array_sz; ++i) {
-		memset(&sub, 0, sizeof(sub));
-		sub.type = event_type[i];
-		rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
-		if (rc) {
-			printf("Failed to unsubscribe event: 0x%x\n", sub.type);
-			break;
-		}
-	}
-	return eRet;
+    if (fd < 0) {
+        printf("Invalid input: %d\n", fd);
+        return OMX_ErrorBadParameter;
+    }
+
+    for (i = 0; i < array_sz; ++i) {
+        memset(&sub, 0, sizeof(sub));
+        sub.type = event_type[i];
+        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+
+        if (rc) {
+            printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+            break;
+        }
+    }
+
+    return eRet;
 }
 
 void venc_dev::venc_close()
 {
-  struct v4l2_encoder_cmd enc;
-  DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
-  if((int)m_nDriver_fd >= 0)
-  {
-    enc.cmd = V4L2_ENC_CMD_STOP;
-    ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc);
-    DEBUG_PRINT_HIGH("venc_close E\n");
-    if (async_thread_created)
-		pthread_join(m_tid,NULL);
-    DEBUG_PRINT_HIGH("venc_close X\n");
-    unsubscribe_to_events(m_nDriver_fd);
-    close(m_nDriver_fd);
-    m_nDriver_fd = -1;
-  }
+    struct v4l2_encoder_cmd enc;
+    DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
+
+    if ((int)m_nDriver_fd >= 0) {
+        enc.cmd = V4L2_ENC_CMD_STOP;
+        ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc);
+        DEBUG_PRINT_HIGH("venc_close E\n");
+
+        if (async_thread_created)
+            pthread_join(m_tid,NULL);
+
+        DEBUG_PRINT_HIGH("venc_close X\n");
+        unsubscribe_to_events(m_nDriver_fd);
+        close(m_nDriver_fd);
+        m_nDriver_fd = -1;
+    }
+
 #ifdef INPUT_BUFFER_LOG
-  fclose (inputBufferFile1);
+    fclose (inputBufferFile1);
 #endif
 #ifdef OUTPUT_BUFFER_LOG
-  fclose (outputBufferFile1);
+    fclose (outputBufferFile1);
 #endif
 }
 
 bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
-                                unsigned long *actual_buff_count,
-                                unsigned long *buff_size,
-                                unsigned long port)
+        unsigned long *actual_buff_count,
+        unsigned long *buff_size,
+        unsigned long port)
 {
-  
-  unsigned long temp_count = 0;
 
-  if(port == 0)
-  {
-    if(*actual_buff_count > m_sInput_buff_property.mincount)
-    {
-      temp_count = m_sInput_buff_property.actualcount;
-      m_sInput_buff_property.actualcount = *actual_buff_count;
-      DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
-    }
-  }
-  else
-  {
-    if(*actual_buff_count > m_sOutput_buff_property.mincount)
-    {
-	  temp_count = m_sOutput_buff_property.actualcount;
-      m_sOutput_buff_property.actualcount = *actual_buff_count;
-      DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
-    }
-  }
+    unsigned long temp_count = 0;
 
-  return true;
+    if (port == 0) {
+        if (*actual_buff_count > m_sInput_buff_property.mincount) {
+            temp_count = m_sInput_buff_property.actualcount;
+            m_sInput_buff_property.actualcount = *actual_buff_count;
+            DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
+        }
+    } else {
+        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
+            temp_count = m_sOutput_buff_property.actualcount;
+            m_sOutput_buff_property.actualcount = *actual_buff_count;
+            DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
+        }
+    }
+
+    return true;
 
 }
 
 bool venc_dev::venc_loaded_start()
 {
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_loaded_stop()
 {
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_loaded_start_done()
 {
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_loaded_stop_done()
 {
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_get_seq_hdr(void *buffer,
-    unsigned buffer_size, unsigned *header_len)
+        unsigned buffer_size, unsigned *header_len)
 {
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
-                                unsigned long *actual_buff_count,
-                                unsigned long *buff_size,
-                                unsigned long port)
+        unsigned long *actual_buff_count,
+        unsigned long *buff_size,
+        unsigned long port)
 {
-	struct v4l2_format fmt;
-	struct v4l2_requestbuffers bufreq;
-	unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
-	int ret;
-  if(port == 0)
-  {
-	fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-	fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-	fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
-	ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
-	m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-	bufreq.memory = V4L2_MEMORY_USERPTR;
-	if (*actual_buff_count)
-		bufreq.count = *actual_buff_count;
-	else
-		bufreq.count = 2;
-	bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
-	if (ret) {
-                        DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
-                        return false;
-                }
-    m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
-    *min_buff_count = m_sInput_buff_property.mincount;
-    *actual_buff_count = m_sInput_buff_property.actualcount;
-#ifdef USE_ION
-// For ION memory allocations of the allocated buffer size
-// must be 4k aligned, hence aligning the input buffer
-// size to 4k.
-		m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095) & (~4095);
-#endif
-		*buff_size = m_sInput_buff_property.datasize;
-	}
-	else
-	{
-		int extra_idx = 0;
-		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-		fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
-		
-		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
-		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-		fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
+    struct v4l2_format fmt;
+    struct v4l2_requestbuffers bufreq;
+    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
+    int ret;
 
-		ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
-		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-		bufreq.memory = V4L2_MEMORY_USERPTR;
-		if (*actual_buff_count)
-			bufreq.count = *actual_buff_count;
-		else
-			bufreq.count = 2;
-		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
-		if (ret) {
-			DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS CAPTURE_MPLANE Failed \n ");
-			return false;
-		}
-		m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
-		*min_buff_count = m_sOutput_buff_property.mincount;
-		*actual_buff_count = m_sOutput_buff_property.actualcount;
-		*buff_size = m_sOutput_buff_property.datasize;
-		num_planes = fmt.fmt.pix_mp.num_planes;
-		extra_idx = EXTRADATA_IDX(num_planes);
-		if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-			extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
-		} else if (extra_idx >= VIDEO_MAX_PLANES) {
-			DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
-			return OMX_ErrorBadParameter;
-		}
-		extradata_info.buffer_size = extra_data_size;
-		extradata_info.count = m_sOutput_buff_property.actualcount;
-		extradata_info.size = extradata_info.buffer_size * extradata_info.count;
-	}
-	return true;
+    if (port == 0) {
+        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
+        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+        bufreq.memory = V4L2_MEMORY_USERPTR;
+
+        if (*actual_buff_count)
+            bufreq.count = *actual_buff_count;
+        else
+            bufreq.count = 2;
+
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+
+        if (ret) {
+            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
+            return false;
+        }
+
+        m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
+        *min_buff_count = m_sInput_buff_property.mincount;
+        *actual_buff_count = m_sInput_buff_property.actualcount;
+#ifdef USE_ION
+        // For ION memory allocations of the allocated buffer size
+        // must be 4k aligned, hence aligning the input buffer
+        // size to 4k.
+        m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095) & (~4095);
+#endif
+        *buff_size = m_sInput_buff_property.datasize;
+    } else {
+        int extra_idx = 0;
+        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
+
+        ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
+
+        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
+        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+        bufreq.memory = V4L2_MEMORY_USERPTR;
+
+        if (*actual_buff_count)
+            bufreq.count = *actual_buff_count;
+        else
+            bufreq.count = 2;
+
+        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+
+        if (ret) {
+            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS CAPTURE_MPLANE Failed \n ");
+            return false;
+        }
+
+        m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
+        *min_buff_count = m_sOutput_buff_property.mincount;
+        *actual_buff_count = m_sOutput_buff_property.actualcount;
+        *buff_size = m_sOutput_buff_property.datasize;
+        num_planes = fmt.fmt.pix_mp.num_planes;
+        extra_idx = EXTRADATA_IDX(num_planes);
+
+        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
+        } else if (extra_idx >= VIDEO_MAX_PLANES) {
+            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
+            return OMX_ErrorBadParameter;
+        }
+
+        extradata_info.buffer_size = extra_data_size;
+        extradata_info.count = m_sOutput_buff_property.actualcount;
+        extradata_info.size = extradata_info.buffer_size * extradata_info.count;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
 {
-  DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
-	struct v4l2_format fmt;
-	struct v4l2_requestbuffers bufreq;
-	int ret;
-  switch(index)
-  {
-  case OMX_IndexParamPortDefinition:
-    {
-      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
-      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
-      if(portDefn->nPortIndex == PORT_INDEX_IN)
-      {
-		if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
-        {
-          return false;
-        }
-        if(!venc_set_color_format(portDefn->format.video.eColorFormat))
-        {
-          return false;
-        }
-        if(m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
-          m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth)
-        {
-          DEBUG_PRINT_LOW("\n Basic parameter has changed");
-          m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
-          m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
-		  fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		  fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-		  fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-		  fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
-		  if(ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
-			  DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT OUTPUT_MPLANE Failed \n ");
-			  return false;
-		  }
-		  m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-		  bufreq.memory = V4L2_MEMORY_USERPTR;
-		  bufreq.count = portDefn->nBufferCountActual;
-		  bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		  if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
-			  DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
-			  return false;
-		  }
-		  if(bufreq.count == portDefn->nBufferCountActual)
-			  m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
-		  if(portDefn->nBufferCountActual >= m_sInput_buff_property.mincount)
-			  m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
-        }
-		DEBUG_PRINT_LOW("input: actual: %d, min: %d, count_req: %d\n",
-			  portDefn->nBufferCountActual, m_sInput_buff_property.mincount, bufreq.count);
-      }
-      else if(portDefn->nPortIndex == PORT_INDEX_OUT)
-      {
-		  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		  fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-		  fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-		  fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
-		  if(ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
-			  DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT CAPTURE_MPLANE Failed \n ");
-			  return false;
-		  }
-		  m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+    DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
+    struct v4l2_format fmt;
+    struct v4l2_requestbuffers bufreq;
+    int ret;
 
-        if(!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0))
-        {
-          return false;
-        }
-
-        if((portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
-            && (m_sOutput_buff_property.datasize == portDefn->nBufferSize))
-        {
-          m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
-		  bufreq.memory = V4L2_MEMORY_USERPTR;
-		  bufreq.count = portDefn->nBufferCountActual;
-		  bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		  if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq))
-		  {
-			  DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer count failed: requested: %lu, current: %lu",
-								portDefn->nBufferCountActual, m_sOutput_buff_property.actualcount);
-			  return false;
-		  }
-		  if(bufreq.count == portDefn->nBufferCountActual)
-			  m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
-		  if(portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
-			  m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
-		  if (num_planes > 1)
-			  extradata_info.count = m_sOutput_buff_property.actualcount;
-        }
-        else
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
-          return false;
-        }
-		DEBUG_PRINT_LOW("Output: actual: %d, min: %d, count_req: %d\n",
-			  portDefn->nBufferCountActual, m_sOutput_buff_property.mincount, bufreq.count);
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoPortFormat:
-    {
-      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
-      portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
-
-      if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
-      {
-        if(!venc_set_color_format(portFmt->eColorFormat))
-        {
-          return false;
-        }
-      }
-      else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(!venc_set_encode_framerate(portFmt->xFramerate, 0))
-        {
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoBitrate:
-    {
-      OMX_VIDEO_PARAM_BITRATETYPE* pParam;
-      pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
-
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(!venc_set_target_bitrate(pParam->nTargetBitrate, 0))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
-          return false;
-        }
-        if(!venc_set_ratectrl_cfg(pParam->eControlRate))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoMpeg4:
-    {
-      OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
-      OMX_U32 bFrames = 0;
-
-      pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(!venc_set_voptiming_cfg(pParam->nTimeIncRes))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
-          return false;
-        }
-        m_profile_set = false;
-        m_level_set = false;
-        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
-          return false;
-        }
-        else {
-          if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-          {
-            if(pParam->nBFrames)
+    switch (index) {
+        case OMX_IndexParamPortDefinition:
             {
-              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-              bFrames = 1;
+                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
+
+                if (portDefn->nPortIndex == PORT_INDEX_IN) {
+                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
+                        return false;
+                    }
+
+                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
+                        return false;
+                    }
+
+                    if (m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
+                            m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth) {
+                        DEBUG_PRINT_LOW("\n Basic parameter has changed");
+                        m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
+                        m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
+                        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+                        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+                        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+                        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+
+                        if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
+                            DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT OUTPUT_MPLANE Failed \n ");
+                            return false;
+                        }
+
+                        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+                        bufreq.memory = V4L2_MEMORY_USERPTR;
+                        bufreq.count = portDefn->nBufferCountActual;
+                        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+
+                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
+                            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
+                            return false;
+                        }
+
+                        if (bufreq.count == portDefn->nBufferCountActual)
+                            m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
+
+                        if (portDefn->nBufferCountActual >= m_sInput_buff_property.mincount)
+                            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
+                    }
+
+                    DEBUG_PRINT_LOW("input: actual: %d, min: %d, count_req: %d\n",
+                            portDefn->nBufferCountActual, m_sInput_buff_property.mincount, bufreq.count);
+                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
+                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+                    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+                    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
+
+                    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
+                        DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT CAPTURE_MPLANE Failed \n ");
+                        return false;
+                    }
+
+                    m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+
+                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
+                        return false;
+                    }
+
+                    if ((portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
+                            && (m_sOutput_buff_property.datasize == portDefn->nBufferSize)) {
+                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
+                        bufreq.memory = V4L2_MEMORY_USERPTR;
+                        bufreq.count = portDefn->nBufferCountActual;
+                        bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+
+                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
+                            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer count failed: requested: %lu, current: %lu",
+                                    portDefn->nBufferCountActual, m_sOutput_buff_property.actualcount);
+                            return false;
+                        }
+
+                        if (bufreq.count == portDefn->nBufferCountActual)
+                            m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
+
+                        if (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
+                            m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
+
+                        if (num_planes > 1)
+                            extradata_info.count = m_sOutput_buff_property.actualcount;
+                    } else {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
+                        return false;
+                    }
+
+                    DEBUG_PRINT_LOW("Output: actual: %d, min: %d, count_req: %d\n",
+                            portDefn->nBufferCountActual, m_sOutput_buff_property.mincount, bufreq.count);
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
+                }
+
+                break;
             }
-          }
-        else
-          {
-            if(pParam->nBFrames)
+        case OMX_IndexParamVideoPortFormat:
             {
-              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-              bFrames = 0;
+                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
+                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
+
+                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
+                    if (!venc_set_color_format(portFmt->eColorFormat)) {
+                        return false;
+                    }
+                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
+                }
+
+                break;
             }
-          }
-        }
-        if(!venc_set_intra_period (pParam->nPFrames,bFrames))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-        if(!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoH263:
-    {
-      OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
-      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
-      OMX_U32 bFrames = 0;
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        m_profile_set = false;
-        m_level_set = false;
-        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
-          return false;
-        }
-        if (pParam->nBFrames)
-          DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
-
-        if(venc_set_intra_period (pParam->nPFrames, bFrames) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoAvc:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
-      OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
-      OMX_U32 bFrames = 0;
-
-      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
-            pParam->eProfile,pParam->eLevel);
-
-        m_profile_set = false;
-        m_level_set = false;
-
-        if(!venc_set_profile_level (pParam->eProfile,pParam->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
-                            pParam->eProfile, pParam->eLevel);
-          return false;
-        }
-        else {
-          if(pParam->eProfile != OMX_VIDEO_AVCProfileBaseline)
-          {
-            if(pParam->nBFrames)
+        case OMX_IndexParamVideoBitrate:
             {
-              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
-              bFrames = 1;
+                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
+                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
+
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
+                        return false;
+                    }
+
+                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
+                }
+
+                break;
             }
-          }
-        else
-          {
-            if(pParam->nBFrames)
+        case OMX_IndexParamVideoMpeg4:
             {
-              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
-              bFrames = 0;
+                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
+                OMX_U32 bFrames = 0;
+
+                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
+
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
+                        return false;
+                    }
+
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+                        return false;
+                    } else {
+                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+                                bFrames = 1;
+                            }
+                        } else {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                                bFrames = 0;
+                            }
+                        }
+                    }
+
+                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+
+                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
+                }
+
+                break;
             }
-          }
-        }
-        if(!venc_set_intra_period (pParam->nPFrames, bFrames))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-        if(!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
-          return false;
-        }
-        if(!venc_set_inloop_filter (pParam->eLoopFilterMode))
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
-          return false;
-        }
-        if(!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing))
-        {
-          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
-      }
-      //TBD, lot of other variables to be updated, yet to decide
-      break;
-    }
-  case OMX_IndexParamVideoIntraRefresh:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
-      OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
-        (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
-      if(intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoErrorCorrection:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
-      OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
-        (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
-      if(error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_error_resilience(error_resilience) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoProfileLevelCurrent:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
-      OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
-      (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
-      if(profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        m_profile_set = false;
-        m_level_set = false;
-        if(!venc_set_profile_level (profile_level->eProfile,
-                                   profile_level->eLevel))
-        {
-          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
-      }
-      break;
-    }
-  case OMX_IndexParamVideoQuantization:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
-      OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
-        (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
-      if(session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_session_qp (session_qp->nQpI,
+        case OMX_IndexParamVideoH263:
+            {
+                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
+                OMX_U32 bFrames = 0;
+
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+                        return false;
+                    }
+
+                    if (pParam->nBFrames)
+                        DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
+
+                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoAvc:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
+                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+                OMX_U32 bFrames = 0;
+
+                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
+                            pParam->eProfile,pParam->eLevel);
+
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
+                                pParam->eProfile, pParam->eLevel);
+                        return false;
+                    } else {
+                        if (pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+                                bFrames = 1;
+                            }
+                        } else {
+                            if (pParam->nBFrames) {
+                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+                                bFrames = 0;
+                            }
+                        }
+                    }
+
+                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+
+                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
+                        return false;
+                    }
+
+                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
+                        return false;
+                    }
+
+                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
+                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
+                }
+
+                //TBD, lot of other variables to be updated, yet to decide
+                break;
+            }
+        case OMX_IndexParamVideoIntraRefresh:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
+                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
+                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
+
+                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoErrorCorrection:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
+                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
+                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
+
+                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_error_resilience(error_resilience) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoProfileLevelCurrent:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
+                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
+                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+
+                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    m_profile_set = false;
+                    m_level_set = false;
+
+                    if (!venc_set_profile_level (profile_level->eProfile,
+                                profile_level->eLevel)) {
+                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
+                }
+
+                break;
+            }
+        case OMX_IndexParamVideoQuantization:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
+                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
+                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
+
+                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_session_qp (session_qp->nQpI,
                                 session_qp->nQpP,
-				session_qp->nQpB) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
-      }
-      break;
-    }
-  case OMX_QcomIndexEnableSliceDeliveryMode:
-    {
-       QOMX_EXTNINDEX_PARAMTYPE* pParam =
-          (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
-       if(pParam->nPortIndex == PORT_INDEX_OUT)
-       {
-         if(venc_set_slice_delivery_mode(pParam->bEnable) == false)
-         {
-           DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
-           return OMX_ErrorUnsupportedSetting;
-         }
-       }
-       else
-       {
-         DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
-            "called on wrong port(%d)", pParam->nPortIndex);
-         return OMX_ErrorBadPortIndex;
-       }
-       break;
-    }
-  case OMX_ExtraDataVideoEncoderSliceInfo:
-    {
-      DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
-      OMX_U32 extra_data = *(OMX_U32 *)paramData;
-      if(venc_set_extradata(extra_data) == false)
-      {
-         DEBUG_PRINT_ERROR("ERROR: Setting "
-            "OMX_ExtraDataVideoEncoderSliceInfo failed");
-         return false;
-      }
-	  extradata = true;
-      break;
-    }
-  case OMX_IndexParamVideoSliceFMO:
-  default:
-	  DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
-      index);
-    break;
-    //case
-  }
+                                session_qp->nQpB) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
+                }
 
-  return true;
+                break;
+            }
+        case OMX_QcomIndexEnableSliceDeliveryMode:
+            {
+                QOMX_EXTNINDEX_PARAMTYPE* pParam =
+                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+
+                if (pParam->nPortIndex == PORT_INDEX_OUT) {
+                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
+                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
+                            "called on wrong port(%d)", pParam->nPortIndex);
+                    return OMX_ErrorBadPortIndex;
+                }
+
+                break;
+            }
+        case OMX_ExtraDataVideoEncoderSliceInfo:
+            {
+                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
+                OMX_U32 extra_data = *(OMX_U32 *)paramData;
+
+                if (venc_set_extradata(extra_data) == false) {
+                    DEBUG_PRINT_ERROR("ERROR: Setting "
+                            "OMX_ExtraDataVideoEncoderSliceInfo failed");
+                    return false;
+                }
+
+                extradata = true;
+                break;
+            }
+        case OMX_IndexParamVideoSliceFMO:
+        default:
+            DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
+                    index);
+            break;
+            //case
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
 {
 
-  DEBUG_PRINT_LOW("\n Inside venc_set_config");
+    DEBUG_PRINT_LOW("\n Inside venc_set_config");
 
-  switch(index)
-  {
-  case OMX_IndexConfigVideoBitrate:
-    {
-      OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
-        configData;
-      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
-      if(bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
-      }
-      break;
-    }
-  case OMX_IndexConfigVideoFramerate:
-    {
-      OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
-        configData;
-      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
-      if(frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
-      }
-      break;
-    }
-  case QOMX_IndexConfigVideoIntraperiod:
-    {
-      DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
-      QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
-      (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
-      if(intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
-      {
-        if(venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-          return false;
-        }
-      }
-	  break;
-    }
-  case OMX_IndexConfigVideoIntraVOPRefresh:
-    {
-      OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
-        configData;
-      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
-      if(intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
-      {
-        if(venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false)
-        {
-          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
-          return false;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
-      }
-      break;
-    }
-  case OMX_IndexConfigCommonRotate:
-    {
-      OMX_CONFIG_ROTATIONTYPE *config_rotation =
-         reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
-      OMX_U32 nFrameWidth;
+    switch (index) {
+        case OMX_IndexConfigVideoBitrate:
+            {
+                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
+                    configData;
+                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
 
-      DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
-      nFrameWidth = m_sVenc_cfg.input_width;
-      m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
-      m_sVenc_cfg.input_height = nFrameWidth;
-      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
-          DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
-          return false;
-      }
-      break;
-    }
-  case OMX_IndexConfigVideoAVCIntraPeriod:
-	{
-		OMX_VIDEO_CONFIG_AVCINTRAPERIOD *avc_iperiod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
-		DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigVideoAVCIntraPeriod");
-		if(venc_set_idr_period(avc_iperiod->nPFrames, avc_iperiod->nIDRPeriod)
-			== false)
-		{
-			DEBUG_PRINT_ERROR("ERROR: Setting "
-				"OMX_IndexConfigVideoAVCIntraPeriod failed");
-			return false;
-		}
-		break;
-	}
-  default:
-    DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
-    break;
-  }
+                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
+                }
 
-  return true;
+                break;
+            }
+        case OMX_IndexConfigVideoFramerate:
+            {
+                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
+                    configData;
+                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
+
+                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
+                }
+
+                break;
+            }
+        case QOMX_IndexConfigVideoIntraperiod:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
+                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
+                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
+
+                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
+                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+                        return false;
+                    }
+                }
+
+                break;
+            }
+        case OMX_IndexConfigVideoIntraVOPRefresh:
+            {
+                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
+                    configData;
+                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
+
+                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
+                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
+                        return false;
+                    }
+                } else {
+                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
+                }
+
+                break;
+            }
+        case OMX_IndexConfigCommonRotate:
+            {
+                OMX_CONFIG_ROTATIONTYPE *config_rotation =
+                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+                OMX_U32 nFrameWidth;
+
+                DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
+                nFrameWidth = m_sVenc_cfg.input_width;
+                m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
+                m_sVenc_cfg.input_height = nFrameWidth;
+
+                if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
+                    DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
+                    return false;
+                }
+
+                break;
+            }
+        case OMX_IndexConfigVideoAVCIntraPeriod:
+            {
+                OMX_VIDEO_CONFIG_AVCINTRAPERIOD *avc_iperiod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
+                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigVideoAVCIntraPeriod");
+
+                if (venc_set_idr_period(avc_iperiod->nPFrames, avc_iperiod->nIDRPeriod)
+                        == false) {
+                    DEBUG_PRINT_ERROR("ERROR: Setting "
+                            "OMX_IndexConfigVideoAVCIntraPeriod failed");
+                    return false;
+                }
+
+                break;
+            }
+        default:
+            DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
+            break;
+    }
+
+    return true;
 }
 
 unsigned venc_dev::venc_stop( void)
 {
-	struct venc_msg venc_msg;
-	int rc = 0;
-	if(!stopped) {
-		enum v4l2_buf_type cap_type;
-		if (streaming[OUTPUT_PORT]) {
-			cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-			rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
-			if (rc) {
-				DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
-						cap_type, rc);
-			} else
-				streaming[OUTPUT_PORT] = false;
-		}
-		if (!rc && streaming[CAPTURE_PORT]) {
-			cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-			rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
-			if (rc) {
-				DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
-						cap_type, rc);
-			} else
-				streaming[CAPTURE_PORT] = false;
-		}
-		if (!rc) {
-			venc_stop_done();
-			stopped = 1;
-		}
-	}
-	return rc;
+    struct venc_msg venc_msg;
+    int rc = 0;
+
+    if (!stopped) {
+        enum v4l2_buf_type cap_type;
+
+        if (streaming[OUTPUT_PORT]) {
+            cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
+
+            if (rc) {
+                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
+                        cap_type, rc);
+            } else
+                streaming[OUTPUT_PORT] = false;
+        }
+
+        if (!rc && streaming[CAPTURE_PORT]) {
+            cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
+
+            if (rc) {
+                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
+                        cap_type, rc);
+            } else
+                streaming[CAPTURE_PORT] = false;
+        }
+
+        if (!rc) {
+            venc_stop_done();
+            stopped = 1;
+        }
+    }
+
+    return rc;
 }
 
 unsigned venc_dev::venc_pause(void)
 {
-	pthread_mutex_lock(&pause_resume_mlock);
-	paused = true;
-	pthread_mutex_unlock(&pause_resume_mlock);
-	return 0;
+    pthread_mutex_lock(&pause_resume_mlock);
+    paused = true;
+    pthread_mutex_unlock(&pause_resume_mlock);
+    return 0;
 }
 
 unsigned venc_dev::venc_resume(void)
 {
-	pthread_mutex_lock(&pause_resume_mlock);
-	paused = false;
-	pthread_mutex_unlock(&pause_resume_mlock);
+    pthread_mutex_lock(&pause_resume_mlock);
+    paused = false;
+    pthread_mutex_unlock(&pause_resume_mlock);
 
-	return pthread_cond_signal(&pause_resume_cond);
+    return pthread_cond_signal(&pause_resume_cond);
 }
 
 unsigned venc_dev::venc_start_done(void)
 {
-  struct venc_msg venc_msg;
-  venc_msg.msgcode = VEN_MSG_START;
-  venc_msg.statuscode = VEN_S_SUCCESS;
-  venc_handle->async_message_process(venc_handle,&venc_msg);
-  return 0;
+    struct venc_msg venc_msg;
+    venc_msg.msgcode = VEN_MSG_START;
+    venc_msg.statuscode = VEN_S_SUCCESS;
+    venc_handle->async_message_process(venc_handle,&venc_msg);
+    return 0;
 }
 
 unsigned venc_dev::venc_stop_done(void)
 {
-  struct venc_msg venc_msg;
-  free_extradata();
-  venc_msg.msgcode=VEN_MSG_STOP;
-  venc_msg.statuscode=VEN_S_SUCCESS;
-  venc_handle->async_message_process(venc_handle,&venc_msg);
-  return 0;
+    struct venc_msg venc_msg;
+    free_extradata();
+    venc_msg.msgcode=VEN_MSG_STOP;
+    venc_msg.statuscode=VEN_S_SUCCESS;
+    venc_handle->async_message_process(venc_handle,&venc_msg);
+    return 0;
 }
 
 unsigned venc_dev::venc_set_message_thread_id(pthread_t tid)
 {
- async_thread_created = true;
- m_tid=tid;
- return 0;
+    async_thread_created = true;
+    m_tid=tid;
+    return 0;
 }
 
 
 unsigned venc_dev::venc_start(void)
 {
-	enum v4l2_buf_type buf_type;
-	int ret,r;
-  DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
-        __func__);
-  if (!venc_set_profile_level(0, 0))
-  {
-    DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
-      __func__);
-  }
-  else
-  {
-    DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
-      __func__, codec_profile.profile, profile_level.level);
-  }
-  venc_config_print();
-  /* Check if slice_delivery mode is enabled & max slices is sufficient for encoding complete frame */
-  if (slice_mode.enable && multislice.mslice_size &&
-	  (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size) >= MAX_SUPPORTED_SLICES_PER_FRAME) {
-	  DEBUG_PRINT_ERROR("slice_mode: %d, max slices (%d) should be less than (%d)\n", slice_mode.enable,
-			(m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size),
-			MAX_SUPPORTED_SLICES_PER_FRAME);
-	  return 1;
-  }
+    enum v4l2_buf_type buf_type;
+    int ret,r;
+    DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
+            __func__);
 
-  buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-  DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
-  ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
+    if (!venc_set_profile_level(0, 0)) {
+        DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
+                __func__);
+    } else {
+        DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
+                __func__, codec_profile.profile, profile_level.level);
+    }
 
-  if (ret)
-	  return 1;
+    venc_config_print();
 
-  streaming[CAPTURE_PORT] = true;
-  return 0;
+    /* Check if slice_delivery mode is enabled & max slices is sufficient for encoding complete frame */
+    if (slice_mode.enable && multislice.mslice_size &&
+            (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size) >= MAX_SUPPORTED_SLICES_PER_FRAME) {
+        DEBUG_PRINT_ERROR("slice_mode: %d, max slices (%d) should be less than (%d)\n", slice_mode.enable,
+                (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size),
+                MAX_SUPPORTED_SLICES_PER_FRAME);
+        return 1;
+    }
+
+    buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+    ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
+
+    if (ret)
+        return 1;
+
+    streaming[CAPTURE_PORT] = true;
+    return 0;
 }
 
 void venc_dev::venc_config_print()
 {
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %ld, Profile %ld, level : %ld",
-                   m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %ld, Profile %ld, level : %ld",
+            m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
 
-  DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %ld, Height:%ld, Fps: %ld",
-                   m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
-                   m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
+    DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %ld, Height:%ld, Fps: %ld",
+            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
+            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %ld, RC: %ld, I-Period: %ld",
-                   bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %ld, RC: %ld, I-Period: %ld",
+            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %ld, qpP: %ld, qpb: %ld",
-                   session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %ld, qpP: %ld, qpb: %ld",
+            session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %ld, Slice-Mode: %ld, Slize_Size: %ld",
-                   voptimecfg.voptime_resolution, multislice.mslice_mode,
-                   multislice.mslice_size);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %ld, Slice-Mode: %ld, Slize_Size: %ld",
+            voptimecfg.voptime_resolution, multislice.mslice_mode,
+            multislice.mslice_size);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %ld",
-                   entropy.longentropysel, entropy.cabacmodel);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %ld",
+            entropy.longentropysel, entropy.cabacmodel);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %ld, alpha: %ld, Beta: %ld\n",
-                   dbkfilter.db_mode, dbkfilter.slicealpha_offset,
-                   dbkfilter.slicebeta_offset);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %ld, alpha: %ld, Beta: %ld\n",
+            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
+            dbkfilter.slicebeta_offset);
 
-  DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %ld, HEC: %ld, IDR Period: %ld\n",
-                   intra_refresh.mbcount, hec.header_extension, idrperiod.idrperiod);
+    DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %ld, HEC: %ld, IDR Period: %ld\n",
+            intra_refresh.mbcount, hec.header_extension, idrperiod.idrperiod);
 
 }
 
 unsigned venc_dev::venc_flush( unsigned port)
 {
-  struct v4l2_encoder_cmd enc;
-  DEBUG_PRINT_LOW("in %s", __func__);
+    struct v4l2_encoder_cmd enc;
+    DEBUG_PRINT_LOW("in %s", __func__);
 
-  enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH;
-  enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE;
+    enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH;
+    enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE;
 
-  if (ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc))
-  {
-    DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", port);
-    return -1;
-  }
-  return 0;
+    if (ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc)) {
+        DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", port);
+        return -1;
+    }
+
+    return 0;
 
 }
 
@@ -1562,1653 +1598,1624 @@
 bool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
 {
 
-	struct pmem *pmem_tmp;
-	struct v4l2_buffer buf;
-	struct v4l2_plane plane[VIDEO_MAX_PLANES];
-	int rc = 0, extra_idx;
+    struct pmem *pmem_tmp;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    int rc = 0, extra_idx;
 
-	pmem_tmp = (struct pmem *)buf_addr;
-	DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
+    pmem_tmp = (struct pmem *)buf_addr;
+    DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
 
-	if(port == PORT_INDEX_IN)
-	{
-		buf.index = index;
-		buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-		buf.memory = V4L2_MEMORY_USERPTR;
-		plane[0].length = pmem_tmp->size;
-		plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
-		plane[0].reserved[0] = pmem_tmp->fd;
-		plane[0].reserved[1] = 0;
-		plane[0].data_offset = pmem_tmp->offset;
-		buf.m.planes = plane;
-		buf.length = 1;
+    if (port == PORT_INDEX_IN) {
+        buf.index = index;
+        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        buf.memory = V4L2_MEMORY_USERPTR;
+        plane[0].length = pmem_tmp->size;
+        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
+        plane[0].reserved[0] = pmem_tmp->fd;
+        plane[0].reserved[1] = 0;
+        plane[0].data_offset = pmem_tmp->offset;
+        buf.m.planes = plane;
+        buf.length = 1;
 
-		rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
-		if (rc)
-			DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
-	}
-	else if(port == PORT_INDEX_OUT)
-	{
-		extra_idx = EXTRADATA_IDX(num_planes);
-		if ((num_planes > 1) && (extra_idx)) {
-			rc = allocate_extradata();
-			if (rc)
-				DEBUG_PRINT_ERROR("Failed to allocate extradata: %d\n", rc);
-		}
-		buf.index = index;
-		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-		buf.memory = V4L2_MEMORY_USERPTR;
-		plane[0].length = pmem_tmp->size;
-		plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
-		plane[0].reserved[0] = pmem_tmp->fd;
-		plane[0].reserved[1] = 0;
-		plane[0].data_offset = pmem_tmp->offset;
-		buf.m.planes = plane;
-		buf.length = num_planes;
+        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
 
-		if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-			plane[extra_idx].length = extradata_info.buffer_size;
-			plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
+        if (rc)
+            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
+    } else if (port == PORT_INDEX_OUT) {
+        extra_idx = EXTRADATA_IDX(num_planes);
+
+        if ((num_planes > 1) && (extra_idx)) {
+            rc = allocate_extradata();
+
+            if (rc)
+                DEBUG_PRINT_ERROR("Failed to allocate extradata: %d\n", rc);
+        }
+
+        buf.index = index;
+        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+        buf.memory = V4L2_MEMORY_USERPTR;
+        plane[0].length = pmem_tmp->size;
+        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
+        plane[0].reserved[0] = pmem_tmp->fd;
+        plane[0].reserved[1] = 0;
+        plane[0].data_offset = pmem_tmp->offset;
+        buf.m.planes = plane;
+        buf.length = num_planes;
+
+        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+            plane[extra_idx].length = extradata_info.buffer_size;
+            plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
 #ifdef USE_ION
-			plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
+            plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
 #endif
-			plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
-			plane[extra_idx].data_offset = 0;
-		} else if  (extra_idx >= VIDEO_MAX_PLANES) {
-			DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
-			return OMX_ErrorBadParameter;
-		}
-		rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
-		if (rc)
-			DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
-	} else {
-		DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
-		return false;
-	}
-	return true;
+            plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
+            plane[extra_idx].data_offset = 0;
+        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
+            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
+            return OMX_ErrorBadParameter;
+        }
+
+        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+        if (rc)
+            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
 {
-  struct pmem *pmem_tmp;
-  struct venc_bufferpayload dev_buffer;
+    struct pmem *pmem_tmp;
+    struct venc_bufferpayload dev_buffer;
 
-  memset(&dev_buffer, 0, sizeof(dev_buffer));
-  pmem_tmp = (struct pmem *)buf_addr;
+    memset(&dev_buffer, 0, sizeof(dev_buffer));
+    pmem_tmp = (struct pmem *)buf_addr;
 
-  if(port == PORT_INDEX_IN)
-  {
-    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
-    dev_buffer.fd  = pmem_tmp->fd;
-    dev_buffer.maped_size = pmem_tmp->size;
-    dev_buffer.sz = pmem_tmp->size;
-    dev_buffer.offset = pmem_tmp->offset;
-    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+    if (port == PORT_INDEX_IN) {
+        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+        dev_buffer.fd  = pmem_tmp->fd;
+        dev_buffer.maped_size = pmem_tmp->size;
+        dev_buffer.sz = pmem_tmp->size;
+        dev_buffer.offset = pmem_tmp->offset;
+        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
                 dev_buffer.pbuffer, \
                 dev_buffer.fd, \
                 dev_buffer.offset, \
                 dev_buffer.maped_size);
 
-  }
-  else if(port == PORT_INDEX_OUT)
-  {
-    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
-    dev_buffer.fd  = pmem_tmp->fd;
-    dev_buffer.sz = pmem_tmp->size;
-    dev_buffer.maped_size = pmem_tmp->size;
-    dev_buffer.offset = pmem_tmp->offset;
+    } else if (port == PORT_INDEX_OUT) {
+        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+        dev_buffer.fd  = pmem_tmp->fd;
+        dev_buffer.sz = pmem_tmp->size;
+        dev_buffer.maped_size = pmem_tmp->size;
+        dev_buffer.offset = pmem_tmp->offset;
 
-    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
                 dev_buffer.pbuffer, \
                 dev_buffer.fd, \
                 dev_buffer.offset, \
                 dev_buffer.maped_size);
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
-    return false;
-  }
-  return true;
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, unsigned fd)
 {
-  struct pmem *temp_buffer;
-  struct v4l2_buffer buf;
-  struct v4l2_plane plane;
-  int rc=0;
-  struct OMX_BUFFERHEADERTYPE *bufhdr;
-  encoder_media_buffer_type * meta_buf = NULL;
-  temp_buffer = (struct pmem *)buffer;
+    struct pmem *temp_buffer;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane;
+    int rc=0;
+    struct OMX_BUFFERHEADERTYPE *bufhdr;
+    encoder_media_buffer_type * meta_buf = NULL;
+    temp_buffer = (struct pmem *)buffer;
 
-  memset (&buf, 0, sizeof(buf));
-  memset (&plane, 0, sizeof(plane));
-  if(buffer == NULL)
-  {
-    DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
-    return false;
-  }
-  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+    memset (&buf, 0, sizeof(buf));
+    memset (&plane, 0, sizeof(plane));
 
-  DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
-  if(pmem_data_buf)
-  {
-    DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
-    plane.m.userptr = (unsigned long)pmem_data_buf;
-	plane.data_offset = bufhdr->nOffset;
-	plane.length = bufhdr->nAllocLen;
-	plane.bytesused = bufhdr->nFilledLen;
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
-	if (metadatamode && !color_format) { // meta Buffer + Camera buffers
-		meta_buf = (encoder_media_buffer_type *)bufhdr->pBuffer;
-		if (!meta_buf)
-			return false;
-		plane.m.userptr = index;
-		plane.data_offset = meta_buf->meta_handle->data[1];
-		plane.length = meta_buf->meta_handle->data[2];
-		plane.bytesused = meta_buf->meta_handle->data[2];
-	}
-	else
-	{ // meta Buffer + Gralloc buffers || pmem buffers
-		plane.m.userptr = (unsigned long) bufhdr->pBuffer;
-		plane.data_offset = bufhdr->nOffset;
-		plane.length = bufhdr->nAllocLen;
-		plane.bytesused = bufhdr->nFilledLen;
-	}
-  }
+    if (buffer == NULL) {
+        DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
+        return false;
+    }
 
-  buf.index = index;
-  buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-  buf.memory = V4L2_MEMORY_USERPTR;
-  plane.reserved[0] = fd;
-  plane.reserved[1] = 0;
-  buf.m.planes = &plane;
-  buf.length = 1;
-  if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
-	  buf.flags = V4L2_BUF_FLAG_EOS;
-  buf.timestamp.tv_sec = bufhdr->nTimeStamp / 1000000;
-  buf.timestamp.tv_usec = (bufhdr->nTimeStamp % 1000000);
-  rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
-  if (rc) {
-	  DEBUG_PRINT_ERROR("Failed to qbuf (etb) to driver");
-	  return false;
-  }
-  etb++;
-  if(!streaming[OUTPUT_PORT])
-  {
-	  enum v4l2_buf_type buf_type;
-	  buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	  int ret;
-	  ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
-	  if (ret) {
-		  DEBUG_PRINT_ERROR("Failed to call streamon\n");
-		  return false;
-	  } else {
-		  streaming[OUTPUT_PORT] = true;
-	  }
-}
+    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+
+    DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
+
+    if (pmem_data_buf) {
+        DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
+        plane.m.userptr = (unsigned long)pmem_data_buf;
+        plane.data_offset = bufhdr->nOffset;
+        plane.length = bufhdr->nAllocLen;
+        plane.bytesused = bufhdr->nFilledLen;
+    } else {
+        DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+
+        if (metadatamode && !color_format) { // meta Buffer + Camera buffers
+            meta_buf = (encoder_media_buffer_type *)bufhdr->pBuffer;
+
+            if (!meta_buf)
+                return false;
+
+            plane.m.userptr = index;
+            plane.data_offset = meta_buf->meta_handle->data[1];
+            plane.length = meta_buf->meta_handle->data[2];
+            plane.bytesused = meta_buf->meta_handle->data[2];
+        } else { // meta Buffer + Gralloc buffers || pmem buffers
+            plane.m.userptr = (unsigned long) bufhdr->pBuffer;
+            plane.data_offset = bufhdr->nOffset;
+            plane.length = bufhdr->nAllocLen;
+            plane.bytesused = bufhdr->nFilledLen;
+        }
+    }
+
+    buf.index = index;
+    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    buf.memory = V4L2_MEMORY_USERPTR;
+    plane.reserved[0] = fd;
+    plane.reserved[1] = 0;
+    buf.m.planes = &plane;
+    buf.length = 1;
+
+    if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
+        buf.flags = V4L2_BUF_FLAG_EOS;
+
+    buf.timestamp.tv_sec = bufhdr->nTimeStamp / 1000000;
+    buf.timestamp.tv_usec = (bufhdr->nTimeStamp % 1000000);
+    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to qbuf (etb) to driver");
+        return false;
+    }
+
+    etb++;
+
+    if (!streaming[OUTPUT_PORT]) {
+        enum v4l2_buf_type buf_type;
+        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+        int ret;
+        ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
+
+        if (ret) {
+            DEBUG_PRINT_ERROR("Failed to call streamon\n");
+            return false;
+        } else {
+            streaming[OUTPUT_PORT] = true;
+        }
+    }
+
 #ifdef INPUT_BUFFER_LOG
-	  int i;
-	  int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, m_sVenc_cfg.input_width);
-	  int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, m_sVenc_cfg.input_height);
-	  char *temp = (char *)bufhdr->pBuffer;
-	  for (i = 0; i < m_sVenc_cfg.input_height; i++) {
-		  fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
-		  temp += stride;
-	  }
-	  temp = (char *)bufhdr->pBuffer + (stride * scanlines);
-	  for(i = 0; i < m_sVenc_cfg.input_height/2; i++) {
-		  fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
-		  temp += stride;
-	  }
+    int i;
+    int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, m_sVenc_cfg.input_width);
+    int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, m_sVenc_cfg.input_height);
+    char *temp = (char *)bufhdr->pBuffer;
+
+    for (i = 0; i < m_sVenc_cfg.input_height; i++) {
+        fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
+        temp += stride;
+    }
+
+    temp = (char *)bufhdr->pBuffer + (stride * scanlines);
+
+    for (i = 0; i < m_sVenc_cfg.input_height/2; i++) {
+        fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
+        temp += stride;
+    }
+
 #endif
-  return true;
+    return true;
 }
 bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
 {
-	struct pmem *temp_buffer = NULL;
-	struct venc_buffer  frameinfo;
-	struct v4l2_buffer buf;
-	struct v4l2_plane plane[VIDEO_MAX_PLANES];
-	int rc = 0, extra_idx;
-	struct OMX_BUFFERHEADERTYPE *bufhdr;
+    struct pmem *temp_buffer = NULL;
+    struct venc_buffer  frameinfo;
+    struct v4l2_buffer buf;
+    struct v4l2_plane plane[VIDEO_MAX_PLANES];
+    int rc = 0, extra_idx;
+    struct OMX_BUFFERHEADERTYPE *bufhdr;
 
-	if(buffer == NULL)
-		return false;
+    if (buffer == NULL)
+        return false;
 
-	bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
 
-	if(pmem_data_buf)
-	{
-		DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
-		plane[0].m.userptr = (unsigned long)pmem_data_buf;
-	} else {
-		DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
-		plane[0].m.userptr = (unsigned long)bufhdr->pBuffer;
-	}
+    if (pmem_data_buf) {
+        DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
+        plane[0].m.userptr = (unsigned long)pmem_data_buf;
+    } else {
+        DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+        plane[0].m.userptr = (unsigned long)bufhdr->pBuffer;
+    }
 
-	buf.index = index;
-	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	buf.memory = V4L2_MEMORY_USERPTR;
-	plane[0].length = bufhdr->nAllocLen;
-	plane[0].bytesused = bufhdr->nFilledLen;
-	plane[0].reserved[0] = fd;
-	plane[0].reserved[1] = 0;
-	plane[0].data_offset = bufhdr->nOffset;
-	buf.m.planes = plane;
-	buf.length = num_planes;
+    buf.index = index;
+    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    buf.memory = V4L2_MEMORY_USERPTR;
+    plane[0].length = bufhdr->nAllocLen;
+    plane[0].bytesused = bufhdr->nFilledLen;
+    plane[0].reserved[0] = fd;
+    plane[0].reserved[1] = 0;
+    plane[0].data_offset = bufhdr->nOffset;
+    buf.m.planes = plane;
+    buf.length = num_planes;
 
-	extra_idx = EXTRADATA_IDX(num_planes);
-	if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-		plane[extra_idx].bytesused = 0;
-		plane[extra_idx].length = extradata_info.buffer_size;
-		plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
+    extra_idx = EXTRADATA_IDX(num_planes);
+
+    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+        plane[extra_idx].bytesused = 0;
+        plane[extra_idx].length = extradata_info.buffer_size;
+        plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
 #ifdef USE_ION
-		plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
+        plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
 #endif
-		plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
-		plane[extra_idx].data_offset = 0;
-	} else if (extra_idx >= VIDEO_MAX_PLANES) {
-		DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
-		return false;
-	}
-	rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to qbuf (ftb) to driver");
-		return false;
-	}
-	ftb++;
-	return true;
+        plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
+        plane[extra_idx].data_offset = 0;
+    } else if (extra_idx >= VIDEO_MAX_PLANES) {
+        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
+        return false;
+    }
+
+    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to qbuf (ftb) to driver");
+        return false;
+    }
+
+    ftb++;
+    return true;
 }
 
 bool venc_dev::venc_set_extradata(OMX_U32 extra_data)
 {
-	struct v4l2_control control;
-	control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
-	control.value = V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO;
-	DEBUG_PRINT_HIGH("venc_set_extradata:: %x", (int) extra_data);
-	if(multislice.mslice_mode && multislice.mslice_mode != V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE)
-	{
-		if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
-			DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
-			return false;
-		}
-	}
-	else
-	{
-		DEBUG_PRINT_ERROR("Failed to set slice extradata, slice_mode "
-						  "is set to [%lu]", multislice.mslice_mode);
-	}
-	return true;
+    struct v4l2_control control;
+    control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+    control.value = V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO;
+    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", (int) extra_data);
+
+    if (multislice.mslice_mode && multislice.mslice_mode != V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
+        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
+            DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
+            return false;
+        }
+    } else {
+        DEBUG_PRINT_ERROR("Failed to set slice extradata, slice_mode "
+                "is set to [%lu]", multislice.mslice_mode);
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_slice_delivery_mode(OMX_U32 enable)
 {
-	struct v4l2_control control;
-	if (enable) {
-		control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE;
-		control.value = 1;
-		DEBUG_PRINT_LOW("Set slice_delivery_mode: %d", control.value);
-		if(multislice.mslice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
-		{
-			if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
-				DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
-				return false;
-			}
-			else {
-				DEBUG_PRINT_LOW("Successfully set Slice delivery mode id: %d, value=%d\n", control.id, control.value);
-				slice_mode.enable = 1;
-			}
-		}
-		else
-		{
-			DEBUG_PRINT_ERROR("Failed to set slice delivery mode, slice_mode [%d] "
-							  "is not MB BASED or [%lu] is not H264 codec ", multislice.mslice_mode,
-							   m_sVenc_cfg.codectype);
-		}
-	}
-	else
-	{
-		DEBUG_PRINT_ERROR("Slice_DELIVERY_MODE not enabled\n");
-	}
-	return true;
+    struct v4l2_control control;
+
+    if (enable) {
+        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE;
+        control.value = 1;
+        DEBUG_PRINT_LOW("Set slice_delivery_mode: %d", control.value);
+
+        if (multislice.mslice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
+                DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
+                return false;
+            } else {
+                DEBUG_PRINT_LOW("Successfully set Slice delivery mode id: %d, value=%d\n", control.id, control.value);
+                slice_mode.enable = 1;
+            }
+        } else {
+            DEBUG_PRINT_ERROR("Failed to set slice delivery mode, slice_mode [%d] "
+                    "is not MB BASED or [%lu] is not H264 codec ", multislice.mslice_mode,
+                    m_sVenc_cfg.codectype);
+        }
+    } else {
+        DEBUG_PRINT_ERROR("Slice_DELIVERY_MODE not enabled\n");
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
 {
-	int rc;
-	struct v4l2_control control;
+    int rc;
+    struct v4l2_control control;
 
-	control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
-	control.value = i_frame_qp;
+    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
+    control.value = i_frame_qp;
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	session_qp.iframeqp = control.value;
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-	control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
-	control.value = p_frame_qp;
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    session_qp.iframeqp = control.value;
 
-	session_qp.pframqp = control.value;
+    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
+    control.value = p_frame_qp;
 
-	if((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
-     (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
-	{
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-	control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
-	control.value = b_frame_qp;
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
 
-	session_qp.bframqp = control.value;
-	}
+    session_qp.pframqp = control.value;
 
-  return true;
+    if ((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
+            (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
+
+        control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
+        control.value = b_frame_qp;
+
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+        session_qp.bframqp = control.value;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
 {
-  struct venc_profile requested_profile = {0};
-  struct ven_profilelevel requested_level = {0};
-  unsigned long mb_per_frame = 0;
-  DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
-    eProfile, eLevel);
-  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
-                  ((m_sVenc_cfg.input_width + 15) >> 4);
-  if((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set)
-  {
-    DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
-    return true;
-  }
+    struct venc_profile requested_profile = {0};
+    struct ven_profilelevel requested_level = {0};
+    unsigned long mb_per_frame = 0;
+    DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
+            eProfile, eLevel);
+    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+        ((m_sVenc_cfg.input_width + 15) >> 4);
 
-  DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
-  if(!venc_validate_profile_level(&eProfile, &eLevel))
-  {
-    DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
-    return false;
-  }
-
-  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
-  {
-    DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
-      "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
-      OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
-    if(eProfile == OMX_VIDEO_MPEG4ProfileSimple)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
-    }
-    else if(eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
-        eProfile);
-      return false;
+    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
+        DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
+        return true;
     }
 
-    DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
-      "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
-      "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
-      OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
+    DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
 
-    if(mb_per_frame >= 3600)
-    {
-      if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
-      if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
-    }
-    else
-    {
-      switch(eLevel)
-      {
-      case OMX_VIDEO_MPEG4Level0:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
-        break;
-		case OMX_VIDEO_MPEG4Level0b:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
-        break;
-      case OMX_VIDEO_MPEG4Level1:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
-        break;
-      case OMX_VIDEO_MPEG4Level2:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
-        break;
-      case OMX_VIDEO_MPEG4Level3:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
-        break;
-      case OMX_VIDEO_MPEG4Level4a:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
-        break;
-      case OMX_VIDEO_MPEG4Level5:
-        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
-        break;
-      default:
+    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
+        DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
         return false;
-        // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
-        break;
-      }
     }
-  }
-  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
-  {
 
-    switch (eProfile) {
-    case OMX_VIDEO_H263ProfileBaseline:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BASELINE;
-	    break;
-    case OMX_VIDEO_H263ProfileH320Coding:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_H320CODING;
-	    break;
-    case OMX_VIDEO_H263ProfileBackwardCompatible:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BACKWARDCOMPATIBLE;
-	    break;
-    case OMX_VIDEO_H263ProfileISWV2:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV2;
-	    break;
-    case OMX_VIDEO_H263ProfileISWV3:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV3;
-	    break;
-    case OMX_VIDEO_H263ProfileHighCompression:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHCOMPRESSION;
-	    break;
-    case OMX_VIDEO_H263ProfileInternet:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERNET;
-	    break;
-    case OMX_VIDEO_H263ProfileInterlace:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERLACE;
-	    break;
-    case OMX_VIDEO_H263ProfileHighLatency:
-	    requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHLATENCY;
-	    break;
-    default:
-      DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
-        requested_profile.profile);
-      return false;
-    }
-    //profile level
-    switch(eLevel)
-    {
-    case OMX_VIDEO_H263Level10:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_1_0;
-	    break;
-    case OMX_VIDEO_H263Level20:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_2_0;
-	    break;
-    case OMX_VIDEO_H263Level30:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_3_0;
-	    break;
-    case OMX_VIDEO_H263Level40:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_0;
-	    break;
-    case OMX_VIDEO_H263Level45:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_5;
-	    break;
-    case OMX_VIDEO_H263Level50:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_5_0;
-	    break;
-    case OMX_VIDEO_H263Level60:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_6_0;
-	    break;
-    case OMX_VIDEO_H263Level70:
-	    requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_7_0;
-	    break;
-    default:
-	    return false;
-	    break;
-    }
-  }
-  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
-  {
-    if(eProfile == OMX_VIDEO_AVCProfileBaseline)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
-    }
-    else if(eProfile == OMX_VIDEO_AVCProfileMain)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
-    }
-	else if(eProfile == OMX_VIDEO_AVCProfileExtended)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
-    }
-    else if(eProfile == OMX_VIDEO_AVCProfileHigh)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
-    }
-	else if(eProfile == OMX_VIDEO_AVCProfileHigh10)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
-    }
-	else if(eProfile == OMX_VIDEO_AVCProfileHigh422)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
-    }
-	else if(eProfile == OMX_VIDEO_AVCProfileHigh444)
-    {
-      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
-    }
-    else
-    {
-      DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
-        requested_profile.profile);
-      return false;
-    }
-    //profile level
-    switch(eLevel)
-    {
-    case OMX_VIDEO_AVCLevel1:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
-      break;
-    case OMX_VIDEO_AVCLevel1b:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
-      break;
-    case OMX_VIDEO_AVCLevel11:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
-      break;
-    case OMX_VIDEO_AVCLevel12:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
-      break;
-    case OMX_VIDEO_AVCLevel13:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
-      break;
-    case OMX_VIDEO_AVCLevel2:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
-      break;
-    case OMX_VIDEO_AVCLevel21:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
-      break;
-    case OMX_VIDEO_AVCLevel22:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
-      break;
-    case OMX_VIDEO_AVCLevel3:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
-      break;
-    case OMX_VIDEO_AVCLevel31:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
-      break;
-    case OMX_VIDEO_AVCLevel32:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
-      break;
-    case OMX_VIDEO_AVCLevel4:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
-      break;
-    case OMX_VIDEO_AVCLevel41:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
-      break;
-    case OMX_VIDEO_AVCLevel42:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
-      break;
-    case OMX_VIDEO_AVCLevel5:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
-      break;
-    case OMX_VIDEO_AVCLevel51:
-      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
-      break;
-    default :
-      DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %lu",
-        requested_level.level);
-	  return false;
-      break;
-    }
-  }
-  if(!m_profile_set)
-  {
-	int rc;
-	struct v4l2_control control;
-	if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
-		control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
-	} else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
-		control.id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE;
-	} else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
-		control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_PROFILE;
-	} else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
-		DEBUG_PRINT_ERROR("\n No Profile and LEVEL Setting for VP8 \n");
-		m_profile_set = true;
-		m_level_set = true;
-		return true;
+    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+        DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
+                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
+                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
+
+        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
+        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
         } else {
-		DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
-		return false;
-	}
+            DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
+                    eProfile);
+            return false;
+        }
 
-	control.value = requested_profile.profile;
+        DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
+                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
+                "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
+                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+        if (mb_per_frame >= 3600) {
+            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
+                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
 
-    codec_profile.profile = control.value;
-    m_profile_set = true;
-  }
+            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
+                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+        } else {
+            switch (eLevel) {
+                case OMX_VIDEO_MPEG4Level0:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
+                    break;
+                case OMX_VIDEO_MPEG4Level0b:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
+                    break;
+                case OMX_VIDEO_MPEG4Level1:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
+                    break;
+                case OMX_VIDEO_MPEG4Level2:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
+                    break;
+                case OMX_VIDEO_MPEG4Level3:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
+                    break;
+                case OMX_VIDEO_MPEG4Level4a:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
+                    break;
+                case OMX_VIDEO_MPEG4Level5:
+                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+                    break;
+                default:
+                    return false;
+                    // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
+                    break;
+            }
+        }
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
 
-  if(!m_level_set)
-  {
-	int rc;
-	struct v4l2_control control;
-	if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
-		control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
-	} else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
-		control.id = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL;
-	} else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
-		control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_LEVEL;
-	} else {
-		DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
-		return false;
-	}
+        switch (eProfile) {
+            case OMX_VIDEO_H263ProfileBaseline:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BASELINE;
+                break;
+            case OMX_VIDEO_H263ProfileH320Coding:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_H320CODING;
+                break;
+            case OMX_VIDEO_H263ProfileBackwardCompatible:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BACKWARDCOMPATIBLE;
+                break;
+            case OMX_VIDEO_H263ProfileISWV2:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV2;
+                break;
+            case OMX_VIDEO_H263ProfileISWV3:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV3;
+                break;
+            case OMX_VIDEO_H263ProfileHighCompression:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHCOMPRESSION;
+                break;
+            case OMX_VIDEO_H263ProfileInternet:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERNET;
+                break;
+            case OMX_VIDEO_H263ProfileInterlace:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERLACE;
+                break;
+            case OMX_VIDEO_H263ProfileHighLatency:
+                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHLATENCY;
+                break;
+            default:
+                DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
+                        requested_profile.profile);
+                return false;
+        }
 
-	control.value = requested_level.level;
+        //profile level
+        switch (eLevel) {
+            case OMX_VIDEO_H263Level10:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_1_0;
+                break;
+            case OMX_VIDEO_H263Level20:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_2_0;
+                break;
+            case OMX_VIDEO_H263Level30:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_3_0;
+                break;
+            case OMX_VIDEO_H263Level40:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_0;
+                break;
+            case OMX_VIDEO_H263Level45:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_5;
+                break;
+            case OMX_VIDEO_H263Level50:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_5_0;
+                break;
+            case OMX_VIDEO_H263Level60:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_6_0;
+                break;
+            case OMX_VIDEO_H263Level70:
+                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_7_0;
+                break;
+            default:
+                return false;
+                break;
+        }
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
+        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
+        } else if (eProfile == OMX_VIDEO_AVCProfileExtended) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
+        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
+        } else if (eProfile == OMX_VIDEO_AVCProfileHigh10) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
+        } else if (eProfile == OMX_VIDEO_AVCProfileHigh422) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
+        } else if (eProfile == OMX_VIDEO_AVCProfileHigh444) {
+            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
+        } else {
+            DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
+                    requested_profile.profile);
+            return false;
+        }
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+        //profile level
+        switch (eLevel) {
+            case OMX_VIDEO_AVCLevel1:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
+                break;
+            case OMX_VIDEO_AVCLevel1b:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
+                break;
+            case OMX_VIDEO_AVCLevel11:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
+                break;
+            case OMX_VIDEO_AVCLevel12:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
+                break;
+            case OMX_VIDEO_AVCLevel13:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
+                break;
+            case OMX_VIDEO_AVCLevel2:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
+                break;
+            case OMX_VIDEO_AVCLevel21:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
+                break;
+            case OMX_VIDEO_AVCLevel22:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
+                break;
+            case OMX_VIDEO_AVCLevel3:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
+                break;
+            case OMX_VIDEO_AVCLevel31:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
+                break;
+            case OMX_VIDEO_AVCLevel32:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
+                break;
+            case OMX_VIDEO_AVCLevel4:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
+                break;
+            case OMX_VIDEO_AVCLevel41:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
+                break;
+            case OMX_VIDEO_AVCLevel42:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
+                break;
+            case OMX_VIDEO_AVCLevel5:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
+                break;
+            case OMX_VIDEO_AVCLevel51:
+                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
+                break;
+            default :
+                DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %lu",
+                        requested_level.level);
+                return false;
+                break;
+        }
+    }
 
-    profile_level.level = control.value;
-    m_level_set = true;
-  }
+    if (!m_profile_set) {
+        int rc;
+        struct v4l2_control control;
 
-  return true;
+        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+            control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
+        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE;
+        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_PROFILE;
+        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
+            DEBUG_PRINT_ERROR("\n No Profile and LEVEL Setting for VP8 \n");
+            m_profile_set = true;
+            m_level_set = true;
+            return true;
+        } else {
+            DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
+            return false;
+        }
+
+        control.value = requested_profile.profile;
+
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+        codec_profile.profile = control.value;
+        m_profile_set = true;
+    }
+
+    if (!m_level_set) {
+        int rc;
+        struct v4l2_control control;
+
+        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+            control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
+        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL;
+        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
+            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_LEVEL;
+        } else {
+            DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
+            return false;
+        }
+
+        control.value = requested_level.level;
+
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+        profile_level.level = control.value;
+        m_level_set = true;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
 {
 
-  struct venc_voptimingcfg vop_timing_cfg;
+    struct venc_voptimingcfg vop_timing_cfg;
 
-  DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
-    TimeIncRes);
+    DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
+            TimeIncRes);
 
-  vop_timing_cfg.voptime_resolution = TimeIncRes;
+    vop_timing_cfg.voptime_resolution = TimeIncRes;
 
-  voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
-  return true;
+    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
+    return true;
 }
 
 bool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
 {
 
-  DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
-    nPFrames);
-	int rc;
-	struct v4l2_control control;
-  if((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
-     (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
-     (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
-  {
-	  nBFrames=0;
-  }
+    DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
+            nPFrames);
+    int rc;
+    struct v4l2_control control;
 
-	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
-	control.value = nPFrames;
+    if ((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
+            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
+            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
+        nBFrames=0;
+    }
 
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
+    control.value = nPFrames;
 
-        intra_period.num_pframes = control.value;
-	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
-	control.value = nBFrames;
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+    intra_period.num_pframes = control.value;
+    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
+    control.value = nBFrames;
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
 
 
-	intra_period.num_bframes = control.value;
-	if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264){
-		control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
-		control.value = 1;
+    intra_period.num_bframes = control.value;
 
-		rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-		if (rc) {
-			DEBUG_PRINT_ERROR("Failed to set control\n");
-			return false;
-		}
-		idrperiod.idrperiod = 1;
-	}
-  return true;
+    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+        control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
+        control.value = 1;
+
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        idrperiod.idrperiod = 1;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod)
 {
-	int rc = 0;
-	struct v4l2_control control;
-	DEBUG_PRINT_LOW("\n venc_set_idr_period: nPFrames = %u, nIDRPeriod: %u\n",
-		nPFrames, nIDRPeriod);
+    int rc = 0;
+    struct v4l2_control control;
+    DEBUG_PRINT_LOW("\n venc_set_idr_period: nPFrames = %u, nIDRPeriod: %u\n",
+            nPFrames, nIDRPeriod);
 
-	if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264){
-		DEBUG_PRINT_ERROR("\nERROR: IDR period valid for H264 only!!");
-		return false;
-	}
+    if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) {
+        DEBUG_PRINT_ERROR("\nERROR: IDR period valid for H264 only!!");
+        return false;
+    }
 
-	if(venc_set_intra_period (nPFrames, intra_period.num_bframes) == false) {
-		DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
-		return false;
-	}
+    if (venc_set_intra_period (nPFrames, intra_period.num_bframes) == false) {
+        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+        return false;
+    }
 
-	intra_period.num_pframes = nPFrames;
-	control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
-	control.value = nIDRPeriod;
+    intra_period.num_pframes = nPFrames;
+    control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
+    control.value = nIDRPeriod;
 
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-	idrperiod.idrperiod = nIDRPeriod;
-	return true;
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
+
+    idrperiod.idrperiod = nIDRPeriod;
+    return true;
 }
 
 bool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
 {
-	int rc = 0;
-	struct v4l2_control control;
+    int rc = 0;
+    struct v4l2_control control;
 
-  DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
+    DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
 
-  if(enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)){
+    if (enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)) {
 
-	  control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
-	  control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
+        control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
+        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
 
-	  DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	entropy.longentropysel = control.value;
-	  if (i_cabac_level == 0) {
-         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
-      }
-      else if (i_cabac_level == 1) {
-         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
-      }
-      else if (i_cabac_level == 2) {
-         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
-      }
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-	  control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
-	  //control.value = entropy_cfg.cabacmodel;
-		DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	entropy.longentropysel=control.value;
-  }
-  else if(!enable){
-    control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
-	control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	entropy.longentropysel=control.value;
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+        entropy.longentropysel = control.value;
+
+        if (i_cabac_level == 0) {
+            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
+        } else if (i_cabac_level == 1) {
+            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
+        } else if (i_cabac_level == 2) {
+            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
+        }
+
+        control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
+        //control.value = entropy_cfg.cabacmodel;
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+        entropy.longentropysel=control.value;
+    } else if (!enable) {
+        control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
+        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+        entropy.longentropysel=control.value;
+    } else {
+        DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
+        return false;
     }
-  else{
-    DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
-    return false;
-  }
 
-  return true;
+    return true;
 }
 
 bool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
 {
-	int rc;
-	struct v4l2_control control;
-  bool status = true;
+    int rc;
+    struct v4l2_control control;
+    bool status = true;
 
-  if((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)){
-	  control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
+    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
+        control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
+    } else {
+        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
     }
-  else{
-   control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
-  }
-	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	multislice.mslice_mode=control.value;
 
-	if(multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE){
+    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
-	control.value = nSlicesize;
-	DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	multislice.mslice_size=control.value;
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
 
-	}
-  return status;
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    multislice.mslice_mode=control.value;
+
+    if (multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
+
+        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
+        control.value = nSlicesize;
+        DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+        multislice.mslice_size=control.value;
+
+    }
+
+    return status;
 }
 
 bool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
 {
-  bool status = true;
-  int rc;
-  struct v4l2_control control_mode,control_mbs;
-   control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
-  // There is no disabled mode.  Disabled mode is indicated by a 0 count.
-  if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax)
-  {
-	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
-	  return status;
-  }
-  else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
-           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
-  {
-	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
-	  control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
-	  control_mbs.value=irMBs;
-  }
-  else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
-           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
-  {
-	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
-	  control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
-	  control_mbs.value=irMBs;
-  }
-  else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
-           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
-  {
-	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
-                      "mb count: %lu, mb mode:%d", irMBs, ir_mode);
-    return false;
-  }
+    bool status = true;
+    int rc;
+    struct v4l2_control control_mode,control_mbs;
+    control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%lu, val=%lu\n", control_mode.id, control_mode.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
+    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
+    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
+        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
+        return status;
+    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
+            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
+        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
+        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
+        control_mbs.value=irMBs;
+    } else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
+            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
+        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
+        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
+        control_mbs.value=irMBs;
+    } else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
+            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
+        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
+                "mb count: %lu, mb mode:%d", irMBs, ir_mode);
+        return false;
+    }
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%lu, val=%lu\n", control_mode.id, control_mode.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
+
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
 
     intra_refresh.irmode = control_mode.value;
     intra_refresh.mbcount = control_mbs.value;
 
-  return status;
+    return status;
 }
 
 bool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
 {
-	bool status = true;
-	struct venc_headerextension hec_cfg;
-	struct venc_multiclicecfg multislice_cfg;
-	int rc;
-	struct v4l2_control control;
+    bool status = true;
+    struct venc_headerextension hec_cfg;
+    struct venc_multiclicecfg multislice_cfg;
+    int rc;
+    struct v4l2_control control;
 
-	memset(&control, 0, sizeof(control));
-	if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
-		if (error_resilience->bEnableHEC) {
-			hec_cfg.header_extension = 1;
-		} else {
-			hec_cfg.header_extension = 0;
-		}
-		hec.header_extension = error_resilience->bEnableHEC;
-	}
+    memset(&control, 0, sizeof(control));
 
-	if (error_resilience->bEnableRVLC) {
-		DEBUG_PRINT_ERROR("\n RVLC is not Supported");
-		return false;
-	}
+    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+        if (error_resilience->bEnableHEC) {
+            hec_cfg.header_extension = 1;
+        } else {
+            hec_cfg.header_extension = 0;
+        }
 
-	if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
-		(error_resilience->bEnableDataPartitioning)) {
-		DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
-		return false;
-		}
+        hec.header_extension = error_resilience->bEnableHEC;
+    }
 
-	if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
-				(error_resilience->nResynchMarkerSpacing)) {
-		multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
-		multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
-		control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
-		control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES;
-	} else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 &&
-			   error_resilience->bEnableDataPartitioning) {
-		multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
-		multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
-		control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
-		control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB;
-	} else {
-		multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
-		multislice_cfg.mslice_size = 0;
-		control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
-		control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
-	}
-	DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__,
-					multislice_cfg.mslice_mode, multislice_cfg.mslice_size);
-	printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		printf("Failed to set Slice mode control\n");
-		return false;
-	}
-	printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
-	multislice.mslice_mode=control.value;
+    if (error_resilience->bEnableRVLC) {
+        DEBUG_PRINT_ERROR("\n RVLC is not Supported");
+        return false;
+    }
 
-	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
-	control.value = error_resilience->nResynchMarkerSpacing;
-	printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		printf("Failed to set MAX MB control\n");
-		return false;
-	}
-	printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
-	multislice.mslice_mode = multislice_cfg.mslice_mode;
-	multislice.mslice_size = multislice_cfg.mslice_size;
-	return status;
+    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
+            (error_resilience->bEnableDataPartitioning)) {
+        DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
+        return false;
+    }
+
+    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
+            (error_resilience->nResynchMarkerSpacing)) {
+        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
+        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
+        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+        control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES;
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 &&
+            error_resilience->bEnableDataPartitioning) {
+        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
+        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
+        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+        control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB;
+    } else {
+        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+        multislice_cfg.mslice_size = 0;
+        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
+    }
+
+    DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__,
+            multislice_cfg.mslice_mode, multislice_cfg.mslice_size);
+    printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        printf("Failed to set Slice mode control\n");
+        return false;
+    }
+
+    printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
+    multislice.mslice_mode=control.value;
+
+    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
+    control.value = error_resilience->nResynchMarkerSpacing;
+    printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        printf("Failed to set MAX MB control\n");
+        return false;
+    }
+
+    printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
+    multislice.mslice_mode = multislice_cfg.mslice_mode;
+    multislice.mslice_size = multislice_cfg.mslice_size;
+    return status;
 }
 
 bool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
 {
-	int rc;
-	struct v4l2_control control;
-	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
-  if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable){
-	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
-  }
-  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisable){
-	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
-  }
-  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary){
-	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
-  }
+    int rc;
+    struct v4l2_control control;
+    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
+        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
+    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
+        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
+    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
+        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
+    }
 
-	dbkfilter.db_mode=control.value;
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
-	control.value=0;
+    if (rc) {
+        return false;
+    }
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
-	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
-	control.value=0;
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+    dbkfilter.db_mode=control.value;
+
+    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
+    control.value=0;
+
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
+    control.value=0;
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
 
 
-  dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
-  return true;
+    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
+    return true;
 }
 
 bool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
 {
-  DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
-    nTargetBitrate);
-	struct v4l2_control control;
-	int rc = 0;
-	control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
-	control.value = nTargetBitrate;
+    DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
+            nTargetBitrate);
+    struct v4l2_control control;
+    int rc = 0;
+    control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
+    control.value = nTargetBitrate;
 
-	DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
-
-  m_sVenc_cfg.targetbitrate = control.value;
-  bitrate.target_bitrate = control.value;
-  if(!config)
-  {
-    m_level_set = false;
-    if(venc_set_profile_level(0, 0))
-    {
-      DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %lu\n",profile_level.level);
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control\n");
+        return false;
     }
-  }
-  return true;
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+    m_sVenc_cfg.targetbitrate = control.value;
+    bitrate.target_bitrate = control.value;
+
+    if (!config) {
+        m_level_set = false;
+
+        if (venc_set_profile_level(0, 0)) {
+            DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %lu\n",profile_level.level);
+        }
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
 {
-  struct v4l2_streamparm parm;
-  int rc = 0;
-  struct venc_framerate frame_rate_cfg;
-  Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
-  parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-  parm.parm.output.timeperframe.numerator = frame_rate_cfg.fps_denominator;
-  parm.parm.output.timeperframe.denominator = frame_rate_cfg.fps_numerator;
-  if(frame_rate_cfg.fps_numerator > 0)
-    rc = ioctl(m_nDriver_fd, VIDIOC_S_PARM, &parm);
-  if (rc) {
-    DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed\n");
-    return false;
-  }
-  m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
-  m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
-  if(!config)
-  {
-    m_level_set = false;
-    if(venc_set_profile_level(0, 0))
-    {
-      DEBUG_PRINT_HIGH("Calling set level (Framerate) with %lu\n",profile_level.level);
+    struct v4l2_streamparm parm;
+    int rc = 0;
+    struct venc_framerate frame_rate_cfg;
+    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
+    parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    parm.parm.output.timeperframe.numerator = frame_rate_cfg.fps_denominator;
+    parm.parm.output.timeperframe.denominator = frame_rate_cfg.fps_numerator;
+
+    if (frame_rate_cfg.fps_numerator > 0)
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_PARM, &parm);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed\n");
+        return false;
     }
-  }
-  return true;
+
+    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
+    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
+
+    if (!config) {
+        m_level_set = false;
+
+        if (venc_set_profile_level(0, 0)) {
+            DEBUG_PRINT_HIGH("Calling set level (Framerate) with %lu\n",profile_level.level);
+        }
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
 {
-  struct v4l2_format fmt;
-  DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
+    struct v4l2_format fmt;
+    DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
 
-  if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
-  {
-    m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
-  }
-  else if(color_format == QOMX_COLOR_FormatYVU420SemiPlanar)
-  {
-    m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21;
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
-    m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
-    DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
-  }
-  fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-  fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
-  fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
-  fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
-  if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
-    DEBUG_PRINT_ERROR("Failed setting color format %x", color_format);
-    return false;
-  }
+    if (color_format == OMX_COLOR_FormatYUV420SemiPlanar) {
+        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
+    } else if (color_format == QOMX_COLOR_FormatYVU420SemiPlanar) {
+        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21;
+    } else {
+        DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
+        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
+        DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
+    }
 
-  return true;
+    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
+    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+
+    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
+        DEBUG_PRINT_ERROR("Failed setting color format %x", color_format);
+        return false;
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
 {
-  DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
-  if(intra_vop_refresh == OMX_TRUE)
-  {
-	struct v4l2_control control;
-	int rc;
-	control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME;
-	control.value = 1;
-	printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		printf("Failed to set Intra Frame Request control\n");
-		return false;
-	}
-	printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
-  }
-  else
-  {
-    DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
-  }
-  return true;
+    DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
+
+    if (intra_vop_refresh == OMX_TRUE) {
+        struct v4l2_control control;
+        int rc;
+        control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME;
+        control.value = 1;
+        printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            printf("Failed to set Intra Frame Request control\n");
+            return false;
+        }
+
+        printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
+    } else {
+        DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
+    }
+
+    return true;
 }
 
 bool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
 {
-  bool status = true;
-	struct v4l2_control control;
-	int rc = 0;
-	control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
-  switch(eControlRate)
-  {
-  case OMX_Video_ControlRateDisable:
-	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
-    break;
-  case OMX_Video_ControlRateVariableSkipFrames:
-	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
-    break;
-  case OMX_Video_ControlRateVariable:
-	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
-    break;
-  case OMX_Video_ControlRateConstantSkipFrames:
-	    control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
-    break;
-  case OMX_Video_ControlRateConstant:
-	    control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
-    break;
-  default:
-    status = false;
-    break;
-  }
+    bool status = true;
+    struct v4l2_control control;
+    int rc = 0;
+    control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
 
-  if(status)
-  {
+    switch (eControlRate) {
+        case OMX_Video_ControlRateDisable:
+            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
+            break;
+        case OMX_Video_ControlRateVariableSkipFrames:
+            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
+            break;
+        case OMX_Video_ControlRateVariable:
+            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
+            break;
+        case OMX_Video_ControlRateConstantSkipFrames:
+            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
+            break;
+        case OMX_Video_ControlRateConstant:
+            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
+            break;
+        default:
+            status = false;
+            break;
+    }
 
-	  DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
-	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-	if (rc) {
-		DEBUG_PRINT_ERROR("Failed to set control\n");
-		return false;
-	}
-	DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+    if (status) {
 
-    rate_ctrl.rcmode = control.value;
-  }
-  return status;
+        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+        if (rc) {
+            DEBUG_PRINT_ERROR("Failed to set control\n");
+            return false;
+        }
+
+        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+        rate_ctrl.rcmode = control.value;
+    }
+
+    return status;
 }
 
 bool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
 {
-  bool status = true;
-  if(eProfile == NULL || eLevel == NULL)
-  {
-    return false;
-  }
+    bool status = true;
 
-  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
-  {
-    switch(codec_profile.profile)
-    {
-    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
-      *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-      break;
-    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
-      *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-      break;
-    default:
-      *eProfile = OMX_VIDEO_MPEG4ProfileMax;
-      status = false;
-      break;
+    if (eProfile == NULL || eLevel == NULL) {
+        return false;
     }
 
-    if(!status)
-    {
-      return status;
+    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+        switch (codec_profile.profile) {
+            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
+                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
+                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                break;
+            default:
+                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
+                status = false;
+                break;
+        }
+
+        if (!status) {
+            return status;
+        }
+
+        //profile level
+        switch (profile_level.level) {
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
+                *eLevel = OMX_VIDEO_MPEG4Level0;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
+                *eLevel = OMX_VIDEO_MPEG4Level0b;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
+                *eLevel = OMX_VIDEO_MPEG4Level1;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
+                *eLevel = OMX_VIDEO_MPEG4Level2;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
+                *eLevel = OMX_VIDEO_MPEG4Level3;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
+                *eLevel = OMX_VIDEO_MPEG4Level4;
+                break;
+            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
+                *eLevel = OMX_VIDEO_MPEG4Level5;
+                break;
+            default:
+                *eLevel = OMX_VIDEO_MPEG4LevelMax;
+                status =  false;
+                break;
+        }
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
+        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
+            *eProfile = OMX_VIDEO_H263ProfileBaseline;
+        } else {
+            *eProfile = OMX_VIDEO_H263ProfileMax;
+            return false;
+        }
+
+        switch (profile_level.level) {
+            case VEN_LEVEL_H263_10:
+                *eLevel = OMX_VIDEO_H263Level10;
+                break;
+            case VEN_LEVEL_H263_20:
+                *eLevel = OMX_VIDEO_H263Level20;
+                break;
+            case VEN_LEVEL_H263_30:
+                *eLevel = OMX_VIDEO_H263Level30;
+                break;
+            case VEN_LEVEL_H263_40:
+                *eLevel = OMX_VIDEO_H263Level40;
+                break;
+            case VEN_LEVEL_H263_45:
+                *eLevel = OMX_VIDEO_H263Level45;
+                break;
+            case VEN_LEVEL_H263_50:
+                *eLevel = OMX_VIDEO_H263Level50;
+                break;
+            case VEN_LEVEL_H263_60:
+                *eLevel = OMX_VIDEO_H263Level60;
+                break;
+            case VEN_LEVEL_H263_70:
+                *eLevel = OMX_VIDEO_H263Level70;
+                break;
+            default:
+                *eLevel = OMX_VIDEO_H263LevelMax;
+                status = false;
+                break;
+        }
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+        switch (codec_profile.profile) {
+            case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
+                *eProfile = OMX_VIDEO_AVCProfileBaseline;
+                break;
+            case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
+                *eProfile = OMX_VIDEO_AVCProfileMain;
+                break;
+            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
+                *eProfile = OMX_VIDEO_AVCProfileHigh;
+                break;
+            case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
+                *eProfile = OMX_VIDEO_AVCProfileExtended;
+                break;
+            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
+                *eProfile = OMX_VIDEO_AVCProfileHigh10;
+                break;
+            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
+                *eProfile = OMX_VIDEO_AVCProfileHigh422;
+                break;
+            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
+                *eProfile = OMX_VIDEO_AVCProfileHigh444;
+                break;
+            default:
+                *eProfile = OMX_VIDEO_AVCProfileMax;
+                status = false;
+                break;
+        }
+
+        if (!status) {
+            return status;
+        }
+
+        switch (profile_level.level) {
+            case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
+                *eLevel = OMX_VIDEO_AVCLevel1;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
+                *eLevel = OMX_VIDEO_AVCLevel1b;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
+                *eLevel = OMX_VIDEO_AVCLevel11;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
+                *eLevel = OMX_VIDEO_AVCLevel12;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
+                *eLevel = OMX_VIDEO_AVCLevel13;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
+                *eLevel = OMX_VIDEO_AVCLevel2;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
+                *eLevel = OMX_VIDEO_AVCLevel21;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
+                *eLevel = OMX_VIDEO_AVCLevel22;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
+                *eLevel = OMX_VIDEO_AVCLevel3;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
+                *eLevel = OMX_VIDEO_AVCLevel31;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
+                *eLevel = OMX_VIDEO_AVCLevel32;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
+                *eLevel = OMX_VIDEO_AVCLevel4;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
+                *eLevel = OMX_VIDEO_AVCLevel41;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
+                *eLevel = OMX_VIDEO_AVCLevel42;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
+                *eLevel = OMX_VIDEO_AVCLevel5;
+                break;
+            case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
+                *eLevel = OMX_VIDEO_AVCLevel51;
+                break;
+            default :
+                *eLevel = OMX_VIDEO_AVCLevelMax;
+                status = false;
+                break;
+        }
     }
 
-    //profile level
-    switch(profile_level.level)
-    {
-    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
-      *eLevel = OMX_VIDEO_MPEG4Level0;
-      break;
-	  case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
-      *eLevel = OMX_VIDEO_MPEG4Level0b;
-      break;
-    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
-      *eLevel = OMX_VIDEO_MPEG4Level1;
-      break;
-    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
-      *eLevel = OMX_VIDEO_MPEG4Level2;
-      break;
-    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
-      *eLevel = OMX_VIDEO_MPEG4Level3;
-      break;
-    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
-      *eLevel = OMX_VIDEO_MPEG4Level4;
-      break;
-    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
-      *eLevel = OMX_VIDEO_MPEG4Level5;
-      break;
-    default:
-      *eLevel = OMX_VIDEO_MPEG4LevelMax;
-      status =  false;
-      break;
-    }
-  }
-  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
-  {
-    if(codec_profile.profile == VEN_PROFILE_H263_BASELINE)
-    {
-      *eProfile = OMX_VIDEO_H263ProfileBaseline;
-    }
-    else
-    {
-      *eProfile = OMX_VIDEO_H263ProfileMax;
-      return false;
-    }
-    switch(profile_level.level)
-    {
-    case VEN_LEVEL_H263_10:
-      *eLevel = OMX_VIDEO_H263Level10;
-      break;
-    case VEN_LEVEL_H263_20:
-      *eLevel = OMX_VIDEO_H263Level20;
-      break;
-    case VEN_LEVEL_H263_30:
-      *eLevel = OMX_VIDEO_H263Level30;
-      break;
-    case VEN_LEVEL_H263_40:
-      *eLevel = OMX_VIDEO_H263Level40;
-      break;
-    case VEN_LEVEL_H263_45:
-      *eLevel = OMX_VIDEO_H263Level45;
-      break;
-    case VEN_LEVEL_H263_50:
-      *eLevel = OMX_VIDEO_H263Level50;
-      break;
-    case VEN_LEVEL_H263_60:
-      *eLevel = OMX_VIDEO_H263Level60;
-      break;
-    case VEN_LEVEL_H263_70:
-      *eLevel = OMX_VIDEO_H263Level70;
-      break;
-    default:
-      *eLevel = OMX_VIDEO_H263LevelMax;
-      status = false;
-      break;
-    }
-  }
-  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
-  {
-    switch(codec_profile.profile)
-    {
-    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
-      *eProfile = OMX_VIDEO_AVCProfileBaseline;
-      break;
-    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
-      *eProfile = OMX_VIDEO_AVCProfileMain;
-      break;
-    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
-      *eProfile = OMX_VIDEO_AVCProfileHigh;
-      break;
-    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
-      *eProfile = OMX_VIDEO_AVCProfileExtended;
-      break;
-	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
-      *eProfile = OMX_VIDEO_AVCProfileHigh10;
-      break;
-	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
-      *eProfile = OMX_VIDEO_AVCProfileHigh422;
-      break;
-	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
-      *eProfile = OMX_VIDEO_AVCProfileHigh444;
-      break;
-    default:
-      *eProfile = OMX_VIDEO_AVCProfileMax;
-      status = false;
-      break;
-    }
-
-    if(!status)
-    {
-      return status;
-    }
-
-    switch(profile_level.level)
-    {
-    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
-      *eLevel = OMX_VIDEO_AVCLevel1;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
-      *eLevel = OMX_VIDEO_AVCLevel1b;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
-      *eLevel = OMX_VIDEO_AVCLevel11;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
-      *eLevel = OMX_VIDEO_AVCLevel12;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
-      *eLevel = OMX_VIDEO_AVCLevel13;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
-      *eLevel = OMX_VIDEO_AVCLevel2;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
-      *eLevel = OMX_VIDEO_AVCLevel21;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
-      *eLevel = OMX_VIDEO_AVCLevel22;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
-      *eLevel = OMX_VIDEO_AVCLevel3;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
-      *eLevel = OMX_VIDEO_AVCLevel31;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
-      *eLevel = OMX_VIDEO_AVCLevel32;
-      break;
-    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
-      *eLevel = OMX_VIDEO_AVCLevel4;
-      break;
-	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
-      *eLevel = OMX_VIDEO_AVCLevel41;
-      break;
-	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
-      *eLevel = OMX_VIDEO_AVCLevel42;
-      break;
-	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
-      *eLevel = OMX_VIDEO_AVCLevel5;
-      break;
-	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
-      *eLevel = OMX_VIDEO_AVCLevel51;
-      break;
-	default :
-      *eLevel = OMX_VIDEO_AVCLevelMax;
-      status = false;
-      break;
-    }
-  }
-  return status;
+    return status;
 }
 
 bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
 {
-  OMX_U32 new_profile = 0, new_level = 0;
-  unsigned const int *profile_tbl = NULL;
-  OMX_U32 mb_per_frame, mb_per_sec;
-  bool profile_level_found = false;
+    OMX_U32 new_profile = 0, new_level = 0;
+    unsigned const int *profile_tbl = NULL;
+    OMX_U32 mb_per_frame, mb_per_sec;
+    bool profile_level_found = false;
 
-  DEBUG_PRINT_LOW("\n Init profile table for respective codec");
-  //validate the ht,width,fps,bitrate and set the appropriate profile and level
-  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
-  {
-      if(*eProfile == 0)
-      {
-        if(!m_profile_set)
-        {
-          *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+    DEBUG_PRINT_LOW("\n Init profile table for respective codec");
+
+    //validate the ht,width,fps,bitrate and set the appropriate profile and level
+    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+        if (*eProfile == 0) {
+            if (!m_profile_set) {
+                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+            } else {
+                switch (codec_profile.profile) {
+                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
+                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+                        break;
+                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
+                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+                        break;
+                    default:
+                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+                        return false;
+                }
+            }
         }
-        else
-        {
-          switch(codec_profile.profile)
-          {
-          case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
-              *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
-            break;
-          case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
-              *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-            break;
-          default:
-            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+
+        if (*eLevel == 0 && !m_level_set) {
+            *eLevel = OMX_VIDEO_MPEG4LevelMax;
+        }
+
+        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
+            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
+            profile_tbl = (unsigned int const *)
+                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+        } else {
+            DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
             return false;
-          }
         }
-      }
-
-      if(*eLevel == 0 && !m_level_set)
-      {
-        *eLevel = OMX_VIDEO_MPEG4LevelMax;
-      }
-
-      if(*eProfile == OMX_VIDEO_MPEG4ProfileSimple)
-      {
-        profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
-      }
-      else if(*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
-      {
-        profile_tbl = (unsigned int const *)
-          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
-        return false;
-      }
-  }
-  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
-  {
-      if(*eProfile == 0)
-      {
-        if(!m_profile_set)
-        {
-          *eProfile = OMX_VIDEO_AVCProfileBaseline;
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+        if (*eProfile == 0) {
+            if (!m_profile_set) {
+                *eProfile = OMX_VIDEO_AVCProfileBaseline;
+            } else {
+                switch (codec_profile.profile) {
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
+                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
+                        break;
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
+                        *eProfile = OMX_VIDEO_AVCProfileMain;
+                        break;
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
+                        *eProfile = OMX_VIDEO_AVCProfileExtended;
+                        break;
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
+                        *eProfile = OMX_VIDEO_AVCProfileHigh;
+                        break;
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
+                        *eProfile = OMX_VIDEO_AVCProfileHigh10;
+                        break;
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
+                        *eProfile = OMX_VIDEO_AVCProfileHigh422;
+                        break;
+                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
+                        *eProfile = OMX_VIDEO_AVCProfileHigh444;
+                        break;
+                    default:
+                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+                        return false;
+                }
+            }
         }
-        else
-        {
-          switch(codec_profile.profile)
-          {
-          case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
-            *eProfile = OMX_VIDEO_AVCProfileBaseline;
-            break;
-          case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
-            *eProfile = OMX_VIDEO_AVCProfileMain;
-            break;
-          case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
-            *eProfile = OMX_VIDEO_AVCProfileExtended;
-            break;
-		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
-            *eProfile = OMX_VIDEO_AVCProfileHigh;
-            break;
-		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
-            *eProfile = OMX_VIDEO_AVCProfileHigh10;
-            break;
-		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
-            *eProfile = OMX_VIDEO_AVCProfileHigh422;
-            break;
-		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
-            *eProfile = OMX_VIDEO_AVCProfileHigh444;
-            break;
-		  default:
-            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+
+        if (*eLevel == 0 && !m_level_set) {
+            *eLevel = OMX_VIDEO_AVCLevelMax;
+        }
+
+        if (*eProfile == OMX_VIDEO_AVCProfileBaseline) {
+            profile_tbl = (unsigned int const *)h264_profile_level_table;
+        } else if (*eProfile == OMX_VIDEO_AVCProfileHigh) {
+            profile_tbl = (unsigned int const *)
+                (&h264_profile_level_table[H264_HP_START]);
+        } else if (*eProfile == OMX_VIDEO_AVCProfileMain) {
+            profile_tbl = (unsigned int const *)
+                (&h264_profile_level_table[H264_MP_START]);
+        } else {
+            DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
             return false;
-          }
         }
-      }
-
-      if(*eLevel == 0 && !m_level_set)
-      {
-        *eLevel = OMX_VIDEO_AVCLevelMax;
-      }
-
-      if(*eProfile == OMX_VIDEO_AVCProfileBaseline)
-      {
-        profile_tbl = (unsigned int const *)h264_profile_level_table;
-      }
-      else if(*eProfile == OMX_VIDEO_AVCProfileHigh)
-      {
-        profile_tbl = (unsigned int const *)
-          (&h264_profile_level_table[H264_HP_START]);
-      }
-      else if(*eProfile == OMX_VIDEO_AVCProfileMain)
-      {
-        profile_tbl = (unsigned int const *)
-          (&h264_profile_level_table[H264_MP_START]);
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
-        return false;
-      }
-  }
-  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
-  {
-      if(*eProfile == 0)
-      {
-        if(!m_profile_set)
-        {
-          *eProfile = OMX_VIDEO_H263ProfileBaseline;
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
+        if (*eProfile == 0) {
+            if (!m_profile_set) {
+                *eProfile = OMX_VIDEO_H263ProfileBaseline;
+            } else {
+                switch (codec_profile.profile) {
+                    case VEN_PROFILE_H263_BASELINE:
+                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
+                        break;
+                    default:
+                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+                        return false;
+                }
+            }
         }
-        else
-        {
-          switch(codec_profile.profile)
-          {
-          case VEN_PROFILE_H263_BASELINE:
-            *eProfile = OMX_VIDEO_H263ProfileBaseline;
-            break;
-          default:
-            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+
+        if (*eLevel == 0 && !m_level_set) {
+            *eLevel = OMX_VIDEO_H263LevelMax;
+        }
+
+        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
+            profile_tbl = (unsigned int const *)h263_profile_level_table;
+        } else {
+            DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
             return false;
-          }
         }
-      }
-
-      if(*eLevel == 0 && !m_level_set)
-      {
-        *eLevel = OMX_VIDEO_H263LevelMax;
-      }
-
-      if(*eProfile == OMX_VIDEO_H263ProfileBaseline)
-      {
-        profile_tbl = (unsigned int const *)h263_profile_level_table;
-      }
-      else
-      {
-        DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
+    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
+        DEBUG_PRINT_HIGH("Disregarding profile/level setting for VP8\n");
+        return true;
+    } else {
+        DEBUG_PRINT_LOW("\n Invalid codec type");
         return false;
-      }
-  } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
-	  DEBUG_PRINT_HIGH("Disregarding profile/level setting for VP8\n");
-	  return true;
-  }
-  else
-  {
-    DEBUG_PRINT_LOW("\n Invalid codec type");
-    return false;
-  }
-
-  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
-                   ((m_sVenc_cfg.input_width + 15)>> 4);
-
-  if((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == (unsigned long) V4L2_PIX_FMT_MPEG4))
-  {
-    if(codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
-      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
-    if(codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
-      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
-    {
-      new_level = profile_level.level;
-      new_profile = codec_profile.profile;
-      return true;
     }
-  }
 
-  mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
+    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+        ((m_sVenc_cfg.input_width + 15)>> 4);
 
-  do{
-      if(mb_per_frame <= (unsigned int)profile_tbl[0])
-      {
-        if(mb_per_sec <= (unsigned int)profile_tbl[1])
+    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == (unsigned long) V4L2_PIX_FMT_MPEG4)) {
+        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
+            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+
+        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
+            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+
         {
-          if(m_sVenc_cfg.targetbitrate <= (unsigned int)profile_tbl[2])
-          {
-              new_level = (int)profile_tbl[3];
-              new_profile = (int)profile_tbl[4];
-              profile_level_found = true;
-              DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
-              break;
-          }
+            new_level = profile_level.level;
+            new_profile = codec_profile.profile;
+            return true;
         }
-      }
-      profile_tbl = profile_tbl + 5;
-  }while(profile_tbl[0] != 0);
+    }
 
-  if (profile_level_found != true)
-  {
-    DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
-    return false;
-  }
+    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
 
-  if((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
-     || (*eLevel == OMX_VIDEO_H263LevelMax))
-  {
-    *eLevel = new_level;
-  }
-  DEBUG_PRINT_HIGH("%s: Returning with eProfile = %lu"
-      "Level = %lu", __func__, *eProfile, *eLevel);
+    do {
+        if (mb_per_frame <= (unsigned int)profile_tbl[0]) {
+            if (mb_per_sec <= (unsigned int)profile_tbl[1]) {
+                if (m_sVenc_cfg.targetbitrate <= (unsigned int)profile_tbl[2]) {
+                    new_level = (int)profile_tbl[3];
+                    new_profile = (int)profile_tbl[4];
+                    profile_level_found = true;
+                    DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
+                    break;
+                }
+            }
+        }
 
-  return true;
+        profile_tbl = profile_tbl + 5;
+    } while (profile_tbl[0] != 0);
+
+    if (profile_level_found != true) {
+        DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
+        return false;
+    }
+
+    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
+            || (*eLevel == OMX_VIDEO_H263LevelMax)) {
+        *eLevel = new_level;
+    }
+
+    DEBUG_PRINT_HIGH("%s: Returning with eProfile = %lu"
+            "Level = %lu", __func__, *eProfile, *eLevel);
+
+    return true;
 }
 #ifdef _ANDROID_ICS_
 bool venc_dev::venc_set_meta_mode(bool mode)
 {
-	metadatamode = 1;
-	return true;
+    metadatamode = 1;
+    return true;
 }
 #endif
 
 bool venc_dev::venc_is_video_session_supported(unsigned long width,
-                                             unsigned long height)
+        unsigned long height)
 {
-	if ((width * height < capability.min_width *  capability.min_height) ||
-	    (width * height > capability.max_width *  capability.max_height)) {
-	    DEBUG_PRINT_ERROR(
-		   "Unsupported video resolution WxH = (%d)x(%d) supported range = min (%d)x(%d) - max (%d)x(%d)\n",
-		   width, height, capability.min_width, capability.min_height,
-		   capability.max_width, capability.max_height);
-	    return false;
-	}
-	DEBUG_PRINT_LOW("\n video session supported\n");
-	return true;
+    if ((width * height < capability.min_width *  capability.min_height) ||
+            (width * height > capability.max_width *  capability.max_height)) {
+        DEBUG_PRINT_ERROR(
+                "Unsupported video resolution WxH = (%d)x(%d) supported range = min (%d)x(%d) - max (%d)x(%d)\n",
+                width, height, capability.min_width, capability.min_height,
+                capability.max_width, capability.max_height);
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("\n video session supported\n");
+    return true;
 }
diff --git a/mm-video-v4l2/vidc/venc/test/camera_test.cpp b/mm-video-v4l2/vidc/venc/test/camera_test.cpp
old mode 100755
new mode 100644
index f5ae6db..7f179cb
--- a/mm-video-v4l2/vidc/venc/test/camera_test.cpp
+++ b/mm-video-v4l2/vidc/venc/test/camera_test.cpp
@@ -1,93 +1,93 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "camera_test.h"
-// #include "camera_class.h"
-
-EXTERN_C_START
-
-// static android::Camera* pCamera = NULL;
-
-int CameraTest_Initialize(int nFrameRate,
-                          int nFrameWidth,
-                          int nFrameHeight,
-                          CameraPreviewCallback pfnPreviewCallback)
-{
-   int result = 0;
-
-//    pCamera = new android::Camera;
-//    if (!pCamera)
-//       return 1;
-
-//    pCamera->init_camera(nFrameWidth,
-//                         nFrameHeight,
-//                         nFrameRate,
-//                         pfnPreviewCallback);
-
-   return result;
-}
-
-int CameraTest_Run()
-{
-   int result = 0;
-
-//    if (pCamera)
-//       pCamera->startPreview();
-//    else
-//       return 1;
-
-   return result;
-}
-
-int CameraTest_ReleaseFrame(void* pPhys, void* pVirt)
-{
-   int result = 0;
-
-//    if (pCamera)
-//       pCamera->releaseFrame(pPhys, pVirt);
-//    else
-//       return 1;
-
-   return result;
-}
-
-int CameraTest_Exit()
-{
-   int result = 0;
-
-//    if (pCamera)
-//    {
-//       pCamera->stopPreview();
-//       delete pCamera;
-//    }
-//    pCamera = NULL;
-
-   return result;
-}
-
-
-EXTERN_C_END
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "camera_test.h"
+// #include "camera_class.h"
+
+EXTERN_C_START
+
+// static android::Camera* pCamera = NULL;
+
+int CameraTest_Initialize(int nFrameRate,
+        int nFrameWidth,
+        int nFrameHeight,
+        CameraPreviewCallback pfnPreviewCallback)
+{
+    int result = 0;
+
+    //    pCamera = new android::Camera;
+    //    if (!pCamera)
+    //       return 1;
+
+    //    pCamera->init_camera(nFrameWidth,
+    //                         nFrameHeight,
+    //                         nFrameRate,
+    //                         pfnPreviewCallback);
+
+    return result;
+}
+
+int CameraTest_Run()
+{
+    int result = 0;
+
+    //    if (pCamera)
+    //       pCamera->startPreview();
+    //    else
+    //       return 1;
+
+    return result;
+}
+
+int CameraTest_ReleaseFrame(void* pPhys, void* pVirt)
+{
+    int result = 0;
+
+    //    if (pCamera)
+    //       pCamera->releaseFrame(pPhys, pVirt);
+    //    else
+    //       return 1;
+
+    return result;
+}
+
+int CameraTest_Exit()
+{
+    int result = 0;
+
+    //    if (pCamera)
+    //    {
+    //       pCamera->stopPreview();
+    //       delete pCamera;
+    //    }
+    //    pCamera = NULL;
+
+    return result;
+}
+
+
+EXTERN_C_END
diff --git a/mm-video-v4l2/vidc/venc/test/fb_test.c b/mm-video-v4l2/vidc/venc/test/fb_test.c
old mode 100755
new mode 100644
index 6479a3e..d7d2a12
--- a/mm-video-v4l2/vidc/venc/test/fb_test.c
+++ b/mm-video-v4l2/vidc/venc/test/fb_test.c
@@ -1,48 +1,48 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "fb_test.h"
-
-int FBTest_Initialize(int nFrameWidth,
-                      int nFrameHeight)
-{
-   return 0;
-}
-int FBTest_DisplayImage(int nPmemFd, int nOffset)
-{
-   return 0;
-}
-
-int FBTest_Exit()
-{
-   return 0;
-}
-
-int FBTest_RunTest()
-{
-   return 0;
-}
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "fb_test.h"
+
+int FBTest_Initialize(int nFrameWidth,
+        int nFrameHeight)
+{
+    return 0;
+}
+int FBTest_DisplayImage(int nPmemFd, int nOffset)
+{
+    return 0;
+}
+
+int FBTest_Exit()
+{
+    return 0;
+}
+
+int FBTest_RunTest()
+{
+    return 0;
+}
diff --git a/mm-video-v4l2/vidc/venc/test/queue.c b/mm-video-v4l2/vidc/venc/test/queue.c
old mode 100755
new mode 100644
index 94756b0..b0ed83f
--- a/mm-video-v4l2/vidc/venc/test/queue.c
+++ b/mm-video-v4l2/vidc/venc/test/queue.c
@@ -1,174 +1,159 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "queue.h"
-
-int check_if_queue_empty ( unsigned int queuetocheck, void* queuecontext )
-{
-	struct video_queue_context *ptr_q = NULL;
-    /*
-	 * queuetocheck - 0 command queue
-	 * queuetocheck - 1 data queue
-	 */
-	if ( queuecontext == NULL || (queuetocheck > 1 ) )
-	{
-		return 1;
-	}
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-	if (queuetocheck == 0)
-	{
-      if (ptr_q->read_comq == ptr_q->write_comq)
-	  {
-		  return 1;
-	  }
-	}
-	else if (queuetocheck == 1)
-	{
-		if (ptr_q->write_dataq == ptr_q->read_dataq)
-		{
-			return 1;
-		}
-	}
-
-    return 0;
-}
-
-
-
-struct video_msgq * queue_get_cmd (void* queuecontext )
-{
-    struct video_queue_context *ptr_q = NULL;
-	struct video_msgq *pitem = NULL;
-
-    if( NULL == queuecontext )
-    {
-        printf("\n queue_get_cmd: Invalid Input parameter\n");
-        return NULL;
-    }
-
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-    /* Wait on the semaphore till it is released */
-    sem_wait(&ptr_q->sem_message);
-
-    /* Lock the mutex to protect the critical section */
-    pthread_mutex_lock(&ptr_q->mutex);
-
-    if (ptr_q->read_comq != ptr_q->write_comq)
-    {
-        pitem = &ptr_q->ptr_cmdq [ptr_q->read_comq];
-        ptr_q->read_comq = (ptr_q->read_comq + 1) % \
-			                ptr_q->commandq_size;
-    }
-    else if (ptr_q->write_dataq != ptr_q->read_dataq)
-	{
-        pitem = &ptr_q->ptr_dataq [ptr_q->read_dataq];
-		ptr_q->read_dataq = (ptr_q->read_dataq + 1) % \
-			                ptr_q->dataq_size;
-	}
-
-    /* Unlock the mutex to release the critical section */
-    pthread_mutex_unlock(&ptr_q->mutex);
-
-    return pitem;
-}
-
-
-int queue_post_cmdq ( void* queuecontext,
-                     struct video_msgq *pitem
-                     )
-{
-    struct video_queue_context *ptr_q = NULL;
-
-	if (pitem == NULL || queuecontext == NULL)
-	{
-		return -1;
-	}
-    ptr_q = (struct video_queue_context *)queuecontext;
-
-    /* Lock the mutex to protect the critical section */
-    pthread_mutex_lock(&ptr_q->mutex);
-
-    if ((ptr_q->write_comq + 1) % ptr_q->commandq_size == ptr_q->read_comq)
-    {
-        printf("\n QUEUE is FULL");
-		return 0;
-    }
-    else
-    {
-        /* Store the command in the Message Queue & increment write offset */
-		memcpy ( &ptr_q->ptr_cmdq [ptr_q->write_comq],pitem, \
-				 sizeof (struct video_msgq));
-        ptr_q->write_comq = (ptr_q->write_comq + 1) % ptr_q->commandq_size;
-    }
-
-    /* Unlock the mutex to release the critical section */
-    pthread_mutex_unlock(&ptr_q->mutex);
-
-    /* Post the semaphore */
-    sem_post(&ptr_q->sem_message);
-	return 1;
-}
-
-
-int queue_post_dataq ( void *queuecontext,
-                       struct video_msgq *pitem
-                      )
-{
-	struct video_queue_context *ptr_q = NULL;
-
-	if (pitem == NULL || queuecontext == NULL)
-	{
-		return -1;
-	}
-	ptr_q = (struct video_queue_context *)queuecontext;
-
-	/* Lock the mutex to protect the critical section */
-	pthread_mutex_lock(&ptr_q->mutex);
-
-	if ((ptr_q->write_dataq + 1) % ptr_q->dataq_size == ptr_q->read_dataq)
-	{
-		printf("\n QUEUE is FULL");
-		return 0;
-	}
-	else
-	{
-		/* Store the command in the Message Queue & increment write offset */
-		memcpy ( &ptr_q->ptr_dataq [ptr_q->write_dataq],pitem, \
-				 sizeof (struct video_msgq));
-		ptr_q->write_dataq = (ptr_q->write_dataq + 1) % ptr_q->dataq_size;
-	}
-
-	/* Unlock the mutex to release the critical section */
-	pthread_mutex_unlock(&ptr_q->mutex);
-
-	/* Post the semaphore */
-	sem_post(&ptr_q->sem_message);
-	return 1;
-
-}
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "queue.h"
+
+int check_if_queue_empty ( unsigned int queuetocheck, void* queuecontext )
+{
+    struct video_queue_context *ptr_q = NULL;
+
+    /*
+     * queuetocheck - 0 command queue
+     * queuetocheck - 1 data queue
+     */
+    if ( queuecontext == NULL || (queuetocheck > 1 ) ) {
+        return 1;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    if (queuetocheck == 0) {
+        if (ptr_q->read_comq == ptr_q->write_comq) {
+            return 1;
+        }
+    } else if (queuetocheck == 1) {
+        if (ptr_q->write_dataq == ptr_q->read_dataq) {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+
+
+struct video_msgq * queue_get_cmd (void* queuecontext ) {
+    struct video_queue_context *ptr_q = NULL;
+    struct video_msgq *pitem = NULL;
+
+    if ( NULL == queuecontext ) {
+        printf("\n queue_get_cmd: Invalid Input parameter\n");
+        return NULL;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    /* Wait on the semaphore till it is released */
+    sem_wait(&ptr_q->sem_message);
+
+    /* Lock the mutex to protect the critical section */
+    pthread_mutex_lock(&ptr_q->mutex);
+
+    if (ptr_q->read_comq != ptr_q->write_comq) {
+        pitem = &ptr_q->ptr_cmdq [ptr_q->read_comq];
+        ptr_q->read_comq = (ptr_q->read_comq + 1) % \
+                   ptr_q->commandq_size;
+    } else if (ptr_q->write_dataq != ptr_q->read_dataq) {
+        pitem = &ptr_q->ptr_dataq [ptr_q->read_dataq];
+        ptr_q->read_dataq = (ptr_q->read_dataq + 1) % \
+                    ptr_q->dataq_size;
+    }
+
+    /* Unlock the mutex to release the critical section */
+    pthread_mutex_unlock(&ptr_q->mutex);
+
+    return pitem;
+}
+
+
+int queue_post_cmdq ( void* queuecontext,
+        struct video_msgq *pitem
+        )
+{
+    struct video_queue_context *ptr_q = NULL;
+
+    if (pitem == NULL || queuecontext == NULL) {
+        return -1;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    /* Lock the mutex to protect the critical section */
+    pthread_mutex_lock(&ptr_q->mutex);
+
+    if ((ptr_q->write_comq + 1) % ptr_q->commandq_size == ptr_q->read_comq) {
+        printf("\n QUEUE is FULL");
+        return 0;
+    } else {
+        /* Store the command in the Message Queue & increment write offset */
+        memcpy ( &ptr_q->ptr_cmdq [ptr_q->write_comq],pitem, \
+                sizeof (struct video_msgq));
+        ptr_q->write_comq = (ptr_q->write_comq + 1) % ptr_q->commandq_size;
+    }
+
+    /* Unlock the mutex to release the critical section */
+    pthread_mutex_unlock(&ptr_q->mutex);
+
+    /* Post the semaphore */
+    sem_post(&ptr_q->sem_message);
+    return 1;
+}
+
+
+int queue_post_dataq ( void *queuecontext,
+        struct video_msgq *pitem
+        )
+{
+    struct video_queue_context *ptr_q = NULL;
+
+    if (pitem == NULL || queuecontext == NULL) {
+        return -1;
+    }
+
+    ptr_q = (struct video_queue_context *)queuecontext;
+
+    /* Lock the mutex to protect the critical section */
+    pthread_mutex_lock(&ptr_q->mutex);
+
+    if ((ptr_q->write_dataq + 1) % ptr_q->dataq_size == ptr_q->read_dataq) {
+        printf("\n QUEUE is FULL");
+        return 0;
+    } else {
+        /* Store the command in the Message Queue & increment write offset */
+        memcpy ( &ptr_q->ptr_dataq [ptr_q->write_dataq],pitem, \
+                sizeof (struct video_msgq));
+        ptr_q->write_dataq = (ptr_q->write_dataq + 1) % ptr_q->dataq_size;
+    }
+
+    /* Unlock the mutex to release the critical section */
+    pthread_mutex_unlock(&ptr_q->mutex);
+
+    /* Post the semaphore */
+    sem_post(&ptr_q->sem_message);
+    return 1;
+
+}
diff --git a/mm-video-v4l2/vidc/venc/test/venc_test.cpp b/mm-video-v4l2/vidc/venc/test/venc_test.cpp
index 7afb5bd..b14f807 100644
--- a/mm-video-v4l2/vidc/venc/test/venc_test.cpp
+++ b/mm-video-v4l2/vidc/venc/test/venc_test.cpp
@@ -84,28 +84,28 @@
 #include <cutils/log.h>
 /// Debug message macro
 #define D(fmt, ...) ALOGE("venc_test Debug %s::%d "fmt,              \
-                         __FUNCTION__, __LINE__,                        \
-                         ## __VA_ARGS__)
+        __FUNCTION__, __LINE__,                        \
+## __VA_ARGS__)
 
 /// Error message macro
 #define E(fmt, ...) ALOGE("venc_test Error %s::%d "fmt,            \
-                         __FUNCTION__, __LINE__,                      \
-                         ## __VA_ARGS__)
+        __FUNCTION__, __LINE__,                      \
+## __VA_ARGS__)
 
 #else
-     #ifdef TEST_LOG
-       #define D(fmt, ...) fprintf(stderr, "venc_test Debug %s::%d "fmt"\n",   \
-                            __FUNCTION__, __LINE__,                     \
-                            ## __VA_ARGS__)
+#ifdef TEST_LOG
+#define D(fmt, ...) fprintf(stderr, "venc_test Debug %s::%d "fmt"\n",   \
+        __FUNCTION__, __LINE__,                     \
+## __VA_ARGS__)
 
-     /// Error message macro
-      #define E(fmt, ...) fprintf(stderr, "venc_test Error %s::%d "fmt"\n", \
-                            __FUNCTION__, __LINE__,                   \
-                            ## __VA_ARGS__)
-     #else
-      #define D(fmt, ...)
-      #define E(fmt, ...)
-         #endif
+/// Error message macro
+#define E(fmt, ...) fprintf(stderr, "venc_test Error %s::%d "fmt"\n", \
+        __FUNCTION__, __LINE__,                   \
+## __VA_ARGS__)
+#else
+#define D(fmt, ...)
+#define E(fmt, ...)
+#endif
 
 #endif
 
@@ -125,8 +125,7 @@
 
 //////////////////////////
 /* MPEG4 profile and level table*/
-static const unsigned int mpeg4_profile_level_table[][5]=
-{
+static const unsigned int mpeg4_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
     {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
@@ -155,9 +154,8 @@
 };
 
 /* H264 profile and level table*/
-static const unsigned int h264_profile_level_table[][5]=
-{
-     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
+static const unsigned int h264_profile_level_table[][5]= {
+    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
     {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
     {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
@@ -215,8 +213,7 @@
 };
 
 /* H263 profile and level table*/
-static const unsigned int h263_profile_level_table[][5]=
-{
+static const unsigned int h263_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
     {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
@@ -233,8 +230,7 @@
     {0,0,0,0,0}
 };
 #ifdef _MSM8974_
-static const unsigned int VP8_profile_level_table[][5]=
-{
+static const unsigned int VP8_profile_level_table[][5]= {
     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
     {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
     {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
@@ -256,93 +252,82 @@
 //////////////////////////
 // TYPES
 //////////////////////////
-struct ProfileType
-{
-   OMX_VIDEO_CODINGTYPE eCodec;
-   OMX_VIDEO_MPEG4LEVELTYPE eLevel;
-   OMX_VIDEO_CONTROLRATETYPE eControlRate;
-   OMX_VIDEO_AVCSLICEMODETYPE eSliceMode;
-   OMX_U32 nFrameWidth;
-   OMX_U32 nFrameHeight;
-   OMX_U32 nFrameBytes;
+struct ProfileType {
+    OMX_VIDEO_CODINGTYPE eCodec;
+    OMX_VIDEO_MPEG4LEVELTYPE eLevel;
+    OMX_VIDEO_CONTROLRATETYPE eControlRate;
+    OMX_VIDEO_AVCSLICEMODETYPE eSliceMode;
+    OMX_U32 nFrameWidth;
+    OMX_U32 nFrameHeight;
+    OMX_U32 nFrameBytes;
 #ifdef _MSM8974_
-   OMX_U32 nFramestride;
-   OMX_U32 nFrameScanlines;
-   OMX_U32 nFrameRead;
+    OMX_U32 nFramestride;
+    OMX_U32 nFrameScanlines;
+    OMX_U32 nFrameRead;
 #endif
-   OMX_U32 nBitrate;
-   float nFramerate;
-   char* cInFileName;
-   char* cOutFileName;
-   OMX_U32 nUserProfile;
+    OMX_U32 nBitrate;
+    float nFramerate;
+    char* cInFileName;
+    char* cOutFileName;
+    OMX_U32 nUserProfile;
 };
 
-enum MsgId
-{
-   MSG_ID_OUTPUT_FRAME_DONE,
-   MSG_ID_INPUT_FRAME_DONE,
-   MSG_ID_MAX
+enum MsgId {
+    MSG_ID_OUTPUT_FRAME_DONE,
+    MSG_ID_INPUT_FRAME_DONE,
+    MSG_ID_MAX
 };
-union MsgData
-{
-   struct
-   {
-      OMX_BUFFERHEADERTYPE* pBuffer;
-   } sBitstreamData;
+union MsgData {
+    struct {
+        OMX_BUFFERHEADERTYPE* pBuffer;
+    } sBitstreamData;
 };
-struct Msg
-{
-   MsgId id;
-   MsgData data;
+struct Msg {
+    MsgId id;
+    MsgData data;
 };
-struct MsgQ
-{
-   Msg q[MAX_MSG];
-   int head;
-   int size;
+struct MsgQ {
+    Msg q[MAX_MSG];
+    int head;
+    int size;
 };
 
-enum Mode
-{
-   MODE_PREVIEW,
-   MODE_DISPLAY,
-   MODE_PROFILE,
-   MODE_FILE_ENCODE,
-   MODE_LIVE_ENCODE
+enum Mode {
+    MODE_PREVIEW,
+    MODE_DISPLAY,
+    MODE_PROFILE,
+    MODE_FILE_ENCODE,
+    MODE_LIVE_ENCODE
 };
 
-enum ResyncMarkerType
-{
-   RESYNC_MARKER_NONE,     ///< No resync marker
-   RESYNC_MARKER_BYTE,     ///< BYTE Resync marker for MPEG4, H.264
-   RESYNC_MARKER_MB,       ///< MB resync marker for MPEG4, H.264
-   RESYNC_MARKER_GOB       ///< GOB resync marker for H.263
+enum ResyncMarkerType {
+    RESYNC_MARKER_NONE,     ///< No resync marker
+    RESYNC_MARKER_BYTE,     ///< BYTE Resync marker for MPEG4, H.264
+    RESYNC_MARKER_MB,       ///< MB resync marker for MPEG4, H.264
+    RESYNC_MARKER_GOB       ///< GOB resync marker for H.263
 };
 
-union DynamicConfigData
-{
-   OMX_VIDEO_CONFIG_BITRATETYPE bitrate;
-   OMX_CONFIG_FRAMERATETYPE framerate;
-   QOMX_VIDEO_INTRAPERIODTYPE intraperiod;
-   OMX_CONFIG_INTRAREFRESHVOPTYPE intravoprefresh;
-   OMX_CONFIG_ROTATIONTYPE rotation;
-   float f_framerate;
+union DynamicConfigData {
+    OMX_VIDEO_CONFIG_BITRATETYPE bitrate;
+    OMX_CONFIG_FRAMERATETYPE framerate;
+    QOMX_VIDEO_INTRAPERIODTYPE intraperiod;
+    OMX_CONFIG_INTRAREFRESHVOPTYPE intravoprefresh;
+    OMX_CONFIG_ROTATIONTYPE rotation;
+    float f_framerate;
 };
 
-struct DynamicConfig
-{
-   bool pending;
-   unsigned frame_num;
-   OMX_INDEXTYPE config_param;
-   union DynamicConfigData config_data;
+struct DynamicConfig {
+    bool pending;
+    unsigned frame_num;
+    OMX_INDEXTYPE config_param;
+    union DynamicConfigData config_data;
 };
 
 #ifdef USE_ION
-struct enc_ion
-{
-   int ion_device_fd;
-   struct ion_allocation_data alloc_data;
-   struct ion_fd_data ion_alloc_fd;
+struct enc_ion {
+    int ion_device_fd;
+    struct ion_allocation_data alloc_data;
+    struct ion_fd_data ion_alloc_fd;
 };
 #endif
 
@@ -400,2043 +385,1949 @@
 
 void* PmemMalloc(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, int nSize)
 {
-   void *pvirt = NULL;
-   int rc = 0;
+    void *pvirt = NULL;
+    int rc = 0;
 
-   if (!pMem)
-      return NULL;
+    if (!pMem)
+        return NULL;
 
 #ifdef USE_ION
-  ion_data.ion_device_fd = open (PMEM_DEVICE, O_RDONLY);
-  if(ion_data.ion_device_fd < 0)
-  {
-      E("\nERROR: ION Device open() Failed");
-      return NULL;
-  }
-  nSize = (nSize + 4095) & (~4095);
-  ion_data.alloc_data.len = nSize;
-  ion_data.alloc_data.heap_mask = 0x1 << ION_CP_MM_HEAP_ID;
-  ion_data.alloc_data.align = 4096;
-  ion_data.alloc_data.flags = ION_SECURE;
+    ion_data.ion_device_fd = open (PMEM_DEVICE, O_RDONLY);
 
-  rc = ioctl(ion_data.ion_device_fd,ION_IOC_ALLOC,&ion_data.alloc_data);
-  if(rc || !ion_data.alloc_data.handle) {
-         E("\n ION ALLOC memory failed rc: %d, handle: %p", rc, ion_data.alloc_data.handle);
-         ion_data.alloc_data.handle=NULL;
-         return NULL;
-  }
+    if (ion_data.ion_device_fd < 0) {
+        E("\nERROR: ION Device open() Failed");
+        return NULL;
+    }
 
-  ion_data.ion_alloc_fd.handle = ion_data.alloc_data.handle;
-  rc = ioctl(ion_data.ion_device_fd,ION_IOC_MAP,&ion_data.ion_alloc_fd);
-  if(rc) {
+    nSize = (nSize + 4095) & (~4095);
+    ion_data.alloc_data.len = nSize;
+    ion_data.alloc_data.heap_mask = 0x1 << ION_CP_MM_HEAP_ID;
+    ion_data.alloc_data.align = 4096;
+    ion_data.alloc_data.flags = ION_SECURE;
+
+    rc = ioctl(ion_data.ion_device_fd,ION_IOC_ALLOC,&ion_data.alloc_data);
+
+    if (rc || !ion_data.alloc_data.handle) {
+        E("\n ION ALLOC memory failed rc: %d, handle: %p", rc, ion_data.alloc_data.handle);
+        ion_data.alloc_data.handle=NULL;
+        return NULL;
+    }
+
+    ion_data.ion_alloc_fd.handle = ion_data.alloc_data.handle;
+    rc = ioctl(ion_data.ion_device_fd,ION_IOC_MAP,&ion_data.ion_alloc_fd);
+
+    if (rc) {
         E("\n ION MAP failed ");
         ion_data.ion_alloc_fd.fd =-1;
         ion_data.ion_alloc_fd.fd =-1;
         return NULL;
-  }
-  pMem->pmem_fd = ion_data.ion_alloc_fd.fd;
-#else
-   pMem->pmem_fd = open(PMEM_DEVICE, O_RDWR);
-   if ((int)(pMem->pmem_fd) < 0)
-      return NULL;
-   nSize = (nSize + 4095) & (~4095);
-#endif
-   pMem->offset = 0;
-   pvirt = mmap(NULL, nSize,
-                PROT_READ | PROT_WRITE,
-                MAP_SHARED, pMem->pmem_fd, pMem->offset);
-   if (pvirt == (void*) MAP_FAILED)
-   {
-      close(pMem->pmem_fd);
-      pMem->pmem_fd = -1;
-#ifdef USE_ION
-    if(ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
-       &ion_data.alloc_data.handle)) {
-      E("ion recon buffer free failed");
     }
+
+    pMem->pmem_fd = ion_data.ion_alloc_fd.fd;
+#else
+    pMem->pmem_fd = open(PMEM_DEVICE, O_RDWR);
+
+    if ((int)(pMem->pmem_fd) < 0)
+        return NULL;
+
+    nSize = (nSize + 4095) & (~4095);
+#endif
+    pMem->offset = 0;
+    pvirt = mmap(NULL, nSize,
+            PROT_READ | PROT_WRITE,
+            MAP_SHARED, pMem->pmem_fd, pMem->offset);
+
+    if (pvirt == (void*) MAP_FAILED) {
+        close(pMem->pmem_fd);
+        pMem->pmem_fd = -1;
+#ifdef USE_ION
+
+        if (ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
+                    &ion_data.alloc_data.handle)) {
+            E("ion recon buffer free failed");
+        }
+
+        ion_data.alloc_data.handle = NULL;
+        ion_data.ion_alloc_fd.fd =-1;
+        close(ion_data.ion_device_fd);
+        ion_data.ion_device_fd =-1;
+#endif
+        return NULL;
+    }
+
+    D("allocated pMem->fd = %lu pvirt=0x%p, pMem->phys=0x%lx, size = %d", pMem->pmem_fd,
+            pvirt, pMem->offset, nSize);
+    return pvirt;
+}
+
+int PmemFree(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, void* pvirt, int nSize)
+{
+    if (!pMem || !pvirt)
+        return -1;
+
+    nSize = (nSize + 4095) & (~4095);
+    munmap(pvirt, nSize);
+    close(pMem->pmem_fd);
+    pMem->pmem_fd = -1;
+#ifdef USE_ION
+
+    if (ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
+                &ion_data.alloc_data.handle)) {
+        E("ion recon buffer free failed");
+    }
+
     ion_data.alloc_data.handle = NULL;
     ion_data.ion_alloc_fd.fd =-1;
     close(ion_data.ion_device_fd);
     ion_data.ion_device_fd =-1;
 #endif
-      return NULL;
-   }
-   D("allocated pMem->fd = %lu pvirt=0x%p, pMem->phys=0x%lx, size = %d", pMem->pmem_fd,
-       pvirt, pMem->offset, nSize);
-   return pvirt;
-}
-
-int PmemFree(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, void* pvirt, int nSize)
-{
-   if (!pMem || !pvirt)
-      return -1;
-
-   nSize = (nSize + 4095) & (~4095);
-   munmap(pvirt, nSize);
-   close(pMem->pmem_fd);
-   pMem->pmem_fd = -1;
-#ifdef USE_ION
-   if(ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
-         &ion_data.alloc_data.handle)) {
-        E("ion recon buffer free failed");
-   }
-   ion_data.alloc_data.handle = NULL;
-   ion_data.ion_alloc_fd.fd =-1;
-   close(ion_data.ion_device_fd);
-   ion_data.ion_device_fd =-1;
-#endif
-   return 0;
+    return 0;
 }
 void PrintFramePackArrangement(OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement)
 {
     printf("id (%lu)\n",
-           framePackingArrangement.id);
+            framePackingArrangement.id);
     printf("cancel_flag (%lu)\n",
-           framePackingArrangement.cancel_flag);
+            framePackingArrangement.cancel_flag);
     printf("type (%lu)\n",
-           framePackingArrangement.type);
+            framePackingArrangement.type);
     printf("quincunx_sampling_flag (%lu)\n",
-           framePackingArrangement.quincunx_sampling_flag);
-   printf("content_interpretation_type (%lu)\n",
-          framePackingArrangement.content_interpretation_type);
-   printf("spatial_flipping_flag (%lu)\n",
-          framePackingArrangement.spatial_flipping_flag);
-   printf("frame0_flipped_flag (%lu)\n",
-          framePackingArrangement.frame0_flipped_flag);
-   printf("field_views_flag (%lu)\n",
-          framePackingArrangement.field_views_flag);
-   printf("current_frame_is_frame0_flag (%lu)\n",
-          framePackingArrangement.current_frame_is_frame0_flag);
-   printf("frame0_self_contained_flag (%lu)\n",
-          framePackingArrangement.frame0_self_contained_flag);
-   printf("frame1_self_contained_flag (%lu)\n",
-          framePackingArrangement.frame1_self_contained_flag);
-   printf("frame0_grid_position_x (%lu)\n",
-          framePackingArrangement.frame0_grid_position_x);
-   printf("frame0_grid_position_y (%lu)\n",
-          framePackingArrangement.frame0_grid_position_y);
-   printf("frame1_grid_position_x (%lu)\n",
-          framePackingArrangement.frame1_grid_position_x);
-   printf("frame1_grid_position_y (%lu)\n",
-          framePackingArrangement.frame1_grid_position_y);
-   printf("reserved_byte (%lu)\n",
-          framePackingArrangement.reserved_byte);
-   printf("repetition_period (%lu)\n",
-          framePackingArrangement.repetition_period);
-   printf("extension_flag (%lu)\n",
-          framePackingArrangement.extension_flag);
+            framePackingArrangement.quincunx_sampling_flag);
+    printf("content_interpretation_type (%lu)\n",
+            framePackingArrangement.content_interpretation_type);
+    printf("spatial_flipping_flag (%lu)\n",
+            framePackingArrangement.spatial_flipping_flag);
+    printf("frame0_flipped_flag (%lu)\n",
+            framePackingArrangement.frame0_flipped_flag);
+    printf("field_views_flag (%lu)\n",
+            framePackingArrangement.field_views_flag);
+    printf("current_frame_is_frame0_flag (%lu)\n",
+            framePackingArrangement.current_frame_is_frame0_flag);
+    printf("frame0_self_contained_flag (%lu)\n",
+            framePackingArrangement.frame0_self_contained_flag);
+    printf("frame1_self_contained_flag (%lu)\n",
+            framePackingArrangement.frame1_self_contained_flag);
+    printf("frame0_grid_position_x (%lu)\n",
+            framePackingArrangement.frame0_grid_position_x);
+    printf("frame0_grid_position_y (%lu)\n",
+            framePackingArrangement.frame0_grid_position_y);
+    printf("frame1_grid_position_x (%lu)\n",
+            framePackingArrangement.frame1_grid_position_x);
+    printf("frame1_grid_position_y (%lu)\n",
+            framePackingArrangement.frame1_grid_position_y);
+    printf("reserved_byte (%lu)\n",
+            framePackingArrangement.reserved_byte);
+    printf("repetition_period (%lu)\n",
+            framePackingArrangement.repetition_period);
+    printf("extension_flag (%lu)\n",
+            framePackingArrangement.extension_flag);
 }
 void SetState(OMX_STATETYPE eState)
 {
 #define GOTO_STATE(eState)                      \
-   case eState:                                 \
-      {                                         \
-         D("Going to state " # eState"...");            \
-         OMX_SendCommand(m_hHandle,                     \
-                         OMX_CommandStateSet,           \
-                         (OMX_U32) eState,              \
-                         NULL);                         \
-         while (m_eState != eState)                     \
-         {                                              \
-            sleep(1);                               \
-         }                                              \
-         D("Now in state " # eState);                   \
-         break;                                         \
-      }
+    case eState:                                 \
+                             {                                         \
+                                 D("Going to state " # eState"...");            \
+                                 OMX_SendCommand(m_hHandle,                     \
+                                         OMX_CommandStateSet,           \
+                                         (OMX_U32) eState,              \
+                                         NULL);                         \
+                                 while (m_eState != eState)                     \
+                                 {                                              \
+                                     sleep(1);                               \
+                                 }                                              \
+                                 D("Now in state " # eState);                   \
+                                 break;                                         \
+                             }
 
-   switch (eState)
-   {
-      GOTO_STATE(OMX_StateLoaded);
-      GOTO_STATE(OMX_StateIdle);
-      GOTO_STATE(OMX_StateExecuting);
-      GOTO_STATE(OMX_StateInvalid);
-      GOTO_STATE(OMX_StateWaitForResources);
-      GOTO_STATE(OMX_StatePause);
-   }
+    switch (eState) {
+        GOTO_STATE(OMX_StateLoaded);
+        GOTO_STATE(OMX_StateIdle);
+        GOTO_STATE(OMX_StateExecuting);
+        GOTO_STATE(OMX_StateInvalid);
+        GOTO_STATE(OMX_StateWaitForResources);
+        GOTO_STATE(OMX_StatePause);
+    }
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE ConfigureEncoder()
 {
-   OMX_ERRORTYPE result = OMX_ErrorNone;
-   unsigned const int *profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
-   OMX_U32 mb_per_sec, mb_per_frame;
-   bool profile_level_found = false;
-   OMX_U32 eProfile,eLevel;
+    OMX_ERRORTYPE result = OMX_ErrorNone;
+    unsigned const int *profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+    OMX_U32 mb_per_sec, mb_per_frame;
+    bool profile_level_found = false;
+    OMX_U32 eProfile,eLevel;
 
-   OMX_PARAM_PORTDEFINITIONTYPE portdef; // OMX_IndexParamPortDefinition
+    OMX_PARAM_PORTDEFINITIONTYPE portdef; // OMX_IndexParamPortDefinition
 #ifdef QCOM_EXT
-      OMX_QCOM_PARAM_PORTDEFINITIONTYPE qPortDefnType;
+    OMX_QCOM_PARAM_PORTDEFINITIONTYPE qPortDefnType;
 #endif
-   portdef.nPortIndex = (OMX_U32) 0; // input
-   result = OMX_GetParameter(m_hHandle,
-                             OMX_IndexParamPortDefinition,
-                             &portdef);
-   E("\n OMX_IndexParamPortDefinition Get Paramter on input port");
-   CHK(result);
-   portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
-   portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
+    portdef.nPortIndex = (OMX_U32) 0; // input
+    result = OMX_GetParameter(m_hHandle,
+            OMX_IndexParamPortDefinition,
+            &portdef);
+    E("\n OMX_IndexParamPortDefinition Get Paramter on input port");
+    CHK(result);
+    portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
+    portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
 
-   E ("\n Height %lu width %lu bit rate %lu",portdef.format.video.nFrameHeight
-      ,portdef.format.video.nFrameWidth,portdef.format.video.nBitrate);
-   result = OMX_SetParameter(m_hHandle,
-                             OMX_IndexParamPortDefinition,
-                             &portdef);
-   E("\n OMX_IndexParamPortDefinition Set Paramter on input port");
-   CHK(result);
-   // once more to get proper buffer size
-   result = OMX_GetParameter(m_hHandle,
-                             OMX_IndexParamPortDefinition,
-                             &portdef);
-   E("\n OMX_IndexParamPortDefinition Get Paramter on input port, 2nd pass");
-   CHK(result);
-   // update size accordingly
-   m_sProfile.nFrameBytes = portdef.nBufferSize;
-   portdef.nPortIndex = (OMX_U32) 1; // output
-   result = OMX_GetParameter(m_hHandle,
-                             OMX_IndexParamPortDefinition,
-                             &portdef);
-   E("\n OMX_IndexParamPortDefinition Get Paramter on output port");
-   CHK(result);
-   portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
-   portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
-   portdef.format.video.nBitrate = m_sProfile.nBitrate;
-   FractionToQ16(portdef.format.video.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
-   result = OMX_SetParameter(m_hHandle,
-                             OMX_IndexParamPortDefinition,
-                             &portdef);
-   E("\n OMX_IndexParamPortDefinition Set Paramter on output port");
-   CHK(result);
+    E ("\n Height %lu width %lu bit rate %lu",portdef.format.video.nFrameHeight
+            ,portdef.format.video.nFrameWidth,portdef.format.video.nBitrate);
+    result = OMX_SetParameter(m_hHandle,
+            OMX_IndexParamPortDefinition,
+            &portdef);
+    E("\n OMX_IndexParamPortDefinition Set Paramter on input port");
+    CHK(result);
+    // once more to get proper buffer size
+    result = OMX_GetParameter(m_hHandle,
+            OMX_IndexParamPortDefinition,
+            &portdef);
+    E("\n OMX_IndexParamPortDefinition Get Paramter on input port, 2nd pass");
+    CHK(result);
+    // update size accordingly
+    m_sProfile.nFrameBytes = portdef.nBufferSize;
+    portdef.nPortIndex = (OMX_U32) 1; // output
+    result = OMX_GetParameter(m_hHandle,
+            OMX_IndexParamPortDefinition,
+            &portdef);
+    E("\n OMX_IndexParamPortDefinition Get Paramter on output port");
+    CHK(result);
+    portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
+    portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
+    portdef.format.video.nBitrate = m_sProfile.nBitrate;
+    FractionToQ16(portdef.format.video.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
+    result = OMX_SetParameter(m_hHandle,
+            OMX_IndexParamPortDefinition,
+            &portdef);
+    E("\n OMX_IndexParamPortDefinition Set Paramter on output port");
+    CHK(result);
 
 #ifdef QCOM_EXT
 
-qPortDefnType.nPortIndex = PORT_INDEX_IN;
-qPortDefnType.nMemRegion = OMX_QCOM_MemRegionEBI1;
-qPortDefnType.nSize = sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
+    qPortDefnType.nPortIndex = PORT_INDEX_IN;
+    qPortDefnType.nMemRegion = OMX_QCOM_MemRegionEBI1;
+    qPortDefnType.nSize = sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
 
-result = OMX_SetParameter(m_hHandle,
-                             (OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
-                             &qPortDefnType);
+    result = OMX_SetParameter(m_hHandle,
+            (OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
+            &qPortDefnType);
 
 #endif
-   if (!m_sProfile.nUserProfile) // profile not set by user, go ahead with table calculation
-   {
-   //validate the ht,width,fps,bitrate and set the appropriate profile and level
-   if(m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
-   {
-     profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
-   }
-   else if(m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
-   {
-     profile_tbl = (unsigned int const *)h264_profile_level_table;
-   }
-   else if(m_sProfile.eCodec == OMX_VIDEO_CodingH263)
-   {
-     profile_tbl = (unsigned int const *)h263_profile_level_table;
-   }
+
+    if (!m_sProfile.nUserProfile) { // profile not set by user, go ahead with table calculation
+        //validate the ht,width,fps,bitrate and set the appropriate profile and level
+        if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4) {
+            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+        } else if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC) {
+            profile_tbl = (unsigned int const *)h264_profile_level_table;
+        } else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263) {
+            profile_tbl = (unsigned int const *)h263_profile_level_table;
+        }
+
 #ifdef _MSM8974_
-   else if(m_sProfile.eCodec == OMX_VIDEO_CodingVPX)
-   {
-     profile_tbl = (unsigned int const *)VP8_profile_level_table;
-   }
+        else if (m_sProfile.eCodec == OMX_VIDEO_CodingVPX) {
+            profile_tbl = (unsigned int const *)VP8_profile_level_table;
+        }
+
 #endif
-   mb_per_frame = ((m_sProfile.nFrameHeight+15)>>4)*
-                ((m_sProfile.nFrameWidth+15)>>4);
+        mb_per_frame = ((m_sProfile.nFrameHeight+15)>>4)*
+            ((m_sProfile.nFrameWidth+15)>>4);
 
-   mb_per_sec = mb_per_frame*(m_sProfile.nFramerate);
+        mb_per_sec = mb_per_frame*(m_sProfile.nFramerate);
 
-   do{
-      if(mb_per_frame <= (unsigned int)profile_tbl[0])
-      {
-          if(mb_per_sec <= (unsigned int)profile_tbl[1])
-          {
-            if(m_sProfile.nBitrate <= (unsigned int)profile_tbl[2])
-            {
-              eLevel = (int)profile_tbl[3];
-              eProfile = (int)profile_tbl[4];
-              E("\n profile/level found: %lu/%lu\n",eProfile, eLevel);
-              profile_level_found = true;
-              break;
+        do {
+            if (mb_per_frame <= (unsigned int)profile_tbl[0]) {
+                if (mb_per_sec <= (unsigned int)profile_tbl[1]) {
+                    if (m_sProfile.nBitrate <= (unsigned int)profile_tbl[2]) {
+                        eLevel = (int)profile_tbl[3];
+                        eProfile = (int)profile_tbl[4];
+                        E("\n profile/level found: %lu/%lu\n",eProfile, eLevel);
+                        profile_level_found = true;
+                        break;
+                    }
+                }
             }
-          }
-      }
-      profile_tbl = profile_tbl + 5;
-   }while(profile_tbl[0] != 0);
 
-   if ( profile_level_found != true )
-   {
-     E("\n Error: Unsupported profile/level\n");
-     return OMX_ErrorNone;
-   }
-   }
-   else // Profile set by user!
-   {
-      eProfile = m_sProfile.nUserProfile;
-      eLevel = 0;
-   }
-   if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
-   {
-      D("Configuring H263...");
+            profile_tbl = profile_tbl + 5;
+        } while (profile_tbl[0] != 0);
 
-      OMX_VIDEO_PARAM_H263TYPE h263;
-      result = OMX_GetParameter(m_hHandle,
-                                OMX_IndexParamVideoH263,
-                                &h263);
-      CHK(result);
-      h263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-      h263.nPFrames = m_sProfile.nFramerate * 2 - 1; // intra period
-      h263.nBFrames = 0;
-      h263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
-      h263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
-      h263.bPLUSPTYPEAllowed = OMX_FALSE;
-      h263.nAllowedPictureTypes = 2;
-      h263.bForceRoundingTypeToZero = OMX_TRUE;
-      h263.nPictureHeaderRepetition = 0;
-      h263.nGOBHeaderInterval = 1;
-      result = OMX_SetParameter(m_hHandle,
-                                OMX_IndexParamVideoH263,
-                                &h263);
-   }
-   else
-   {
-      D("Configuring MP4/H264...");
+        if ( profile_level_found != true ) {
+            E("\n Error: Unsupported profile/level\n");
+            return OMX_ErrorNone;
+        }
+    } else { // Profile set by user!
+        eProfile = m_sProfile.nUserProfile;
+        eLevel = 0;
+    }
 
-      OMX_VIDEO_PARAM_PROFILELEVELTYPE profileLevel; // OMX_IndexParamVideoProfileLevelCurrent
-      profileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-      profileLevel.eProfile = eProfile;
-      profileLevel.eLevel =  eLevel;
-      result = OMX_SetParameter(m_hHandle,
-                                OMX_IndexParamVideoProfileLevelCurrent,
-                                &profileLevel);
-      E("\n OMX_IndexParamVideoProfileLevelCurrent Set Paramter port");
-      CHK(result);
-      //profileLevel.eLevel = (OMX_U32) m_sProfile.eLevel;
-      result = OMX_GetParameter(m_hHandle,
-                                OMX_IndexParamVideoProfileLevelCurrent,
-                                &profileLevel);
-      E("\n OMX_IndexParamVideoProfileLevelCurrent Get Paramter port");
-      D ("\n Profile = %lu level = %lu",profileLevel.eProfile,profileLevel.eLevel);
-      CHK(result);
+    if (m_sProfile.eCodec == OMX_VIDEO_CodingH263) {
+        D("Configuring H263...");
 
-        if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
-        {
-        OMX_VIDEO_PARAM_MPEG4TYPE mp4; // OMX_IndexParamVideoMpeg4
-       result = OMX_GetParameter(m_hHandle,
-                                 OMX_IndexParamVideoMpeg4,
-                                 &mp4);
-       CHK(result);
-       mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-       mp4.nTimeIncRes = 1000;
-       result = OMX_SetParameter(m_hHandle,
-                                 OMX_IndexParamVideoMpeg4,
-                                 &mp4);
-       CHK(result);
-         }
-   }
-   if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
-   {
+        OMX_VIDEO_PARAM_H263TYPE h263;
+        result = OMX_GetParameter(m_hHandle,
+                OMX_IndexParamVideoH263,
+                &h263);
+        CHK(result);
+        h263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+        h263.nPFrames = m_sProfile.nFramerate * 2 - 1; // intra period
+        h263.nBFrames = 0;
+        h263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
+        h263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
+        h263.bPLUSPTYPEAllowed = OMX_FALSE;
+        h263.nAllowedPictureTypes = 2;
+        h263.bForceRoundingTypeToZero = OMX_TRUE;
+        h263.nPictureHeaderRepetition = 0;
+        h263.nGOBHeaderInterval = 1;
+        result = OMX_SetParameter(m_hHandle,
+                OMX_IndexParamVideoH263,
+                &h263);
+    } else {
+        D("Configuring MP4/H264...");
+
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE profileLevel; // OMX_IndexParamVideoProfileLevelCurrent
+        profileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+        profileLevel.eProfile = eProfile;
+        profileLevel.eLevel =  eLevel;
+        result = OMX_SetParameter(m_hHandle,
+                OMX_IndexParamVideoProfileLevelCurrent,
+                &profileLevel);
+        E("\n OMX_IndexParamVideoProfileLevelCurrent Set Paramter port");
+        CHK(result);
+        //profileLevel.eLevel = (OMX_U32) m_sProfile.eLevel;
+        result = OMX_GetParameter(m_hHandle,
+                OMX_IndexParamVideoProfileLevelCurrent,
+                &profileLevel);
+        E("\n OMX_IndexParamVideoProfileLevelCurrent Get Paramter port");
+        D ("\n Profile = %lu level = %lu",profileLevel.eProfile,profileLevel.eLevel);
+        CHK(result);
+
+        if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4) {
+            OMX_VIDEO_PARAM_MPEG4TYPE mp4; // OMX_IndexParamVideoMpeg4
+            result = OMX_GetParameter(m_hHandle,
+                    OMX_IndexParamVideoMpeg4,
+                    &mp4);
+            CHK(result);
+            mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+            mp4.nTimeIncRes = 1000;
+            result = OMX_SetParameter(m_hHandle,
+                    OMX_IndexParamVideoMpeg4,
+                    &mp4);
+            CHK(result);
+        }
+    }
+
+    if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC) {
 #if 1
-/////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
+        /////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
 
-      OMX_VIDEO_PARAM_AVCTYPE avcdata;
-      avcdata.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
-      result = OMX_GetParameter(m_hHandle,
-                                OMX_IndexParamVideoAvc,
-                                &avcdata);
-      CHK(result);
-// TEST VALUES (CHANGE FOR DIFF CONFIG's)
-    avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
-//      avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisable;
-//    avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisableSliceBoundary;
-   avcdata.bEntropyCodingCABAC = OMX_FALSE;
-//   avcdata.bEntropyCodingCABAC = OMX_TRUE;
-   avcdata.nCabacInitIdc = 1;
-///////////////////////////////////////////////
+        OMX_VIDEO_PARAM_AVCTYPE avcdata;
+        avcdata.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+        result = OMX_GetParameter(m_hHandle,
+                OMX_IndexParamVideoAvc,
+                &avcdata);
+        CHK(result);
+        // TEST VALUES (CHANGE FOR DIFF CONFIG's)
+        avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
+        //      avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisable;
+        //    avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisableSliceBoundary;
+        avcdata.bEntropyCodingCABAC = OMX_FALSE;
+        //   avcdata.bEntropyCodingCABAC = OMX_TRUE;
+        avcdata.nCabacInitIdc = 1;
+        ///////////////////////////////////////////////
 
-      result = OMX_SetParameter(m_hHandle,
-                                OMX_IndexParamVideoAvc,
-                                &avcdata);
-      CHK(result);
+        result = OMX_SetParameter(m_hHandle,
+                OMX_IndexParamVideoAvc,
+                &avcdata);
+        CHK(result);
 
-/////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
+        /////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
 #endif
-   }
+    }
 
-   OMX_VIDEO_PARAM_BITRATETYPE bitrate; // OMX_IndexParamVideoBitrate
-   bitrate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
-   result = OMX_GetParameter(m_hHandle,
-                             OMX_IndexParamVideoBitrate,
-                             &bitrate);
-   E("\n OMX_IndexParamVideoBitrate Get Paramter port");
-   CHK(result);
-   bitrate.eControlRate = m_sProfile.eControlRate;
-   bitrate.nTargetBitrate = m_sProfile.nBitrate;
-   result = OMX_SetParameter(m_hHandle,
-                             OMX_IndexParamVideoBitrate,
-                             &bitrate);
-   E("\n OMX_IndexParamVideoBitrate Set Paramter port");
-   CHK(result);
+    OMX_VIDEO_PARAM_BITRATETYPE bitrate; // OMX_IndexParamVideoBitrate
+    bitrate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+    result = OMX_GetParameter(m_hHandle,
+            OMX_IndexParamVideoBitrate,
+            &bitrate);
+    E("\n OMX_IndexParamVideoBitrate Get Paramter port");
+    CHK(result);
+    bitrate.eControlRate = m_sProfile.eControlRate;
+    bitrate.nTargetBitrate = m_sProfile.nBitrate;
+    result = OMX_SetParameter(m_hHandle,
+            OMX_IndexParamVideoBitrate,
+            &bitrate);
+    E("\n OMX_IndexParamVideoBitrate Set Paramter port");
+    CHK(result);
 
-   OMX_VIDEO_PARAM_PORTFORMATTYPE framerate; // OMX_IndexParamVidePortFormat
-   framerate.nPortIndex = 0;
-   result = OMX_GetParameter(m_hHandle,
-                             OMX_IndexParamVideoPortFormat,
-                             &framerate);
-   E("\n OMX_IndexParamVideoPortFormat Get Paramter port");
-   CHK(result);
-   FractionToQ16(framerate.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
-   result = OMX_SetParameter(m_hHandle,
-                             OMX_IndexParamVideoPortFormat,
-                             &framerate);
-   E("\n OMX_IndexParamVideoPortFormat Set Paramter port");
-   CHK(result);
+    OMX_VIDEO_PARAM_PORTFORMATTYPE framerate; // OMX_IndexParamVidePortFormat
+    framerate.nPortIndex = 0;
+    result = OMX_GetParameter(m_hHandle,
+            OMX_IndexParamVideoPortFormat,
+            &framerate);
+    E("\n OMX_IndexParamVideoPortFormat Get Paramter port");
+    CHK(result);
+    FractionToQ16(framerate.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
+    result = OMX_SetParameter(m_hHandle,
+            OMX_IndexParamVideoPortFormat,
+            &framerate);
+    E("\n OMX_IndexParamVideoPortFormat Set Paramter port");
+    CHK(result);
 
 #if 1
-///////////////////I N T R A P E R I O D ///////////////////
+    ///////////////////I N T R A P E R I O D ///////////////////
 
-      QOMX_VIDEO_INTRAPERIODTYPE intra;
+    QOMX_VIDEO_INTRAPERIODTYPE intra;
 
-      intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
-      result = OMX_GetConfig(m_hHandle,
-                             (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
-                             (OMX_PTR) &intra);
+    intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+    result = OMX_GetConfig(m_hHandle,
+            (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
+            (OMX_PTR) &intra);
 
-      if (result == OMX_ErrorNone)
-      {
-         intra.nPFrames = (OMX_U32) (2 * m_sProfile.nFramerate - 1); //setting I
-                                                                     //frame interval to
-                                                                     //2 x framerate
-         intra.nIDRPeriod = 1; //every I frame is an IDR
-         intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-         result = OMX_SetConfig(m_hHandle,
-                                (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
-                                (OMX_PTR) &intra);
-      }
-      else
-      {
-         E("failed to get state", 0, 0, 0);
-      }
+    if (result == OMX_ErrorNone) {
+        intra.nPFrames = (OMX_U32) (2 * m_sProfile.nFramerate - 1); //setting I
+        //frame interval to
+        //2 x framerate
+        intra.nIDRPeriod = 1; //every I frame is an IDR
+        intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+        result = OMX_SetConfig(m_hHandle,
+                (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
+                (OMX_PTR) &intra);
+    } else {
+        E("failed to get state", 0, 0, 0);
+    }
 
 
-///////////////////I N T R A P E R I O D ///////////////////
+    ///////////////////I N T R A P E R I O D ///////////////////
 #endif
 
 #if 1
-///////////////////E R R O R C O R R E C T I O N ///////////////////
+    ///////////////////E R R O R C O R R E C T I O N ///////////////////
 
-      ResyncMarkerType eResyncMarkerType = RESYNC_MARKER_NONE;
-      unsigned long int nResyncMarkerSpacing = 0;
-      OMX_BOOL enableHEC = OMX_FALSE;
+    ResyncMarkerType eResyncMarkerType = RESYNC_MARKER_NONE;
+    unsigned long int nResyncMarkerSpacing = 0;
+    OMX_BOOL enableHEC = OMX_FALSE;
 
-//For Testing ONLY
-   if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
-   {
-// MPEG4
-//      eResyncMarkerType = RESYNC_MARKER_BYTE;
-//      nResyncMarkerSpacing = 1920;
-      eResyncMarkerType = RESYNC_MARKER_MB;
-      nResyncMarkerSpacing = 50;
-      enableHEC = OMX_TRUE;
-   }
-   else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
-   {
-//H263
-      //eResyncMarkerType = RESYNC_MARKER_GOB;
-	  eResyncMarkerType = RESYNC_MARKER_NONE;
-      nResyncMarkerSpacing = 0;
-   }
-   else if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
-   {
-//H264
-//      eResyncMarkerType = RESYNC_MARKER_BYTE;
-//      nResyncMarkerSpacing = 1920;
+    //For Testing ONLY
+    if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4) {
+        // MPEG4
+        //      eResyncMarkerType = RESYNC_MARKER_BYTE;
+        //      nResyncMarkerSpacing = 1920;
+        eResyncMarkerType = RESYNC_MARKER_MB;
+        nResyncMarkerSpacing = 50;
+        enableHEC = OMX_TRUE;
+    } else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263) {
+        //H263
+        //eResyncMarkerType = RESYNC_MARKER_GOB;
+        eResyncMarkerType = RESYNC_MARKER_NONE;
+        nResyncMarkerSpacing = 0;
+    } else if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC) {
+        //H264
+        //      eResyncMarkerType = RESYNC_MARKER_BYTE;
+        //      nResyncMarkerSpacing = 1920;
 
-      //nResyncMarkerSpacing sets the slice size in venc_set_multislice_cfg
-      //
-      //As of 9/24/10, it is known that the firmware has a bitstream
-      //corruption issue when RateControl and multislice are enabled for 720P
-      //So, disabling multislice for 720P when ratecontrol is enabled until
-      //the firmware issue is resolved.
+        //nResyncMarkerSpacing sets the slice size in venc_set_multislice_cfg
+        //
+        //As of 9/24/10, it is known that the firmware has a bitstream
+        //corruption issue when RateControl and multislice are enabled for 720P
+        //So, disabling multislice for 720P when ratecontrol is enabled until
+        //the firmware issue is resolved.
 
-      if ( ( (m_sProfile.nFrameWidth == 1280) && (m_sProfile.nFrameHeight = 720) ) &&
-           (m_sProfile.eControlRate  != OMX_Video_ControlRateDisable) )
-      {
-         eResyncMarkerType = RESYNC_MARKER_NONE;
-         nResyncMarkerSpacing = 0;
-      }
-      else
-      {
-         eResyncMarkerType = RESYNC_MARKER_NONE;
-          nResyncMarkerSpacing = 0;
-      }
-   }
+        if ( ( (m_sProfile.nFrameWidth == 1280) && (m_sProfile.nFrameHeight = 720) ) &&
+                (m_sProfile.eControlRate  != OMX_Video_ControlRateDisable) ) {
+            eResyncMarkerType = RESYNC_MARKER_NONE;
+            nResyncMarkerSpacing = 0;
+        } else {
+            eResyncMarkerType = RESYNC_MARKER_NONE;
+            nResyncMarkerSpacing = 0;
+        }
+    }
 
-   OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrection; //OMX_IndexParamVideoErrorCorrection
-   errorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
-   result = OMX_GetParameter(m_hHandle,
-                             (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
-                             (OMX_PTR) &errorCorrection);
+    OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrection; //OMX_IndexParamVideoErrorCorrection
+    errorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+    result = OMX_GetParameter(m_hHandle,
+            (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
+            (OMX_PTR) &errorCorrection);
 
-   errorCorrection.bEnableRVLC = OMX_FALSE;
-   errorCorrection.bEnableDataPartitioning = OMX_FALSE;
+    errorCorrection.bEnableRVLC = OMX_FALSE;
+    errorCorrection.bEnableDataPartitioning = OMX_FALSE;
 
-      if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
-         (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)){
-            errorCorrection.bEnableResync = OMX_TRUE;
-            errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
-            errorCorrection.bEnableHEC = enableHEC;
-            }
-      else if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
-               (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)){
-         errorCorrection.bEnableResync = OMX_TRUE;
-         errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
-         }
-      else if ((eResyncMarkerType == RESYNC_MARKER_GOB) &&
-               (m_sProfile.eCodec == OMX_VIDEO_CodingH263)){
-         errorCorrection.bEnableResync = OMX_FALSE;
-         errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
-         errorCorrection.bEnableDataPartitioning = OMX_TRUE;
-         }
+    if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
+            (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)) {
+        errorCorrection.bEnableResync = OMX_TRUE;
+        errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
+        errorCorrection.bEnableHEC = enableHEC;
+    } else if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
+            (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)) {
+        errorCorrection.bEnableResync = OMX_TRUE;
+        errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
+    } else if ((eResyncMarkerType == RESYNC_MARKER_GOB) &&
+            (m_sProfile.eCodec == OMX_VIDEO_CodingH263)) {
+        errorCorrection.bEnableResync = OMX_FALSE;
+        errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
+        errorCorrection.bEnableDataPartitioning = OMX_TRUE;
+    }
 
-      result = OMX_SetParameter(m_hHandle,
-                            (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
-                            (OMX_PTR) &errorCorrection);
-   CHK(result);
+    result = OMX_SetParameter(m_hHandle,
+            (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
+            (OMX_PTR) &errorCorrection);
+    CHK(result);
 
-      if (eResyncMarkerType == RESYNC_MARKER_MB){
-         if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC){
+    if (eResyncMarkerType == RESYNC_MARKER_MB) {
+        if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC) {
             OMX_VIDEO_PARAM_AVCTYPE avcdata;
             avcdata.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
             result = OMX_GetParameter(m_hHandle,
-                                      OMX_IndexParamVideoAvc,
-                                      (OMX_PTR) &avcdata);
+                    OMX_IndexParamVideoAvc,
+                    (OMX_PTR) &avcdata);
             CHK(result);
-            if (result == OMX_ErrorNone)
-            {
-               avcdata.nSliceHeaderSpacing = nResyncMarkerSpacing;
-               result = OMX_SetParameter(m_hHandle,
-                                         OMX_IndexParamVideoAvc,
-                                         (OMX_PTR) &avcdata);
-               CHK(result);
+
+            if (result == OMX_ErrorNone) {
+                avcdata.nSliceHeaderSpacing = nResyncMarkerSpacing;
+                result = OMX_SetParameter(m_hHandle,
+                        OMX_IndexParamVideoAvc,
+                        (OMX_PTR) &avcdata);
+                CHK(result);
 
             }
-         }
-         else if(m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4){
+        } else if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4) {
             OMX_VIDEO_PARAM_MPEG4TYPE mp4;
             mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
             result = OMX_GetParameter(m_hHandle,
-                                      OMX_IndexParamVideoMpeg4,
-                                      (OMX_PTR) &mp4);
+                    OMX_IndexParamVideoMpeg4,
+                    (OMX_PTR) &mp4);
             CHK(result);
 
-            if (result == OMX_ErrorNone)
-            {
-               mp4.nSliceHeaderSpacing = nResyncMarkerSpacing;
-               result = OMX_SetParameter(m_hHandle,
-                                         OMX_IndexParamVideoMpeg4,
-                                         (OMX_PTR) &mp4);
-               CHK(result);
+            if (result == OMX_ErrorNone) {
+                mp4.nSliceHeaderSpacing = nResyncMarkerSpacing;
+                result = OMX_SetParameter(m_hHandle,
+                        OMX_IndexParamVideoMpeg4,
+                        (OMX_PTR) &mp4);
+                CHK(result);
             }
-         }
-         }
+        }
+    }
 
-///////////////////E R R O R C O R R E C T I O N ///////////////////
+    ///////////////////E R R O R C O R R E C T I O N ///////////////////
 #endif
 
 #if 1
-///////////////////I N T R A R E F R E S H///////////////////
-      bool bEnableIntraRefresh = OMX_TRUE;
+    ///////////////////I N T R A R E F R E S H///////////////////
+    bool bEnableIntraRefresh = OMX_TRUE;
 
-      if (result == OMX_ErrorNone)
-      {
-         OMX_VIDEO_PARAM_INTRAREFRESHTYPE ir; // OMX_IndexParamVideoIntraRefresh
-         ir.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
-         result = OMX_GetParameter(m_hHandle,
-                                   OMX_IndexParamVideoIntraRefresh,
-                                   (OMX_PTR) &ir);
-         if (result == OMX_ErrorNone)
-         {
-            if (bEnableIntraRefresh)
-            {
-               ir.eRefreshMode = OMX_VIDEO_IntraRefreshCyclic;
-               ir.nCirMBs = 5;
-               result = OMX_SetParameter(m_hHandle,
-                                         OMX_IndexParamVideoIntraRefresh,
-                                         (OMX_PTR) &ir);
-               CHK(result);
+    if (result == OMX_ErrorNone) {
+        OMX_VIDEO_PARAM_INTRAREFRESHTYPE ir; // OMX_IndexParamVideoIntraRefresh
+        ir.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+        result = OMX_GetParameter(m_hHandle,
+                OMX_IndexParamVideoIntraRefresh,
+                (OMX_PTR) &ir);
+
+        if (result == OMX_ErrorNone) {
+            if (bEnableIntraRefresh) {
+                ir.eRefreshMode = OMX_VIDEO_IntraRefreshCyclic;
+                ir.nCirMBs = 5;
+                result = OMX_SetParameter(m_hHandle,
+                        OMX_IndexParamVideoIntraRefresh,
+                        (OMX_PTR) &ir);
+                CHK(result);
             }
-         }
-      }
+        }
+    }
+
 #endif
 #if 1
-///////////////////FRAMEPACKING DATA///////////////////
-      OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
-      FILE *m_pConfigFile;
-      char m_configFilename [128] = "/data/configFile.cfg";
-      memset(&framePackingArrangement, 0, sizeof(framePackingArrangement));
-      m_pConfigFile = fopen(m_configFilename, "r");
-      if (m_pConfigFile != NULL)
-      {
-         //read all frame packing data
-         framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
-         int totalSizeToRead = FRAME_PACK_SIZE * sizeof(OMX_U32);
-         char *pFramePack = (char *) &(framePackingArrangement.id);
-         while ( ( (fscanf(m_pConfigFile, "%d", pFramePack)) != EOF ) &&
-                 (totalSizeToRead != 0) )
-         {
+    ///////////////////FRAMEPACKING DATA///////////////////
+    OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
+    FILE *m_pConfigFile;
+    char m_configFilename [128] = "/data/configFile.cfg";
+    memset(&framePackingArrangement, 0, sizeof(framePackingArrangement));
+    m_pConfigFile = fopen(m_configFilename, "r");
+
+    if (m_pConfigFile != NULL) {
+        //read all frame packing data
+        framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+        int totalSizeToRead = FRAME_PACK_SIZE * sizeof(OMX_U32);
+        char *pFramePack = (char *) &(framePackingArrangement.id);
+
+        while ( ( (fscanf(m_pConfigFile, "%d", pFramePack)) != EOF ) &&
+                (totalSizeToRead != 0) ) {
             //printf("Addr = %p, Value read = %d, sizeToRead remaining=%d\n",
             //       pFramePack, *pFramePack, totalSizeToRead);
             pFramePack += sizeof(OMX_U32);
             totalSizeToRead -= sizeof(OMX_U32);
-         }
-         //close the file.
-         fclose(m_pConfigFile);
+        }
 
-         printf("Frame Packing data from config file:\n");
-         PrintFramePackArrangement(framePackingArrangement);
-      }
-      else
-      {
-         D("\n Config file does not exist or could not be opened.");
-         //set the default values
-         framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
-         framePackingArrangement.id = 123;
-         framePackingArrangement.cancel_flag = false;
-         framePackingArrangement.type = 3;
-         framePackingArrangement.quincunx_sampling_flag = false;
-         framePackingArrangement.content_interpretation_type = 0;
-         framePackingArrangement.spatial_flipping_flag = true;
-         framePackingArrangement.frame0_flipped_flag = false;
-         framePackingArrangement.field_views_flag = false;
-         framePackingArrangement.current_frame_is_frame0_flag = false;
-         framePackingArrangement.frame0_self_contained_flag = true;
-         framePackingArrangement.frame1_self_contained_flag = false;
-         framePackingArrangement.frame0_grid_position_x = 3;
-         framePackingArrangement.frame0_grid_position_y = 15;
-         framePackingArrangement.frame1_grid_position_x = 11;
-         framePackingArrangement.frame1_grid_position_y = 7;
-         framePackingArrangement.reserved_byte = 0;
-         framePackingArrangement.repetition_period = 16381;
-         framePackingArrangement.extension_flag = false;
+        //close the file.
+        fclose(m_pConfigFile);
 
-         printf("Frame Packing Defaults :\n");
-         PrintFramePackArrangement(framePackingArrangement);
-      }
-      result = OMX_SetConfig(m_hHandle,
-                (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
-                (OMX_PTR) &framePackingArrangement);
-      CHK(result);
+        printf("Frame Packing data from config file:\n");
+        PrintFramePackArrangement(framePackingArrangement);
+    } else {
+        D("\n Config file does not exist or could not be opened.");
+        //set the default values
+        framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+        framePackingArrangement.id = 123;
+        framePackingArrangement.cancel_flag = false;
+        framePackingArrangement.type = 3;
+        framePackingArrangement.quincunx_sampling_flag = false;
+        framePackingArrangement.content_interpretation_type = 0;
+        framePackingArrangement.spatial_flipping_flag = true;
+        framePackingArrangement.frame0_flipped_flag = false;
+        framePackingArrangement.field_views_flag = false;
+        framePackingArrangement.current_frame_is_frame0_flag = false;
+        framePackingArrangement.frame0_self_contained_flag = true;
+        framePackingArrangement.frame1_self_contained_flag = false;
+        framePackingArrangement.frame0_grid_position_x = 3;
+        framePackingArrangement.frame0_grid_position_y = 15;
+        framePackingArrangement.frame1_grid_position_x = 11;
+        framePackingArrangement.frame1_grid_position_y = 7;
+        framePackingArrangement.reserved_byte = 0;
+        framePackingArrangement.repetition_period = 16381;
+        framePackingArrangement.extension_flag = false;
 
-//////////////////////OMX_VIDEO_PARAM_INTRAREFRESHTYPE///////////////////
+        printf("Frame Packing Defaults :\n");
+        PrintFramePackArrangement(framePackingArrangement);
+    }
+
+    result = OMX_SetConfig(m_hHandle,
+            (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
+            (OMX_PTR) &framePackingArrangement);
+    CHK(result);
+
+    //////////////////////OMX_VIDEO_PARAM_INTRAREFRESHTYPE///////////////////
 #endif
 
-   OMX_CONFIG_FRAMERATETYPE enc_framerate; // OMX_IndexConfigVideoFramerate
-   enc_framerate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
-   result = OMX_GetConfig(m_hHandle,
-                          OMX_IndexConfigVideoFramerate,
-                          &enc_framerate);
-   CHK(result);
-   FractionToQ16(enc_framerate.xEncodeFramerate,(int) (m_sProfile.nFramerate * 2),2);
-   result = OMX_SetConfig(m_hHandle,
-                          OMX_IndexConfigVideoFramerate,
-                          &enc_framerate);
-   CHK(result);
-   return OMX_ErrorNone;
+    OMX_CONFIG_FRAMERATETYPE enc_framerate; // OMX_IndexConfigVideoFramerate
+    enc_framerate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+    result = OMX_GetConfig(m_hHandle,
+            OMX_IndexConfigVideoFramerate,
+            &enc_framerate);
+    CHK(result);
+    FractionToQ16(enc_framerate.xEncodeFramerate,(int) (m_sProfile.nFramerate * 2),2);
+    result = OMX_SetConfig(m_hHandle,
+            OMX_IndexConfigVideoFramerate,
+            &enc_framerate);
+    CHK(result);
+    return OMX_ErrorNone;
 }
 ////////////////////////////////////////////////////////////////////////////////
 void SendMessage(MsgId id, MsgData* data)
 {
-   pthread_mutex_lock(&m_mutex);
-   if (m_sMsgQ.size >= MAX_MSG)
-   {
-      E("main msg m_sMsgQ is full");
-      return;
-   }
-   m_sMsgQ.q[(m_sMsgQ.head + m_sMsgQ.size) % MAX_MSG].id = id;
-   if (data)
-      m_sMsgQ.q[(m_sMsgQ.head + m_sMsgQ.size) % MAX_MSG].data = *data;
-   ++m_sMsgQ.size;
-   pthread_cond_signal(&m_signal);
-   pthread_mutex_unlock(&m_mutex);
+    pthread_mutex_lock(&m_mutex);
+
+    if (m_sMsgQ.size >= MAX_MSG) {
+        E("main msg m_sMsgQ is full");
+        return;
+    }
+
+    m_sMsgQ.q[(m_sMsgQ.head + m_sMsgQ.size) % MAX_MSG].id = id;
+
+    if (data)
+        m_sMsgQ.q[(m_sMsgQ.head + m_sMsgQ.size) % MAX_MSG].data = *data;
+
+    ++m_sMsgQ.size;
+    pthread_cond_signal(&m_signal);
+    pthread_mutex_unlock(&m_mutex);
 }
 ////////////////////////////////////////////////////////////////////////////////
 void PopMessage(Msg* msg)
 {
-   pthread_mutex_lock(&m_mutex);
-   while (m_sMsgQ.size == 0)
-   {
-      pthread_cond_wait(&m_signal, &m_mutex);
-   }
-   *msg = m_sMsgQ.q[m_sMsgQ.head];
-   --m_sMsgQ.size;
-   m_sMsgQ.head = (m_sMsgQ.head + 1) % MAX_MSG;
-   pthread_mutex_unlock(&m_mutex);
+    pthread_mutex_lock(&m_mutex);
+
+    while (m_sMsgQ.size == 0) {
+        pthread_cond_wait(&m_signal, &m_mutex);
+    }
+
+    *msg = m_sMsgQ.q[m_sMsgQ.head];
+    --m_sMsgQ.size;
+    m_sMsgQ.head = (m_sMsgQ.head + 1) % MAX_MSG;
+    pthread_mutex_unlock(&m_mutex);
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE EVT_CB(OMX_IN OMX_HANDLETYPE hComponent,
-                     OMX_IN OMX_PTR pAppData,
-                     OMX_IN OMX_EVENTTYPE eEvent,
-                     OMX_IN OMX_U32 nData1,
-                     OMX_IN OMX_U32 nData2,
-                     OMX_IN OMX_PTR pEventData)
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_EVENTTYPE eEvent,
+        OMX_IN OMX_U32 nData1,
+        OMX_IN OMX_U32 nData2,
+        OMX_IN OMX_PTR pEventData)
 {
 #define SET_STATE(eState)                                   \
-   case eState:                                             \
-      {                                                     \
-         D("" # eState " complete");                        \
-         m_eState = eState;                                 \
-         break;                                             \
-      }
+    case eState:                                             \
+                                 {                                                     \
+                                     D("" # eState " complete");                        \
+                                     m_eState = eState;                                 \
+                                     break;                                             \
+                                 }
 
-   if (eEvent == OMX_EventCmdComplete)
-   {
-      if ((OMX_COMMANDTYPE) nData1 == OMX_CommandStateSet)
-      {
-         switch ((OMX_STATETYPE) nData2)
-         {
-            SET_STATE(OMX_StateLoaded);
-            SET_STATE(OMX_StateIdle);
-            SET_STATE(OMX_StateExecuting);
-            SET_STATE(OMX_StateInvalid);
-            SET_STATE(OMX_StateWaitForResources);
-            SET_STATE(OMX_StatePause);
-         default:
-            E("invalid state %d", (int) nData2);
-          }
-      }
-   }
+    if (eEvent == OMX_EventCmdComplete) {
+        if ((OMX_COMMANDTYPE) nData1 == OMX_CommandStateSet) {
+            switch ((OMX_STATETYPE) nData2) {
+                SET_STATE(OMX_StateLoaded);
+                SET_STATE(OMX_StateIdle);
+                SET_STATE(OMX_StateExecuting);
+                SET_STATE(OMX_StateInvalid);
+                SET_STATE(OMX_StateWaitForResources);
+                SET_STATE(OMX_StatePause);
+                default:
+                E("invalid state %d", (int) nData2);
+            }
+        }
+    }
 
-   else if (eEvent == OMX_EventError)
-   {
-      E("OMX_EventError");
-   }
+    else if (eEvent == OMX_EventError) {
+        E("OMX_EventError");
+    }
 
-   else
-   {
-      E("unexpected event %d", (int) eEvent);
-   }
-   return OMX_ErrorNone;
+    else {
+        E("unexpected event %d", (int) eEvent);
+    }
+
+    return OMX_ErrorNone;
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE EBD_CB(OMX_IN OMX_HANDLETYPE hComponent,
-                     OMX_IN OMX_PTR pAppData,
-                     OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
 {
-   D("Got EBD callback ts=%lld", pBuffer->nTimeStamp);
+    D("Got EBD callback ts=%lld", pBuffer->nTimeStamp);
 
-   for (int i = 0; i < num_in_buffers; i++)
-   {
-      // mark this buffer ready for use again
-      if (m_pInBuffers[i] == pBuffer)
-      {
+    for (int i = 0; i < num_in_buffers; i++) {
+        // mark this buffer ready for use again
+        if (m_pInBuffers[i] == pBuffer) {
 
-         D("Marked input buffer idx %d as free, buf %p", i, pBuffer->pBuffer);
-         m_bInFrameFree[i] = OMX_TRUE;
-         break;
-      }
-   }
+            D("Marked input buffer idx %d as free, buf %p", i, pBuffer->pBuffer);
+            m_bInFrameFree[i] = OMX_TRUE;
+            break;
+        }
+    }
 
-   if (m_eMode == MODE_LIVE_ENCODE)
-   {
-      CameraTest_ReleaseFrame(pBuffer->pBuffer,
-                              ((OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*)pBuffer->pAppPrivate));
-   }
-   else
-   {
-      // wake up main thread and tell it to send next frame
-      MsgData data;
-      data.sBitstreamData.pBuffer = pBuffer;
-      SendMessage(MSG_ID_INPUT_FRAME_DONE,
-                  &data);
+    if (m_eMode == MODE_LIVE_ENCODE) {
+        CameraTest_ReleaseFrame(pBuffer->pBuffer,
+                ((OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*)pBuffer->pAppPrivate));
+    } else {
+        // wake up main thread and tell it to send next frame
+        MsgData data;
+        data.sBitstreamData.pBuffer = pBuffer;
+        SendMessage(MSG_ID_INPUT_FRAME_DONE,
+                &data);
 
-   }
-   return OMX_ErrorNone;
+    }
+
+    return OMX_ErrorNone;
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE FBD_CB(OMX_OUT OMX_HANDLETYPE hComponent,
-                     OMX_OUT OMX_PTR pAppData,
-                     OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
+        OMX_OUT OMX_PTR pAppData,
+        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
 {
-   D("Got FBD callback ts=%lld", pBuffer->nTimeStamp);
+    D("Got FBD callback ts=%lld", pBuffer->nTimeStamp);
 
-   static long long prevTime = 0;
-   long long currTime = GetTimeStamp();
+    static long long prevTime = 0;
+    long long currTime = GetTimeStamp();
 
-   m_bWatchDogKicked = true;
+    m_bWatchDogKicked = true;
 
-   /* Empty Buffers should not be counted */
-   if(pBuffer->nFilledLen !=0)
-   {
-      /* Counting Buffers supplied from OpneMax Encoder */
-      fbd_cnt++;
-      tot_bufsize += pBuffer->nFilledLen;
-   }
-   if (prevTime != 0)
-   {
-      long long currTime = GetTimeStamp();
-      D("FBD_DELTA = %lld\n", currTime - prevTime);
-   }
-   prevTime = currTime;
+    /* Empty Buffers should not be counted */
+    if (pBuffer->nFilledLen !=0) {
+        /* Counting Buffers supplied from OpneMax Encoder */
+        fbd_cnt++;
+        tot_bufsize += pBuffer->nFilledLen;
+    }
 
-   if (m_eMode == MODE_PROFILE)
-   {
-      // if we are profiling we are not doing file I/O
-      // so just give back to encoder
-      if (OMX_FillThisBuffer(m_hHandle, pBuffer) != OMX_ErrorNone)
-      {
-         E("empty buffer failed for profiling");
-      }
-   }
-   else
-   {
-      // wake up main thread and tell it to write to file
-      MsgData data;
-      data.sBitstreamData.pBuffer = pBuffer;
-      SendMessage(MSG_ID_OUTPUT_FRAME_DONE,
-                  &data);
-   }
-   return OMX_ErrorNone;
+    if (prevTime != 0) {
+        long long currTime = GetTimeStamp();
+        D("FBD_DELTA = %lld\n", currTime - prevTime);
+    }
+
+    prevTime = currTime;
+
+    if (m_eMode == MODE_PROFILE) {
+        // if we are profiling we are not doing file I/O
+        // so just give back to encoder
+        if (OMX_FillThisBuffer(m_hHandle, pBuffer) != OMX_ErrorNone) {
+            E("empty buffer failed for profiling");
+        }
+    } else {
+        // wake up main thread and tell it to write to file
+        MsgData data;
+        data.sBitstreamData.pBuffer = pBuffer;
+        SendMessage(MSG_ID_OUTPUT_FRAME_DONE,
+                &data);
+    }
+
+    return OMX_ErrorNone;
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE VencTest_Initialize()
 {
-   OMX_ERRORTYPE result = OMX_ErrorNone;
-   static OMX_CALLBACKTYPE sCallbacks = {EVT_CB, EBD_CB, FBD_CB};
-   int i;
+    OMX_ERRORTYPE result = OMX_ErrorNone;
+    static OMX_CALLBACKTYPE sCallbacks = {EVT_CB, EBD_CB, FBD_CB};
+    int i;
 
-   for (i = 0; i < num_in_buffers; i++)
-   {
-      m_pInBuffers[i] = NULL;
-   }
+    for (i = 0; i < num_in_buffers; i++) {
+        m_pInBuffers[i] = NULL;
+    }
 
-   result = OMX_Init();
-   CHK(result);
+    result = OMX_Init();
+    CHK(result);
 
-   if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
-   {
+    if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4) {
         result = OMX_GetHandle(&m_hHandle,
-                             "OMX.qcom.video.encoder.mpeg4",
-                             NULL,
-                             &sCallbacks);
-     // CHK(result);
-   }
-   else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
-   {
-      result = OMX_GetHandle(&m_hHandle,
-                             "OMX.qcom.video.encoder.h263",
-                             NULL,
-                             &sCallbacks);
-      CHK(result);
-   }
+                "OMX.qcom.video.encoder.mpeg4",
+                NULL,
+                &sCallbacks);
+        // CHK(result);
+    } else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263) {
+        result = OMX_GetHandle(&m_hHandle,
+                "OMX.qcom.video.encoder.h263",
+                NULL,
+                &sCallbacks);
+        CHK(result);
+    }
+
 #ifdef _MSM8974_
-   else if (m_sProfile.eCodec == OMX_VIDEO_CodingVPX)
-   {
-      result = OMX_GetHandle(&m_hHandle,
-                             "OMX.qcom.video.encoder.vp8",
-                             NULL,
-                             &sCallbacks);
-      CHK(result);
-   }
+    else if (m_sProfile.eCodec == OMX_VIDEO_CodingVPX) {
+        result = OMX_GetHandle(&m_hHandle,
+                "OMX.qcom.video.encoder.vp8",
+                NULL,
+                &sCallbacks);
+        CHK(result);
+    }
+
 #endif
-   else
-   {
-      result = OMX_GetHandle(&m_hHandle,
-                             "OMX.qcom.video.encoder.avc",
-                             NULL,
-                             &sCallbacks);
-      CHK(result);
-   }
+    else {
+        result = OMX_GetHandle(&m_hHandle,
+                "OMX.qcom.video.encoder.avc",
+                NULL,
+                &sCallbacks);
+        CHK(result);
+    }
 
 
-   result = ConfigureEncoder();
-   CHK(result);
+    result = ConfigureEncoder();
+    CHK(result);
 
-   return result;
+    return result;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE VencTest_RegisterYUVBuffer(OMX_BUFFERHEADERTYPE** ppBufferHeader,
-                                         OMX_U8 *pBuffer,
-                                         OMX_PTR pAppPrivate)
+        OMX_U8 *pBuffer,
+        OMX_PTR pAppPrivate)
 {
-   OMX_ERRORTYPE result = OMX_ErrorNone;
+    OMX_ERRORTYPE result = OMX_ErrorNone;
 #if 0
-   D("register buffer");
-   if ((result = OMX_AllocateBuffer(m_hHandle,
-                               ppBufferHeader,
-                               (OMX_U32) PORT_INDEX_IN,
-                               pAppPrivate,
-                               m_sProfile.nFrameBytes
-                               )) != OMX_ErrorNone)
-   {
-      E("use buffer failed");
-   }
-   else
-   {
-     E("Allocate Buffer Success %x", (*ppBufferHeader)->pBuffer);
-   }
-  #endif
-   D("register buffer");
-   D("Calling UseBuffer for Input port");
-   if ((result = OMX_UseBuffer(m_hHandle,
-                               ppBufferHeader,
-                               (OMX_U32) PORT_INDEX_IN,
-                               pAppPrivate,
-                               m_sProfile.nFrameBytes,
-                               pBuffer)) != OMX_ErrorNone)
-   {
-      E("use buffer failed");
-   }
+    D("register buffer");
 
-   return result;
+    if ((result = OMX_AllocateBuffer(m_hHandle,
+                    ppBufferHeader,
+                    (OMX_U32) PORT_INDEX_IN,
+                    pAppPrivate,
+                    m_sProfile.nFrameBytes
+                    )) != OMX_ErrorNone) {
+        E("use buffer failed");
+    } else {
+        E("Allocate Buffer Success %x", (*ppBufferHeader)->pBuffer);
+    }
+
+#endif
+    D("register buffer");
+    D("Calling UseBuffer for Input port");
+
+    if ((result = OMX_UseBuffer(m_hHandle,
+                    ppBufferHeader,
+                    (OMX_U32) PORT_INDEX_IN,
+                    pAppPrivate,
+                    m_sProfile.nFrameBytes,
+                    pBuffer)) != OMX_ErrorNone) {
+        E("use buffer failed");
+    }
+
+    return result;
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE VencTest_EncodeFrame(void* pYUVBuff,
-                                   long long nTimeStamp)
+        long long nTimeStamp)
 {
-   OMX_ERRORTYPE result = OMX_ErrorUndefined;
-   D("calling OMX empty this buffer");
-   for (int i = 0; i < num_in_buffers; i++)
-   {
-      if (pYUVBuff == m_pInBuffers[i]->pBuffer)
-      {
-         m_pInBuffers[i]->nTimeStamp = nTimeStamp;
-    D("Sending Buffer - %x", m_pInBuffers[i]->pBuffer);
-         result = OMX_EmptyThisBuffer(m_hHandle,
-                                      m_pInBuffers[i]);
-         /* Counting Buffers supplied to OpenMax Encoder */
-         if(OMX_ErrorNone == result)
-            ebd_cnt++;
-         CHK(result);
-         break;
-      }
-   }
-   return result;
+    OMX_ERRORTYPE result = OMX_ErrorUndefined;
+    D("calling OMX empty this buffer");
+
+    for (int i = 0; i < num_in_buffers; i++) {
+        if (pYUVBuff == m_pInBuffers[i]->pBuffer) {
+            m_pInBuffers[i]->nTimeStamp = nTimeStamp;
+            D("Sending Buffer - %x", m_pInBuffers[i]->pBuffer);
+            result = OMX_EmptyThisBuffer(m_hHandle,
+                    m_pInBuffers[i]);
+
+            /* Counting Buffers supplied to OpenMax Encoder */
+            if (OMX_ErrorNone == result)
+                ebd_cnt++;
+
+            CHK(result);
+            break;
+        }
+    }
+
+    return result;
 }
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE VencTest_Exit(void)
 {
-   int i;
-   OMX_ERRORTYPE result = OMX_ErrorNone;
-   D("trying to exit venc");
+    int i;
+    OMX_ERRORTYPE result = OMX_ErrorNone;
+    D("trying to exit venc");
 
-   D("going to idle state");
-   SetState(OMX_StateIdle);
+    D("going to idle state");
+    SetState(OMX_StateIdle);
 
 
-   D("going to loaded state");
-   //SetState(OMX_StateLoaded);
-      OMX_SendCommand(m_hHandle,
-                      OMX_CommandStateSet,
-                      (OMX_U32) OMX_StateLoaded,
-                       NULL);
+    D("going to loaded state");
+    //SetState(OMX_StateLoaded);
+    OMX_SendCommand(m_hHandle,
+            OMX_CommandStateSet,
+            (OMX_U32) OMX_StateLoaded,
+            NULL);
 
-      for (i = 0; i < num_in_buffers; i++)
-   {
-      D("free buffer");
-      if (m_pInBuffers[i]->pBuffer)
-      {
-        // free(m_pInBuffers[i]->pBuffer);
-         result = OMX_FreeBuffer(m_hHandle,
-                                 PORT_INDEX_IN,
-                                 m_pInBuffers[i]);
-         CHK(result);
-      }
-      else
-      {
-         E("buffer %d is null", i);
-         result = OMX_ErrorUndefined;
-         CHK(result);
-      }
-   }
-   for (i = 0; i < num_out_buffers; i++)
-   {
-      D("free buffer");
-      if (m_pOutBuffers[i]->pBuffer)
-      {
-         free(m_pOutBuffers[i]->pBuffer);
-         result = OMX_FreeBuffer(m_hHandle,
-                                 PORT_INDEX_OUT,
-                                 m_pOutBuffers[i]);
-         CHK(result);
+    for (i = 0; i < num_in_buffers; i++) {
+        D("free buffer");
 
-      }
-      else
-      {
-         E("buffer %d is null", i);
-         result = OMX_ErrorUndefined;
-         CHK(result);
-      }
-   }
+        if (m_pInBuffers[i]->pBuffer) {
+            // free(m_pInBuffers[i]->pBuffer);
+            result = OMX_FreeBuffer(m_hHandle,
+                    PORT_INDEX_IN,
+                    m_pInBuffers[i]);
+            CHK(result);
+        } else {
+            E("buffer %d is null", i);
+            result = OMX_ErrorUndefined;
+            CHK(result);
+        }
+    }
 
-     while (m_eState != OMX_StateLoaded)
-     {
+    for (i = 0; i < num_out_buffers; i++) {
+        D("free buffer");
+
+        if (m_pOutBuffers[i]->pBuffer) {
+            free(m_pOutBuffers[i]->pBuffer);
+            result = OMX_FreeBuffer(m_hHandle,
+                    PORT_INDEX_OUT,
+                    m_pOutBuffers[i]);
+            CHK(result);
+
+        } else {
+            E("buffer %d is null", i);
+            result = OMX_ErrorUndefined;
+            CHK(result);
+        }
+    }
+
+    while (m_eState != OMX_StateLoaded) {
         sleep(1);
-     }
-   D("component_deinit...");
-   result = OMX_Deinit();
-   CHK(result);
+    }
 
-   D("venc is exiting...");
-   return result;
+    D("component_deinit...");
+    result = OMX_Deinit();
+    CHK(result);
+
+    D("venc is exiting...");
+    return result;
 }
 ////////////////////////////////////////////////////////////////////////////////
 
 void VencTest_ReadDynamicConfigMsg()
 {
-  char frame_n[8], config[16], param[8];
-  char *dest = frame_n;
-  bool end = false;
-  int cntr, nparam = 0;
-  memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
-  do
-  {
-    cntr = -1;
-    do
-    {
-      dest[++cntr] = fgetc(m_pDynConfFile);
-    } while(dest[cntr] != ' ' && dest[cntr] != '\t' && dest[cntr] != '\n' && dest[cntr] != '\r' && !feof(m_pDynConfFile));
-    if (dest[cntr] == '\n' || dest[cntr] == '\r')
-      end = true;
-    dest[cntr] = NULL;
-    if (dest == frame_n)
-      dest = config;
-    else if (dest == config)
-      dest = param;
-    else
-      end = true;
-    nparam++;
-  } while (!end && !feof(m_pDynConfFile));
+    char frame_n[8], config[16], param[8];
+    char *dest = frame_n;
+    bool end = false;
+    int cntr, nparam = 0;
+    memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
 
-  if (nparam > 1)
-  {
-    dynamic_config.pending = true;
-    dynamic_config.frame_num = atoi(frame_n);
-    if (!strcmp(config, "bitrate"))
-    {
-      dynamic_config.config_param = OMX_IndexConfigVideoBitrate;
-      dynamic_config.config_data.bitrate.nPortIndex = PORT_INDEX_OUT;
-      dynamic_config.config_data.bitrate.nEncodeBitrate = strtoul(param, NULL, 10);
+    do {
+        cntr = -1;
+
+        do {
+            dest[++cntr] = fgetc(m_pDynConfFile);
+        } while (dest[cntr] != ' ' && dest[cntr] != '\t' && dest[cntr] != '\n' && dest[cntr] != '\r' && !feof(m_pDynConfFile));
+
+        if (dest[cntr] == '\n' || dest[cntr] == '\r')
+            end = true;
+
+        dest[cntr] = NULL;
+
+        if (dest == frame_n)
+            dest = config;
+        else if (dest == config)
+            dest = param;
+        else
+            end = true;
+
+        nparam++;
+    } while (!end && !feof(m_pDynConfFile));
+
+    if (nparam > 1) {
+        dynamic_config.pending = true;
+        dynamic_config.frame_num = atoi(frame_n);
+
+        if (!strcmp(config, "bitrate")) {
+            dynamic_config.config_param = OMX_IndexConfigVideoBitrate;
+            dynamic_config.config_data.bitrate.nPortIndex = PORT_INDEX_OUT;
+            dynamic_config.config_data.bitrate.nEncodeBitrate = strtoul(param, NULL, 10);
+        } else if (!strcmp(config, "framerate")) {
+            dynamic_config.config_param = OMX_IndexConfigVideoFramerate;
+            dynamic_config.config_data.framerate.nPortIndex = PORT_INDEX_OUT;
+            dynamic_config.config_data.f_framerate = atof(param);
+        } else if (!strcmp(config, "iperiod")) {
+            dynamic_config.config_param = (OMX_INDEXTYPE)QOMX_IndexConfigVideoIntraperiod;
+            dynamic_config.config_data.intraperiod.nPortIndex = PORT_INDEX_OUT;
+            dynamic_config.config_data.intraperiod.nPFrames = strtoul(param, NULL, 10) - 1;
+            dynamic_config.config_data.intraperiod.nIDRPeriod = 1; // This value is ignored in OMX component
+        } else if (!strcmp(config, "ivoprefresh")) {
+            dynamic_config.config_param = OMX_IndexConfigVideoIntraVOPRefresh;
+            dynamic_config.config_data.intravoprefresh.nPortIndex = PORT_INDEX_OUT;
+            dynamic_config.config_data.intravoprefresh.IntraRefreshVOP = OMX_TRUE;
+        } else if (!strcmp(config, "rotation")) {
+            dynamic_config.config_param = OMX_IndexConfigCommonRotate;
+            dynamic_config.config_data.rotation.nPortIndex = PORT_INDEX_OUT;
+            dynamic_config.config_data.rotation.nRotation = strtoul(param, NULL, 10);
+        } else {
+            E("UNKNOWN CONFIG PARAMETER: %s!", config);
+            dynamic_config.pending = false;
+        }
+    } else if (feof(m_pDynConfFile)) {
+        fclose(m_pDynConfFile);
+        m_pDynConfFile = NULL;
     }
-    else if (!strcmp(config, "framerate"))
-    {
-      dynamic_config.config_param = OMX_IndexConfigVideoFramerate;
-      dynamic_config.config_data.framerate.nPortIndex = PORT_INDEX_OUT;
-      dynamic_config.config_data.f_framerate = atof(param);
-    }
-    else if (!strcmp(config, "iperiod"))
-    {
-      dynamic_config.config_param = (OMX_INDEXTYPE)QOMX_IndexConfigVideoIntraperiod;
-      dynamic_config.config_data.intraperiod.nPortIndex = PORT_INDEX_OUT;
-      dynamic_config.config_data.intraperiod.nPFrames = strtoul(param, NULL, 10) - 1;
-      dynamic_config.config_data.intraperiod.nIDRPeriod = 1; // This value is ignored in OMX component
-    }
-    else if (!strcmp(config, "ivoprefresh"))
-    {
-      dynamic_config.config_param = OMX_IndexConfigVideoIntraVOPRefresh;
-      dynamic_config.config_data.intravoprefresh.nPortIndex = PORT_INDEX_OUT;
-      dynamic_config.config_data.intravoprefresh.IntraRefreshVOP = OMX_TRUE;
-    }
-    else if (!strcmp(config, "rotation"))
-    {
-      dynamic_config.config_param = OMX_IndexConfigCommonRotate;
-      dynamic_config.config_data.rotation.nPortIndex = PORT_INDEX_OUT;
-      dynamic_config.config_data.rotation.nRotation = strtoul(param, NULL, 10);
-    }
-    else
-    {
-      E("UNKNOWN CONFIG PARAMETER: %s!", config);
-      dynamic_config.pending = false;
-    }
-  }
-  else if (feof(m_pDynConfFile))
-  {
-    fclose(m_pDynConfFile);
-    m_pDynConfFile = NULL;
-  }
 }
 
 void VencTest_ProcessDynamicConfigurationFile()
 {
-  do
-  {
-    if (dynamic_config.pending)
-    {
-      if(m_nFrameIn == dynamic_config.frame_num)
-      {
-        if (dynamic_config.config_param == OMX_IndexConfigVideoFramerate)
-        {
-          m_sProfile.nFramerate = dynamic_config.config_data.f_framerate;
-          FractionToQ16(dynamic_config.config_data.framerate.xEncodeFramerate,
-                        (int)(m_sProfile.nFramerate * 2), 2);
+    do {
+        if (dynamic_config.pending) {
+            if (m_nFrameIn == dynamic_config.frame_num) {
+                if (dynamic_config.config_param == OMX_IndexConfigVideoFramerate) {
+                    m_sProfile.nFramerate = dynamic_config.config_data.f_framerate;
+                    FractionToQ16(dynamic_config.config_data.framerate.xEncodeFramerate,
+                            (int)(m_sProfile.nFramerate * 2), 2);
+                }
+
+                if (OMX_SetConfig(m_hHandle, dynamic_config.config_param,
+                            &dynamic_config.config_data) != OMX_ErrorNone)
+                    E("ERROR: Setting dynamic config to OMX param[0x%x]", dynamic_config.config_param);
+
+                dynamic_config.pending = false;
+            } else if (m_nFrameIn > dynamic_config.frame_num) {
+                E("WARNING: Config change requested in passed frame(%d)", dynamic_config.frame_num);
+                dynamic_config.pending = false;
+            }
         }
-        if (OMX_SetConfig(m_hHandle, dynamic_config.config_param,
-            &dynamic_config.config_data) != OMX_ErrorNone)
-          E("ERROR: Setting dynamic config to OMX param[0x%x]", dynamic_config.config_param);
-        dynamic_config.pending = false;
-      }
-      else if (m_nFrameIn > dynamic_config.frame_num)
-      {
-        E("WARNING: Config change requested in passed frame(%d)", dynamic_config.frame_num);
-        dynamic_config.pending = false;
-      }
-    }
-    if (!dynamic_config.pending)
-      VencTest_ReadDynamicConfigMsg();
-  } while (!dynamic_config.pending && m_pDynConfFile);
+
+        if (!dynamic_config.pending)
+            VencTest_ReadDynamicConfigMsg();
+    } while (!dynamic_config.pending && m_pDynConfFile);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 OMX_ERRORTYPE VencTest_ReadAndEmpty(OMX_BUFFERHEADERTYPE* pYUVBuffer)
 {
-   OMX_ERRORTYPE result = OMX_ErrorNone;
+    OMX_ERRORTYPE result = OMX_ErrorNone;
 #ifdef T_ARM
 #if defined(MAX_RES_720P) && !defined(_MSM8974_)
-   if (read(m_nInFd,
-            pYUVBuffer->pBuffer,
-            m_sProfile.nFrameBytes) != m_sProfile.nFrameBytes)
-   {
-      return OMX_ErrorUndefined;
-   }
+
+    if (read(m_nInFd,
+                pYUVBuffer->pBuffer,
+                m_sProfile.nFrameBytes) != m_sProfile.nFrameBytes) {
+        return OMX_ErrorUndefined;
+    }
+
 #elif _MSM8974_
-   int i, lscanl, lstride, cscanl, cstride, height, width;
-   int bytes = 0, read_bytes = 0;
-   OMX_U8 *yuv = pYUVBuffer->pBuffer;
-   height = m_sProfile.nFrameHeight;
-   width = m_sProfile.nFrameWidth;
-   lstride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
-   lscanl = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height);
-   cstride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width);
-   cscanl = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height);
+    int i, lscanl, lstride, cscanl, cstride, height, width;
+    int bytes = 0, read_bytes = 0;
+    OMX_U8 *yuv = pYUVBuffer->pBuffer;
+    height = m_sProfile.nFrameHeight;
+    width = m_sProfile.nFrameWidth;
+    lstride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
+    lscanl = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height);
+    cstride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width);
+    cscanl = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height);
 
-   for(i = 0; i < height; i++) {
-	   bytes = read(m_nInFd, yuv, width);
-	   if (bytes != width) {
-		   E("read failed: %d != %d\n", read, width);
-		   return OMX_ErrorUndefined;
-	   }
-	   read_bytes += bytes;
-	   yuv += lstride;
-   }
-   yuv = pYUVBuffer->pBuffer + (lscanl * lstride);
-   for (i = 0; i < ((height + 1) >> 1); i++) {
-	   bytes = read(m_nInFd, yuv, width);
-	   if (bytes != width) {
-		   E("read failed: %d != %d\n", read, width);
-		   return OMX_ErrorUndefined;
-	   }
-	   read_bytes += bytes;
-	   yuv += cstride;
-   }
-   m_sProfile.nFrameRead = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
-   E("\n\nActual read bytes: %d, NV12 buffer size: %d\n\n\n", read_bytes, m_sProfile.nFrameRead);
+    for (i = 0; i < height; i++) {
+        bytes = read(m_nInFd, yuv, width);
+
+        if (bytes != width) {
+            E("read failed: %d != %d\n", read, width);
+            return OMX_ErrorUndefined;
+        }
+
+        read_bytes += bytes;
+        yuv += lstride;
+    }
+
+    yuv = pYUVBuffer->pBuffer + (lscanl * lstride);
+
+    for (i = 0; i < ((height + 1) >> 1); i++) {
+        bytes = read(m_nInFd, yuv, width);
+
+        if (bytes != width) {
+            E("read failed: %d != %d\n", read, width);
+            return OMX_ErrorUndefined;
+        }
+
+        read_bytes += bytes;
+        yuv += cstride;
+    }
+
+    m_sProfile.nFrameRead = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
+    E("\n\nActual read bytes: %d, NV12 buffer size: %d\n\n\n", read_bytes, m_sProfile.nFrameRead);
 #else
-         OMX_U32 bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight;
-         // read Y first
-         if (read(m_nInFd,
-              pYUVBuffer->pBuffer,
-              bytestoread) != bytestoread)
-            return OMX_ErrorUndefined;
+    OMX_U32 bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight;
 
-         // check alignment for offset to C
-         OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
+    // read Y first
+    if (read(m_nInFd,
+                pYUVBuffer->pBuffer,
+                bytestoread) != bytestoread)
+        return OMX_ErrorUndefined;
 
-         const OMX_U32 C_2K = (1024*2),
-            MASK_2K = C_2K-1,
-            IMASK_2K = ~MASK_2K;
+    // check alignment for offset to C
+    OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
 
-         if (offset_to_c & MASK_2K)
-         {
-            // offset to C is not 2k aligned, adjustment is required
-            offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
-         }
+    const OMX_U32 C_2K = (1024*2),
+          MASK_2K = C_2K-1,
+          IMASK_2K = ~MASK_2K;
 
-         bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2;
-         // read C
-         if (read(m_nInFd,
-              pYUVBuffer->pBuffer + offset_to_c,
-              bytestoread)!= bytestoread)
-            return OMX_ErrorUndefined;
+    if (offset_to_c & MASK_2K) {
+        // offset to C is not 2k aligned, adjustment is required
+        offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
+    }
+
+    bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2;
+
+    // read C
+    if (read(m_nInFd,
+                pYUVBuffer->pBuffer + offset_to_c,
+                bytestoread)!= bytestoread)
+        return OMX_ErrorUndefined;
+
 #endif
 #else
-   {
-	  char * pInputbuf = (char *)(pYUVBuffer->pBuffer) ;
-	      read(m_nInFd,pInputbuf,m_sProfile.nFrameBytes) ;
+    {
+        char * pInputbuf = (char *)(pYUVBuffer->pBuffer) ;
+        read(m_nInFd,pInputbuf,m_sProfile.nFrameBytes) ;
 
-   }
+    }
 #endif
-   if (m_pDynConfFile)
-     VencTest_ProcessDynamicConfigurationFile();
-   D("about to call VencTest_EncodeFrame...");
-   pthread_mutex_lock(&m_mutex);
-   ++m_nFrameIn;
+
+    if (m_pDynConfFile)
+        VencTest_ProcessDynamicConfigurationFile();
+
+    D("about to call VencTest_EncodeFrame...");
+    pthread_mutex_lock(&m_mutex);
+    ++m_nFrameIn;
 #ifdef _MSM8974_
-   pYUVBuffer->nFilledLen = m_sProfile.nFrameRead;
+    pYUVBuffer->nFilledLen = m_sProfile.nFrameRead;
 #else
-   pYUVBuffer->nFilledLen = m_sProfile.nFrameBytes;
+    pYUVBuffer->nFilledLen = m_sProfile.nFrameBytes;
 #endif
-   D("Called Buffer with Data filled length %d",pYUVBuffer->nFilledLen);
+    D("Called Buffer with Data filled length %d",pYUVBuffer->nFilledLen);
 
-      result = VencTest_EncodeFrame(pYUVBuffer->pBuffer,
-                                 m_nTimeStamp);
+    result = VencTest_EncodeFrame(pYUVBuffer->pBuffer,
+            m_nTimeStamp);
 
-   m_nTimeStamp += (1000000) / m_sProfile.nFramerate;
-   CHK(result);
-   pthread_mutex_unlock(&m_mutex);
-   return result;
+    m_nTimeStamp += (1000000) / m_sProfile.nFramerate;
+    CHK(result);
+    pthread_mutex_unlock(&m_mutex);
+    return result;
 }
 ////////////////////////////////////////////////////////////////////////////////
 void PreviewCallback(int nFD,
-                     int nOffset,
-                     void* pPhys,
-                     void* pVirt,
-                     long long nTimeStamp)
+        int nOffset,
+        void* pPhys,
+        void* pVirt,
+        long long nTimeStamp)
 {
 
-   D("================= preview frame %d, phys=0x%x, nTimeStamp(millis)=%lld",
-     m_nFrameIn+1, pPhys, (nTimeStamp / 1000));
+    D("================= preview frame %d, phys=0x%x, nTimeStamp(millis)=%lld",
+            m_nFrameIn+1, pPhys, (nTimeStamp / 1000));
 
-   if (m_nFrameIn == m_nFramePlay &&
-       m_nFramePlay != 0)
-   {
-      // we will stop camera after last frame is encoded.
-      // for now just ignore input frames
+    if (m_nFrameIn == m_nFramePlay &&
+            m_nFramePlay != 0) {
+        // we will stop camera after last frame is encoded.
+        // for now just ignore input frames
 
-      CameraTest_ReleaseFrame(pPhys, pVirt);
-      return;
-   }
+        CameraTest_ReleaseFrame(pPhys, pVirt);
+        return;
+    }
 
-   // see if we should stop
-   pthread_mutex_lock(&m_mutex);
-   ++m_nFrameIn;
-   pthread_mutex_unlock(&m_mutex);
+    // see if we should stop
+    pthread_mutex_lock(&m_mutex);
+    ++m_nFrameIn;
+    pthread_mutex_unlock(&m_mutex);
 
 
-   if (m_eMode == MODE_LIVE_ENCODE)
-   {
+    if (m_eMode == MODE_LIVE_ENCODE) {
 
-      OMX_ERRORTYPE result;
+        OMX_ERRORTYPE result;
 
-      // register new camera buffers with encoder
-      int i;
-      for (i = 0; i < num_in_buffers; i++)
-      {
-         if (m_pInBuffers[i] != NULL &&
-             m_pInBuffers[i]->pBuffer == pPhys)
-         {
-            break;
-         }
-         else if (m_pInBuffers[i] == NULL)
-         {
-            D("registering buffer...");
-            result = VencTest_RegisterYUVBuffer(&m_pInBuffers[i],
-                                                (OMX_U8*) pPhys,
-                                                (OMX_PTR) pVirt); // store virt in app private field
-            D("register done");
-            CHK(result);
-            break;
-         }
-      }
+        // register new camera buffers with encoder
+        int i;
 
-      if (i == num_in_buffers)
-      {
-         E("There are more camera buffers than we thought");
-         CHK(1);
-      }
+        for (i = 0; i < num_in_buffers; i++) {
+            if (m_pInBuffers[i] != NULL &&
+                    m_pInBuffers[i]->pBuffer == pPhys) {
+                break;
+            } else if (m_pInBuffers[i] == NULL) {
+                D("registering buffer...");
+                result = VencTest_RegisterYUVBuffer(&m_pInBuffers[i],
+                        (OMX_U8*) pPhys,
+                        (OMX_PTR) pVirt); // store virt in app private field
+                D("register done");
+                CHK(result);
+                break;
+            }
+        }
 
-      // encode the yuv frame
+        if (i == num_in_buffers) {
+            E("There are more camera buffers than we thought");
+            CHK(1);
+        }
 
-      D("StartEncodeTime=%lld", GetTimeStamp());
-      result = VencTest_EncodeFrame(pPhys,
-                                    nTimeStamp);
-      CHK(result);
-     // FBTest_DisplayImage(nFD, nOffset);
-   }
-   else
-   {
-     // FBTest_DisplayImage(nFD, nOffset);
-      CameraTest_ReleaseFrame(pPhys, pVirt);
-   }
+        // encode the yuv frame
+
+        D("StartEncodeTime=%lld", GetTimeStamp());
+        result = VencTest_EncodeFrame(pPhys,
+                nTimeStamp);
+        CHK(result);
+        // FBTest_DisplayImage(nFD, nOffset);
+    } else {
+        // FBTest_DisplayImage(nFD, nOffset);
+        CameraTest_ReleaseFrame(pPhys, pVirt);
+    }
 }
 ////////////////////////////////////////////////////////////////////////////////
 void usage(char* filename)
 {
-   char* fname = strrchr(filename, (int) '/');
-   fname = (fname == NULL) ? filename : fname;
+    char* fname = strrchr(filename, (int) '/');
+    fname = (fname == NULL) ? filename : fname;
 
-   fprintf(stderr, "usage: %s LIVE <QCIF|QVGA> <MP4|H263> <FPS> <BITRATE> <NFRAMES> <OUTFILE>\n", fname);
-   fprintf(stderr, "usage: %s FILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE> <OUTFILE> ", fname);
-   fprintf(stderr, "<Dynamic config file - opt> <Rate Control - opt> <AVC Slice Mode - opt>\n", fname);
-   fprintf(stderr, "usage: %s PROFILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE>\n", fname);
-   fprintf(stderr, "usage: %s PREVIEW <QCIF|QVGA> <FPS> <NFRAMES>\n", fname);
-   fprintf(stderr, "usage: %s DISPLAY <QCIF|QVGA> <FPS> <NFRAMES> <INFILE>\n", fname);
-   fprintf(stderr, "\n       BITRATE - bitrate in kbps\n");
-   fprintf(stderr, "       FPS - frames per second\n");
-   fprintf(stderr, "       NFRAMES - number of frames to play, 0 for infinite\n");
-   fprintf(stderr, "       RateControl (Values 0 - 4 for RC_OFF, RC_CBR_CFR, RC_CBR_VFR, RC_VBR_CFR, RC_VBR_VFR\n");
-   exit(1);
+    fprintf(stderr, "usage: %s LIVE <QCIF|QVGA> <MP4|H263> <FPS> <BITRATE> <NFRAMES> <OUTFILE>\n", fname);
+    fprintf(stderr, "usage: %s FILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE> <OUTFILE> ", fname);
+    fprintf(stderr, "<Dynamic config file - opt> <Rate Control - opt> <AVC Slice Mode - opt>\n", fname);
+    fprintf(stderr, "usage: %s PROFILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE>\n", fname);
+    fprintf(stderr, "usage: %s PREVIEW <QCIF|QVGA> <FPS> <NFRAMES>\n", fname);
+    fprintf(stderr, "usage: %s DISPLAY <QCIF|QVGA> <FPS> <NFRAMES> <INFILE>\n", fname);
+    fprintf(stderr, "\n       BITRATE - bitrate in kbps\n");
+    fprintf(stderr, "       FPS - frames per second\n");
+    fprintf(stderr, "       NFRAMES - number of frames to play, 0 for infinite\n");
+    fprintf(stderr, "       RateControl (Values 0 - 4 for RC_OFF, RC_CBR_CFR, RC_CBR_VFR, RC_VBR_CFR, RC_VBR_VFR\n");
+    exit(1);
 }
 
 bool parseWxH(char *str, OMX_U32 *width, OMX_U32 *height)
 {
-   bool parseOK = false;
-   const char delimiters[] = " x*,";
-   char *token, *dupstr, *temp;
-   OMX_U32 w, h;
+    bool parseOK = false;
+    const char delimiters[] = " x*,";
+    char *token, *dupstr, *temp;
+    OMX_U32 w, h;
 
-   dupstr = strdup(str);
-   token = strtok_r(dupstr, delimiters, &temp);
-   if (token)
-   {
-       w = strtoul(token, NULL, 10);
-       token = strtok_r(NULL, delimiters, &temp);
-       if (token)
-       {
-           h = strtoul(token, NULL, 10);
-           if (w != ULONG_MAX && h != ULONG_MAX)
-           {
+    dupstr = strdup(str);
+    token = strtok_r(dupstr, delimiters, &temp);
+
+    if (token) {
+        w = strtoul(token, NULL, 10);
+        token = strtok_r(NULL, delimiters, &temp);
+
+        if (token) {
+            h = strtoul(token, NULL, 10);
+
+            if (w != ULONG_MAX && h != ULONG_MAX) {
 #ifdef MAX_RES_720P
-              if ((w * h >> 8) <= 3600)
-              {
-                 parseOK = true;
-                 *width = w;
-                 *height = h;
-                 }
+
+                if ((w * h >> 8) <= 3600) {
+                    parseOK = true;
+                    *width = w;
+                    *height = h;
+                }
+
 #else
-              if ((w * h >> 8) <= 8160)
-              {
-                 parseOK = true;
-                 *width = w;
-                 *height = h;
-                 }
+
+                if ((w * h >> 8) <= 8160) {
+                    parseOK = true;
+                    *width = w;
+                    *height = h;
+                }
+
 #endif
-              else
-                 E("\nInvalid dimensions %dx%d",w,h);
-              }
-           }
-       }
-   free(dupstr);
-   return parseOK;
+                else
+                    E("\nInvalid dimensions %dx%d",w,h);
+            }
+        }
+    }
+
+    free(dupstr);
+    return parseOK;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 void parseArgs(int argc, char** argv)
 {
-   int dyn_file_arg = argc;
-   if (argc == 1)
-   {
-      usage(argv[0]);
-   }
-   else if (strcmp("PREVIEW", argv[1]) == 0 ||
-            strcmp("preview", argv[1]) == 0)
-   {
-      m_eMode = MODE_PREVIEW;
-      if (argc != 5)
-      {
-         usage(argv[0]);
-      }
-   }
-   else if (strcmp("DISPLAY", argv[1]) == 0 ||
-            strcmp("display", argv[1]) == 0)
-   {
-      m_eMode = MODE_DISPLAY;
-      if (argc != 6)
-      {
-         usage(argv[0]);
-      }
-      m_sProfile.cInFileName = argv[5];
-      m_sProfile.cOutFileName = NULL;
-   }
-   else if (strcmp("LIVE", argv[1]) == 0 ||
-            strcmp("live", argv[1]) == 0)
-   {//263
-      m_eMode = MODE_LIVE_ENCODE;
-      if (argc != 8)
-      {
-         usage(argv[0]);
-      }
-      m_sProfile.cInFileName = NULL;
-      m_sProfile.cOutFileName = argv[7];
-   }
-   else if (strcmp("FILE", argv[1]) == 0 ||
-            strcmp("file", argv[1]) == 0)
-   {//263
-      m_eMode = MODE_FILE_ENCODE;
+    int dyn_file_arg = argc;
 
-      if(argc < 9 || argc > 13)
-      {
-          usage(argv[0]);
-      }
-      else
-      {
-         if (argc > 9)
-            dyn_file_arg = 9;
+    if (argc == 1) {
+        usage(argv[0]);
+    } else if (strcmp("PREVIEW", argv[1]) == 0 ||
+            strcmp("preview", argv[1]) == 0) {
+        m_eMode = MODE_PREVIEW;
 
-         if (argc > 10)
-         {
-           m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
-            int RC = atoi(argv[10]);
+        if (argc != 5) {
+            usage(argv[0]);
+        }
+    } else if (strcmp("DISPLAY", argv[1]) == 0 ||
+            strcmp("display", argv[1]) == 0) {
+        m_eMode = MODE_DISPLAY;
 
-            switch (RC)
-            {
-            case 0:
-               m_sProfile.eControlRate  = OMX_Video_ControlRateDisable ;//VENC_RC_NONE
-               break;
-            case 1:
-               m_sProfile.eControlRate  = OMX_Video_ControlRateConstant;//VENC_RC_CBR_CFR
-               break;
+        if (argc != 6) {
+            usage(argv[0]);
+        }
 
-            case 2:
-               m_sProfile.eControlRate  = OMX_Video_ControlRateConstantSkipFrames;//VENC_RC_CBR_VFR
-               break;
+        m_sProfile.cInFileName = argv[5];
+        m_sProfile.cOutFileName = NULL;
+    } else if (strcmp("LIVE", argv[1]) == 0 ||
+            strcmp("live", argv[1]) == 0) {//263
+        m_eMode = MODE_LIVE_ENCODE;
 
-            case 3:
-               m_sProfile.eControlRate  =OMX_Video_ControlRateVariable ;//VENC_RC_VBR_CFR
-               break;
+        if (argc != 8) {
+            usage(argv[0]);
+        }
 
-            case 4:
-               m_sProfile.eControlRate  = OMX_Video_ControlRateVariableSkipFrames;//VENC_RC_VBR_VFR
-               break;
+        m_sProfile.cInFileName = NULL;
+        m_sProfile.cOutFileName = argv[7];
+    } else if (strcmp("FILE", argv[1]) == 0 ||
+            strcmp("file", argv[1]) == 0) {//263
+        m_eMode = MODE_FILE_ENCODE;
 
-           default:
-               E("invalid rate control selection");
-               m_sProfile.eControlRate = OMX_Video_ControlRateVariable; //VENC_RC_VBR_CFR
-               break;
+        if (argc < 9 || argc > 13) {
+            usage(argv[0]);
+        } else {
+            if (argc > 9)
+                dyn_file_arg = 9;
+
+            if (argc > 10) {
+                m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
+                int RC = atoi(argv[10]);
+
+                switch (RC) {
+                    case 0:
+                        m_sProfile.eControlRate  = OMX_Video_ControlRateDisable ;//VENC_RC_NONE
+                        break;
+                    case 1:
+                        m_sProfile.eControlRate  = OMX_Video_ControlRateConstant;//VENC_RC_CBR_CFR
+                        break;
+
+                    case 2:
+                        m_sProfile.eControlRate  = OMX_Video_ControlRateConstantSkipFrames;//VENC_RC_CBR_VFR
+                        break;
+
+                    case 3:
+                        m_sProfile.eControlRate  =OMX_Video_ControlRateVariable ;//VENC_RC_VBR_CFR
+                        break;
+
+                    case 4:
+                        m_sProfile.eControlRate  = OMX_Video_ControlRateVariableSkipFrames;//VENC_RC_VBR_VFR
+                        break;
+
+                    default:
+                        E("invalid rate control selection");
+                        m_sProfile.eControlRate = OMX_Video_ControlRateVariable; //VENC_RC_VBR_CFR
+                        break;
+                }
             }
-         }
 
-         if (argc > 11)
-         {
-            int profile_argi = 11;
-            if(!strcmp(argv[3], "H264") || !strcmp(argv[3], "h264"))
-            {
-               profile_argi = 12;
-               D("\nSetting AVCSliceMode ... ");
-               int AVCSliceMode = atoi(argv[11]);
-               switch(AVCSliceMode)
-               {
-               case 0:
-                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
-                  break;
+            if (argc > 11) {
+                int profile_argi = 11;
 
-               case 1:
-                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCMBSlice;
-                  break;
+                if (!strcmp(argv[3], "H264") || !strcmp(argv[3], "h264")) {
+                    profile_argi = 12;
+                    D("\nSetting AVCSliceMode ... ");
+                    int AVCSliceMode = atoi(argv[11]);
 
-               case 2:
-                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCByteSlice;
-                  break;
+                    switch (AVCSliceMode) {
+                        case 0:
+                            m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
+                            break;
 
-               default:
-                  E("invalid Slice Mode");
-                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
-                  break;
-              }
+                        case 1:
+                            m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCMBSlice;
+                            break;
+
+                        case 2:
+                            m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCByteSlice;
+                            break;
+
+                        default:
+                            E("invalid Slice Mode");
+                            m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
+                            break;
+                    }
+                }
+
+                if (profile_argi < argc) {
+                    if (!strncmp(argv[profile_argi], "0x", 2) || !strncmp(argv[profile_argi], "0x", 2)) {
+                        m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 16);
+                    } else {
+                        m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 10);
+                    }
+
+                    if (!m_sProfile.nUserProfile || m_sProfile.nUserProfile == ULONG_MAX) {
+                        E("invalid specified Profile %s, using default", argv[profile_argi]);
+                        m_sProfile.nUserProfile = 0;
+                    }
+                }
             }
-            if (profile_argi < argc)
-            {
-               if (!strncmp(argv[profile_argi], "0x", 2) || !strncmp(argv[profile_argi], "0x", 2))
-               {
-                  m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 16);
-               }
-               else
-               {
-                  m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 10);
-               }
-               if (!m_sProfile.nUserProfile || m_sProfile.nUserProfile == ULONG_MAX)
-               {
-                  E("invalid specified Profile %s, using default", argv[profile_argi]);
-                  m_sProfile.nUserProfile = 0;
-               }
-            }
-         }
-      }
-      m_sProfile.cInFileName = argv[7];
-      m_sProfile.cOutFileName = argv[8];
-   }
-   else if (strcmp("PROFILE", argv[1]) == 0 ||
-            strcmp("profile", argv[1]) == 0)
-   {//263
-      m_eMode = MODE_PROFILE;
-      if (argc != 8)
-      {
-         usage(argv[0]);
-      }
-      m_sProfile.cInFileName = argv[7];
-      m_sProfile.cOutFileName = NULL;
-   }
-   else
-   {
-      usage(argv[0]);
-   }
+        }
+
+        m_sProfile.cInFileName = argv[7];
+        m_sProfile.cOutFileName = argv[8];
+    } else if (strcmp("PROFILE", argv[1]) == 0 ||
+            strcmp("profile", argv[1]) == 0) {//263
+        m_eMode = MODE_PROFILE;
+
+        if (argc != 8) {
+            usage(argv[0]);
+        }
+
+        m_sProfile.cInFileName = argv[7];
+        m_sProfile.cOutFileName = NULL;
+    } else {
+        usage(argv[0]);
+    }
 
 
-   if (strcmp("QCIF", argv[2]) == 0 ||
-       strcmp("qcif", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 176;
-      m_sProfile.nFrameHeight = 144;
-      m_sProfile.nFrameBytes = 176*144*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level0;
-   }
-   else if (strcmp("QVGA", argv[2]) == 0 ||
-            strcmp("qvga", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 320;
-      m_sProfile.nFrameHeight = 240;
-      m_sProfile.nFrameBytes = 320*240*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
+    if (strcmp("QCIF", argv[2]) == 0 ||
+            strcmp("qcif", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 176;
+        m_sProfile.nFrameHeight = 144;
+        m_sProfile.nFrameBytes = 176*144*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level0;
+    } else if (strcmp("QVGA", argv[2]) == 0 ||
+            strcmp("qvga", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 320;
+        m_sProfile.nFrameHeight = 240;
+        m_sProfile.nFrameBytes = 320*240*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    }
 
 
     else if (strcmp("VGA", argv[2]) == 0 ||
-            strcmp("vga", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 640;
-      m_sProfile.nFrameHeight = 480;
-      m_sProfile.nFrameBytes = 640*480*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
+            strcmp("vga", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 640;
+        m_sProfile.nFrameHeight = 480;
+        m_sProfile.nFrameBytes = 640*480*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    }
 
     else if (strcmp("WVGA", argv[2]) == 0 ||
-            strcmp("wvga", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 800;
-      m_sProfile.nFrameHeight = 480;
-      m_sProfile.nFrameBytes = 800*480*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-  else if (strcmp("CIF", argv[2]) == 0 ||
-            strcmp("cif", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 352;
-      m_sProfile.nFrameHeight = 288;
-      m_sProfile.nFrameBytes = 352*288*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-   else if (strcmp("720", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 1280;
-      m_sProfile.nFrameHeight = 720;
-      m_sProfile.nFrameBytes = 720*1280*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-   else if (strcmp("1080", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 1920;
-      m_sProfile.nFrameHeight = 1080;
-      m_sProfile.nFrameBytes = 1920*1080*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-#ifdef _MSM8974_
-   else if (strcmp("4K2K", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 4096;
-      m_sProfile.nFrameHeight = 2160;
-      m_sProfile.nFrameBytes = 4096*2160*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-   else if (strcmp("2160P", argv[2]) == 0)
-   {
-      m_sProfile.nFrameWidth = 3840;
-      m_sProfile.nFrameHeight = 2160;
-      m_sProfile.nFrameBytes = 3840*2160*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-#endif
-   else if (parseWxH(argv[2], &m_sProfile.nFrameWidth, &m_sProfile.nFrameHeight))
-   {
-      m_sProfile.nFrameBytes = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight*3/2;
-      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
-   }
-   else
-   {
-      usage(argv[0]);
-   }
+            strcmp("wvga", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 800;
+        m_sProfile.nFrameHeight = 480;
+        m_sProfile.nFrameBytes = 800*480*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    } else if (strcmp("CIF", argv[2]) == 0 ||
+            strcmp("cif", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 352;
+        m_sProfile.nFrameHeight = 288;
+        m_sProfile.nFrameBytes = 352*288*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    } else if (strcmp("720", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 1280;
+        m_sProfile.nFrameHeight = 720;
+        m_sProfile.nFrameBytes = 720*1280*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    } else if (strcmp("1080", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 1920;
+        m_sProfile.nFrameHeight = 1080;
+        m_sProfile.nFrameBytes = 1920*1080*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    }
 
 #ifdef _MSM8974_
-   m_sProfile.nFramestride =  (m_sProfile.nFrameWidth + 31) & (~31);
-   m_sProfile.nFrameScanlines = (m_sProfile.nFrameHeight + 31) & (~31);
-   m_sProfile.nFrameBytes = ((m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2) + 4095) & (~4095);
-   m_sProfile.nFrameRead = m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2;
-#endif
-   if (m_eMode == MODE_DISPLAY ||
-       m_eMode == MODE_PREVIEW)
-   {
-      m_sProfile.nFramerate = atof(argv[3]);
-      m_nFramePlay = atoi(argv[4]);
+    else if (strcmp("4K2K", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 4096;
+        m_sProfile.nFrameHeight = 2160;
+        m_sProfile.nFrameBytes = 4096*2160*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    } else if (strcmp("2160P", argv[2]) == 0) {
+        m_sProfile.nFrameWidth = 3840;
+        m_sProfile.nFrameHeight = 2160;
+        m_sProfile.nFrameBytes = 3840*2160*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    }
 
-   }
-   else if (m_eMode == MODE_LIVE_ENCODE ||
+#endif
+    else if (parseWxH(argv[2], &m_sProfile.nFrameWidth, &m_sProfile.nFrameHeight)) {
+        m_sProfile.nFrameBytes = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight*3/2;
+        m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+    } else {
+        usage(argv[0]);
+    }
+
+#ifdef _MSM8974_
+    m_sProfile.nFramestride =  (m_sProfile.nFrameWidth + 31) & (~31);
+    m_sProfile.nFrameScanlines = (m_sProfile.nFrameHeight + 31) & (~31);
+    m_sProfile.nFrameBytes = ((m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2) + 4095) & (~4095);
+    m_sProfile.nFrameRead = m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2;
+#endif
+
+    if (m_eMode == MODE_DISPLAY ||
+            m_eMode == MODE_PREVIEW) {
+        m_sProfile.nFramerate = atof(argv[3]);
+        m_nFramePlay = atoi(argv[4]);
+
+    } else if (m_eMode == MODE_LIVE_ENCODE ||
             m_eMode == MODE_FILE_ENCODE ||
-            m_eMode == MODE_PROFILE)
-   {
-      if ((!strcmp(argv[3], "MP4")) || (!strcmp(argv[3], "mp4")))
-      {
-         m_sProfile.eCodec = OMX_VIDEO_CodingMPEG4;
-      }
-      else if ((!strcmp(argv[3], "H263")) || (!strcmp(argv[3], "h263")))
-      {
-         m_sProfile.eCodec = OMX_VIDEO_CodingH263;
-      }
-      else if ((!strcmp(argv[3], "H264")) || (!strcmp(argv[3], "h264")))
-      {
-         m_sProfile.eCodec = OMX_VIDEO_CodingAVC;
-      }
-#ifdef _MSM8974_
-      else if ((!strcmp(argv[3], "VP8")) || (!strcmp(argv[3], "vp8")))
-      {
-         m_sProfile.eCodec = OMX_VIDEO_CodingVPX;
-      }
-#endif
-      else
-      {
-         usage(argv[0]);
-      }
-
-      m_sProfile.nFramerate = atof(argv[4]);
-      m_sProfile.nBitrate = atoi(argv[5]);
-//      m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
-      m_nFramePlay = atoi(argv[6]);
-      if (dyn_file_arg < argc)
-      {
-        m_pDynConfFile = fopen(argv[dyn_file_arg], "r");
-        if (!m_pDynConfFile)
-          E("ERROR: Cannot open dynamic config file: %s", argv[dyn_file_arg]);
-        else
-        {
-          memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
+            m_eMode == MODE_PROFILE) {
+        if ((!strcmp(argv[3], "MP4")) || (!strcmp(argv[3], "mp4"))) {
+            m_sProfile.eCodec = OMX_VIDEO_CodingMPEG4;
+        } else if ((!strcmp(argv[3], "H263")) || (!strcmp(argv[3], "h263"))) {
+            m_sProfile.eCodec = OMX_VIDEO_CodingH263;
+        } else if ((!strcmp(argv[3], "H264")) || (!strcmp(argv[3], "h264"))) {
+            m_sProfile.eCodec = OMX_VIDEO_CodingAVC;
         }
-      }
-   }
+
+#ifdef _MSM8974_
+        else if ((!strcmp(argv[3], "VP8")) || (!strcmp(argv[3], "vp8"))) {
+            m_sProfile.eCodec = OMX_VIDEO_CodingVPX;
+        }
+
+#endif
+        else {
+            usage(argv[0]);
+        }
+
+        m_sProfile.nFramerate = atof(argv[4]);
+        m_sProfile.nBitrate = atoi(argv[5]);
+        //      m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
+        m_nFramePlay = atoi(argv[6]);
+
+        if (dyn_file_arg < argc) {
+            m_pDynConfFile = fopen(argv[dyn_file_arg], "r");
+
+            if (!m_pDynConfFile)
+                E("ERROR: Cannot open dynamic config file: %s", argv[dyn_file_arg]);
+            else {
+                memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
+            }
+        }
+    }
 }
 
 void* Watchdog(void* data)
 {
-   while (1)
-   {
-      sleep(1000);
-      if (m_bWatchDogKicked == true)
-         m_bWatchDogKicked = false;
-      else
-         E("watchdog has not been kicked. we may have a deadlock");
-   }
-   return NULL;
+    while (1) {
+        sleep(1000);
+
+        if (m_bWatchDogKicked == true)
+            m_bWatchDogKicked = false;
+        else
+            E("watchdog has not been kicked. we may have a deadlock");
+    }
+
+    return NULL;
 }
 
 int main(int argc, char** argv)
 {
-   OMX_U8* pvirt = NULL;
-   int result;
-   float enc_time_sec=0.0,enc_time_usec=0.0;
+    OMX_U8* pvirt = NULL;
+    int result;
+    float enc_time_sec=0.0,enc_time_usec=0.0;
 
-   m_nInFd = -1;
-   m_nOutFd = -1;
-   m_nTimeStamp = 0;
-   m_nFrameIn = 0;
-   m_nFrameOut = 0;
+    m_nInFd = -1;
+    m_nOutFd = -1;
+    m_nTimeStamp = 0;
+    m_nFrameIn = 0;
+    m_nFrameOut = 0;
 
-   memset(&m_sMsgQ, 0, sizeof(MsgQ));
-   memset(&m_sProfile, 0, sizeof(m_sProfile));
-   parseArgs(argc, argv);
+    memset(&m_sMsgQ, 0, sizeof(MsgQ));
+    memset(&m_sProfile, 0, sizeof(m_sProfile));
+    parseArgs(argc, argv);
 
-   D("fps=%f, bitrate=%u, width=%u, height=%u, frame bytes=%u",
-     m_sProfile.nFramerate,
-     m_sProfile.nBitrate,
-     m_sProfile.nFrameWidth,
-     m_sProfile.nFrameHeight,
-     m_sProfile.nFrameBytes);
+    D("fps=%f, bitrate=%u, width=%u, height=%u, frame bytes=%u",
+            m_sProfile.nFramerate,
+            m_sProfile.nBitrate,
+            m_sProfile.nFrameWidth,
+            m_sProfile.nFrameHeight,
+            m_sProfile.nFrameBytes);
 #ifdef _MSM8974_
-   D("Frame stride=%u, scanlines=%u, read=%u",
-		   m_sProfile.nFramestride,
-		   m_sProfile.nFrameScanlines,
-		   m_sProfile.nFrameRead);
+    D("Frame stride=%u, scanlines=%u, read=%u",
+            m_sProfile.nFramestride,
+            m_sProfile.nFrameScanlines,
+            m_sProfile.nFrameRead);
 #endif
 
 
-   //if (m_eMode != MODE_PREVIEW && m_eMode != MODE_DISPLAY)
-   //{
-     // pthread_t wd;
-     // pthread_create(&wd, NULL, Watchdog, NULL);
-   //}
+    //if (m_eMode != MODE_PREVIEW && m_eMode != MODE_DISPLAY)
+    //{
+    // pthread_t wd;
+    // pthread_create(&wd, NULL, Watchdog, NULL);
+    //}
 
-   for (int x = 0; x < num_in_buffers; x++)
-   {
-      // mark all buffers as ready to use
-      m_bInFrameFree[x] = OMX_TRUE;
-   }
+    for (int x = 0; x < num_in_buffers; x++) {
+        // mark all buffers as ready to use
+        m_bInFrameFree[x] = OMX_TRUE;
+    }
 
 
-    if (m_eMode != MODE_PROFILE)
-   {
-      #if T_ARM
-	   m_nOutFd = open(m_sProfile.cOutFileName, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
-      #else
-	  m_nOutFd = open(m_sProfile.cOutFileName,0);
-      #endif
-      if (m_nOutFd < 0)
-      {
-         E("could not open output file %s", m_sProfile.cOutFileName);
-         CHK(1);
-      }
-   }
-
-   pthread_mutex_init(&m_mutex, NULL);
-   pthread_cond_init(&m_signal, NULL);
-
-   if (m_eMode != MODE_PREVIEW)
-   {
-      VencTest_Initialize();
-   }
-
-   ////////////////////////////////////////
-   // Camera + Encode
-   ////////////////////////////////////////
-   if (m_eMode == MODE_LIVE_ENCODE)
-   {
-     CameraTest_Initialize(m_sProfile.nFramerate,
-                            m_sProfile.nFrameWidth,
-                            m_sProfile.nFrameHeight,
-                            PreviewCallback);
-      CameraTest_Run();
-   }
-
-   if (m_eMode == MODE_FILE_ENCODE ||
-       m_eMode == MODE_PROFILE)
-   {
-      int i;
-      #if T_ARM
-      m_nInFd = open(m_sProfile.cInFileName, O_RDONLY);
-      #else
-      m_nInFd = open(m_sProfile.cInFileName,1);
-      #endif
-	  if (m_nInFd < 0)
-      {
-         E("could not open input file");
-         CHK(1);
-
-      }
-      D("going to idle state");
-      //SetState(OMX_StateIdle);
-      OMX_SendCommand(m_hHandle,
-                      OMX_CommandStateSet,
-                      (OMX_U32) OMX_StateIdle,
-                       NULL);
-
-      OMX_PARAM_PORTDEFINITIONTYPE portDef;
-
-      portDef.nPortIndex = 0;
-      result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
-      CHK(result);
-
-      D("allocating Input buffers");
-      num_in_buffers = portDef.nBufferCountActual;
-      for (i = 0; i < portDef.nBufferCountActual; i++)
-      {
-         OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem = new OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO;
-         pvirt = (OMX_U8*)PmemMalloc(pMem, m_sProfile.nFrameBytes);
-
-         if(pvirt == NULL)
-         {
-            CHK(1);
-         }
-         result = VencTest_RegisterYUVBuffer(&m_pInBuffers[i],
-                                             (OMX_U8*) pvirt,
-                                             (OMX_PTR) pMem);
-         CHK(result);
-      }
-   }
-   else if (m_eMode == MODE_LIVE_ENCODE)
-   {
-       D("going to idle state");
-       //SetState(OMX_StateIdle);
-       OMX_SendCommand(m_hHandle,
-                       OMX_CommandStateSet,
-                       (OMX_U32) OMX_StateIdle,
-                        NULL);
-   }
-
-   int i;
-   OMX_PARAM_PORTDEFINITIONTYPE portDef;
-
-   portDef.nPortIndex = 1;
-   result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
-   CHK(result);
-
-   D("allocating & calling usebuffer for Output port");
-   num_out_buffers = portDef.nBufferCountActual;
-   for (i = 0; i < portDef.nBufferCountActual; i++)
-   {
-      void* pBuff;
-
-      pBuff = malloc(portDef.nBufferSize);
-     D("portDef.nBufferSize = %d ",portDef.nBufferSize);
-      result = OMX_UseBuffer(m_hHandle,
-                             &m_pOutBuffers[i],
-                             (OMX_U32) PORT_INDEX_OUT,
-                             NULL,
-                             portDef.nBufferSize,
-                             (OMX_U8*) pBuff);
-      CHK(result);
-   }
-   D("allocate done");
-
-        // D("Going to state " # eState"...");
-
-         while (m_eState != OMX_StateIdle)
-         {
-            sleep(1);
-         }
-         //D("Now in state " # eState);
-
-
-   D("going to executing state");
-   SetState(OMX_StateExecuting);
-   for (i = 0; i < num_out_buffers; i++)
-   {
-      D("filling buffer %d", i);
-      result = OMX_FillThisBuffer(m_hHandle, m_pOutBuffers[i]);
-      //sleep(1000);
-      CHK(result);
-   }
-
-   if (m_eMode == MODE_FILE_ENCODE)
-   {
-      // encode the first frame to kick off the whole process
-      VencTest_ReadAndEmpty(m_pInBuffers[0]);
-    //  FBTest_DisplayImage(((PmemBuffer*) m_pInBuffers[0]->pAppPrivate)->fd,0);
-   }
-
-   if (m_eMode == MODE_PROFILE)
-   {
-      int i;
-
-      // read several frames into memory
-      D("reading frames into memory");
-      for (i = 0; i < num_in_buffers; i++)
-      {
-        D("[%d] address 0x%x",i, m_pInBuffers[i]->pBuffer);
-#ifdef MAX_RES_720P
-         read(m_nInFd,
-              m_pInBuffers[i]->pBuffer,
-              m_sProfile.nFrameBytes);
+    if (m_eMode != MODE_PROFILE) {
+#if T_ARM
+        m_nOutFd = open(m_sProfile.cOutFileName, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
 #else
-         // read Y first
-         read(m_nInFd,
-              m_pInBuffers[i]->pBuffer,
-              m_sProfile.nFrameWidth*m_sProfile.nFrameHeight);
-
-         // check alignment for offset to C
-         OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
-
-         const OMX_U32 C_2K = (1024*2),
-            MASK_2K = C_2K-1,
-            IMASK_2K = ~MASK_2K;
-
-         if (offset_to_c & MASK_2K)
-         {
-            // offset to C is not 2k aligned, adjustment is required
-            offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
-         }
-
-         // read C
-         read(m_nInFd,
-              m_pInBuffers[i]->pBuffer + offset_to_c,
-              m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2);
+        m_nOutFd = open(m_sProfile.cOutFileName,0);
 #endif
 
-      }
+        if (m_nOutFd < 0) {
+            E("could not open output file %s", m_sProfile.cOutFileName);
+            CHK(1);
+        }
+    }
 
-     // FBTest_Initialize(m_sProfile.nFrameWidth, m_sProfile.nFrameHeight);
+    pthread_mutex_init(&m_mutex, NULL);
+    pthread_cond_init(&m_signal, NULL);
 
-      // loop over the mem-resident frames and encode them
-      D("beging playing mem-resident frames...");
-      for (i = 0; m_nFramePlay == 0 || i < m_nFramePlay; i++)
-      {
-         int idx = i % num_in_buffers;
-         if (m_bInFrameFree[idx] == OMX_FALSE)
-         {
-            int j;
-            E("the expected buffer is not free, but lets find another");
+    if (m_eMode != MODE_PREVIEW) {
+        VencTest_Initialize();
+    }
 
-            idx = -1;
+    ////////////////////////////////////////
+    // Camera + Encode
+    ////////////////////////////////////////
+    if (m_eMode == MODE_LIVE_ENCODE) {
+        CameraTest_Initialize(m_sProfile.nFramerate,
+                m_sProfile.nFrameWidth,
+                m_sProfile.nFrameHeight,
+                PreviewCallback);
+        CameraTest_Run();
+    }
 
-            // lets see if we can find another free buffer
-            for (j = 0; j < num_in_buffers; j++)
-            {
-               if(m_bInFrameFree[j])
-               {
-                  idx = j;
-                  break;
-               }
+    if (m_eMode == MODE_FILE_ENCODE ||
+            m_eMode == MODE_PROFILE) {
+        int i;
+#if T_ARM
+        m_nInFd = open(m_sProfile.cInFileName, O_RDONLY);
+#else
+        m_nInFd = open(m_sProfile.cInFileName,1);
+#endif
+
+        if (m_nInFd < 0) {
+            E("could not open input file");
+            CHK(1);
+
+        }
+
+        D("going to idle state");
+        //SetState(OMX_StateIdle);
+        OMX_SendCommand(m_hHandle,
+                OMX_CommandStateSet,
+                (OMX_U32) OMX_StateIdle,
+                NULL);
+
+        OMX_PARAM_PORTDEFINITIONTYPE portDef;
+
+        portDef.nPortIndex = 0;
+        result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
+        CHK(result);
+
+        D("allocating Input buffers");
+        num_in_buffers = portDef.nBufferCountActual;
+
+        for (i = 0; i < portDef.nBufferCountActual; i++) {
+            OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem = new OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO;
+            pvirt = (OMX_U8*)PmemMalloc(pMem, m_sProfile.nFrameBytes);
+
+            if (pvirt == NULL) {
+                CHK(1);
             }
-         }
 
-         // if we have a free buffer let's encode it
-         if (idx >= 0)
-         {
-            D("encode frame %d...m_pInBuffers[idx]->pBuffer=0x%x", i,m_pInBuffers[idx]->pBuffer);
-            m_bInFrameFree[idx] = OMX_FALSE;
-            VencTest_EncodeFrame(m_pInBuffers[idx]->pBuffer,
-                                 m_nTimeStamp);
-            D("display frame %d...", i);
-        //    FBTest_DisplayImage(((PmemBuffer*) m_pInBuffers[idx]->pAppPrivate)->fd,0);
-            m_nTimeStamp += 1000000 / m_sProfile.nFramerate;
-         }
-         else
-         {
-            E("wow, no buffers are free, performance "
-              "is not so good. lets just sleep some more");
-
-         }
-         D("sleep for %d microsec", 1000000/m_sProfile.nFramerate);
-         sleep (1000000 / m_sProfile.nFramerate);
-      }
-     // FBTest_Exit();
-   }
-
-   Msg msg;
-   bool bQuit = false;
-   while ((m_eMode == MODE_FILE_ENCODE || m_eMode == MODE_LIVE_ENCODE) &&
-          !bQuit)
-   {
-      PopMessage(&msg);
-      switch (msg.id)
-      {
-      //////////////////////////////////
-      // FRAME IS ENCODED
-      //////////////////////////////////
-      case MSG_ID_INPUT_FRAME_DONE:
-         /*pthread_mutex_lock(&m_mutex);
-         ++m_nFrameOut;
-         if (m_nFrameOut == m_nFramePlay && m_nFramePlay != 0)
-         {
-            bQuit = true;
-         }
-         pthread_mutex_unlock(&m_mutex);*/
-
-         if (!bQuit && m_eMode == MODE_FILE_ENCODE)
-         {
-            D("pushing another frame down to encoder");
-            if (VencTest_ReadAndEmpty(msg.data.sBitstreamData.pBuffer))
-            {
-               // we have read the last frame
-               D("main is exiting...");
-               bQuit = true;
-            }
-         }
-       break;
-      case MSG_ID_OUTPUT_FRAME_DONE:
-         D("================ writing frame %d = %d bytes to output file",
-           m_nFrameOut+1,
-           msg.data.sBitstreamData.pBuffer->nFilledLen);
-         D("StopEncodeTime=%lld", GetTimeStamp());
-
-
-		 write(m_nOutFd,
-               msg.data.sBitstreamData.pBuffer->pBuffer,
-               msg.data.sBitstreamData.pBuffer->nFilledLen);
-
-
-         result = OMX_FillThisBuffer(m_hHandle,
-                                     msg.data.sBitstreamData.pBuffer);
-
-         if (result != OMX_ErrorNone)
-         {
+            result = VencTest_RegisterYUVBuffer(&m_pInBuffers[i],
+                    (OMX_U8*) pvirt,
+                    (OMX_PTR) pMem);
             CHK(result);
-         }
+        }
+    } else if (m_eMode == MODE_LIVE_ENCODE) {
+        D("going to idle state");
+        //SetState(OMX_StateIdle);
+        OMX_SendCommand(m_hHandle,
+                OMX_CommandStateSet,
+                (OMX_U32) OMX_StateIdle,
+                NULL);
+    }
 
-         pthread_mutex_lock(&m_mutex);
-         ++m_nFrameOut;
-         if (m_nFrameOut == m_nFramePlay && m_nFramePlay != 0)
-         {
-            bQuit = true;
-         }
-         pthread_mutex_unlock(&m_mutex);
-         break;
+    int i;
+    OMX_PARAM_PORTDEFINITIONTYPE portDef;
 
-      default:
-         E("invalid msg id %d", (int) msg.id);
-      } // end switch (msg.id)
+    portDef.nPortIndex = 1;
+    result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
+    CHK(result);
 
-/*  // TO UNCOMMENT FOR PAUSE TESTINGS
-      if(m_nFrameOut == 10)
-      {
-         E("\nGoing to Pause state\n");
-         SetState(OMX_StatePause);
-         sleep(3);
-//REQUEST AN I FRAME AFTER PAUSE
-         OMX_CONFIG_INTRAREFRESHVOPTYPE voprefresh;
-         voprefresh.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
-         voprefresh.IntraRefreshVOP = OMX_TRUE;
-         result = OMX_SetConfig(m_hHandle,
-                                   OMX_IndexConfigVideoIntraVOPRefresh,
-                                   &voprefresh);
-         E("\n OMX_IndexConfigVideoIntraVOPRefresh Set Paramter port");
-         CHK(result);
-         E("\nGoing to executing state\n");
-         SetState(OMX_StateExecuting);
-      }
-*/
-   } // end while (!bQuit)
+    D("allocating & calling usebuffer for Output port");
+    num_out_buffers = portDef.nBufferCountActual;
+
+    for (i = 0; i < portDef.nBufferCountActual; i++) {
+        void* pBuff;
+
+        pBuff = malloc(portDef.nBufferSize);
+        D("portDef.nBufferSize = %d ",portDef.nBufferSize);
+        result = OMX_UseBuffer(m_hHandle,
+                &m_pOutBuffers[i],
+                (OMX_U32) PORT_INDEX_OUT,
+                NULL,
+                portDef.nBufferSize,
+                (OMX_U8*) pBuff);
+        CHK(result);
+    }
+
+    D("allocate done");
+
+    // D("Going to state " # eState"...");
+
+    while (m_eState != OMX_StateIdle) {
+        sleep(1);
+    }
+
+    //D("Now in state " # eState);
 
 
-   if (m_eMode == MODE_LIVE_ENCODE)
-   {
-      CameraTest_Exit();
-      close(m_nOutFd);
-   }
-   else if (m_eMode == MODE_FILE_ENCODE ||
-            m_eMode == MODE_PROFILE)
-   {
-      // deallocate pmem buffers
-      for (int i = 0; i < num_in_buffers; i++)
-      {
-         PmemFree((OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*)m_pInBuffers[i]->pAppPrivate,
-                  m_pInBuffers[i]->pBuffer,
-                  m_sProfile.nFrameBytes);
-         delete (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*) m_pInBuffers[i]->pAppPrivate;
-      }
-      close(m_nInFd);
+    D("going to executing state");
+    SetState(OMX_StateExecuting);
 
-      if (m_eMode == MODE_FILE_ENCODE)
-      {
-         close(m_nOutFd);
-      }
-      if (m_pDynConfFile)
-      {
-        fclose(m_pDynConfFile);
-        m_pDynConfFile = NULL;
-      }
-   }
+    for (i = 0; i < num_out_buffers; i++) {
+        D("filling buffer %d", i);
+        result = OMX_FillThisBuffer(m_hHandle, m_pOutBuffers[i]);
+        //sleep(1000);
+        CHK(result);
+    }
 
-   if (m_eMode != MODE_PREVIEW)
-   {
-      D("exit encoder test");
-      VencTest_Exit();
-   }
+    if (m_eMode == MODE_FILE_ENCODE) {
+        // encode the first frame to kick off the whole process
+        VencTest_ReadAndEmpty(m_pInBuffers[0]);
+        //  FBTest_DisplayImage(((PmemBuffer*) m_pInBuffers[0]->pAppPrivate)->fd,0);
+    }
 
-   pthread_mutex_destroy(&m_mutex);
-   pthread_cond_destroy(&m_signal);
+    if (m_eMode == MODE_PROFILE) {
+        int i;
 
-   /* Time Statistics Logging */
-   if(0 != m_sProfile.nFramerate)
-   {
-      enc_time_usec = m_nTimeStamp - (1000000 / m_sProfile.nFramerate);
-      enc_time_sec =enc_time_usec/1000000;
-      if(0 != enc_time_sec)
-      {
-         printf("Total Frame Rate: %f",ebd_cnt/enc_time_sec);
-         printf("\nEncoder Bitrate :%lf Kbps",(tot_bufsize*8)/(enc_time_sec*1000));
-      }
-   }
-   else
-   {
-      printf("\n\n Encode Time is zero");
-   }
-   printf("\nTotal Number of Frames :%d",ebd_cnt);
-   printf("\nNumber of dropped frames during encoding:%d\n",ebd_cnt-fbd_cnt);
-   /* End of Time Statistics Logging */
+        // read several frames into memory
+        D("reading frames into memory");
 
-   D("main has exited");
-   return 0;
+        for (i = 0; i < num_in_buffers; i++) {
+            D("[%d] address 0x%x",i, m_pInBuffers[i]->pBuffer);
+#ifdef MAX_RES_720P
+            read(m_nInFd,
+                    m_pInBuffers[i]->pBuffer,
+                    m_sProfile.nFrameBytes);
+#else
+            // read Y first
+            read(m_nInFd,
+                    m_pInBuffers[i]->pBuffer,
+                    m_sProfile.nFrameWidth*m_sProfile.nFrameHeight);
+
+            // check alignment for offset to C
+            OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
+
+            const OMX_U32 C_2K = (1024*2),
+                  MASK_2K = C_2K-1,
+                  IMASK_2K = ~MASK_2K;
+
+            if (offset_to_c & MASK_2K) {
+                // offset to C is not 2k aligned, adjustment is required
+                offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
+            }
+
+            // read C
+            read(m_nInFd,
+                    m_pInBuffers[i]->pBuffer + offset_to_c,
+                    m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2);
+#endif
+
+        }
+
+        // FBTest_Initialize(m_sProfile.nFrameWidth, m_sProfile.nFrameHeight);
+
+        // loop over the mem-resident frames and encode them
+        D("beging playing mem-resident frames...");
+
+        for (i = 0; m_nFramePlay == 0 || i < m_nFramePlay; i++) {
+            int idx = i % num_in_buffers;
+
+            if (m_bInFrameFree[idx] == OMX_FALSE) {
+                int j;
+                E("the expected buffer is not free, but lets find another");
+
+                idx = -1;
+
+                // lets see if we can find another free buffer
+                for (j = 0; j < num_in_buffers; j++) {
+                    if (m_bInFrameFree[j]) {
+                        idx = j;
+                        break;
+                    }
+                }
+            }
+
+            // if we have a free buffer let's encode it
+            if (idx >= 0) {
+                D("encode frame %d...m_pInBuffers[idx]->pBuffer=0x%x", i,m_pInBuffers[idx]->pBuffer);
+                m_bInFrameFree[idx] = OMX_FALSE;
+                VencTest_EncodeFrame(m_pInBuffers[idx]->pBuffer,
+                        m_nTimeStamp);
+                D("display frame %d...", i);
+                //    FBTest_DisplayImage(((PmemBuffer*) m_pInBuffers[idx]->pAppPrivate)->fd,0);
+                m_nTimeStamp += 1000000 / m_sProfile.nFramerate;
+            } else {
+                E("wow, no buffers are free, performance "
+                        "is not so good. lets just sleep some more");
+
+            }
+
+            D("sleep for %d microsec", 1000000/m_sProfile.nFramerate);
+            sleep (1000000 / m_sProfile.nFramerate);
+        }
+
+        // FBTest_Exit();
+    }
+
+    Msg msg;
+    bool bQuit = false;
+
+    while ((m_eMode == MODE_FILE_ENCODE || m_eMode == MODE_LIVE_ENCODE) &&
+            !bQuit) {
+        PopMessage(&msg);
+
+        switch (msg.id) {
+            //////////////////////////////////
+            // FRAME IS ENCODED
+            //////////////////////////////////
+            case MSG_ID_INPUT_FRAME_DONE:
+                /*pthread_mutex_lock(&m_mutex);
+                  ++m_nFrameOut;
+                  if (m_nFrameOut == m_nFramePlay && m_nFramePlay != 0)
+                  {
+                  bQuit = true;
+                  }
+                  pthread_mutex_unlock(&m_mutex);*/
+
+                if (!bQuit && m_eMode == MODE_FILE_ENCODE) {
+                    D("pushing another frame down to encoder");
+
+                    if (VencTest_ReadAndEmpty(msg.data.sBitstreamData.pBuffer)) {
+                        // we have read the last frame
+                        D("main is exiting...");
+                        bQuit = true;
+                    }
+                }
+
+                break;
+            case MSG_ID_OUTPUT_FRAME_DONE:
+                D("================ writing frame %d = %d bytes to output file",
+                        m_nFrameOut+1,
+                        msg.data.sBitstreamData.pBuffer->nFilledLen);
+                D("StopEncodeTime=%lld", GetTimeStamp());
+
+
+                write(m_nOutFd,
+                        msg.data.sBitstreamData.pBuffer->pBuffer,
+                        msg.data.sBitstreamData.pBuffer->nFilledLen);
+
+
+                result = OMX_FillThisBuffer(m_hHandle,
+                        msg.data.sBitstreamData.pBuffer);
+
+                if (result != OMX_ErrorNone) {
+                    CHK(result);
+                }
+
+                pthread_mutex_lock(&m_mutex);
+                ++m_nFrameOut;
+
+                if (m_nFrameOut == m_nFramePlay && m_nFramePlay != 0) {
+                    bQuit = true;
+                }
+
+                pthread_mutex_unlock(&m_mutex);
+                break;
+
+            default:
+                E("invalid msg id %d", (int) msg.id);
+        } // end switch (msg.id)
+
+        /*  // TO UNCOMMENT FOR PAUSE TESTINGS
+            if(m_nFrameOut == 10)
+            {
+            E("\nGoing to Pause state\n");
+            SetState(OMX_StatePause);
+            sleep(3);
+        //REQUEST AN I FRAME AFTER PAUSE
+        OMX_CONFIG_INTRAREFRESHVOPTYPE voprefresh;
+        voprefresh.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+        voprefresh.IntraRefreshVOP = OMX_TRUE;
+        result = OMX_SetConfig(m_hHandle,
+        OMX_IndexConfigVideoIntraVOPRefresh,
+        &voprefresh);
+        E("\n OMX_IndexConfigVideoIntraVOPRefresh Set Paramter port");
+        CHK(result);
+        E("\nGoing to executing state\n");
+        SetState(OMX_StateExecuting);
+        }
+         */
+    } // end while (!bQuit)
+
+
+    if (m_eMode == MODE_LIVE_ENCODE) {
+        CameraTest_Exit();
+        close(m_nOutFd);
+    } else if (m_eMode == MODE_FILE_ENCODE ||
+            m_eMode == MODE_PROFILE) {
+        // deallocate pmem buffers
+        for (int i = 0; i < num_in_buffers; i++) {
+            PmemFree((OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*)m_pInBuffers[i]->pAppPrivate,
+                    m_pInBuffers[i]->pBuffer,
+                    m_sProfile.nFrameBytes);
+            delete (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*) m_pInBuffers[i]->pAppPrivate;
+        }
+
+        close(m_nInFd);
+
+        if (m_eMode == MODE_FILE_ENCODE) {
+            close(m_nOutFd);
+        }
+
+        if (m_pDynConfFile) {
+            fclose(m_pDynConfFile);
+            m_pDynConfFile = NULL;
+        }
+    }
+
+    if (m_eMode != MODE_PREVIEW) {
+        D("exit encoder test");
+        VencTest_Exit();
+    }
+
+    pthread_mutex_destroy(&m_mutex);
+    pthread_cond_destroy(&m_signal);
+
+    /* Time Statistics Logging */
+    if (0 != m_sProfile.nFramerate) {
+        enc_time_usec = m_nTimeStamp - (1000000 / m_sProfile.nFramerate);
+        enc_time_sec =enc_time_usec/1000000;
+
+        if (0 != enc_time_sec) {
+            printf("Total Frame Rate: %f",ebd_cnt/enc_time_sec);
+            printf("\nEncoder Bitrate :%lf Kbps",(tot_bufsize*8)/(enc_time_sec*1000));
+        }
+    } else {
+        printf("\n\n Encode Time is zero");
+    }
+
+    printf("\nTotal Number of Frames :%d",ebd_cnt);
+    printf("\nNumber of dropped frames during encoding:%d\n",ebd_cnt-fbd_cnt);
+    /* End of Time Statistics Logging */
+
+    D("main has exited");
+    return 0;
 }
diff --git a/mm-video-v4l2/vidc/venc/test/venc_util.c b/mm-video-v4l2/vidc/venc/test/venc_util.c
old mode 100755
new mode 100644
index 4e4688e..ab91df8
--- a/mm-video-v4l2/vidc/venc/test/venc_util.c
+++ b/mm-video-v4l2/vidc/venc/test/venc_util.c
@@ -1,51 +1,51 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-/*============================================================================
-                    V E N C _ U T I L. C
-
-DESCRIPTION
-
-
-REFERENCES
-
-============================================================================*/
-
-#include "venc_util.h"
-#include <time.h>
-#include <sys/time.h>
-
-long long GetTimeStamp()
-{
-   struct timeval tv;
-   long long microsec;
-   gettimeofday(&tv, NULL);
-   microsec = (tv.tv_sec * 1000000) + (tv.tv_usec);
-   return microsec;
-
-}
-
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+                    V E N C _ U T I L. C
+
+DESCRIPTION
+
+
+REFERENCES
+
+============================================================================*/
+
+#include "venc_util.h"
+#include <time.h>
+#include <sys/time.h>
+
+long long GetTimeStamp()
+{
+    struct timeval tv;
+    long long microsec;
+    gettimeofday(&tv, NULL);
+    microsec = (tv.tv_sec * 1000000) + (tv.tv_usec);
+    return microsec;
+
+}
+
diff --git a/mm-video-v4l2/vidc/venc/test/video_encoder_test.c b/mm-video-v4l2/vidc/venc/test/video_encoder_test.c
old mode 100755
new mode 100644
index 567d081..e23f4e8
--- a/mm-video-v4l2/vidc/venc/test/video_encoder_test.c
+++ b/mm-video-v4l2/vidc/venc/test/video_encoder_test.c
@@ -1,1064 +1,1001 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of The Linux Foundation nor
-      the names of its contributors may be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-#include "video_encoder_test.h"
-
-#define DEBUG_PRINT printf
-/************************************************************************/
-/*        #DEFINES                          */
-/************************************************************************/
-
-#define VOP_START_CODE 0x000001B6
-#define SHORT_HEADER_START_CODE 0x00008000
-#define H264_START_CODE         0x00000001
-
-/************************************************************************/
-/*        STATIC VARIABLES                          */
-/************************************************************************/
-
-static int Code_type;
-static int total_frames = 0;
-static unsigned int header_code = 0;
-static pthread_mutex_t read_lock;
-
-static unsigned int read_frame ( unsigned char *dataptr,unsigned int length,
-                                 FILE * inputBufferFile
-                                );
-static unsigned clp2(unsigned x)
-{
-        x = x - 1;
-        x = x | (x >> 1);
-        x = x | (x >> 2);
-        x = x | (x >> 4);
-        x = x | (x >> 8);
-        x = x | (x >>16);
-        return x + 1;
-}
-
-
-static void* video_thread (void *);
-static void* async_thread (void *);
-
-
-
-int main (int argc, char **argv)
-{
-  struct video_encoder_context *encoder_context = NULL;
-  char *file_name = NULL;
-  FILE *file_ptr = NULL;
-  int temp1 =0,temp2 =0;
-  int error = 1;
-  unsigned int i = 0;
-
-  file_name = argv [1];
-  file_ptr = fopen (file_name,"rb");
-
-  if (file_ptr == NULL)
-  {
-    DEBUG_PRINT("\n File is not located ");
-    return -1;
-  }
-
-
-  encoder_context = (struct video_encoder_context *) \
-                   calloc (sizeof (struct video_encoder_context),1);
-  if (encoder_context == NULL)
-  {
-    return -1;
-  }
-  encoder_context->outputBufferFile = NULL;
-  encoder_context->inputBufferFile = NULL;
-  encoder_context->video_driver_fd = -1;
-  encoder_context->inputBufferFile = file_ptr;
-  encoder_context->input_width = 176;
-  encoder_context->input_height = 144;
-  encoder_context->codectype = VEN_CODEC_MPEG4;
-  encoder_context->fps_num = 60;
-  encoder_context->fps_den = 2;
-  encoder_context->inputformat = VEN_INPUTFMT_NV12;
-  encoder_context->targetbitrate = 128000;
-
-  file_ptr = fopen ("/data/output.m4v","wb");
-  if (file_ptr == NULL)
-  {
-    DEBUG_PRINT("\n File can't be created");
-    free (encoder_context);
-    return -1;
-  }
-  encoder_context->outputBufferFile = file_ptr;
-
-   switch (atoi(argv[2]))
-   {
-   case 0:
-     DEBUG_PRINT("\n MPEG4 codec selected");
-     encoder_context->codectype = VEN_CODEC_MPEG4;
-     Code_type = 0;
-     break;
-   case 1:
-     DEBUG_PRINT("\n H.263");
-     encoder_context->codectype = VEN_CODEC_H263;
-     Code_type = 0;
-     break;
-   case 2:
-     DEBUG_PRINT("\n H.264");
-     encoder_context->codectype = VEN_CODEC_H264;
-     Code_type = 1;
-     break;
-   default:
-     DEBUG_PRINT("\n Wrong codec type");
-     error = -1;
-     break;
-   }
-
-   if (error != -1)
-   {
-     temp1 = atoi(argv[3]);
-     temp2 = atoi(argv[4]);
-
-     if (((temp1%16) != 0) || ((temp2%16) != 0))
-     {
-       error = -1;
-     }
-     else
-     {
-      encoder_context->input_width = temp1;
-      encoder_context->input_height = temp2;
-     }
-   }
-
-   switch (atoi(argv[5]))
-   {
-   case 0:
-     DEBUG_PRINT("\n No Sink");
-     encoder_context->outputBufferFile = NULL;
-     break;
-   }
-
-   if (error != -1)
-   {
-     encoder_context->targetbitrate = atoi (argv[6]);
-   }
-
-   if ( error != -1 && (init_encoder (encoder_context) == -1 ))
-   {
-      DEBUG_PRINT("\n Init decoder fails ");
-      error = -1;
-   }
-   DEBUG_PRINT("\n Decoder open successfull");
-
-
-   /*Allocate input and output buffers*/
-   if (error != -1 && (allocate_buffer (0,encoder_context)== -1))
-   {
-     DEBUG_PRINT("\n Error in input Buffer allocation");
-     error = -1;
-   }
-
-   if (error != -1 && (allocate_buffer (1,encoder_context)== -1))
-   {
-     DEBUG_PRINT("\n Error in output Buffer allocation");
-     error = -1;
-   }
-
-
-   if (error != -1 && (start_encoding (encoder_context) == -1))
-   {
-     DEBUG_PRINT("\n Error in start decoding call");
-     error = -1;
-   }
-
-   if (error != -1 && (stop_encoding (encoder_context) == -1))
-   {
-     DEBUG_PRINT("\n Error in stop decoding call");
-     error = -1;
-   }
-
-   DEBUG_PRINT("\n De-init the decoder");
-   if ((deinit_encoder (encoder_context) == -1))
-   {
-      error = -1;
-   }
-
-
-  (void)free_buffer (INPUT_BUFFER,encoder_context);
-  (void)free_buffer (OUTPUT_BUFFER,encoder_context);
-
-  if (encoder_context->inputBufferFile != NULL)
-  {
-   fclose (encoder_context->inputBufferFile);
-  }
-  if (encoder_context->outputBufferFile != NULL)
-  {
-    fclose (encoder_context->outputBufferFile);
-  }
-  DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames);
-  DEBUG_PRINT("\n closing the driver");
-  free (encoder_context);
-
-  return error;
-}
-
-int init_encoder ( struct video_encoder_context *init_decode )
-{
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_basecfg basecfg;
-  struct video_queue_context *queue_ptr = NULL;
-  struct venc_ratectrlcfg ratecrl;
-  pthread_mutexattr_t init_values;
-  struct venc_profile profile;
-  struct ven_profilelevel profilelevel;
-
-  DEBUG_PRINT("\n Before calling the open");
-
-  init_decode->video_driver_fd = open ("/dev/msm_vidc_enc", \
-                     O_RDWR | O_NONBLOCK);
-
-
-
-  if (init_decode->video_driver_fd < 0)
-  {
-    DEBUG_PRINT("\n Open failed");
-    return -1;
-  }
-
-  basecfg.codectype = init_decode->codectype;
-  basecfg.dvs_height = 0;
-  basecfg.dvs_width = 0;
-  basecfg.fps_den = init_decode->fps_den;
-  basecfg.fps_num = init_decode->fps_num;
-  basecfg.input_height = init_decode->input_height;
-  basecfg.input_width = init_decode->input_width;
-  basecfg.inputformat = init_decode->inputformat;
-  basecfg.targetbitrate = init_decode->targetbitrate;
-
-  /*Initialize Decoder with codec type and resolution*/
-  ioctl_msg.in = &basecfg;
-  ioctl_msg.out = NULL;
-
-  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_BASE_CFG,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set base config type failed");
-    return -1;
-  }
-
-  /*Initialize Decoder with codec type and resolution*/
-  DEBUG_PRINT ("\n Switch off rate control");
-  ioctl_msg.in = &ratecrl;
-  ioctl_msg.out = NULL;
-  ratecrl.rcmode = VEN_RC_OFF;
-  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set rate control failed");
-    return -1;
-  }
-
-  if (basecfg.codectype == VEN_CODEC_H264)
-  {
-    DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
-    ioctl_msg.in = &profile;
-    ioctl_msg.out = NULL;
-    profile.profile = VEN_PROFILE_H264_BASELINE;
-    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
-           (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
-      return -1;
-    }
-
-    DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
-    ioctl_msg.in = &profilelevel;
-    ioctl_msg.out = NULL;
-    profilelevel.level = VEN_LEVEL_H264_1p1;
-    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
-           (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
-      return -1;
-    }
-
-    if (basecfg.input_width > 720)
-    {
-      DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
-      ioctl_msg.in = &profile;
-      ioctl_msg.out = NULL;
-      profile.profile = VEN_PROFILE_H264_HIGH;
-      if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
-             (void*)&ioctl_msg) < 0)
-      {
-        DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
-        return -1;
-      }
-
-      DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
-      ioctl_msg.in = &profilelevel;
-      ioctl_msg.out = NULL;
-      profilelevel.level = VEN_LEVEL_H264_3p1;
-      if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
-             (void*)&ioctl_msg) < 0)
-      {
-        DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
-        return -1;
-      }
-    }
-  }
-
-  DEBUG_PRINT("\n Query Input bufffer requirements");
-  /*Get the Buffer requirements for input and output ports*/
-
-
-
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = &init_decode->input_buffer;
-
-  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Requesting for input buffer requirements failed");
-    return -1;
-  }
-
-  DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \
-              (int)init_decode->input_buffer.datasize,\
-              (int)init_decode->input_buffer.mincount,\
-              (int)init_decode->input_buffer.actualcount);
-
-
-  ioctl_msg.in = &init_decode->input_buffer;
-  ioctl_msg.out = NULL;
-  init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
-
-  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Set Buffer Requirements Failed");
-    return -1;
-  }
-
-
-  DEBUG_PRINT("\n Query output bufffer requirements");
-  ioctl_msg.in = NULL;
-  ioctl_msg.out = &init_decode->output_buffer;
-
-  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,
-         (void*)&ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Requesting for output buffer requirements failed");
-    return -1;
-  }
-
-  DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \
-              (int)init_decode->output_buffer.datasize,\
-              (int)init_decode->output_buffer.mincount,\
-              (int)init_decode->output_buffer.actualcount);
-
-  /*Create Queue related data structures*/
-  queue_ptr = &init_decode->queue_context;
-  queue_ptr->commandq_size = 50;
-  queue_ptr->dataq_size = 50;
-
-  sem_init(&queue_ptr->sem_message,0, 0);
-  sem_init(&init_decode->sem_synchronize,0, 0);
-
-  pthread_mutexattr_init (&init_values);
-  pthread_mutex_init (&queue_ptr->mutex,&init_values);
-  pthread_mutex_init (&read_lock,&init_values);
-  DEBUG_PRINT("\n create Queues");
-  queue_ptr->ptr_cmdq = (struct video_msgq*) \
-                        calloc (sizeof (struct video_msgq),
-                  queue_ptr->commandq_size);
-  queue_ptr->ptr_dataq = (struct video_msgq*) \
-              calloc (sizeof (struct video_msgq),
-                  queue_ptr->dataq_size
-                  );
-
-  if ( queue_ptr->ptr_cmdq == NULL ||
-     queue_ptr->ptr_dataq == NULL
-    )
-  {
-    return -1;
-  }
-  DEBUG_PRINT("\n create Threads");
-  /*Create two threads*/
-    if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread,
-            init_decode) < 0) ||
-         (pthread_create (&init_decode->asyncthread_id,NULL,async_thread,
-            init_decode) < 0)
-    )
-  {
-    return -1;
-  }
-
-  return 1;
-}
-
-
-
-int free_buffer ( unsigned int  buffer_dir,
-                  struct video_encoder_context *encoder_context
-                 )
-{
-  unsigned int buffercount = 0,i=0;
-  struct venc_bufferpayload **ptemp = NULL;
-
-  if (encoder_context == NULL)
-  {
-    return -1;
-  }
-
-  if (buffer_dir == INPUT_BUFFER && encoder_context->ptr_inputbuffer)
-  {
-      buffercount = encoder_context->input_buffer.actualcount;
-      ptemp = encoder_context->ptr_inputbuffer;
-
-    for (i=0;i<buffercount;i++)
-    {
-      if (ptemp [i])
-      {
-        if (ptemp [i]->fd != -1)
-        {
-          munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size);
-          ptemp [i]->pbuffer = NULL;
-          close (ptemp [i]->fd);
-        }
-        free (ptemp [i]);
-        ptemp [i] = NULL;
-      }
-    }
-    free (encoder_context->ptr_inputbuffer);
-    encoder_context->ptr_inputbuffer = NULL;
-  }
-  else if ( buffer_dir == OUTPUT_BUFFER && encoder_context->ptr_outputbuffer )
-  {
-    buffercount = encoder_context->output_buffer.actualcount;
-    ptemp = encoder_context->ptr_outputbuffer;
-
-    if (ptemp)
-    {
-      for (i=0;i<buffercount;i++)
-      {
-        if (ptemp [i])
-        {
-          if (ptemp [i]->fd != -1)
-          {
-            munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size);
-            ptemp [i]->pbuffer = NULL;
-            close (ptemp [i]->fd);
-          }
-          free (ptemp [i]);
-          ptemp [i] = NULL;
-        }
-      }
-      free (ptemp);
-      encoder_context->ptr_outputbuffer = NULL;
-    }
-  }
-
-  return 1;
-}
-
-int allocate_buffer ( unsigned int buffer_dir,
-                      struct video_encoder_context *encoder_context
-                    )
-{
-  struct venc_bufferpayload **ptemp = NULL;
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  unsigned int buffercount = 0,i=0,alignedsize=0;
-  unsigned int buffersize = 0;
-
-  if ( encoder_context == NULL)
-  {
-    DEBUG_PRINT ("\nallocate_buffer: context is NULL");
-    return -1;
-  }
-
-  if ( buffer_dir == INPUT_BUFFER )
-  {
-        /*Check if buffers are allocated*/
-    if (encoder_context->ptr_inputbuffer != NULL)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: encoder_context->ptr_inputbuffer is set");
-      return -1;
-    }
-
-    buffercount = encoder_context->input_buffer.actualcount;
-    alignedsize = encoder_context->input_buffer.alignment;
-    buffersize = encoder_context->input_buffer.datasize;
-    buffersize = (buffersize + alignedsize) & (~alignedsize);
-  }
-  else if (buffer_dir == OUTPUT_BUFFER)
-  {
-    /*Check if buffers are allocated*/
-    if (encoder_context->ptr_outputbuffer != NULL)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: Double allcoate output");
-      return -1;
-    }
-
-    buffercount = encoder_context->output_buffer.actualcount;
-    alignedsize = encoder_context->output_buffer.alignment;
-    buffersize = encoder_context->output_buffer.datasize;
-    buffersize = (buffersize + alignedsize) & (~alignedsize);
-
-  }
-  else
-  {
-    DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions");
-    return -1;
-  }
-
-  ptemp = (struct venc_bufferpayload **)\
-  calloc (sizeof (struct venc_bufferpayload *),buffercount);
-
-  if (ptemp == NULL)
-  {
-    DEBUG_PRINT ("\nallocate_buffer: venc_bufferpayload failure");
-    return -1;
-  }
-
-
-  if (buffer_dir == OUTPUT_BUFFER)
-  {
-    DEBUG_PRINT ("\nallocate_buffer: OUT");
-    encoder_context->ptr_outputbuffer = ptemp;
-  }
-  else
-  {
-    DEBUG_PRINT ("\nallocate_buffer: IN");
-    encoder_context->ptr_inputbuffer = ptemp;
-  }
-
-  /*Allocate buffer headers*/
-  for (i=0; i< buffercount; i++)
-  {
-    ptemp [i] = (struct venc_bufferpayload*)\
-    calloc (sizeof (struct venc_bufferpayload),1);
-
-    if (ptemp [i] == NULL)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure");
-      return -1;
-    }
-    ptemp [i]->fd = -1;
-  }
-
-  for (i=0; i< buffercount; i++)
-  {
-    ptemp [i]->fd = open ("/dev/pmem_adsp",O_RDWR);
-
-    if (ptemp [i]->fd < 0)
-    {
-      DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
-      return -1;
-    }
-
-    ptemp [i]->pbuffer = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE,
-                                 MAP_SHARED,ptemp [i]->fd,0);
-    DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->fd,\
-                  ptemp [i]->pbuffer);
-    if (ptemp [i]->pbuffer == MAP_FAILED)
-    {
-      ptemp [i]->pbuffer = NULL;
-      DEBUG_PRINT ("\nallocate_buffer: MMAP failed");
-      return -1;
-    }
-    ptemp [i]->sz = buffersize;
-    ptemp [i]->maped_size = clp2 (buffersize);
-
-    ioctl_msg.in  = ptemp [i];
-    ioctl_msg.out = NULL;
-
-    if (buffer_dir == OUTPUT_BUFFER)
-    {
-      if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,
-           &ioctl_msg) < 0)
-      {
-        DEBUG_PRINT ("\nallocate_buffer: Set Output Buffer IOCTL failed");
-        return -1;
-      }
-    }
-    else
-    {
-      if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER,
-           &ioctl_msg) < 0)
-      {
-        DEBUG_PRINT ("\nallocate_buffer: Set input Buffer IOCTL failed");
-        return -1;
-      }
-    }
-
-  }
-  DEBUG_PRINT ("\nallocate_buffer: Success");
-  return 1;
-}
-
-
-
-int start_encoding (struct video_encoder_context *encoder_context)
-{
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_buffer enc_buffer;
-  unsigned int i = 0;
-  unsigned int data_len =0;
-
-
-  if (encoder_context == NULL)
-  {
-    return -1;
-  }
-
-  if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_START,
-         NULL) < 0)
-  {
-    DEBUG_PRINT("\n Start failed");
-    return -1;
-  }
-
-  DEBUG_PRINT("\n Start Issued successfully waiting for Start Done");
-  /*Wait for Start command response*/
-  sem_wait (&encoder_context->sem_synchronize);
-
-  /*Push output Buffers*/
-  i = 0;
-  while (i < encoder_context->output_buffer.actualcount)
-  {
-    enc_buffer.clientdata = (void *)encoder_context->ptr_outputbuffer [i];
-    enc_buffer.flags = 0;
-    enc_buffer.sz = encoder_context->ptr_outputbuffer [i]->sz;
-    enc_buffer.len = 0;
-    enc_buffer.ptrbuffer = encoder_context->ptr_outputbuffer [i]->pbuffer;
-    enc_buffer.offset = 0;
-    enc_buffer.timestamp = 0;
-
-    DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
-    ioctl_msg.in = &enc_buffer;
-    ioctl_msg.out = NULL;
-
-    if (ioctl (encoder_context->video_driver_fd,
-           VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n fill output frame failed");
-      return -1;
-    }
-    i++;
-  }
-
-
-  /*push input buffers*/
-  i = 0;
-  while (i < encoder_context->input_buffer.actualcount)
-  {
-    DEBUG_PRINT("\n Read  Frame from File");
-
-    enc_buffer.clientdata = (void *)encoder_context->ptr_inputbuffer [i];
-    enc_buffer.flags = 0;
-    enc_buffer.sz = encoder_context->ptr_inputbuffer [i]->sz;
-    enc_buffer.len = 0;
-    enc_buffer.ptrbuffer = encoder_context->ptr_inputbuffer [i]->pbuffer;
-    enc_buffer.offset = 0;
-    enc_buffer.timestamp = total_frames *
-                ((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
-    enc_buffer.len = (encoder_context->input_height *
-                     encoder_context->input_width *3)/2;
-    data_len = read_frame ( enc_buffer.ptrbuffer,
-                            enc_buffer.len,
-                            encoder_context->inputBufferFile);
-    if (data_len == 0)
-    {
-      DEBUG_PRINT("\n Length is zero error");
-      return -1;
-    }
-    enc_buffer.len = data_len;
-    DEBUG_PRINT("\n Read  Frame from File szie = %d",(int)data_len);
-
-    DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
-    ioctl_msg.in = &enc_buffer;
-    ioctl_msg.out = NULL;
-
-    if (ioctl (encoder_context->video_driver_fd,
-           VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Encode input frame failed");
-      return -1;
-    }
-    total_frames++;
-    i++;
-  }
-  DEBUG_PRINT ("\n Wait for EOS");
-  /*Wait for EOS or Error condition*/
-  sem_wait (&encoder_context->sem_synchronize);
-  DEBUG_PRINT ("\n Reached EOS");
-
-  return 1;
-}
-
-int stop_encoding  (struct video_encoder_context *encoder_context)
-{
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  struct venc_bufferflush buffer_flush;
-
-  if (encoder_context == NULL)
-  {
-    return -1;
-  }
-  buffer_flush.flush_mode = VEN_FLUSH_INPUT;
-  ioctl_msg.in = &buffer_flush;
-  ioctl_msg.out = NULL;
-
-  if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
-         &ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Flush input failed");
-  }
-  else
-  {
-       sem_wait (&encoder_context->sem_synchronize);
-  }
-
-  buffer_flush.flush_mode = VEN_FLUSH_OUTPUT;
-  ioctl_msg.in = &buffer_flush;
-  ioctl_msg.out = NULL;
-
-  if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
-            &ioctl_msg) < 0)
-  {
-    DEBUG_PRINT("\n Flush output failed");
-  }
-  else
-  {
-     sem_wait (&encoder_context->sem_synchronize);
-  }
-
-  DEBUG_PRINT("\n Stop VEN_IOCTL_CMD_STOP");
-  if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_STOP,NULL) < 0)
-  {
-    DEBUG_PRINT("\n Stop failed");
-  }
-  else
-  {
-     sem_wait (&encoder_context->sem_synchronize);
-  }
-  return 1;
-}
-
-int deinit_encoder (struct video_encoder_context *init_decode)
-{
-  if (init_decode == NULL)
-  {
-    return -1;
-  }
-
-  /*Close the driver*/
-  if (init_decode->video_driver_fd != -1)
-  {
-    close (init_decode->video_driver_fd);
-  }
-
-  if (init_decode->queue_context.ptr_cmdq)
-  {
-    free (init_decode->queue_context.ptr_cmdq);
-    init_decode->queue_context.ptr_cmdq = NULL;
-  }
-
-  if (init_decode->queue_context.ptr_dataq)
-  {
-    free (init_decode->queue_context.ptr_dataq);
-    init_decode->queue_context.ptr_dataq = NULL;
-  }
-
-  sem_destroy (&init_decode->queue_context.sem_message);
-  sem_destroy (&init_decode->sem_synchronize);
-
-  pthread_mutex_destroy(&init_decode->queue_context.mutex);
-  pthread_mutex_destroy (&read_lock);
-
-  return 1;
-}
-
-static void* video_thread (void *context)
-{
-   struct video_encoder_context *encoder_context = NULL;
-   struct video_msgq *queueitem = NULL;
-   struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-   struct venc_bufferpayload *tempbuffer = NULL;
-   struct venc_buffer enc_buffer;
-   unsigned int data_len =0;
-
-
-   if (context == NULL)
-   {
-     DEBUG_PRINT("\n video thread recieved NULL context");
-     return NULL;
-   }
-   encoder_context = (struct video_encoder_context *) context;
-
-   /* Thread function which will accept commands from async thread
-    * or main thread
-   */
-   while (1)
-   {
-      queueitem = queue_get_cmd (&encoder_context ->queue_context);
-      if (queueitem != NULL)
-      {
-        switch (queueitem->cmd)
-        {
-        case VEN_MSG_START:
-          DEBUG_PRINT("\n recived start done command");
-            sem_post (&encoder_context->sem_synchronize);
-          break;
-
-        case VEN_MSG_STOP:
-          DEBUG_PRINT("\n recieved stop done");
-          sem_post (&encoder_context->sem_synchronize);
-          break;
-
-        case VEN_MSG_INPUT_BUFFER_DONE:
-
-          tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata;
-          if (tempbuffer == NULL)
-          {
-            DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
-            sem_post (&encoder_context->sem_synchronize);
-            break;
-          }
-          tempbuffer->filled_len = (encoder_context->input_height *
-                             encoder_context->input_width *3)/2;
-
-          data_len = read_frame ( tempbuffer->pbuffer,
-                                  tempbuffer->filled_len,
-                                  encoder_context->inputBufferFile);
-
-          if (data_len == 0)
-          {
-            DEBUG_PRINT ("\n End of stream reached");
-            sem_post (&encoder_context->sem_synchronize);
-            break;
-          }
-          enc_buffer.clientdata = (void *)tempbuffer;
-          enc_buffer.flags = 0;
-          enc_buffer.ptrbuffer = tempbuffer->pbuffer;
-          enc_buffer.sz = tempbuffer->sz;
-          enc_buffer.len = tempbuffer->filled_len;
-          enc_buffer.offset = 0;
-          enc_buffer.timestamp = total_frames *
-                ((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
-
-          /*TODO: Time stamp needs to be updated*/
-          ioctl_msg.in = &enc_buffer;
-          ioctl_msg.out = NULL;
-          total_frames++;
-          if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,
-               &ioctl_msg) < 0)
-          {
-            DEBUG_PRINT("\n Decoder frame failed");
-            sem_post (&encoder_context->sem_synchronize);
-          }
-          DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\
-                      total_frames);
-          break;
-
-        case VEN_MSG_OUTPUT_BUFFER_DONE:
-
-          tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata;
-          if (tempbuffer == NULL)
-          {
-            DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
-            sem_post (&encoder_context->sem_synchronize);
-            break;
-          }
-
-         if (encoder_context->outputBufferFile != NULL)
-         {
-           fwrite (tempbuffer->pbuffer,1,tempbuffer->filled_len,
-                encoder_context->outputBufferFile);
-         }
-
-
-         DEBUG_PRINT("\n recieved output buffer consume outbuffer");
-         DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
-                     tempbuffer->pbuffer);
-         enc_buffer.clientdata = (void *)tempbuffer;
-         enc_buffer.flags = 0;
-         enc_buffer.sz = tempbuffer->sz;
-         enc_buffer.len = 0;
-         enc_buffer.ptrbuffer = tempbuffer->pbuffer;
-         enc_buffer.offset = 0;
-         enc_buffer.timestamp = 0;
-
-         ioctl_msg.in = &enc_buffer;
-         ioctl_msg.out = NULL;
-
-         if (ioctl (encoder_context->video_driver_fd,
-              VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
-         {
-           DEBUG_PRINT("\n Decoder frame failed");
-           return NULL;
-         }
-
-         break;
-
-        case VEN_MSG_FLUSH_INPUT_DONE:
-          DEBUG_PRINT("\n Flush input complete");
-          sem_post (&encoder_context->sem_synchronize);
-          break;
-
-        case VEN_MSG_FLUSH_OUPUT_DONE:
-          DEBUG_PRINT("\n Flush output complete");
-          sem_post (&encoder_context->sem_synchronize);
-          break;
-        }
-
-        if (queueitem->cmd == VEN_MSG_STOP)
-        {
-          DEBUG_PRINT("\n Playback has ended thread will exit");
-          return NULL;
-        }
-      }
-      else
-      {
-        DEBUG_PRINT("\n Error condition recieved NULL from Queue");
-      }
-
-   }
-}
-
-static void* async_thread (void *context)
-{
-  struct video_encoder_context *encoder_context = NULL;
-  struct video_msgq queueitem ;
-  struct venc_msg venc_msg;
-  struct venc_bufferpayload *tempbuffer = NULL;
-  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
-  int result = -1;
-
-  if (context == NULL)
-  {
-    DEBUG_PRINT("\n aynsc thread recieved NULL context");
-    return NULL;
-  }
-  encoder_context = (struct video_encoder_context *) context;
-  DEBUG_PRINT("\n Entering the async thread");
-
-  while (1)
-  {
-    ioctl_msg.in = NULL;
-    ioctl_msg.out = (void*)&venc_msg;
-    DEBUG_PRINT ("\n Sizeof venc_msginfo = %d ",sizeof (venc_msg));
-    DEBUG_PRINT("\n Address of Venc msg in async thread %p",\
-                ioctl_msg.out);
-    if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,\
-         (void*)&ioctl_msg) < 0)
-    {
-      DEBUG_PRINT("\n Error in ioctl read next msg");
-    }
-    else
-    {
-      switch (venc_msg.msgcode)
-      {
-      case VEN_MSG_START:
-      case VEN_MSG_STOP:
-      case VEN_MSG_INDICATION:
-        DEBUG_PRINT("\nSTOP/START Indiacation");
-        queueitem.cmd = venc_msg.msgcode;
-        queueitem.status = venc_msg.statuscode;
-        queueitem.clientdata = NULL;
-        break;
-
-      case VEN_MSG_INPUT_BUFFER_DONE:
-        DEBUG_PRINT("\nINPUT buffer done Indiacation");
-        queueitem.cmd = venc_msg.msgcode;
-        queueitem.status = venc_msg.statuscode;
-        queueitem.clientdata = (void *)venc_msg.buf.clientdata;
-        DEBUG_PRINT("\nInput Client data pointer is %p",queueitem.clientdata);
-        tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata;
-        DEBUG_PRINT ("\n Input Address of tempbuffer %p",tempbuffer);
-        tempbuffer->filled_len = venc_msg.buf.len;
-        DEBUG_PRINT ("\n Input value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len);
-        break;
-      case VEN_MSG_OUTPUT_BUFFER_DONE:
-        DEBUG_PRINT("\nOUPUT buffer done Indiacation");
-        queueitem.cmd = venc_msg.msgcode;
-        queueitem.status = venc_msg.statuscode;
-        queueitem.clientdata = (void *)venc_msg.buf.clientdata;
-        DEBUG_PRINT("\nOutput Client data pointer is %p",queueitem.clientdata);
-        tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata;
-        DEBUG_PRINT ("\n Output Address of tempbuffer %p",tempbuffer);
-        tempbuffer->filled_len = venc_msg.buf.len;
-        DEBUG_PRINT ("\n Output value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len);
-        break;
-
-      default:
-        DEBUG_PRINT("\nIn Default of get next message %d",(int)venc_msg.msgcode);
-        queueitem.cmd = venc_msg.msgcode;
-        queueitem.status = venc_msg.statuscode;
-        queueitem.clientdata = NULL;
-        break;
-      }
-      result = queue_post_cmdq (&encoder_context->queue_context,&queueitem);
-      while (result == 0)
-      {
-         result = queue_post_cmdq (&encoder_context->queue_context,&queueitem);
-      }
-
-      if (result == -1)
-      {
-        DEBUG_PRINT("\n FATAL ERROR WITH Queue");
-      }
-    }
-    if (venc_msg.msgcode == VEN_MSG_STOP)
-    {
-      /*Thread can exit at this point*/
-      return NULL;
-    }
-  }
-}
-
-
-static unsigned int read_frame (unsigned char *dataptr, unsigned int length,
-                                FILE * inputBufferFile)
-{
-
-  unsigned int readOffset = 0;
-  int bytes_read = 0;
-  unsigned int code = 0;
-  int found = 0;
-
-  DEBUG_PRINT ("\n Inside the readframe");
-
-  if (dataptr == NULL && length == 0)
-  {
-    DEBUG_PRINT ("\n dataptr = %p length = %d",dataptr,(int)length);
-    return 0;
-  }
-
-  pthread_mutex_lock(&read_lock);
-  bytes_read = fread(&dataptr[readOffset],1,length,inputBufferFile);
-  pthread_mutex_unlock(&read_lock);
-
-  return bytes_read;
-}
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of The Linux Foundation nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "video_encoder_test.h"
+
+#define DEBUG_PRINT printf
+/************************************************************************/
+/*        #DEFINES                          */
+/************************************************************************/
+
+#define VOP_START_CODE 0x000001B6
+#define SHORT_HEADER_START_CODE 0x00008000
+#define H264_START_CODE         0x00000001
+
+/************************************************************************/
+/*        STATIC VARIABLES                          */
+/************************************************************************/
+
+static int Code_type;
+static int total_frames = 0;
+static unsigned int header_code = 0;
+static pthread_mutex_t read_lock;
+
+static unsigned int read_frame ( unsigned char *dataptr,unsigned int length,
+        FILE * inputBufferFile
+        );
+static unsigned clp2(unsigned x)
+{
+    x = x - 1;
+    x = x | (x >> 1);
+    x = x | (x >> 2);
+    x = x | (x >> 4);
+    x = x | (x >> 8);
+    x = x | (x >>16);
+    return x + 1;
+}
+
+
+static void* video_thread (void *);
+static void* async_thread (void *);
+
+
+
+int main (int argc, char **argv)
+{
+    struct video_encoder_context *encoder_context = NULL;
+    char *file_name = NULL;
+    FILE *file_ptr = NULL;
+    int temp1 =0,temp2 =0;
+    int error = 1;
+    unsigned int i = 0;
+
+    file_name = argv [1];
+    file_ptr = fopen (file_name,"rb");
+
+    if (file_ptr == NULL) {
+        DEBUG_PRINT("\n File is not located ");
+        return -1;
+    }
+
+
+    encoder_context = (struct video_encoder_context *) \
+              calloc (sizeof (struct video_encoder_context),1);
+
+    if (encoder_context == NULL) {
+        return -1;
+    }
+
+    encoder_context->outputBufferFile = NULL;
+    encoder_context->inputBufferFile = NULL;
+    encoder_context->video_driver_fd = -1;
+    encoder_context->inputBufferFile = file_ptr;
+    encoder_context->input_width = 176;
+    encoder_context->input_height = 144;
+    encoder_context->codectype = VEN_CODEC_MPEG4;
+    encoder_context->fps_num = 60;
+    encoder_context->fps_den = 2;
+    encoder_context->inputformat = VEN_INPUTFMT_NV12;
+    encoder_context->targetbitrate = 128000;
+
+    file_ptr = fopen ("/data/output.m4v","wb");
+
+    if (file_ptr == NULL) {
+        DEBUG_PRINT("\n File can't be created");
+        free (encoder_context);
+        return -1;
+    }
+
+    encoder_context->outputBufferFile = file_ptr;
+
+    switch (atoi(argv[2])) {
+        case 0:
+            DEBUG_PRINT("\n MPEG4 codec selected");
+            encoder_context->codectype = VEN_CODEC_MPEG4;
+            Code_type = 0;
+            break;
+        case 1:
+            DEBUG_PRINT("\n H.263");
+            encoder_context->codectype = VEN_CODEC_H263;
+            Code_type = 0;
+            break;
+        case 2:
+            DEBUG_PRINT("\n H.264");
+            encoder_context->codectype = VEN_CODEC_H264;
+            Code_type = 1;
+            break;
+        default:
+            DEBUG_PRINT("\n Wrong codec type");
+            error = -1;
+            break;
+    }
+
+    if (error != -1) {
+        temp1 = atoi(argv[3]);
+        temp2 = atoi(argv[4]);
+
+        if (((temp1%16) != 0) || ((temp2%16) != 0)) {
+            error = -1;
+        } else {
+            encoder_context->input_width = temp1;
+            encoder_context->input_height = temp2;
+        }
+    }
+
+    switch (atoi(argv[5])) {
+        case 0:
+            DEBUG_PRINT("\n No Sink");
+            encoder_context->outputBufferFile = NULL;
+            break;
+    }
+
+    if (error != -1) {
+        encoder_context->targetbitrate = atoi (argv[6]);
+    }
+
+    if ( error != -1 && (init_encoder (encoder_context) == -1 )) {
+        DEBUG_PRINT("\n Init decoder fails ");
+        error = -1;
+    }
+
+    DEBUG_PRINT("\n Decoder open successfull");
+
+
+    /*Allocate input and output buffers*/
+    if (error != -1 && (allocate_buffer (0,encoder_context)== -1)) {
+        DEBUG_PRINT("\n Error in input Buffer allocation");
+        error = -1;
+    }
+
+    if (error != -1 && (allocate_buffer (1,encoder_context)== -1)) {
+        DEBUG_PRINT("\n Error in output Buffer allocation");
+        error = -1;
+    }
+
+
+    if (error != -1 && (start_encoding (encoder_context) == -1)) {
+        DEBUG_PRINT("\n Error in start decoding call");
+        error = -1;
+    }
+
+    if (error != -1 && (stop_encoding (encoder_context) == -1)) {
+        DEBUG_PRINT("\n Error in stop decoding call");
+        error = -1;
+    }
+
+    DEBUG_PRINT("\n De-init the decoder");
+
+    if ((deinit_encoder (encoder_context) == -1)) {
+        error = -1;
+    }
+
+
+    (void)free_buffer (INPUT_BUFFER,encoder_context);
+    (void)free_buffer (OUTPUT_BUFFER,encoder_context);
+
+    if (encoder_context->inputBufferFile != NULL) {
+        fclose (encoder_context->inputBufferFile);
+    }
+
+    if (encoder_context->outputBufferFile != NULL) {
+        fclose (encoder_context->outputBufferFile);
+    }
+
+    DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames);
+    DEBUG_PRINT("\n closing the driver");
+    free (encoder_context);
+
+    return error;
+}
+
+int init_encoder ( struct video_encoder_context *init_decode )
+{
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_basecfg basecfg;
+    struct video_queue_context *queue_ptr = NULL;
+    struct venc_ratectrlcfg ratecrl;
+    pthread_mutexattr_t init_values;
+    struct venc_profile profile;
+    struct ven_profilelevel profilelevel;
+
+    DEBUG_PRINT("\n Before calling the open");
+
+    init_decode->video_driver_fd = open ("/dev/msm_vidc_enc", \
+            O_RDWR | O_NONBLOCK);
+
+
+
+    if (init_decode->video_driver_fd < 0) {
+        DEBUG_PRINT("\n Open failed");
+        return -1;
+    }
+
+    basecfg.codectype = init_decode->codectype;
+    basecfg.dvs_height = 0;
+    basecfg.dvs_width = 0;
+    basecfg.fps_den = init_decode->fps_den;
+    basecfg.fps_num = init_decode->fps_num;
+    basecfg.input_height = init_decode->input_height;
+    basecfg.input_width = init_decode->input_width;
+    basecfg.inputformat = init_decode->inputformat;
+    basecfg.targetbitrate = init_decode->targetbitrate;
+
+    /*Initialize Decoder with codec type and resolution*/
+    ioctl_msg.in = &basecfg;
+    ioctl_msg.out = NULL;
+
+    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_BASE_CFG,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set base config type failed");
+        return -1;
+    }
+
+    /*Initialize Decoder with codec type and resolution*/
+    DEBUG_PRINT ("\n Switch off rate control");
+    ioctl_msg.in = &ratecrl;
+    ioctl_msg.out = NULL;
+    ratecrl.rcmode = VEN_RC_OFF;
+
+    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set rate control failed");
+        return -1;
+    }
+
+    if (basecfg.codectype == VEN_CODEC_H264) {
+        DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
+        ioctl_msg.in = &profile;
+        ioctl_msg.out = NULL;
+        profile.profile = VEN_PROFILE_H264_BASELINE;
+
+        if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
+            return -1;
+        }
+
+        DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
+        ioctl_msg.in = &profilelevel;
+        ioctl_msg.out = NULL;
+        profilelevel.level = VEN_LEVEL_H264_1p1;
+
+        if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
+            return -1;
+        }
+
+        if (basecfg.input_width > 720) {
+            DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
+            ioctl_msg.in = &profile;
+            ioctl_msg.out = NULL;
+            profile.profile = VEN_PROFILE_H264_HIGH;
+
+            if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
+                        (void*)&ioctl_msg) < 0) {
+                DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
+                return -1;
+            }
+
+            DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
+            ioctl_msg.in = &profilelevel;
+            ioctl_msg.out = NULL;
+            profilelevel.level = VEN_LEVEL_H264_3p1;
+
+            if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
+                        (void*)&ioctl_msg) < 0) {
+                DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
+                return -1;
+            }
+        }
+    }
+
+    DEBUG_PRINT("\n Query Input bufffer requirements");
+    /*Get the Buffer requirements for input and output ports*/
+
+
+
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = &init_decode->input_buffer;
+
+    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Requesting for input buffer requirements failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \
+            (int)init_decode->input_buffer.datasize,\
+            (int)init_decode->input_buffer.mincount,\
+            (int)init_decode->input_buffer.actualcount);
+
+
+    ioctl_msg.in = &init_decode->input_buffer;
+    ioctl_msg.out = NULL;
+    init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
+
+    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Set Buffer Requirements Failed");
+        return -1;
+    }
+
+
+    DEBUG_PRINT("\n Query output bufffer requirements");
+    ioctl_msg.in = NULL;
+    ioctl_msg.out = &init_decode->output_buffer;
+
+    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,
+                (void*)&ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Requesting for output buffer requirements failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \
+            (int)init_decode->output_buffer.datasize,\
+            (int)init_decode->output_buffer.mincount,\
+            (int)init_decode->output_buffer.actualcount);
+
+    /*Create Queue related data structures*/
+    queue_ptr = &init_decode->queue_context;
+    queue_ptr->commandq_size = 50;
+    queue_ptr->dataq_size = 50;
+
+    sem_init(&queue_ptr->sem_message,0, 0);
+    sem_init(&init_decode->sem_synchronize,0, 0);
+
+    pthread_mutexattr_init (&init_values);
+    pthread_mutex_init (&queue_ptr->mutex,&init_values);
+    pthread_mutex_init (&read_lock,&init_values);
+    DEBUG_PRINT("\n create Queues");
+    queue_ptr->ptr_cmdq = (struct video_msgq*) \
+                  calloc (sizeof (struct video_msgq),
+                          queue_ptr->commandq_size);
+    queue_ptr->ptr_dataq = (struct video_msgq*) \
+                   calloc (sizeof (struct video_msgq),
+                           queue_ptr->dataq_size
+                      );
+
+    if ( queue_ptr->ptr_cmdq == NULL ||
+            queue_ptr->ptr_dataq == NULL
+       ) {
+        return -1;
+    }
+
+    DEBUG_PRINT("\n create Threads");
+
+    /*Create two threads*/
+    if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread,
+                    init_decode) < 0) ||
+            (pthread_create (&init_decode->asyncthread_id,NULL,async_thread,
+                     init_decode) < 0)
+       ) {
+        return -1;
+    }
+
+    return 1;
+}
+
+
+
+int free_buffer ( unsigned int  buffer_dir,
+        struct video_encoder_context *encoder_context
+        )
+{
+    unsigned int buffercount = 0,i=0;
+    struct venc_bufferpayload **ptemp = NULL;
+
+    if (encoder_context == NULL) {
+        return -1;
+    }
+
+    if (buffer_dir == INPUT_BUFFER && encoder_context->ptr_inputbuffer) {
+        buffercount = encoder_context->input_buffer.actualcount;
+        ptemp = encoder_context->ptr_inputbuffer;
+
+        for (i=0; i<buffercount; i++) {
+            if (ptemp [i]) {
+                if (ptemp [i]->fd != -1) {
+                    munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size);
+                    ptemp [i]->pbuffer = NULL;
+                    close (ptemp [i]->fd);
+                }
+
+                free (ptemp [i]);
+                ptemp [i] = NULL;
+            }
+        }
+
+        free (encoder_context->ptr_inputbuffer);
+        encoder_context->ptr_inputbuffer = NULL;
+    } else if ( buffer_dir == OUTPUT_BUFFER && encoder_context->ptr_outputbuffer ) {
+        buffercount = encoder_context->output_buffer.actualcount;
+        ptemp = encoder_context->ptr_outputbuffer;
+
+        if (ptemp) {
+            for (i=0; i<buffercount; i++) {
+                if (ptemp [i]) {
+                    if (ptemp [i]->fd != -1) {
+                        munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size);
+                        ptemp [i]->pbuffer = NULL;
+                        close (ptemp [i]->fd);
+                    }
+
+                    free (ptemp [i]);
+                    ptemp [i] = NULL;
+                }
+            }
+
+            free (ptemp);
+            encoder_context->ptr_outputbuffer = NULL;
+        }
+    }
+
+    return 1;
+}
+
+int allocate_buffer ( unsigned int buffer_dir,
+        struct video_encoder_context *encoder_context
+        )
+{
+    struct venc_bufferpayload **ptemp = NULL;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    unsigned int buffercount = 0,i=0,alignedsize=0;
+    unsigned int buffersize = 0;
+
+    if ( encoder_context == NULL) {
+        DEBUG_PRINT ("\nallocate_buffer: context is NULL");
+        return -1;
+    }
+
+    if ( buffer_dir == INPUT_BUFFER ) {
+        /*Check if buffers are allocated*/
+        if (encoder_context->ptr_inputbuffer != NULL) {
+            DEBUG_PRINT ("\nallocate_buffer: encoder_context->ptr_inputbuffer is set");
+            return -1;
+        }
+
+        buffercount = encoder_context->input_buffer.actualcount;
+        alignedsize = encoder_context->input_buffer.alignment;
+        buffersize = encoder_context->input_buffer.datasize;
+        buffersize = (buffersize + alignedsize) & (~alignedsize);
+    } else if (buffer_dir == OUTPUT_BUFFER) {
+        /*Check if buffers are allocated*/
+        if (encoder_context->ptr_outputbuffer != NULL) {
+            DEBUG_PRINT ("\nallocate_buffer: Double allcoate output");
+            return -1;
+        }
+
+        buffercount = encoder_context->output_buffer.actualcount;
+        alignedsize = encoder_context->output_buffer.alignment;
+        buffersize = encoder_context->output_buffer.datasize;
+        buffersize = (buffersize + alignedsize) & (~alignedsize);
+
+    } else {
+        DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions");
+        return -1;
+    }
+
+    ptemp = (struct venc_bufferpayload **)\
+        calloc (sizeof (struct venc_bufferpayload *),buffercount);
+
+    if (ptemp == NULL) {
+        DEBUG_PRINT ("\nallocate_buffer: venc_bufferpayload failure");
+        return -1;
+    }
+
+
+    if (buffer_dir == OUTPUT_BUFFER) {
+        DEBUG_PRINT ("\nallocate_buffer: OUT");
+        encoder_context->ptr_outputbuffer = ptemp;
+    } else {
+        DEBUG_PRINT ("\nallocate_buffer: IN");
+        encoder_context->ptr_inputbuffer = ptemp;
+    }
+
+    /*Allocate buffer headers*/
+    for (i=0; i< buffercount; i++) {
+        ptemp [i] = (struct venc_bufferpayload*)\
+                calloc (sizeof (struct venc_bufferpayload),1);
+
+        if (ptemp [i] == NULL) {
+            DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure");
+            return -1;
+        }
+
+        ptemp [i]->fd = -1;
+    }
+
+    for (i=0; i< buffercount; i++) {
+        ptemp [i]->fd = open ("/dev/pmem_adsp",O_RDWR);
+
+        if (ptemp [i]->fd < 0) {
+            DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
+            return -1;
+        }
+
+        ptemp [i]->pbuffer = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE,
+                MAP_SHARED,ptemp [i]->fd,0);
+        DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->fd,\
+                ptemp [i]->pbuffer);
+
+        if (ptemp [i]->pbuffer == MAP_FAILED) {
+            ptemp [i]->pbuffer = NULL;
+            DEBUG_PRINT ("\nallocate_buffer: MMAP failed");
+            return -1;
+        }
+
+        ptemp [i]->sz = buffersize;
+        ptemp [i]->maped_size = clp2 (buffersize);
+
+        ioctl_msg.in  = ptemp [i];
+        ioctl_msg.out = NULL;
+
+        if (buffer_dir == OUTPUT_BUFFER) {
+            if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,
+                        &ioctl_msg) < 0) {
+                DEBUG_PRINT ("\nallocate_buffer: Set Output Buffer IOCTL failed");
+                return -1;
+            }
+        } else {
+            if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER,
+                        &ioctl_msg) < 0) {
+                DEBUG_PRINT ("\nallocate_buffer: Set input Buffer IOCTL failed");
+                return -1;
+            }
+        }
+
+    }
+
+    DEBUG_PRINT ("\nallocate_buffer: Success");
+    return 1;
+}
+
+
+
+int start_encoding (struct video_encoder_context *encoder_context)
+{
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_buffer enc_buffer;
+    unsigned int i = 0;
+    unsigned int data_len =0;
+
+
+    if (encoder_context == NULL) {
+        return -1;
+    }
+
+    if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_START,
+                NULL) < 0) {
+        DEBUG_PRINT("\n Start failed");
+        return -1;
+    }
+
+    DEBUG_PRINT("\n Start Issued successfully waiting for Start Done");
+    /*Wait for Start command response*/
+    sem_wait (&encoder_context->sem_synchronize);
+
+    /*Push output Buffers*/
+    i = 0;
+
+    while (i < encoder_context->output_buffer.actualcount) {
+        enc_buffer.clientdata = (void *)encoder_context->ptr_outputbuffer [i];
+        enc_buffer.flags = 0;
+        enc_buffer.sz = encoder_context->ptr_outputbuffer [i]->sz;
+        enc_buffer.len = 0;
+        enc_buffer.ptrbuffer = encoder_context->ptr_outputbuffer [i]->pbuffer;
+        enc_buffer.offset = 0;
+        enc_buffer.timestamp = 0;
+
+        DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
+        ioctl_msg.in = &enc_buffer;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (encoder_context->video_driver_fd,
+                    VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n fill output frame failed");
+            return -1;
+        }
+
+        i++;
+    }
+
+
+    /*push input buffers*/
+    i = 0;
+
+    while (i < encoder_context->input_buffer.actualcount) {
+        DEBUG_PRINT("\n Read  Frame from File");
+
+        enc_buffer.clientdata = (void *)encoder_context->ptr_inputbuffer [i];
+        enc_buffer.flags = 0;
+        enc_buffer.sz = encoder_context->ptr_inputbuffer [i]->sz;
+        enc_buffer.len = 0;
+        enc_buffer.ptrbuffer = encoder_context->ptr_inputbuffer [i]->pbuffer;
+        enc_buffer.offset = 0;
+        enc_buffer.timestamp = total_frames *
+            ((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
+        enc_buffer.len = (encoder_context->input_height *
+                encoder_context->input_width *3)/2;
+        data_len = read_frame ( enc_buffer.ptrbuffer,
+                enc_buffer.len,
+                encoder_context->inputBufferFile);
+
+        if (data_len == 0) {
+            DEBUG_PRINT("\n Length is zero error");
+            return -1;
+        }
+
+        enc_buffer.len = data_len;
+        DEBUG_PRINT("\n Read  Frame from File szie = %d",(int)data_len);
+
+        DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
+        ioctl_msg.in = &enc_buffer;
+        ioctl_msg.out = NULL;
+
+        if (ioctl (encoder_context->video_driver_fd,
+                    VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Encode input frame failed");
+            return -1;
+        }
+
+        total_frames++;
+        i++;
+    }
+
+    DEBUG_PRINT ("\n Wait for EOS");
+    /*Wait for EOS or Error condition*/
+    sem_wait (&encoder_context->sem_synchronize);
+    DEBUG_PRINT ("\n Reached EOS");
+
+    return 1;
+}
+
+int stop_encoding  (struct video_encoder_context *encoder_context)
+{
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_bufferflush buffer_flush;
+
+    if (encoder_context == NULL) {
+        return -1;
+    }
+
+    buffer_flush.flush_mode = VEN_FLUSH_INPUT;
+    ioctl_msg.in = &buffer_flush;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
+                &ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Flush input failed");
+    } else {
+        sem_wait (&encoder_context->sem_synchronize);
+    }
+
+    buffer_flush.flush_mode = VEN_FLUSH_OUTPUT;
+    ioctl_msg.in = &buffer_flush;
+    ioctl_msg.out = NULL;
+
+    if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
+                &ioctl_msg) < 0) {
+        DEBUG_PRINT("\n Flush output failed");
+    } else {
+        sem_wait (&encoder_context->sem_synchronize);
+    }
+
+    DEBUG_PRINT("\n Stop VEN_IOCTL_CMD_STOP");
+
+    if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_STOP,NULL) < 0) {
+        DEBUG_PRINT("\n Stop failed");
+    } else {
+        sem_wait (&encoder_context->sem_synchronize);
+    }
+
+    return 1;
+}
+
+int deinit_encoder (struct video_encoder_context *init_decode)
+{
+    if (init_decode == NULL) {
+        return -1;
+    }
+
+    /*Close the driver*/
+    if (init_decode->video_driver_fd != -1) {
+        close (init_decode->video_driver_fd);
+    }
+
+    if (init_decode->queue_context.ptr_cmdq) {
+        free (init_decode->queue_context.ptr_cmdq);
+        init_decode->queue_context.ptr_cmdq = NULL;
+    }
+
+    if (init_decode->queue_context.ptr_dataq) {
+        free (init_decode->queue_context.ptr_dataq);
+        init_decode->queue_context.ptr_dataq = NULL;
+    }
+
+    sem_destroy (&init_decode->queue_context.sem_message);
+    sem_destroy (&init_decode->sem_synchronize);
+
+    pthread_mutex_destroy(&init_decode->queue_context.mutex);
+    pthread_mutex_destroy (&read_lock);
+
+    return 1;
+}
+
+static void* video_thread (void *context)
+{
+    struct video_encoder_context *encoder_context = NULL;
+    struct video_msgq *queueitem = NULL;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    struct venc_bufferpayload *tempbuffer = NULL;
+    struct venc_buffer enc_buffer;
+    unsigned int data_len =0;
+
+
+    if (context == NULL) {
+        DEBUG_PRINT("\n video thread recieved NULL context");
+        return NULL;
+    }
+
+    encoder_context = (struct video_encoder_context *) context;
+
+    /* Thread function which will accept commands from async thread
+     * or main thread
+     */
+    while (1) {
+        queueitem = queue_get_cmd (&encoder_context ->queue_context);
+
+        if (queueitem != NULL) {
+            switch (queueitem->cmd) {
+                case VEN_MSG_START:
+                    DEBUG_PRINT("\n recived start done command");
+                    sem_post (&encoder_context->sem_synchronize);
+                    break;
+
+                case VEN_MSG_STOP:
+                    DEBUG_PRINT("\n recieved stop done");
+                    sem_post (&encoder_context->sem_synchronize);
+                    break;
+
+                case VEN_MSG_INPUT_BUFFER_DONE:
+
+                    tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata;
+
+                    if (tempbuffer == NULL) {
+                        DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
+                        sem_post (&encoder_context->sem_synchronize);
+                        break;
+                    }
+
+                    tempbuffer->filled_len = (encoder_context->input_height *
+                            encoder_context->input_width *3)/2;
+
+                    data_len = read_frame ( tempbuffer->pbuffer,
+                            tempbuffer->filled_len,
+                            encoder_context->inputBufferFile);
+
+                    if (data_len == 0) {
+                        DEBUG_PRINT ("\n End of stream reached");
+                        sem_post (&encoder_context->sem_synchronize);
+                        break;
+                    }
+
+                    enc_buffer.clientdata = (void *)tempbuffer;
+                    enc_buffer.flags = 0;
+                    enc_buffer.ptrbuffer = tempbuffer->pbuffer;
+                    enc_buffer.sz = tempbuffer->sz;
+                    enc_buffer.len = tempbuffer->filled_len;
+                    enc_buffer.offset = 0;
+                    enc_buffer.timestamp = total_frames *
+                        ((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
+
+                    /*TODO: Time stamp needs to be updated*/
+                    ioctl_msg.in = &enc_buffer;
+                    ioctl_msg.out = NULL;
+                    total_frames++;
+
+                    if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,
+                                &ioctl_msg) < 0) {
+                        DEBUG_PRINT("\n Decoder frame failed");
+                        sem_post (&encoder_context->sem_synchronize);
+                    }
+
+                    DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\
+                            total_frames);
+                    break;
+
+                case VEN_MSG_OUTPUT_BUFFER_DONE:
+
+                    tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata;
+
+                    if (tempbuffer == NULL) {
+                        DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
+                        sem_post (&encoder_context->sem_synchronize);
+                        break;
+                    }
+
+                    if (encoder_context->outputBufferFile != NULL) {
+                        fwrite (tempbuffer->pbuffer,1,tempbuffer->filled_len,
+                                encoder_context->outputBufferFile);
+                    }
+
+
+                    DEBUG_PRINT("\n recieved output buffer consume outbuffer");
+                    DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
+                            tempbuffer->pbuffer);
+                    enc_buffer.clientdata = (void *)tempbuffer;
+                    enc_buffer.flags = 0;
+                    enc_buffer.sz = tempbuffer->sz;
+                    enc_buffer.len = 0;
+                    enc_buffer.ptrbuffer = tempbuffer->pbuffer;
+                    enc_buffer.offset = 0;
+                    enc_buffer.timestamp = 0;
+
+                    ioctl_msg.in = &enc_buffer;
+                    ioctl_msg.out = NULL;
+
+                    if (ioctl (encoder_context->video_driver_fd,
+                                VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
+                        DEBUG_PRINT("\n Decoder frame failed");
+                        return NULL;
+                    }
+
+                    break;
+
+                case VEN_MSG_FLUSH_INPUT_DONE:
+                    DEBUG_PRINT("\n Flush input complete");
+                    sem_post (&encoder_context->sem_synchronize);
+                    break;
+
+                case VEN_MSG_FLUSH_OUPUT_DONE:
+                    DEBUG_PRINT("\n Flush output complete");
+                    sem_post (&encoder_context->sem_synchronize);
+                    break;
+            }
+
+            if (queueitem->cmd == VEN_MSG_STOP) {
+                DEBUG_PRINT("\n Playback has ended thread will exit");
+                return NULL;
+            }
+        } else {
+            DEBUG_PRINT("\n Error condition recieved NULL from Queue");
+        }
+
+    }
+}
+
+static void* async_thread (void *context)
+{
+    struct video_encoder_context *encoder_context = NULL;
+    struct video_msgq queueitem ;
+    struct venc_msg venc_msg;
+    struct venc_bufferpayload *tempbuffer = NULL;
+    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+    int result = -1;
+
+    if (context == NULL) {
+        DEBUG_PRINT("\n aynsc thread recieved NULL context");
+        return NULL;
+    }
+
+    encoder_context = (struct video_encoder_context *) context;
+    DEBUG_PRINT("\n Entering the async thread");
+
+    while (1) {
+        ioctl_msg.in = NULL;
+        ioctl_msg.out = (void*)&venc_msg;
+        DEBUG_PRINT ("\n Sizeof venc_msginfo = %d ",sizeof (venc_msg));
+        DEBUG_PRINT("\n Address of Venc msg in async thread %p",\
+                ioctl_msg.out);
+
+        if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,\
+                    (void*)&ioctl_msg) < 0) {
+            DEBUG_PRINT("\n Error in ioctl read next msg");
+        } else {
+            switch (venc_msg.msgcode) {
+                case VEN_MSG_START:
+                case VEN_MSG_STOP:
+                case VEN_MSG_INDICATION:
+                    DEBUG_PRINT("\nSTOP/START Indiacation");
+                    queueitem.cmd = venc_msg.msgcode;
+                    queueitem.status = venc_msg.statuscode;
+                    queueitem.clientdata = NULL;
+                    break;
+
+                case VEN_MSG_INPUT_BUFFER_DONE:
+                    DEBUG_PRINT("\nINPUT buffer done Indiacation");
+                    queueitem.cmd = venc_msg.msgcode;
+                    queueitem.status = venc_msg.statuscode;
+                    queueitem.clientdata = (void *)venc_msg.buf.clientdata;
+                    DEBUG_PRINT("\nInput Client data pointer is %p",queueitem.clientdata);
+                    tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata;
+                    DEBUG_PRINT ("\n Input Address of tempbuffer %p",tempbuffer);
+                    tempbuffer->filled_len = venc_msg.buf.len;
+                    DEBUG_PRINT ("\n Input value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len);
+                    break;
+                case VEN_MSG_OUTPUT_BUFFER_DONE:
+                    DEBUG_PRINT("\nOUPUT buffer done Indiacation");
+                    queueitem.cmd = venc_msg.msgcode;
+                    queueitem.status = venc_msg.statuscode;
+                    queueitem.clientdata = (void *)venc_msg.buf.clientdata;
+                    DEBUG_PRINT("\nOutput Client data pointer is %p",queueitem.clientdata);
+                    tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata;
+                    DEBUG_PRINT ("\n Output Address of tempbuffer %p",tempbuffer);
+                    tempbuffer->filled_len = venc_msg.buf.len;
+                    DEBUG_PRINT ("\n Output value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len);
+                    break;
+
+                default:
+                    DEBUG_PRINT("\nIn Default of get next message %d",(int)venc_msg.msgcode);
+                    queueitem.cmd = venc_msg.msgcode;
+                    queueitem.status = venc_msg.statuscode;
+                    queueitem.clientdata = NULL;
+                    break;
+            }
+
+            result = queue_post_cmdq (&encoder_context->queue_context,&queueitem);
+
+            while (result == 0) {
+                result = queue_post_cmdq (&encoder_context->queue_context,&queueitem);
+            }
+
+            if (result == -1) {
+                DEBUG_PRINT("\n FATAL ERROR WITH Queue");
+            }
+        }
+
+        if (venc_msg.msgcode == VEN_MSG_STOP) {
+            /*Thread can exit at this point*/
+            return NULL;
+        }
+    }
+}
+
+
+static unsigned int read_frame (unsigned char *dataptr, unsigned int length,
+        FILE * inputBufferFile)
+{
+
+    unsigned int readOffset = 0;
+    int bytes_read = 0;
+    unsigned int code = 0;
+    int found = 0;
+
+    DEBUG_PRINT ("\n Inside the readframe");
+
+    if (dataptr == NULL && length == 0) {
+        DEBUG_PRINT ("\n dataptr = %p length = %d",dataptr,(int)length);
+        return 0;
+    }
+
+    pthread_mutex_lock(&read_lock);
+    bytes_read = fread(&dataptr[readOffset],1,length,inputBufferFile);
+    pthread_mutex_unlock(&read_lock);
+
+    return bytes_read;
+}
