Update to 07.00.00.253.024

Bug: 31713031
Change-Id: I46336f0b8c929500b28abda944e55f2cc6d05a03
diff --git a/msmcobalt/mm-core/inc/OMX_QCOMExtns.h b/msmcobalt/mm-core/inc/OMX_QCOMExtns.h
old mode 100755
new mode 100644
index a7c5b52..e4ddc51
--- a/msmcobalt/mm-core/inc/OMX_QCOMExtns.h
+++ b/msmcobalt/mm-core/inc/OMX_QCOMExtns.h
@@ -47,6 +47,29 @@
 #include "OMX_Video.h"
 
 #define OMX_VIDEO_MAX_HP_LAYERS 6
+
+/**
+ * These MACROS used by Camera and Video to decide buffer count.
+ * This is to avoid mismatch of buffer count between Camera and Video.
+ * In Meta mode, read this count as buffer count in Camera and Header
+ * count in Video.
+ * 1) Number of buffers in Non-DCVS mode.
+ * 2) DCVS resolution.
+ * 3) Buffer count when Current resolution is greater than DCVS resolution
+ * defined in 2)
+ */
+
+#define OMX_VIDEO_MIN_CAMERA_BUFFERS 9
+#define OMX_VIDEO_ENC_DCVS_RESOLUTION 3840 * 2160
+#define OMX_VIDEO_MIN_CAMERA_BUFFERS_DCVS 11
+
+/**
+ * This count indicates the number of Ints in the legacy Camera payload
+ * used for HAL1
+ */
+
+#define VIDEO_METADATA_NUM_COMMON_INTS 1
+
 /**
  * This extension is used to register mapping of a virtual
  * address to a physical address. This extension is a parameter
@@ -95,6 +118,14 @@
  */
 #define QOMX_ErrorLTRUseFailed        (OMX_ErrorVendorStartUnused + 1)
 
+/*
+ * This rate control will be used for low bitrate applications to get better
+ * video quality for a given bitrate.
+ */
+#define QOMX_Video_ControlRateMaxBitrate (OMX_Video_ControlRateVendorStartUnused + 1)
+
+#define QOMX_Video_ControlRateMaxBitrateSkipFrames (OMX_Video_ControlRateVendorStartUnused + 2)
+
 #define QOMX_VIDEO_BUFFERFLAG_BFRAME 0x00100000
 
 #define QOMX_VIDEO_BUFFERFLAG_EOSEQ  0x00200000
@@ -190,6 +221,18 @@
     OMX_U32 maxQP;
 } OMX_QCOM_VIDEO_PARAM_QPRANGETYPE;
 
+typedef struct OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 minIQP;
+    OMX_U32 maxIQP;
+    OMX_U32 minPQP;
+    OMX_U32 maxPQP;
+    OMX_U32 minBQP;
+    OMX_U32 maxBQP;
+} OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE;
+
 #define OMX_QCOM_PLATFORMPVT_EXTN   "OMX.QCOM.index.param.platformprivate"
 /** Allowed APIs on the above Index: OMX_SetParameter() */
 
@@ -562,6 +605,15 @@
 
     /* Configure BLUR resolution for encode */
     OMX_QTIIndexConfigVideoBlurResolution = 0x7F00005E,
+
+    /* QP range for I frame B frame P frame */
+    OMX_QcomIndexParamVideoIPBQPRange = 0x7F00005F,
+
+    /* Enable client extradata */
+    OMX_QTIIndexParamVideoClientExtradata = 0x7F000060,
+
+    /* H264 transform 8x8 mode */
+    OMX_QcomIndexConfigH264Transform8x8 = 0x7F000061,
 };
 
 /**
@@ -1655,6 +1707,7 @@
 #define OMX_QTI_INDEX_PARAM_VIDEO_ENABLE_ROIINFO "OMX.QTI.index.param.enableRoiInfo"
 #define OMX_QTI_INDEX_CONFIG_VIDEO_ROIINFO "OMX.QTI.index.config.RoiInfo"
 #define OMX_QTI_INDEX_CONFIG_VIDEO_BLURINFO "OMX.QTI.index.config.BlurInfo"
+#define OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA "OMX.QTI.index.param.client.extradata"
 
 typedef enum {
     QOMX_VIDEO_FRAME_PACKING_CHECKERBOARD = 0,
@@ -1938,6 +1991,15 @@
     OMX_U32 nBatchSize;
 } QOMX_VIDEO_BATCHSIZETYPE;
 
+typedef struct QOMX_VIDEO_CLIENT_EXTRADATA {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nFd;
+    OMX_U32 nExtradataAllocSize;
+    OMX_U32 nExtradataSize;
+} QOMX_VIDEO_CLIENT_EXTRADATATYPE;
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/msmcobalt/mm-core/src/msm8953/registry_table.c b/msmcobalt/mm-core/src/msm8953/registry_table.c
index e6a394f..3f7f3ca 100644
--- a/msmcobalt/mm-core/src/msm8953/registry_table.c
+++ b/msmcobalt/mm-core/src/msm8953/registry_table.c
@@ -547,6 +547,19 @@
     }
   },
   {
+    "OMX.qcom.audio.encoder.amrwb",
+    NULL,   // Create instance function
+    // Unique instance handle
+    {
+      NULL
+    },
+    NULL,   // Shared object library handle
+    "libOmxAmrEnc.so",
+    {
+      "audio_encoder.amrwb"
+    }
+  },
+  {
     "OMX.qcom.audio.encoder.g711mlaw",
     NULL,   // Create instance function
     // Unique instance handle
diff --git a/msmcobalt/mm-core/src/msm8953/registry_table_android.c b/msmcobalt/mm-core/src/msm8953/registry_table_android.c
index 8de929a..988a460 100644
--- a/msmcobalt/mm-core/src/msm8953/registry_table_android.c
+++ b/msmcobalt/mm-core/src/msm8953/registry_table_android.c
@@ -612,6 +612,19 @@
     }
   },
 {
+    "OMX.qcom.audio.encoder.amrwb",
+    NULL,   // Create instance function
+    // Unique instance handle
+    {
+      NULL
+    },
+    NULL,   // Shared object library handle
+    "libOmxAmrEnc.so",
+    {
+      "audio_encoder.amrwb"
+    }
+  },
+{
     "OMX.qcom.audio.encoder.g711mlaw",
     NULL,   // Create instance function
     // Unique instance handle
diff --git a/msmcobalt/mm-video-v4l2/vidc/common/inc/vidc_debug.h b/msmcobalt/mm-video-v4l2/vidc/common/inc/vidc_debug.h
index 6355188..3d5bbb5 100644
--- a/msmcobalt/mm-video-v4l2/vidc/common/inc/vidc_debug.h
+++ b/msmcobalt/mm-video-v4l2/vidc/common/inc/vidc_debug.h
@@ -32,6 +32,7 @@
 #ifdef _ANDROID_
 #include <cstdio>
 #include <pthread.h>
+#include <sys/mman.h>
 
 enum {
    PRIO_ERROR=0x1,
@@ -93,4 +94,20 @@
         pthread_mutex_t &mLock;
 };
 
+class AutoUnmap {
+    void *vaddr;
+    int size;
+
+    public:
+        AutoUnmap(void *vaddr, int size) {
+            this->vaddr = vaddr;
+            this->size = size;
+        }
+
+        ~AutoUnmap() {
+            if (vaddr)
+                munmap(vaddr, size);
+        }
+};
+
 #endif
diff --git a/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index b9083dd..a0201ef 100644
--- a/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -1177,6 +1177,59 @@
         static OMX_ERRORTYPE describeColorFormat(OMX_PTR params);
         void prefetchNewBuffers();
 
+        class client_extradata_info {
+            private:
+                int fd;
+                OMX_U32 total_size;
+                OMX_U32 size;
+                void *vaddr;
+            public:
+                client_extradata_info() {
+                    fd = -1;
+                    size = 0;
+                    total_size = 0;
+                    vaddr = NULL;
+                }
+
+                void reset() {
+                    if (vaddr) {
+                        munmap(vaddr, total_size);
+                        vaddr = NULL;
+                    }
+                    if (fd != -1) {
+                        close(fd);
+                        fd = -1;
+                    }
+                }
+
+                ~client_extradata_info() {
+                    reset();
+                }
+
+                bool set_extradata_info(int fd, OMX_U32 total_size, OMX_U32 size) {
+                    reset();
+                    this->fd = fd;
+                    this->size = size;
+                    this->total_size = total_size;
+                    vaddr = (OMX_U8*)mmap(0, total_size,
+                            PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+                    if (vaddr == MAP_FAILED) {
+                        vaddr = NULL;
+                        reset();
+                        return false;
+                    }
+                    return true;
+                }
+
+                OMX_U8 *getBase() const {
+                    return (OMX_U8 *)vaddr;
+                }
+
+                OMX_U32 getSize() const {
+                    return size;
+                }
+        };
+        client_extradata_info m_client_extradata_info;
 };
 
 #ifdef _MSM8974_
diff --git a/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
index 7632b38..b737726 100644
--- a/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -1028,11 +1028,10 @@
 
     //Restore the capture format again here, because
     //in switching between different DPB-OPB modes, the pixelformat
-    //on capture port may be changed.
+    //on capture port may be changed. Don't change resolutions.
     memset(&fmt, 0x0, sizeof(struct v4l2_format));
     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;
+    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
     fmt.fmt.pix_mp.pixelformat = capture_capability;
     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
     if (rc) {
@@ -1099,6 +1098,7 @@
     int rc = 0;
     struct v4l2_format fmt;
     enum color_fmts color_format;
+    OMX_U32 width, height;
 
     if  (!m_downscalar_width || !m_downscalar_height) {
         DEBUG_PRINT_LOW("%s: downscalar not supported", __func__);
@@ -1119,10 +1119,13 @@
        return rc;
     }
 
+    height = fmt.fmt.pix_mp.height;
+    width = fmt.fmt.pix_mp.width;
+
     DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d m_is_display_session = %d", __func__,
         fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height, m_is_display_session);
 
-    if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height > m_downscalar_width * m_downscalar_height) &&
+    if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height >= m_downscalar_width * m_downscalar_height) &&
          m_is_display_session) {
         rc = enable_downscalar();
         if (rc < 0) {
@@ -1130,9 +1133,9 @@
             return rc;
         }
 
-        OMX_U32 width = m_downscalar_width > fmt.fmt.pix_mp.width ?
+        width = m_downscalar_width > fmt.fmt.pix_mp.width ?
                             fmt.fmt.pix_mp.width : m_downscalar_width;
-        OMX_U32 height = m_downscalar_height > fmt.fmt.pix_mp.height ?
+        height = m_downscalar_height > fmt.fmt.pix_mp.height ?
                             fmt.fmt.pix_mp.height : m_downscalar_height;
         switch (capture_capability) {
             case V4L2_PIX_FMT_NV12:
@@ -1149,13 +1152,6 @@
                 rc = OMX_ErrorUndefined;
                 return rc;
         }
-
-        rc = update_resolution(width, height,
-                VENUS_Y_STRIDE(color_format, width), VENUS_Y_SCANLINES(color_format, height));
-        if (rc < 0) {
-            DEBUG_PRINT_ERROR("%s: update_resolution WxH %dx%d failed \n", __func__, width, height);
-            return rc;
-        }
     } else {
 
         rc = disable_downscalar();
@@ -1163,20 +1159,12 @@
             DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
             return rc;
         }
-
-        rc = 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 (rc < 0) {
-            DEBUG_PRINT_ERROR("%s: update_resolution WxH %dx%d failed\n", __func__, fmt.fmt.pix_mp.width,
-                fmt.fmt.pix_mp.height);
-            return rc;
-        }
     }
 
     memset(&fmt, 0x0, sizeof(struct v4l2_format));
     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.height = height;
+    fmt.fmt.pix_mp.width = width;
     fmt.fmt.pix_mp.pixelformat = capture_capability;
     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
     if (rc) {
@@ -3814,6 +3802,17 @@
              break;
 
          }
+        case OMX_QTIIndexParamVideoClientExtradata:
+        {
+            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
+            DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVideoClientExtradata");
+            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
+                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
+            pParam->nExtradataSize = VENUS_EXTRADATA_SIZE(4096, 2160);
+            pParam->nExtradataAllocSize = pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS;
+            eRet = OMX_ErrorNone;
+            break;
+        }
         default: {
                  DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
                  eRet =OMX_ErrorUnsupportedIndex;
@@ -3962,10 +3961,6 @@
                                                (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) {
                                                    port_format_changed = true;
                                            }
-                                           update_resolution(portDefn->format.video.nFrameWidth,
-                                                   portDefn->format.video.nFrameHeight,
-                                                   portDefn->format.video.nFrameWidth,
-                                                   portDefn->format.video.nFrameHeight);
 
                                            /* set crop info */
                                            rectangle.nLeft = 0;
@@ -3978,8 +3973,8 @@
                                                break;
                                            memset(&fmt, 0x0, sizeof(struct v4l2_format));
                                            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.height = (unsigned int)portDefn->format.video.nFrameHeight;
+                                           fmt.fmt.pix_mp.width = (unsigned int)portDefn->format.video.nFrameWidth;
                                            fmt.fmt.pix_mp.pixelformat = capture_capability;
                                            DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
                                                fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width);
@@ -4137,13 +4132,28 @@
                                            eRet = is_video_session_supported();
                                            if (eRet)
                                                break;
-                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
-                                           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("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
-                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                                           if (is_down_scalar_enabled) {
+                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
+                                               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("DS Enabled : height = %d , width = %d",
+                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
+                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                                           } else {
+                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
+                                               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("DS Disabled : height = %d , width = %d",
+                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
+                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                                               fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                                               fmt.fmt.pix_mp.pixelformat = capture_capability;
+                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+                                           }
                                            if (ret) {
                                                DEBUG_PRINT_ERROR("Set Resolution failed");
                                                eRet = OMX_ErrorUnsupportedSetting;
@@ -4207,24 +4217,27 @@
                                 memset(&fmt, 0x0, sizeof(struct v4l2_format));
                                 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;
+                                    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+                                    if (ret < 0) {
+                                        DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
+                                        return OMX_ErrorBadParameter;
+                                    }
                                     enum vdec_output_fromat op_format;
                                     if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
-                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m ||
+                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m ||
                                             portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
-                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView ||
+                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView ||
                                             portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar ||
                                             portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
                                         op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
                                     } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
-                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
+                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
                                         op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC;
                                     } else
                                         eRet = OMX_ErrorBadParameter;
 
                                     if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
-                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
+                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
                                         fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC;
                                     } else {
                                         fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12;
@@ -4904,6 +4917,28 @@
             DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled");
             break;
         }
+        case OMX_QTIIndexParamVideoClientExtradata:
+        {
+            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
+            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoClientExtradata");
+            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
+                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
+            OMX_U32 extradata_size = VENUS_EXTRADATA_SIZE(4096, 2160);
+            if (pParam->nExtradataSize < extradata_size ||
+                pParam->nExtradataAllocSize < (extradata_size * MAX_NUM_INPUT_OUTPUT_BUFFERS) ||
+                pParam->nExtradataAllocSize < (pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS)) {
+                DEBUG_PRINT_ERROR("set_parameter: Incorrect buffer size for client extradata");
+                eRet = OMX_ErrorBadParameter;
+                break;
+            }
+            if (!m_client_extradata_info.set_extradata_info(dup(pParam->nFd),
+                pParam->nExtradataAllocSize, pParam->nExtradataSize)) {
+                DEBUG_PRINT_ERROR("set_parameter: Setting client extradata failed.");
+                eRet = OMX_ErrorBadParameter;
+                break;
+            }
+            break;
+        }
 
         default: {
                  DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
@@ -5346,6 +5381,8 @@
         *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB;
     } else if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) {
         *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode;
+    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA)) {
+        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoClientExtradata;
     } else {
         DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
         return OMX_ErrorNotImplemented;
@@ -9584,15 +9621,8 @@
     DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
             buffer_prop->actualcount, (unsigned int)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",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
@@ -9630,8 +9660,6 @@
         drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size;
         drv_ctx.extradata_info.count = buffer_prop->actualcount;
         drv_ctx.extradata_info.buffer_size = final_extra_data_size;
-        if (!secure_mode)
-            buf_size += final_extra_data_size;
         buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
         DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)",
                 buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size);
@@ -9655,9 +9683,9 @@
 {
     OMX_ERRORTYPE eRet = OMX_ErrorNone;
     unsigned buf_size = 0;
-    struct v4l2_format fmt;
+    struct v4l2_format fmt, c_fmt;
     struct v4l2_requestbuffers bufreq;
-    int ret;
+    int ret = 0;
     DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)",
             buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
     buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
@@ -9667,6 +9695,7 @@
         eRet = OMX_ErrorBadParameter;
     } else {
         memset(&fmt, 0x0, sizeof(struct v4l2_format));
+        memset(&c_fmt, 0x0, sizeof(struct v4l2_format));
         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.plane_fmt[0].sizeimage = buf_size;
@@ -9674,14 +9703,17 @@
         if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
             fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
             fmt.fmt.pix_mp.pixelformat = output_capability;
+            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
         } 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;
+            c_fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            c_fmt.fmt.pix_mp.pixelformat = capture_capability;
+            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &c_fmt);
+            c_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
+            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &c_fmt);
         } 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);
@@ -9758,10 +9790,18 @@
 
         fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
         fmt.fmt.pix_mp.pixelformat = output_capability;
+        ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
     } else if (1 == portDefn->nPortIndex) {
         unsigned int buf_size = 0;
         int ret = 0;
-       memset(&fmt, 0x0, sizeof(struct v4l2_format));
+       if (!is_down_scalar_enabled) {
+           fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+           fmt.fmt.pix_mp.pixelformat = capture_capability;
+           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+       }
+
        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
        fmt.fmt.pix_mp.pixelformat = capture_capability;
        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
@@ -9770,8 +9810,6 @@
            return OMX_ErrorHardware;
        }
        drv_ctx.op_buf.buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
-       drv_ctx.op_buf.buffer_size += drv_ctx.extradata_info.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));
        if (!client_buffers.update_buffer_req()) {
            DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
            return OMX_ErrorHardware;
@@ -9800,24 +9838,13 @@
                 (int)portDefn->nPortIndex);
         eRet = OMX_ErrorBadPortIndex;
     }
-    if (is_down_scalar_enabled) {
-        int ret = 0;
-        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
-        if (ret) {
-            DEBUG_PRINT_ERROR("update_portdef : Error in getting port resolution");
-            return OMX_ErrorHardware;
-        } else {
-            portDefn->format.video.nFrameWidth = fmt.fmt.pix_mp.width;
-            portDefn->format.video.nFrameHeight = fmt.fmt.pix_mp.height;
-            portDefn->format.video.nStride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
-            portDefn->format.video.nSliceHeight = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
-        }
-    } else {
+    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]);
+
         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;
-    }
 
     if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
        (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
@@ -10119,7 +10146,8 @@
 
 void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
 {
-    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
+    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_client_extra = NULL;
+    OMX_U8 *pBuffer = NULL;
     OMX_U32 num_conceal_MB = 0;
     OMX_TICKS time_stamp = 0;
     OMX_U32 frame_rate = 0;
@@ -10144,9 +10172,6 @@
         return;
     }
 
-    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
-        p_buf_hdr->nOffset;
-
     if (!drv_ctx.extradata_info.uaddr) {
         DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
         return;
@@ -10156,11 +10181,25 @@
         p_extra = NULL;
         return;
     }
-    if (!secure_mode)
+    if (!secure_mode) {
+        pBuffer = (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[buf_index].buffer_len,
+                    PROT_READ|PROT_WRITE, MAP_SHARED, drv_ctx.ptr_outputbuffer[buf_index].pmem_fd, 0);
+        if (pBuffer == MAP_FAILED) {
+            DEBUG_PRINT_ERROR("handle_extradata output buffer mmap failed - errno: %d", errno);
+            return;
+        }
         p_extra = (OMX_OTHER_EXTRADATATYPE *)
             ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
-    else
+    } else
         p_extra = m_other_extradata;
+
+    AutoUnmap autounmap(pBuffer, drv_ctx.ptr_outputbuffer[buf_index].buffer_len);
+    if (m_client_extradata_info.getBase() &&
+        m_client_extradata_info.getSize() >= drv_ctx.extradata_info.buffer_size) {
+        p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (m_client_extradata_info.getBase() +
+                            buf_index * m_client_extradata_info.getSize());
+    }
+
     char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
 
     if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
@@ -10238,7 +10277,12 @@
                     }
                     if (client_extradata & OMX_INTERLACE_EXTRADATA) {
                         append_interlace_extradata(p_extra, payload->format);
-                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+                        if (p_client_extra) {
+                            append_interlace_extradata(p_client_extra, payload->format);
+                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *)
+                                (((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+                        }
                     }
                     break;
                 case MSM_VIDC_EXTRADATA_FRAME_RATE:
@@ -10339,7 +10383,11 @@
                         s3d_frame_packing_payload->fpa_type, s3d_frame_packing_payload->content_interprtation_type, stereo_output_mode);
                     if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
                         append_framepack_extradata(p_extra, s3d_frame_packing_payload);
-                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+                        if (p_client_extra) {
+                            append_framepack_extradata(p_client_extra, s3d_frame_packing_payload);
+                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+                        }
                     }
                     break;
                 case MSM_VIDC_EXTRADATA_FRAME_QP:
@@ -10347,7 +10395,11 @@
                     qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data;
                     if (client_extradata & OMX_QP_EXTRADATA) {
                         append_qp_extradata(p_extra, qp_payload);
-                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+                        if (p_client_extra) {
+                            append_qp_extradata(p_client_extra, qp_payload);
+                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+                        }
                     }
                     break;
                 case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO:
@@ -10355,13 +10407,21 @@
                     bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data;
                     if (client_extradata & OMX_BITSINFO_EXTRADATA) {
                         append_bitsinfo_extradata(p_extra, bits_info_payload);
-                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+                        if (p_client_extra) {
+                            append_bitsinfo_extradata(p_client_extra, bits_info_payload);
+                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+                        }
                     }
                     break;
                 case MSM_VIDC_EXTRADATA_STREAM_USERDATA:
                     if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
                         append_user_extradata(p_extra, data);
-                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+                        if (p_client_extra) {
+                            append_user_extradata(p_client_extra, data);
+                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+                        }
                     }
                     break;
                 case MSM_VIDC_EXTRADATA_VQZIP_SEI:
@@ -10370,7 +10430,11 @@
                     if (client_extradata & OMX_VQZIPSEI_EXTRADATA) {
                         p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
                         append_vqzip_extradata(p_extra, vqzip_payload);
-                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+                        if (p_client_extra) {
+                            append_vqzip_extradata(p_client_extra, vqzip_payload);
+                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+                        }
                     }
                     break;
                 default:
@@ -10386,17 +10450,31 @@
                     num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
                     time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
                         p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
-            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+            if (p_client_extra) {
+                append_frame_info_extradata(p_client_extra,
+                        num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
+                        time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
+                            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+            }
         }
         if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) {
             append_frame_dimension_extradata(p_extra);
-            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
+            if (p_client_extra) {
+                append_frame_dimension_extradata(p_client_extra);
+                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+            }
         }
     }
 unrecognized_extradata:
     if (client_extradata && p_extra) {
         p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
         append_terminator_extradata(p_extra);
+        if (p_client_extra) {
+            append_terminator_extradata(p_client_extra);
+        }
     }
     if (secure_mode && p_extradata && m_other_extradata) {
         struct vdec_output_frameinfo  *ptr_extradatabuff = NULL;
@@ -11192,7 +11270,10 @@
 {
     bool status = true;
     unsigned int src_size = 0, destination_size = 0;
+    unsigned int height, width;
+    struct v4l2_format fmt;
     OMX_COLOR_FORMATTYPE drv_color_format;
+
     if (!omx) {
         DEBUG_PRINT_ERROR("Invalid client in color convert");
         return false;
@@ -11203,8 +11284,15 @@
     }
     pthread_mutex_lock(&omx->c_lock);
 
-    bool resolution_upgrade = (omx->drv_ctx.video_resolution.frame_height > m_c2d_height ||
-            omx->drv_ctx.video_resolution.frame_width > m_c2d_width);
+    memset(&fmt, 0x0, sizeof(struct v4l2_format));
+    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    fmt.fmt.pix_mp.pixelformat = omx->capture_capability;
+    ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+    width = fmt.fmt.pix_mp.width;
+    height =  fmt.fmt.pix_mp.height;
+
+    bool resolution_upgrade = (height > m_c2d_height ||
+            width > m_c2d_width);
     if (resolution_upgrade) {
         // resolution upgraded ? ensure we are yet to allocate;
         // failing which, c2d buffers will never be reallocated and bad things will happen
@@ -11223,8 +11311,8 @@
         goto fail_update_buf_req;
     }
     c2d.close();
-    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
-            omx->drv_ctx.video_resolution.frame_width,
+    status = c2d.open(height,
+            width,
             NV12_128m,dest_format);
     if (status) {
         status = c2d.get_buffer_size(C2D_INPUT,src_size);
@@ -11245,8 +11333,8 @@
             //  smaller than what C2D needs !!
         } else {
             buffer_size_req = destination_size;
-            m_c2d_height = omx->drv_ctx.video_resolution.frame_height;
-            m_c2d_width = omx->drv_ctx.video_resolution.frame_width;
+            m_c2d_height = height;
+            m_c2d_width = width;
         }
     }
 fail_update_buf_req:
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/msmcobalt/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
index 311e28e..7ee28d8 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
@@ -162,6 +162,11 @@
     VENC_EXTRADATA_ROI = 0x04000000,
 };
 
+struct output_metabuffer {
+    OMX_U32 type;
+    native_handle_t *nh;
+};
+
 // OMX video class
 class omx_video: public qc_omx_component
 {
@@ -625,6 +630,7 @@
         OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
         OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
         OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
+        OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE m_sSessionIPBQPRange;
         OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
         QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index 4731e49..a7a2083 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -105,6 +105,16 @@
     unsigned long    maxqp;
     unsigned long    minqp;
 };
+
+struct msm_venc_ipb_qprange {
+    unsigned long    max_i_qp;
+    unsigned long    min_i_qp;
+    unsigned long    max_p_qp;
+    unsigned long    min_p_qp;
+    unsigned long    max_b_qp;
+    unsigned long    min_b_qp;
+};
+
 struct msm_venc_intraperiod {
     unsigned long    num_pframes;
     unsigned long    num_bframes;
@@ -252,6 +262,7 @@
     enum v4l2_ports port_index;
 #ifdef USE_ION
     struct venc_ion ion;
+    unsigned int m_ion_dev;
 #endif
     bool vqzip_sei_found;
 };
@@ -267,8 +278,10 @@
     RC_VBR_CFR = BIT(1),
     RC_CBR_VFR = BIT(2),
     RC_CBR_CFR = BIT(3),
+    RC_MBR_CFR = BIT(4),
+    RC_MBR_VFR = BIT(5),
     RC_ALL = (RC_VBR_VFR | RC_VBR_CFR
-        | RC_CBR_VFR | RC_CBR_CFR)
+        | RC_CBR_VFR | RC_CBR_CFR | RC_MBR_CFR | RC_MBR_VFR)
 };
 
 class venc_dev
@@ -302,6 +315,7 @@
                 OMX_U32 *,OMX_U32);
         bool venc_set_param(void *,OMX_INDEXTYPE);
         bool venc_set_config(void *configData, OMX_INDEXTYPE index);
+        bool venc_h264_transform_8x8(OMX_BOOL enable);
         bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
         bool venc_get_seq_hdr(void *, unsigned, unsigned *);
         bool venc_loaded_start(void);
@@ -403,6 +417,7 @@
         struct msm_venc_initqp              init_qp;
         struct msm_venc_qprange             session_qp_range;
         struct msm_venc_qprange             session_qp_values;
+        struct msm_venc_ipb_qprange         session_ipb_qp_values;
         struct msm_venc_multiclicecfg       multislice;
         struct msm_venc_entropycfg          entropy;
         struct msm_venc_dbcfg               dbkfilter;
@@ -430,6 +445,7 @@
         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_session_qp_range(OMX_U32 min_qp, OMX_U32 max_qp);
+        bool venc_set_session_qp_range_packed(OMX_U32 min_qp, OMX_U32 max_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);
@@ -466,7 +482,7 @@
         bool venc_set_batch_size(OMX_U32 size);
         bool venc_calibrate_gop();
         bool venc_set_vqzip_defaults();
-        int venc_get_index_from_fd(OMX_U32 fd);
+        int venc_get_index_from_fd(OMX_U32 ion_fd, OMX_U32 buffer_fd);
         bool venc_validate_hybridhp_params(OMX_U32 layers, OMX_U32 bFrames, OMX_U32 count, int mode);
         bool venc_set_hierp_layers(OMX_U32 hierp_layers);
         bool venc_set_baselayerid(OMX_U32 baseid);
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp b/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp
index ecf9772..3afc147 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp
@@ -1799,6 +1799,8 @@
     SWVENC_IPBUFFER ipbuffer;
     OMX_BUFFERHEADERTYPE *bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
     unsigned int size = 0, filled_length, offset = 0;
+    SWVENC_COLOR_FORMAT color_format;
+    SWVENC_PROPERTY prop;
 
     (void)pmem_data_buf;
     (void)index;
@@ -1829,9 +1831,44 @@
               VideoGrallocMetadata *meta_buf = (VideoGrallocMetadata *)bufhdr->pBuffer;
               private_handle_t *handle = (private_handle_t *)meta_buf->pHandle;
               size = handle->size;
+              if(!format_set)
+              {
+                format_set = true;
+                DEBUG_PRINT_LOW("color format = 0x%x",handle->format);
+                if (((OMX_COLOR_FORMATTYPE)handle->format) != m_sInPortFormat.eColorFormat)
+                {
+                    if(handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE)
+                    {
+                        m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
+                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+                        color_format = SWVENC_COLOR_FORMAT_NV12;
+                        m_sInPortDef.format.video.eColorFormat = m_sInPortFormat.eColorFormat;
+                        prop.id = SWVENC_PROPERTY_ID_COLOR_FORMAT;
+                        prop.info.color_format = color_format;
+                        Ret = swvenc_setproperty(m_hSwVenc, &prop);
+                        if (Ret != SWVENC_S_SUCCESS)
+                        {
+                            DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
+                                __FUNCTION__, Ret);
+                            RETURN(OMX_ErrorUnsupportedSetting);
+                        }
+                    }
+                    else
+                    {
+                        DEBUG_PRINT_ERROR("%s: OMX_IndexParamVideoPortFormat 0x%x invalid",
+                                          __FUNCTION__,handle->format);
+                        RETURN(OMX_ErrorBadParameter);
+                    }
+                }
+              }
           }
        }
        ipbuffer.p_buffer = (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, offset);
+       if (ipbuffer.p_buffer == MAP_FAILED)
+        {
+            DEBUG_PRINT_ERROR("mmap() failed for fd %d of size %d",fd,size);
+            RETURN(OMX_ErrorBadParameter);
+        }
        ipbuffer.size = size;
        ipbuffer.filled_length = size;
     }
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
index f37babe..87a3d5c 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
@@ -80,7 +80,7 @@
 
 #define SZ_4K                       0x1000
 #define SZ_1M                       0x100000
-#define SECURE_BUFPTR               0xDEADBEEF
+#define ALIGN(x, to_align) ((((unsigned long) x) + (to_align - 1)) & ~(to_align - 1))
 
 #ifndef ION_FLAG_CP_BITSTREAM
 #define ION_FLAG_CP_BITSTREAM 0
@@ -1800,6 +1800,14 @@
                 break;
             }
 
+        case OMX_QcomIndexParamVideoIPBQPRange:
+            {
+                OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE*) paramData;
+                DEBUG_PRINT_LOW("get_parameter: OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE");
+                memcpy(qp_range, &m_sSessionIPBQPRange, sizeof(m_sSessionIPBQPRange));
+                break;
+            }
+
         case OMX_IndexParamVideoErrorCorrection:
             {
                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
@@ -2580,7 +2588,7 @@
             m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
             m_pInput_pmem[i].offset = 0;
 
-            m_pInput_pmem[i].buffer = (OMX_U8 *)SECURE_BUFPTR;
+            m_pInput_pmem[i].buffer = NULL;
             if(!secure_session) {
                 m_pInput_pmem[i].buffer = (unsigned char *)mmap(
                     NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE,
@@ -2588,6 +2596,7 @@
 
                 if (m_pInput_pmem[i].buffer == MAP_FAILED) {
                     DEBUG_PRINT_ERROR("ERROR: mmap() Failed");
+                    m_pInput_pmem[i].buffer = NULL;
                     close(m_pInput_pmem[i].fd);
 #ifdef USE_ION
                     free_ion_memory(&m_pInput_ion[i]);
@@ -2772,7 +2781,7 @@
                 m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
                 m_pOutput_pmem[i].offset = 0;
 
-                m_pOutput_pmem[i].buffer = (OMX_U8 *)SECURE_BUFPTR;
+                m_pOutput_pmem[i].buffer = NULL;
                 if(!secure_session) {
 #ifdef _MSM8974_
                     m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,
@@ -2785,6 +2794,7 @@
 #endif
                     if (m_pOutput_pmem[i].buffer == MAP_FAILED) {
                         DEBUG_PRINT_ERROR("ERROR: mmap() Failed");
+                        m_pOutput_pmem[i].buffer = NULL;
                         close(m_pOutput_pmem[i].fd);
 #ifdef USE_ION
                         free_ion_memory(&m_pOutput_ion[i]);
@@ -3187,13 +3197,14 @@
         m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
         m_pInput_pmem[i].offset = 0;
 
-        m_pInput_pmem[i].buffer = (OMX_U8 *)SECURE_BUFPTR;
+        m_pInput_pmem[i].buffer = NULL;
         if(!secure_session) {
             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("ERROR: mmap FAILED= %d", errno);
+                m_pInput_pmem[i].buffer = NULL;
                 close(m_pInput_pmem[i].fd);
 #ifdef USE_ION
                 free_ion_memory(&m_pInput_ion[i]);
@@ -3204,6 +3215,11 @@
             //This should only be used for passing reference to source type and
             //secure handle fd struct native_handle_t*
             m_pInput_pmem[i].buffer = malloc(sizeof(OMX_U32) + sizeof(native_handle_t*));
+            if (m_pInput_pmem[i].buffer == NULL) {
+                DEBUG_PRINT_ERROR("%s: failed to allocate native-handle", __func__);
+                return OMX_ErrorInsufficientResources;
+            }
+            (*bufferHdr)->nAllocLen = sizeof(OMX_U32) + sizeof(native_handle_t*);
         }
 
         (*bufferHdr)->pBuffer           = (OMX_U8 *)m_pInput_pmem[i].buffer;
@@ -3319,7 +3335,7 @@
         if (i < m_sOutPortDef.nBufferCountActual) {
 #ifdef USE_ION
 #ifdef _MSM8974_
-            align_size = ((m_sOutPortDef.nBufferSize + 4095)/4096) * 4096;
+            align_size = ALIGN(m_sOutPortDef.nBufferSize, 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,
@@ -3349,7 +3365,9 @@
             m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
             m_pOutput_pmem[i].offset = 0;
 
-            m_pOutput_pmem[i].buffer = (OMX_U8 *)SECURE_BUFPTR;
+            m_pOutput_pmem[i].buffer = NULL;
+            *bufferHdr = (m_out_mem_ptr + i );
+
             if(!secure_session) {
 #ifdef _MSM8974_
                 m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,
@@ -3362,6 +3380,7 @@
 #endif
                 if (m_pOutput_pmem[i].buffer == MAP_FAILED) {
                     DEBUG_PRINT_ERROR("ERROR: MMAP_FAILED in o/p alloc buffer");
+                    m_pOutput_pmem[i].buffer = NULL;
                     close (m_pOutput_pmem[i].fd);
 #ifdef USE_ION
                     free_ion_memory(&m_pOutput_ion[i]);
@@ -3372,20 +3391,26 @@
             else {
                 //This should only be used for passing reference to source type and
                 //secure handle fd struct native_handle_t*
-                m_pOutput_pmem[i].buffer = malloc(sizeof(OMX_U32) + sizeof(native_handle_t*));
-                native_handle_t *handle = native_handle_create(1, 0);
+                native_handle_t *handle = native_handle_create(1, 3); //fd, offset, size, alloc length
                 if (!handle) {
                     DEBUG_PRINT_ERROR("ERROR: native handle creation failed");
                     return OMX_ErrorInsufficientResources;
                 }
+                m_pOutput_pmem[i].buffer = malloc(sizeof(output_metabuffer));
+                if (m_pOutput_pmem[i].buffer == NULL) {
+                    DEBUG_PRINT_ERROR("%s: Failed to allocate meta buffer", __func__);
+                    return OMX_ErrorInsufficientResources;
+                }
+                (*bufferHdr)->nAllocLen = sizeof(output_metabuffer);
                 handle->data[0] = m_pOutput_pmem[i].fd;
-                char *data = (char*) m_pOutput_pmem[i].buffer;
-                OMX_U32 type = 1;
-                memcpy(data, &type, sizeof(OMX_U32));
-                memcpy(data + sizeof(OMX_U32), &handle, sizeof(native_handle_t*));
+                handle->data[1] = 0;
+                handle->data[2] = 0;
+                handle->data[3] = ALIGN(m_sOutPortDef.nBufferSize, 4096);
+                output_metabuffer *buffer = (output_metabuffer*) m_pOutput_pmem[i].buffer;
+                buffer->type = 1;
+                buffer->nh = handle;
             }
 
-            *bufferHdr = (m_out_mem_ptr + i );
             (*bufferHdr)->pBuffer = (OMX_U8 *)m_pOutput_pmem[i].buffer;
             (*bufferHdr)->pAppPrivate = appData;
 
@@ -3846,9 +3871,9 @@
             post_event ((unsigned long)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 && m_pInput_pmem[nBufIndex].buffer)
 #else
-    if (input_use_buffer && !m_use_input_pmem)
+    if (input_use_buffer && !m_use_input_pmem && m_pInput_pmem[nBufIndex].buffer)
 #endif
     {
         DEBUG_PRINT_LOW("Heap UseBuffer case, so memcpy the data");
@@ -4387,6 +4412,12 @@
 
     pending_output_buffers--;
 
+    if (secure_session && m_pCallbacks.FillBufferDone) {
+        if (buffer->nFilledLen > 0)
+            m_fbd_count++;
+        m_pCallbacks.FillBufferDone (hComp,m_app_data,buffer);
+        return OMX_ErrorNone;
+    }
     if(!secure_session) {
         extra_data_handle.create_extra_data(buffer);
 #ifndef _MSM8974_
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
index 2443cd3..716d985 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
@@ -308,13 +308,21 @@
     m_sSessionQuantization.nQpB = 2;
 
     OMX_INIT_STRUCT(&m_sSessionQPRange, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
+    OMX_INIT_STRUCT(&m_sSessionIPBQPRange, OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE);
     m_sSessionQPRange.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+    m_sSessionIPBQPRange.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
     m_sSessionQPRange.minQP = 2;
-    if (codec_type == OMX_VIDEO_CodingAVC)
+    if (codec_type == OMX_VIDEO_CodingAVC) {
         m_sSessionQPRange.maxQP = 51;
-    else
+    } else {
         m_sSessionQPRange.maxQP = 31;
-
+    }
+    m_sSessionIPBQPRange.minIQP =
+                m_sSessionIPBQPRange.minPQP =
+                m_sSessionIPBQPRange.minBQP = m_sSessionQPRange.minQP;
+    m_sSessionIPBQPRange.maxIQP =
+                m_sSessionIPBQPRange.maxPQP =
+                m_sSessionIPBQPRange.maxBQP = m_sSessionQPRange.maxQP;
     OMX_INIT_STRUCT(&m_sAVCSliceFMO, OMX_VIDEO_PARAM_AVCSLICEFMO);
     m_sAVCSliceFMO.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
     m_sAVCSliceFMO.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
@@ -1160,6 +1168,28 @@
                 break;
             }
 
+        case OMX_QcomIndexParamVideoIPBQPRange:
+            {
+                DEBUG_PRINT_LOW("set_parameter: OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE");
+                OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE*) paramData;
+                if (qp_range->nPortIndex == PORT_INDEX_OUT) {
+                    if (handle->venc_set_param(paramData,
+                                (OMX_INDEXTYPE)OMX_QcomIndexParamVideoIPBQPRange) != true) {
+                        return OMX_ErrorUnsupportedSetting;
+                    }
+                    m_sSessionIPBQPRange.minIQP = qp_range->minIQP;
+                    m_sSessionIPBQPRange.maxIQP = qp_range->maxIQP;
+                    m_sSessionIPBQPRange.minPQP = qp_range->minPQP;
+                    m_sSessionIPBQPRange.maxPQP = qp_range->maxPQP;
+                    m_sSessionIPBQPRange.minBQP = qp_range->minBQP;
+                    m_sSessionIPBQPRange.maxBQP = qp_range->maxBQP;
+                } else {
+                    DEBUG_PRINT_ERROR("Unsupported port Index for IPB QP range setting");
+                    eRet = OMX_ErrorBadPortIndex;
+                }
+                break;
+            }
+
         case OMX_QcomIndexPortDefn:
             {
                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
@@ -2122,6 +2152,14 @@
                 memcpy(&m_blurInfo, pParam, sizeof(m_blurInfo));
                 break;
            }
+        case OMX_QcomIndexConfigH264Transform8x8:
+           {
+                if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QcomIndexConfigH264Transform8x8)) {
+                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigH264Transform8x8 failed");
+                    return OMX_ErrorUnsupportedSetting;
+                }
+                break;
+           }
         default:
             DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
             break;
@@ -2431,6 +2469,7 @@
     struct venc_msg *m_sVenc_msg = NULL;
     OMX_BUFFERHEADERTYPE* omxhdr = NULL;
     struct venc_buffer *temp_buff = NULL;
+    native_handle_t *nh = NULL;
 
     if (context == NULL || message == NULL) {
         DEBUG_PRINT_ERROR("ERROR: omx_venc::async_message_process invalid i/p params");
@@ -2502,7 +2541,7 @@
 
             if ( (omxhdr != NULL) &&
                     ((OMX_U32)(omxhdr - omx->m_out_mem_ptr)  < omx->m_sOutPortDef.nBufferCountActual)) {
-                if (m_sVenc_msg->buf.len <=  omxhdr->nAllocLen) {
+                if (!omx->is_secure_session() && (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;
@@ -2510,12 +2549,20 @@
                     omxhdr->nFlags = m_sVenc_msg->buf.flags;
 
                     /*Use buffer case*/
-                    if (omx->output_use_buffer && !omx->m_use_output_pmem) {
+                    if (omx->output_use_buffer && !omx->m_use_output_pmem && !omx->is_secure_session()) {
                         DEBUG_PRINT_LOW("memcpy() for o/p Heap UseBuffer");
                         memcpy(omxhdr->pBuffer,
                                 (m_sVenc_msg->buf.ptrbuffer),
                                 m_sVenc_msg->buf.len);
                     }
+                } else if (omx->is_secure_session()) {
+                    output_metabuffer *meta_buf = (output_metabuffer *)(omxhdr->pBuffer);
+                    native_handle_t *nh = meta_buf->nh;
+                    nh->data[1] = m_sVenc_msg->buf.offset;
+                    nh->data[2] = m_sVenc_msg->buf.len;
+                    omxhdr->nFilledLen = sizeof(output_metabuffer);
+                    omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
+                    omxhdr->nFlags = m_sVenc_msg->buf.flags;
                 } else {
                     omxhdr->nFilledLen = 0;
                 }
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
index 958165d..5f2a48c 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
@@ -270,6 +270,7 @@
     color_format = 0;
     hw_overload = false;
     mBatchSize = 0;
+    deinterlace_enabled = false;
     pthread_mutex_init(&pause_resume_mlock, NULL);
     pthread_cond_init(&pause_resume_cond, NULL);
     memset(&input_extradata_info, 0, sizeof(input_extradata_info));
@@ -287,6 +288,7 @@
     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(&session_ipb_qp_values, 0, sizeof(session_ipb_qp_values));
     memset(&entropy, 0, sizeof(entropy));
     memset(&dbkfilter, 0, sizeof(dbkfilter));
     memset(&intra_refresh, 0, sizeof(intra_refresh));
@@ -660,7 +662,7 @@
     height = ALIGN(m_sVenc_cfg.input_height, 32);
     width = ALIGN(m_sVenc_cfg.input_width, 32);
 
-    index = venc_get_index_from_fd(fd);
+    index = venc_get_index_from_fd(input_extradata_info.m_ion_dev,fd);
 
     unsigned char *pVirt;
     int size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
@@ -900,6 +902,7 @@
             venc_handle->free_ion_memory(&extradata_info->ion);
             return OMX_ErrorInsufficientResources;
         }
+        extradata_info->m_ion_dev = open("/dev/ion", O_RDONLY);
     }
 
 #endif
@@ -916,6 +919,8 @@
         close(output_extradata_info.ion.fd_ion_data.fd);
         venc_handle->free_ion_memory(&output_extradata_info.ion);
     }
+    if (output_extradata_info.m_ion_dev)
+        close(output_extradata_info.m_ion_dev);
 
     memset(&output_extradata_info, 0, sizeof(output_extradata_info));
     output_extradata_info.ion.fd_ion_data.fd = -1;
@@ -926,6 +931,9 @@
         venc_handle->free_ion_memory(&input_extradata_info.ion);
     }
 
+    if (input_extradata_info.m_ion_dev)
+        close(output_extradata_info.m_ion_dev);
+
     memset(&input_extradata_info, 0, sizeof(input_extradata_info));
     input_extradata_info.ion.fd_ion_data.fd = -1;
 
@@ -939,6 +947,11 @@
 
 int venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len)
 {
+    if (venc_handle->is_secure_session()) {
+        DEBUG_PRINT_ERROR("logging secure output buffers is not allowed!");
+        return -1;
+    }
+
     if (!m_debug.outfile) {
         int size = 0;
         if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
@@ -1023,6 +1036,11 @@
 
 int venc_dev::venc_input_log_buffers(OMX_BUFFERHEADERTYPE *pbuffer, int fd, int plane_offset,
         unsigned long inputformat) {
+    if (venc_handle->is_secure_session()) {
+        DEBUG_PRINT_ERROR("logging secure input buffers is not allowed!");
+        return -1;
+    }
+
     if (!m_debug.infile) {
         int size = snprintf(m_debug.infile_name, PROPERTY_VALUE_MAX, "%s/input_enc_%lu_%lu_%p.yuv",
                             m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
@@ -1194,6 +1212,12 @@
     }
     session_qp_values.minqp = session_qp_range.minqp;
     session_qp_values.maxqp = session_qp_range.maxqp;
+    session_ipb_qp_values.min_i_qp = session_qp_range.minqp;
+    session_ipb_qp_values.max_i_qp = session_qp_range.maxqp;
+    session_ipb_qp_values.min_p_qp = session_qp_range.minqp;
+    session_ipb_qp_values.max_p_qp = session_qp_range.maxqp;
+    session_ipb_qp_values.min_b_qp = session_qp_range.minqp;
+    session_ipb_qp_values.max_b_qp = session_qp_range.maxqp;
 
     int ret;
     ret = subscribe_to_events(m_nDriver_fd);
@@ -1363,6 +1387,7 @@
 
     input_extradata_info.port_index = OUTPUT_PORT;
     output_extradata_info.port_index = CAPTURE_PORT;
+
     return true;
 }
 
@@ -1938,7 +1963,7 @@
                     DEBUG_PRINT_ERROR("ERROR: Failed to set vpx error resilience");
                     return false;
                  }
-                if(!venc_set_ltrmode(1, 1)) {
+                if(!venc_set_ltrmode(1, ltrinfo.count)) {
                    DEBUG_PRINT_ERROR("ERROR: Failed to enable ltrmode");
                    return false;
                 }
@@ -2082,6 +2107,48 @@
 
                 break;
             }
+        case OMX_QcomIndexParamVideoIPBQPRange:
+            {
+                DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoIPBQPRange");
+                OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp =
+                    (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *)paramData;
+                OMX_U32 min_IPB_packed_QP = 0;
+                OMX_U32 max_IPB_packed_QP = 0;
+                 if (((qp->minIQP >= session_qp_range.minqp) && (qp->maxIQP <= session_qp_range.maxqp)) &&
+                          ((qp->minPQP >= session_qp_range.minqp) && (qp->maxPQP <= session_qp_range.maxqp)) &&
+                          ((qp->minBQP >= session_qp_range.minqp) && (qp->maxBQP <= session_qp_range.maxqp))) {
+
+                        /* When creating the packet, pack the qp value as
+                         * 0xbbppii, where ii = qp range for I-frames,
+                         * pp = qp range for P-frames, etc. */
+                       min_IPB_packed_QP = qp->minIQP | qp->minPQP << 8 | qp->minBQP << 16;
+                       max_IPB_packed_QP = qp->maxIQP | qp->maxPQP << 8 | qp->maxBQP << 16;
+
+                       if (qp->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
+                           if (venc_set_session_qp_range_packed(min_IPB_packed_QP,
+                                       max_IPB_packed_QP) == false) {
+                               DEBUG_PRINT_ERROR("ERROR: Setting IPB QP Range[%d %d] failed",
+                                   min_IPB_packed_QP, max_IPB_packed_QP);
+                               return false;
+                           } else {
+                               session_ipb_qp_values.min_i_qp = qp->minIQP;
+                               session_ipb_qp_values.max_i_qp = qp->maxIQP;
+                               session_ipb_qp_values.min_p_qp = qp->minPQP;
+                               session_ipb_qp_values.max_p_qp = qp->maxPQP;
+                               session_ipb_qp_values.min_b_qp = qp->minBQP;
+                               session_ipb_qp_values.max_b_qp = qp->maxBQP;
+                           }
+                       } else {
+                           DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoIPBQPRange");
+                       }
+                } else {
+                    DEBUG_PRINT_ERROR("Wrong qp values: IQP range[%u %u], PQP range[%u,%u], BQP[%u,%u] range allowed range[%u %u]",
+                           (unsigned int)qp->minIQP, (unsigned int)qp->maxIQP , (unsigned int)qp->minPQP,
+                           (unsigned int)qp->maxPQP, (unsigned int)qp->minBQP, (unsigned int)qp->maxBQP,
+                           (unsigned int)session_qp_range.minqp, (unsigned int)session_qp_range.maxqp);
+                }
+                break;
+            }
         case OMX_QcomIndexEnableSliceDeliveryMode:
             {
                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
@@ -2212,7 +2279,7 @@
                 // Disable ltr if hier-p is enabled.
                 if (m_codec == OMX_VIDEO_CodingVP8) {
                     DEBUG_PRINT_LOW("Disable LTR as HIER-P is being set");
-                    if(!venc_set_ltrmode(0, 1)) {
+                    if(!venc_set_ltrmode(0, 0)) {
                          DEBUG_PRINT_ERROR("ERROR: Failed to disable ltrmode");
                      }
                 }
@@ -2479,11 +2546,12 @@
                     DEBUG_PRINT_ERROR("ERROR: Rotation is not supported with deinterlacing");
                     return false;
                 }
-                DEBUG_PRINT_HIGH("venc_set_config: updating the new Dims");
-                nFrameWidth = m_sVenc_cfg.dvs_width;
-                m_sVenc_cfg.dvs_width  = m_sVenc_cfg.dvs_height;
-                m_sVenc_cfg.dvs_height = nFrameWidth;
-
+                if (config_rotation->nRotation == 90 || config_rotation->nRotation == 270) {
+                    DEBUG_PRINT_HIGH("venc_set_config: updating the new Dims");
+                    nFrameWidth = m_sVenc_cfg.dvs_width;
+                    m_sVenc_cfg.dvs_width  = m_sVenc_cfg.dvs_height;
+                    m_sVenc_cfg.dvs_height = nFrameWidth;
+                }
                 if(venc_set_vpe_rotation(config_rotation->nRotation) == false) {
                     DEBUG_PRINT_ERROR("ERROR: Dimension Change for Rotation failed");
                     return false;
@@ -2683,6 +2751,16 @@
              }
              break;
         }
+        case OMX_QcomIndexConfigH264Transform8x8:
+        {
+            OMX_CONFIG_BOOLEANTYPE *pEnable = (OMX_CONFIG_BOOLEANTYPE *) configData;
+            DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigH264Transform8x8");
+            if (venc_h264_transform_8x8(pEnable->bEnabled) == false) {
+                DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigH264Transform8x8");
+                return false;
+            }
+            break;
+        }
         default:
             DEBUG_PRINT_ERROR("Unsupported config index = %u", index);
             break;
@@ -3108,7 +3186,7 @@
         buf.length = num_input_planes;
 
 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-            extradata_index = venc_get_index_from_fd(pmem_tmp->fd);
+            extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev, pmem_tmp->fd);
             if (extradata_index < 0 ) {
                 DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", pmem_tmp->fd);
                 return OMX_ErrorBadParameter;
@@ -3491,7 +3569,7 @@
     extra_idx = EXTRADATA_IDX(num_input_planes);
 
     if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
-        int extradata_index = venc_get_index_from_fd(fd);
+        int extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev,fd);
         if (extradata_index < 0 ) {
                 DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", fd);
                 return OMX_ErrorBadParameter;
@@ -3718,6 +3796,12 @@
     buf.length = num_output_planes;
     buf.flags = 0;
 
+    if (venc_handle->is_secure_session()) {
+        output_metabuffer *meta_buf = (output_metabuffer *)(bufhdr->pBuffer);
+        native_handle_t *handle_t = meta_buf->nh;
+        plane[0].length = handle_t->data[3];
+    }
+
     if (mBatchSize) {
         // Should always mark first buffer as DEFER, since 0 % anything is 0, just offset by 1
         // This results in the first batch being of size mBatchSize + 1, but thats good because
@@ -3809,21 +3893,29 @@
     return true;
 }
 
-int venc_dev::venc_get_index_from_fd(OMX_U32 fd)
+int venc_dev::venc_get_index_from_fd(OMX_U32 ion_fd, OMX_U32 buffer_fd)
 {
-    unsigned int i = 0;
-    for (;i < 64; i++) {
-        if (fd_list[i] == fd) {
+    unsigned int cookie = buffer_fd;
+    struct ion_fd_data fdData;
+
+    memset(&fdData, 0, sizeof(fdData));
+    fdData.fd = buffer_fd;
+    if (ion_fd && !ioctl(ion_fd, ION_IOC_IMPORT, &fdData)) {
+        cookie = fdData.handle;
+    }
+
+    for (int i = 0; i < 64; i++) {
+        if (fd_list[i] == cookie) {
             DEBUG_PRINT_HIGH("FD is present at index = %d", i);
             return i;
         }
     }
-    for (i = 0;i < 64; i++)
+    for (int i = 0; i < 64; i++)
         if (fd_list[i] == 0) {
             DEBUG_PRINT_HIGH("FD added at index = %d", i);
-            fd_list[i] = fd;
+            fd_list[i] = cookie;
             return i;
-    }
+        }
     return -EINVAL;
 }
 
@@ -4153,6 +4245,36 @@
     return true;
 }
 
+bool venc_dev::venc_set_session_qp_range_packed(OMX_U32 min_qp, OMX_U32 max_qp)
+{
+    int rc;
+    struct v4l2_control control;
+
+    control.id = V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED;
+    control.value = min_qp;
+
+    DEBUG_PRINT_LOW("Calling IOCTL set MIN_QP_PACKED control id=%d, val=%d",
+            control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control");
+        return false;
+    }
+
+    control.id = V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED;
+    control.value = max_qp;
+
+    DEBUG_PRINT_LOW("Calling IOCTL set MAX_QP_PACKED control id=%d, val=%d",
+            control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control");
+        return false;
+    }
+
+    return true;
+}
+
 bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
 {
     struct venc_profile requested_profile = {0};
@@ -5649,7 +5771,7 @@
     int rc = 0;
     control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
 
-    switch (eControlRate) {
+    switch ((OMX_U32)eControlRate) {
         case OMX_Video_ControlRateDisable:
             control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
             break;
@@ -5673,6 +5795,16 @@
                 control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR :
                 status = false;
             break;
+        case QOMX_Video_ControlRateMaxBitrate:
+            (supported_rc_modes & RC_MBR_CFR) ?
+                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR:
+                status = false;
+            break;
+        case QOMX_Video_ControlRateMaxBitrateSkipFrames:
+            (supported_rc_modes & RC_MBR_VFR) ?
+                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR:
+                status = false;
+            break;
         default:
             status = false;
             break;
@@ -6054,6 +6186,25 @@
 
 }
 
+bool venc_dev::venc_h264_transform_8x8(OMX_BOOL enable)
+{
+    struct v4l2_control control;
+
+    control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8;
+    if (enable)
+        control.value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE;
+    else
+        control.value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE;
+
+    DEBUG_PRINT_LOW("Set h264_transform_8x8 mode: %d", control.value);
+    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
+        DEBUG_PRINT_ERROR("set control: H264 transform 8x8 failed");
+        return false;
+    }
+
+    return true;
+}
+
 bool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
 {
     bool status = true;