hardware/qcom/media: Initial commit

- Includes modules : libstagefrighthw, mm-core, mm-video
- libstagefrighthw: Adds OMX plugins for QCom component
- mm-core: Registers QCom component
- mm-video: Decoder and encoder component

Change-Id: I3ba599ac1c8652dc5fc2f3825f6e6ab8047be347
diff --git a/mm-video/vidc/venc/Android.mk b/mm-video/vidc/venc/Android.mk
new file mode 100755
index 0000000..d2dfe40
--- /dev/null
+++ b/mm-video/vidc/venc/Android.mk
@@ -0,0 +1,133 @@
+ifneq ($(BUILD_TINY_ANDROID),true)
+
+ROOT_DIR := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_PATH:= $(ROOT_DIR)
+
+# ---------------------------------------------------------------------------------
+# 				Common definitons
+# ---------------------------------------------------------------------------------
+
+libmm-venc-def := -g -O3 -Dlrintf=_ffix_r
+libmm-venc-def += -D__align=__alignx
+libmm-venc-def += -D__alignx\(x\)=__attribute__\(\(__aligned__\(x\)\)\)
+libmm-venc-def += -DT_ARM
+libmm-venc-def += -Dinline=__inline
+libmm-venc-def += -D_ANDROID_
+libmm-venc-def += -UENABLE_DEBUG_LOW
+libmm-venc-def += -DENABLE_DEBUG_HIGH
+libmm-venc-def += -DENABLE_DEBUG_ERROR
+libmm-venc-def += -UINPUT_BUFFER_LOG
+libmm-venc-def += -UOUTPUT_BUFFER_LOG
+libmm-venc-def += -USINGLE_ENCODER_INSTANCE
+ifeq ($(TARGET_BOARD_PLATFORM),msm8660)
+libmm-venc-def += -DMAX_RES_1080P
+endif
+ifeq ($(TARGET_BOARD_PLATFORM),msm8960)
+libmm-venc-def += -DMAX_RES_1080P
+libmm-venc-def += -DMAX_RES_1080P_EBI
+endif
+ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
+libmm-venc-def += -DMAX_RES_1080P
+libmm-venc-def += -DMAX_RES_1080P_EBI
+libmm-venc-def += -DBADGER
+endif
+ifeq ($(TARGET_USES_ION),true)
+libmm-venc-def += -DUSE_ION
+endif
+libmm-venc-def += -D_ANDROID_ICS_
+# ---------------------------------------------------------------------------------
+# 			Make the Shared library (libOmxVenc)
+# ---------------------------------------------------------------------------------
+
+include $(CLEAR_VARS)
+
+libmm-venc-inc      := bionic/libc/include
+libmm-venc-inc      += bionic/libstdc++/include
+libmm-venc-inc      := $(LOCAL_PATH)/inc
+libmm-venc-inc      += $(OMX_VIDEO_PATH)/vidc/common/inc
+libmm-venc-inc      += hardware/qcom/media/mm-core/inc
+#libmm-venc-inc      += bionic/libc/kernel/common/linux
+libmm-venc-inc      += hardware/qcom/media/libstagefrighthw
+libmm-venc-inc      += hardware/qcom/display/libgralloc
+libmm-venc-inc      += frameworks/native/include/media/hardware
+libmm-venc-inc      += frameworks/native/include/media/openmax
+
+
+LOCAL_MODULE                    := libOmxVenc
+LOCAL_MODULE_TAGS               := optional
+LOCAL_CFLAGS                    := $(libmm-venc-def)
+LOCAL_C_INCLUDES                := $(libmm-venc-inc)
+
+LOCAL_PRELINK_MODULE      := false
+LOCAL_SHARED_LIBRARIES    := liblog libutils libbinder libcutils
+
+LOCAL_SRC_FILES   := src/omx_video_base.cpp
+LOCAL_SRC_FILES   += src/omx_video_encoder.cpp
+ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
+LOCAL_SRC_FILES   += src/video_encoder_device_copper.cpp
+else
+LOCAL_SRC_FILES   += src/video_encoder_device.cpp
+endif
+
+
+LOCAL_SRC_FILES   += ../common/src/extra_data_handler.cpp
+
+include $(BUILD_SHARED_LIBRARY)
+
+# -----------------------------------------------------------------------------
+#  #                       Make the apps-test (mm-venc-omx-test720p)
+# -----------------------------------------------------------------------------
+
+include $(CLEAR_VARS)
+
+mm-venc-test720p-inc            := $(TARGET_OUT_HEADERS)/mm-core
+mm-venc-test720p-inc            += $(LOCAL_PATH)/inc
+mm-venc-test720p-inc            += $(OMX_VIDEO_PATH)/vidc/common/inc
+mm-venc-test720p-inc            += hardware/qcom/media/mm-core/inc
+mm-venc-test720p-inc            += hardware/qcom/display/libgralloc
+
+LOCAL_MODULE                    := mm-venc-omx-test720p
+LOCAL_MODULE_TAGS               := optional
+LOCAL_CFLAGS                    := $(libmm-venc-def)
+LOCAL_C_INCLUDES                := $(mm-venc-test720p-inc)
+#LOCAL_ADDITIONAL_DEPENDENCIES   := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
+LOCAL_PRELINK_MODULE            := false
+LOCAL_SHARED_LIBRARIES          := libmm-omxcore libOmxVenc libbinder
+
+LOCAL_SRC_FILES                 := test/venc_test.cpp
+LOCAL_SRC_FILES                 += test/camera_test.cpp
+LOCAL_SRC_FILES                 += test/venc_util.c
+LOCAL_SRC_FILES                 += test/fb_test.c
+
+include $(BUILD_EXECUTABLE)
+
+# -----------------------------------------------------------------------------
+# 			Make the apps-test (mm-video-driver-test)
+# -----------------------------------------------------------------------------
+
+include $(CLEAR_VARS)
+
+venc-test-inc                   += $(LOCAL_PATH)/inc
+venc-test-inc                   += hardware/qcom/display/libgralloc
+
+LOCAL_MODULE                    := mm-video-encdrv-test
+LOCAL_MODULE_TAGS               := optional
+LOCAL_C_INCLUDES                := $(venc-test-inc)
+LOCAL_C_INCLUDES                += hardware/qcom/media/mm-core/inc
+
+#LOCAL_ADDITIONAL_DEPENDENCIES   := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
+LOCAL_PRELINK_MODULE            := false
+
+LOCAL_SRC_FILES                 := test/video_encoder_test.c
+LOCAL_SRC_FILES                 += test/queue.c
+
+include $(BUILD_EXECUTABLE)
+
+endif #BUILD_TINY_ANDROID
+
+# ---------------------------------------------------------------------------------
+# 					END
+# ---------------------------------------------------------------------------------
+
diff --git a/mm-video/vidc/venc/inc/camera_test.h b/mm-video/vidc/venc/inc/camera_test.h
new file mode 100755
index 0000000..f206c61
--- /dev/null
+++ b/mm-video/vidc/venc/inc/camera_test.h
@@ -0,0 +1,58 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/inc/fb_test.h b/mm-video/vidc/venc/inc/fb_test.h
new file mode 100755
index 0000000..1ebc76a
--- /dev/null
+++ b/mm-video/vidc/venc/inc/fb_test.h
@@ -0,0 +1,48 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/inc/omx_video_base.h b/mm-video/vidc/venc/inc/omx_video_base.h
new file mode 100755
index 0000000..b7f8ffd
--- /dev/null
+++ b/mm-video/vidc/venc/inc/omx_video_base.h
@@ -0,0 +1,559 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. 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 Code Aurora 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_VIDEO_BASE_H__
+#define __OMX_VIDEO_BASE_H__
+/*============================================================================
+                            O p e n M A X   Component
+                                Video Encoder
+
+*//** @file comx_video_base.h
+  This module contains the class definition for openMAX decoder component.
+
+*//*========================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+//                             Include Files
+//////////////////////////////////////////////////////////////////////////////
+
+#include<stdlib.h>
+#include <stdio.h>
+#include <sys/mman.h>
+#ifdef _ANDROID_
+  #include <binder/MemoryHeapBase.h>
+#ifdef _ANDROID_ICS_
+  #include "QComOMXMetadata.h"
+#endif
+#endif // _ANDROID_
+#include <pthread.h>
+#include <semaphore.h>
+#include <linux/msm_vidc_enc.h>
+#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
+#include "qc_omx_component.h"
+#include "omx_video_common.h"
+#include "extra_data_handler.h"
+#include <linux/videodev2.h>
+
+#ifdef _ANDROID_
+using namespace android;
+// local pmem heap object
+class VideoHeap : public MemoryHeapBase
+{
+public:
+  VideoHeap(int fd, size_t size, void* base);
+  virtual ~VideoHeap() {}
+};
+
+#include <utils/Log.h>
+#define LOG_TAG "OMX-VENC-720p"
+#ifdef ENABLE_DEBUG_LOW
+#define DEBUG_PRINT_LOW ALOGV
+#else
+#define DEBUG_PRINT_LOW
+#endif
+#ifdef ENABLE_DEBUG_HIGH
+#define DEBUG_PRINT_HIGH  ALOGV
+#else
+#define DEBUG_PRINT_HIGH
+#endif
+#ifdef ENABLE_DEBUG_ERROR
+#define DEBUG_PRINT_ERROR ALOGE
+#else
+#define DEBUG_PRINT_ERROR
+#endif
+
+#else //_ANDROID_
+#define DEBUG_PRINT_LOW
+#define DEBUG_PRINT_HIGH
+#define DEBUG_PRINT_ERROR
+#endif // _ANDROID_
+
+#ifdef USE_ION
+    static const char* MEM_DEVICE = "/dev/ion";
+    #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
+#elif MAX_RES_720P
+static const char* MEM_DEVICE = "/dev/pmem_adsp";
+#elif MAX_RES_1080P_EBI
+static const char* MEM_DEVICE  = "/dev/pmem_adsp";
+#elif MAX_RES_1080P
+static const char* MEM_DEVICE = "/dev/pmem_smipool";
+#else
+#error MEM_DEVICE cannot be determined.
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//                       Module specific globals
+//////////////////////////////////////////////////////////////////////////////
+
+#define OMX_SPEC_VERSION  0x00000101
+
+
+//////////////////////////////////////////////////////////////////////////////
+//               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)
+
+// BitMask Management logic
+#define BITS_PER_BYTE        32
+#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
+#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))
+#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(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)
+#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)
+#ifdef _ANDROID_ICS_
+#define MAX_NUM_INPUT_BUFFERS 32
+#endif
+void* message_thread(void *);
+// OMX video class
+class omx_video: public qc_omx_component
+{
+protected:
+#ifdef _ANDROID_ICS_
+  bool meta_mode_enable;
+  encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
+  OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
+  bool mUseProxyColorFormat;
+#endif
+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);
+
+  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_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_stop_done(void) = 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 _ANDROID_ICS_
+  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_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 fill_this_buffer(
+                                OMX_HANDLETYPE hComp,
+                                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_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_parameter(OMX_HANDLETYPE hComp,
+                              OMX_INDEXTYPE  paramIndex,
+                              OMX_PTR        paramData);
+
+  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 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_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_EGL_image(OMX_HANDLETYPE     hComp,
+                              OMX_BUFFERHEADERTYPE **bufferHdr,
+                              OMX_U32              port,
+                              OMX_PTR              appData,
+                              void *               eglImage);
+
+
+
+  int  m_pipe_in;
+  int  m_pipe_out;
+
+  pthread_t msg_thread_id;
+  pthread_t async_thread_id;
+
+  OMX_U8 m_nkind[128];
+
+
+  //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;
+#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,
+
+  };
+
+  // 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
+  };
+
+  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;
+
+    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);
+
+  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);
+#ifdef _ANDROID_ICS_
+  OMX_ERRORTYPE allocate_input_meta_buffer(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 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);
+
+  bool execute_omx_flush(OMX_U32);
+  bool execute_output_flush(void);
+  bool execute_input_flush(void);
+  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_this_buffer_proxy(OMX_HANDLETYPE       hComp,
+                                       OMX_BUFFERHEADERTYPE *buffer);
+  bool release_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);
+    }
+  }
+
+  void complete_pending_buffer_done_cbs();
+
+  //*************************************************************
+  //*******************MEMBER VARIABLES *************************
+  //*************************************************************
+
+  pthread_mutex_t       m_lock;
+  sem_t                 m_cmd_lock;
+  bool              m_error_propogated;
+
+  //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_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
+  QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
+  OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
+  OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
+  OMX_U32 m_sExtraData;
+  OMX_U32 m_sDebugSliceinfo;
+
+  // 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;
+
+  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;
+#ifdef _ANDROID_
+  // 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;
+
+private:
+#ifdef USE_ION
+  int alloc_map_ion_memory(int size,struct ion_allocation_data *alloc_data,
+                                    struct ion_fd_data *fd_data,int flag);
+  void free_ion_memory(struct venc_ion *buf_ion_info);
+#endif
+};
+
+#endif // __OMX_VIDEO_BASE_H__
diff --git a/mm-video/vidc/venc/inc/omx_video_common.h b/mm-video/vidc/venc/inc/omx_video_common.h
new file mode 100755
index 0000000..b57a9fa
--- /dev/null
+++ b/mm-video/vidc/venc/inc/omx_video_common.h
@@ -0,0 +1,85 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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_VIDEO_COMMON_H__
+#define __OMX_VIDEO_COMMON_H__
+//////////////////////////////////////////////////////////////////////////////
+//                             Include Files
+//////////////////////////////////////////////////////////////////////////////
+
+#include<stdlib.h>
+#include <stdio.h>
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
+
+#define OMX_VIDEO_DEC_NUM_INPUT_BUFFERS   2
+#define OMX_VIDEO_DEC_NUM_OUTPUT_BUFFERS  2
+
+#ifdef FEATURE_QTV_WVGA_ENABLE
+#define OMX_VIDEO_DEC_INPUT_BUFFER_SIZE   (256*1024)
+#else
+#define OMX_VIDEO_DEC_INPUT_BUFFER_SIZE   (128*1024)
+#endif
+
+#define OMX_CORE_CONTROL_CMDQ_SIZE   100
+#define OMX_CORE_QCIF_HEIGHT         144
+#define OMX_CORE_QCIF_WIDTH          176
+#define OMX_CORE_VGA_HEIGHT          480
+#define OMX_CORE_VGA_WIDTH           640
+#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
+};
+
+struct pmem
+{
+  void *buffer;
+  int fd;
+  unsigned offset;
+  unsigned size;
+};
+#ifdef USE_ION
+struct venc_ion
+{
+    int ion_device_fd;
+    struct ion_fd_data fd_ion_data;
+    struct ion_allocation_data ion_alloc_data;
+};
+#endif
+#endif // __OMX_VIDEO_COMMON_H__
+
+
+
+
diff --git a/mm-video/vidc/venc/inc/omx_video_encoder.h b/mm-video/vidc/venc/inc/omx_video_encoder.h
new file mode 100755
index 0000000..4404553
--- /dev/null
+++ b/mm-video/vidc/venc/inc/omx_video_encoder.h
@@ -0,0 +1,83 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. 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 Code Aurora 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__H
+#define __OMX_VENC__H
+
+#include <unistd.h>
+#include "omx_video_base.h"
+#ifdef _COPPER_
+#include "video_encoder_device_copper.h"
+#else
+#include "video_encoder_device.h"
+#endif
+
+extern "C" {
+  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;
+
+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_stop_done(void);
+  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);
+};
+
+#endif //__OMX_VENC__H
diff --git a/mm-video/vidc/venc/inc/queue.h b/mm-video/vidc/venc/inc/queue.h
new file mode 100755
index 0000000..39c656a
--- /dev/null
+++ b/mm-video/vidc/venc/inc/queue.h
@@ -0,0 +1,80 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/inc/venc_util.h b/mm-video/vidc/venc/inc/venc_util.h
new file mode 100755
index 0000000..1062591
--- /dev/null
+++ b/mm-video/vidc/venc/inc/venc_util.h
@@ -0,0 +1,53 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/inc/video_encoder_device.h b/mm-video/vidc/venc/inc/video_encoder_device.h
new file mode 100755
index 0000000..25df71f
--- /dev/null
+++ b/mm-video/vidc/venc/inc/video_encoder_device.h
@@ -0,0 +1,161 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2012, Code Aurora Forum. 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 Code Aurora 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_stop_done(void);

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

+  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_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;

+

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

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

+#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/vidc/venc/inc/video_encoder_device_copper.h b/mm-video/vidc/venc/inc/video_encoder_device_copper.h
new file mode 100755
index 0000000..0089cce
--- /dev/null
+++ b/mm-video/vidc/venc/inc/video_encoder_device_copper.h
@@ -0,0 +1,288 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2012, Code Aurora Forum. 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 Code Aurora 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 "omx_video_base.h"

+#include "omx_video_encoder.h"

+#include <linux/videodev2.h>

+#include <poll.h>

+#define TIMEOUT 5000

+#define MAX_RECON_BUFFERS 4

+

+void* async_venc_message_thread (void *);

+

+struct msm_venc_switch{

+	unsigned char	status;

+};

+

+struct msm_venc_allocatorproperty{

+	unsigned long	 mincount;

+	unsigned long	 maxcount;

+	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_profile{

+	unsigned long	profile;

+};

+struct msm_venc_profilelevel{

+	unsigned long	level;

+};

+

+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_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_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_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_multiclicecfg{

+	unsigned long	mslice_mode;

+	unsigned long	mslice_size;

+};

+

+struct msm_venc_bufferflush{

+	unsigned long	flush_mode;

+};

+

+struct msm_venc_ratectrlcfg{

+	unsigned long	rcmode;

+};

+

+struct	msm_venc_voptimingcfg{

+	unsigned long	voptime_resolution;

+};

+struct msm_venc_framerate{

+	unsigned long	fps_denominator;

+	unsigned long	fps_numerator;

+};

+

+struct msm_venc_targetbitrate{

+	unsigned long	target_bitrate;

+};

+

+

+struct msm_venc_rotation{

+	unsigned long	rotation;

+};

+

+struct msm_venc_timeout{

+	 unsigned long	millisec;

+};

+

+struct msm_venc_headerextension{

+	 unsigned long	header_extension;

+};

+

+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_stop_done(void);

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

+  OMX_U32 m_nDriver_fd;

+  bool m_profile_set;

+  bool m_level_set;

+  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 etb_count;

+  class omx_venc *venc_handle;

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

+

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

+#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

+};

+

+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,

+};

+#endif

diff --git a/mm-video/vidc/venc/inc/video_encoder_test.h b/mm-video/vidc/venc/inc/video_encoder_test.h
new file mode 100755
index 0000000..1462db0
--- /dev/null
+++ b/mm-video/vidc/venc/inc/video_encoder_test.h
@@ -0,0 +1,76 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/src/omx_video_base.cpp b/mm-video/vidc/venc/src/omx_video_base.cpp
new file mode 100755
index 0000000..21d3e33
--- /dev/null
+++ b/mm-video/vidc/venc/src/omx_video_base.cpp
@@ -0,0 +1,4272 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2012, Code Aurora Forum. 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 Code Aurora 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.

+--------------------------------------------------------------------------*/

+/*============================================================================

+                            O p e n M A X   w r a p p e r s

+                             O p e n  M A X   C o r e

+

+*//** @file omx_video_base.cpp

+  This module contains the implementation of the OpenMAX core & component.

+

+*//*========================================================================*/

+

+//////////////////////////////////////////////////////////////////////////////

+//                             Include Files

+//////////////////////////////////////////////////////////////////////////////

+

+#include <string.h>

+#include "omx_video_base.h"

+#include <stdlib.h>

+#include <errno.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/prctl.h>

+#ifdef _ANDROID_ICS_

+#include <media/hardware/HardwareAPI.h>

+#include <gralloc_priv.h>

+#endif

+#ifndef _ANDROID_

+#include <glib.h>

+#define strlcpy g_strlcpy

+#endif

+#define H264_SUPPORTED_WIDTH (480)

+#define H264_SUPPORTED_HEIGHT (368)

+

+#define MPEG4_SUPPORTED_WIDTH (480)

+#define MPEG4_SUPPORTED_HEIGHT (368)

+

+#define VC1_SP_MP_START_CODE        0xC5000000

+#define VC1_SP_MP_START_CODE_MASK   0xFF000000

+#define VC1_AP_START_CODE           0x00000100

+#define VC1_AP_START_CODE_MASK      0xFFFFFF00

+#define VC1_STRUCT_C_PROFILE_MASK   0xF0

+#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000

+#define VC1_SIMPLE_PROFILE          0

+#define VC1_MAIN_PROFILE            1

+#define VC1_ADVANCE_PROFILE         3

+#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0

+#define VC1_SIMPLE_PROFILE_MED_LEVEL  2

+#define VC1_STRUCT_C_LEN            4

+#define VC1_STRUCT_C_POS            8

+#define VC1_STRUCT_A_POS            12

+#define VC1_STRUCT_B_POS            24

+#define VC1_SEQ_LAYER_SIZE          36

+

+typedef struct OMXComponentCapabilityFlagsType

+{

+    ////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS

+    OMX_BOOL iIsOMXComponentMultiThreaded;

+    OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;

+    OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;

+    OMX_BOOL iOMXComponentSupportsMovableInputBuffers;

+    OMX_BOOL iOMXComponentSupportsPartialFrames;

+    OMX_BOOL iOMXComponentUsesNALStartCodes;

+    OMX_BOOL iOMXComponentCanHandleIncompleteFrames;

+    OMX_BOOL iOMXComponentUsesFullAVCFrames;

+

+} OMXComponentCapabilityFlagsType;

+#define OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347

+

+#ifdef OUTPUT_BUFFER_LOG

+extern FILE *outputBufferFile1;

+#endif

+

+void* message_thread(void *input)

+{

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

+    }

+

+    if(1 == n)

+    {

+      omx->process_event_cb(omx, id);

+    }

+#ifdef QLE_BUILD

+    if(n < 0) break;

+#else

+    if((n < 0) && (errno != EINTR)) break;

+#endif

+  }

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

+}

+

+// omx_cmd_queue destructor

+omx_video::omx_cmd_queue::~omx_cmd_queue()

+{

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

+}

+

+// 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;

+    }

+  }

+  else

+  {

+    ret = false;

+    DEBUG_PRINT_ERROR("ERROR!!! Command Queue Full\n");

+  }

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

+    }

+  }

+  else

+  {

+    ret = false;

+  }

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

+}

+

+

+

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

+}

+#endif // _ANDROID_

+

+/* ======================================================================

+FUNCTION

+  omx_venc::omx_venc

+

+DESCRIPTION

+  Constructor

+

+PARAMETERS

+  None

+

+RETURN VALUE

+  None.

+========================================================================== */

+omx_video::omx_video(): m_state(OMX_StateInvalid),

+                        m_app_data(NULL),

+                        m_inp_mem_ptr(NULL),

+                        m_out_mem_ptr(NULL),

+                        m_pInput_pmem(NULL),

+                        m_pOutput_pmem(NULL),

+#ifdef USE_ION

+                        m_pInput_ion(NULL),

+                        m_pOutput_ion(NULL),

+#endif

+                        pending_input_buffers(0),

+                        pending_output_buffers(0),

+                        m_out_bm_count(0),

+                        m_inp_bm_count(0),

+                        m_flags(0),

+                        m_event_port_settings_sent(false),

+                        output_flush_progress (false),

+                        input_flush_progress (false),

+                        input_use_buffer (false),

+                        output_use_buffer (false),

+                        m_use_input_pmem(OMX_FALSE),

+                        m_use_output_pmem(OMX_FALSE),

+                        m_etb_count(0),

+                        m_fbd_count(0),

+                        m_error_propogated(false)

+{

+  DEBUG_PRINT_HIGH("\n omx_video(): Inside Constructor()");

+  memset(&m_cmp,0,sizeof(m_cmp));

+  memset(&m_pCallbacks,0,sizeof(m_pCallbacks));

+

+  pthread_mutex_init(&m_lock, NULL);

+  sem_init(&m_cmd_lock,0,0);

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::~omx_venc

+

+DESCRIPTION

+  Destructor

+

+PARAMETERS

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

+  pthread_join(msg_thread_id,NULL);

+  DEBUG_PRINT_HIGH("omx_video: Waiting on Async Thread exit\n");

+  pthread_join(async_thread_id,NULL);

+  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

+

+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

+

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

+

+  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(qsize == 0)

+    {

+      qsize = pThis->m_ftb_q.m_size;

+      if(qsize)

+      {

+        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);

+      }

+    }

+

+    if(qsize == 0)

+    {

+      qsize = pThis->m_etb_q.m_size;

+      if(qsize)

+      {

+        pThis->m_etb_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);

+            }

+            else

+            {

+              pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,

+                                               OMX_EventError, p2, NULL, NULL );

+

+            }

+            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:

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

+

+      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_ERROR("\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_ERROR("\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;

+

+      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_unlock(&pThis->m_lock);

+

+  }

+  while(qsize>0);

+  DEBUG_PRINT_LOW("\n exited the while loop\n");

+

+}

+

+

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::GetComponentVersion

+

+DESCRIPTION

+  Returns the component version.

+

+PARAMETERS

+  TBD.

+

+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

+)

+{

+  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

+

+DESCRIPTION

+  Returns zero if all the buffers released..

+

+PARAMETERS

+  None.

+

+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

+                                      )

+{

+  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_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;

+    }

+  }

+

+  post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);

+  sem_wait(&m_cmd_lock);

+  return OMX_ErrorNone;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_venc::SendCommand

+

+DESCRIPTION

+  Returns zero if all the buffers released..

+

+PARAMETERS

+  None.

+

+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_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");

+        }

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

+      }

+    }

+

+    /***************************/

+    /* 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;

+      }

+    }

+

+    /******************************/

+    /* 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;

+	dev_stop_done();

+      }

+      /* 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 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;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_venc::ExecuteOmxFlush

+

+DESCRIPTION

+  Executes the OMX flush.

+

+PARAMETERS

+  flushtype - input flush(1)/output flush(0)/ both.

+

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

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

+  }

+  return bRet;

+}

+/*=========================================================================

+FUNCTION : execute_output_flush

+

+DESCRIPTION

+  Executes the OMX flush at OUTPUT PORT.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

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

+

+  /*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);

+    }

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

+  }

+

+  return bRet;

+}

+/*=========================================================================

+FUNCTION : execute_input_flush

+

+DESCRIPTION

+  Executes the OMX flush at INPUT PORT.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

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

+

+  /*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);

+    }

+    else if(ident == OMX_COMPONENT_GENERATE_EBD)

+    {

+      empty_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_IN))

+  {

+    DEBUG_PRINT_ERROR("\nERROR: i/p dev_flush() Failed");

+    return false;

+  }

+

+  return bRet;

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::SendCommandEvent

+

+DESCRIPTION

+  Send the event to decoder pipe.  This is needed to generate the callbacks

+  in decoder thread context.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

+  true/false

+

+========================================================================== */

+bool omx_video::post_event(unsigned int p1,

+                           unsigned int p2,

+                           unsigned int id)

+{

+  bool bRet      =                      false;

+

+

+  pthread_mutex_lock(&m_lock);

+

+  if( id == OMX_COMPONENT_GENERATE_FTB || \

+      (id == OMX_COMPONENT_GENERATE_FRAME_DONE))

+  {

+    m_ftb_q.insert_entry(p1,p2,id);

+  }

+  else if((id == OMX_COMPONENT_GENERATE_ETB) \

+          || (id == OMX_COMPONENT_GENERATE_EBD))

+  {

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

+

+  return bRet;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_venc::GetParameter

+

+DESCRIPTION

+  OMX Get Parameter method implementation

+

+PARAMETERS

+  <TBD>.

+

+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_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: 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;

+        }

+#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;

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

+

+      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 %d, %d",

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

+

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

+    }

+

+  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_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;

+   }

+#ifndef MAX_RES_720P

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

+        }

+      }

+      else

+      {

+        DEBUG_PRINT_ERROR("get_parameter: unsupported index (%x), "

+            "only slice information extradata is supported", pParam->nIndex);

+        eRet =OMX_ErrorUnsupportedIndex;

+      }

+      break;

+    }

+#endif

+  case QOMX_IndexParamVideoSyntaxHdr:

+    {

+       DEBUG_PRINT_HIGH("QOMX_IndexParamVideoSyntaxHdr");

+       QOMX_EXTNINDEX_PARAMTYPE* pParam =

+          reinterpret_cast<QOMX_EXTNINDEX_PARAMTYPE*>(paramData);

+       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 = %d)",

+            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_ERROR("ERROR: get_parameter: unknown param %08x\n", paramIndex);

+      eRet =OMX_ErrorUnsupportedIndex;

+      break;

+    }

+

+  }

+

+  return eRet;

+

+}

+/* ======================================================================

+FUNCTION

+  omx_video::GetConfig

+

+DESCRIPTION

+  OMX Get Config Method implementation.

+

+PARAMETERS

+  <TBD>.

+

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

+{

+  ////////////////////////////////////////////////////////////////

+  // 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(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;

+    }

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

+    }

+  default:

+    DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);

+    return OMX_ErrorUnsupportedIndex;

+  }

+  return OMX_ErrorNone;

+

+}

+

+/* ======================================================================

+FUNCTION

+  omx_video::GetExtensionIndex

+

+DESCRIPTION

+  OMX GetExtensionIndex method implementaion.  <TBD>

+

+PARAMETERS

+  <TBD>.

+

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

+{

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

+  }

+#endif

+#ifdef _ANDROID_ICS_

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

+}

+

+/* ======================================================================

+FUNCTION

+  omx_video::GetState

+

+DESCRIPTION

+  Returns the state information back to the caller.<TBD>

+

+PARAMETERS

+  <TBD>.

+

+RETURN VALUE

+  Error None if everything is successful.

+========================================================================== */

+OMX_ERRORTYPE  omx_video::get_state(OMX_IN OMX_HANDLETYPE  hComp,

+                                    OMX_OUT OMX_STATETYPE* state)

+{

+  *state = m_state;

+  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);

+  return OMX_ErrorNone;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_video::ComponentTunnelRequest

+

+DESCRIPTION

+  OMX Component Tunnel Request method implementation. <TBD>

+

+PARAMETERS

+  None.

+

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

+{

+  DEBUG_PRINT_ERROR("ERROR: component_tunnel_request Not Implemented\n");

+  return OMX_ErrorNotImplemented;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_video::UseInputBuffer

+

+DESCRIPTION

+  Helper function for Use buffer in the input pin

+

+PARAMETERS

+  None.

+

+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_ERRORTYPE eRet = OMX_ErrorNone;

+

+  unsigned   i = 0;

+  unsigned char *buf_addr = NULL;

+

+  DEBUG_PRINT_HIGH("use_input_buffer: port = %d appData = %p bytes = %d buffer = %p",port,appData,bytes,buffer);

+  if(bytes != m_sInPortDef.nBufferSize)

+  {

+    DEBUG_PRINT_ERROR("\nERROR: use_input_buffer: Size Mismatch!! "

+                      "bytes[%d] != Port.nBufferSize[%d]", 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

+      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,CACHED);

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

+    }

+  }

+  else

+  {

+    DEBUG_PRINT_ERROR("\nERROR: All buffers are already used, invalid use_buf call for "

+                      "index = %u", i);

+    eRet = OMX_ErrorInsufficientResources;

+  }

+

+  return eRet;

+}

+

+

+

+/* ======================================================================

+FUNCTION

+  omx_video::UseOutputBuffer

+

+DESCRIPTION

+  Helper function for Use buffer in the input pin

+

+PARAMETERS

+  None.

+

+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_ERRORTYPE eRet = OMX_ErrorNone;

+  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header

+  unsigned                         i= 0; // Temporary counter

+  unsigned char *buf_addr = NULL;

+

+  DEBUG_PRINT_HIGH("\n Inside use_output_buffer()");

+  if(bytes != m_sOutPortDef.nBufferSize)

+  {

+    DEBUG_PRINT_ERROR("\nERROR: use_output_buffer: Size Mismatch!! "

+                      "bytes[%d] != Port.nBufferSize[%d]", 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;

+    }

+

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

+    }

+#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;

+#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;

+#endif

+      }

+    }

+    else

+    {

+      DEBUG_PRINT_ERROR("ERROR: Output buf mem alloc failed[0x%x]\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;

+    }

+  }

+

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

+      {

+#ifdef USE_ION

+        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,CACHED);

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

+

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

+        }

+#endif

+        m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;

+        m_pOutput_pmem[i].offset = 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);

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

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

+

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

+      }

+    }

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

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_video::UseBuffer

+

+DESCRIPTION

+  OMX Use Buffer method implementation.

+

+PARAMETERS

+  <TBD>.

+

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

+      }

+

+    }

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

+}

+

+OMX_ERRORTYPE omx_video::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)

+{

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

+  }

+

+  index = bufferHdr - m_inp_mem_ptr;

+#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]));

+    }

+    return OMX_ErrorNone;

+  }

+#endif

+  if(index < m_sInPortDef.nBufferCountActual &&

+     dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true)

+  {

+    DEBUG_PRINT_ERROR("\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);

+#ifdef USE_ION

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

+#ifdef USE_ION

+      free_ion_memory(&m_pInput_ion[index]);

+#endif

+      m_pInput_pmem[index].fd = -1;

+    }

+    else

+    {

+      DEBUG_PRINT_LOW("\n FreeBuffer:: fd is invalid or i/p PMEM UseBuffer case");

+    }

+  }

+  return OMX_ErrorNone;

+}

+

+OMX_ERRORTYPE omx_video::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)

+{

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

+    }

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

+    }

+  }

+  return OMX_ErrorNone;

+}

+#ifdef _ANDROID_ICS_

+OMX_ERRORTYPE omx_video::allocate_input_meta_buffer(

+                    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 %d",

+                     bufferHdr,bytes);

+    return OMX_ErrorBadParameter;

+  }

+  if(!m_inp_mem_ptr)

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

+  }

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

+  return OMX_ErrorNone;

+}

+#endif

+/* ======================================================================

+FUNCTION

+  omx_venc::AllocateInputBuffer

+

+DESCRIPTION

+  Helper function for allocate buffer in the input pin

+

+PARAMETERS

+  None.

+

+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_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[%u] != nBufferSize[%u]\n",

+      bytes, m_sInPortDef.nBufferSize);

+    return OMX_ErrorBadParameter;

+  }

+

+  if(!m_inp_mem_ptr)

+  {

+    DEBUG_PRINT_HIGH("%s: size = %d, actual cnt %d", __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;

+    }

+

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

+    (*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

+    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,CACHED);

+    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\n");

+      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= %d\n", errno);

+      close(m_pInput_pmem[i].fd);

+#ifdef USE_ION

+      free_ion_memory(&m_pInput_ion[i]);

+#endif

+      return OMX_ErrorInsufficientResources;

+    }

+

+    (*bufferHdr)->pBuffer           = (OMX_U8 *)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( 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;

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::AllocateOutputBuffer

+

+DESCRIPTION

+  Helper fn for AllocateBuffer in the output pin

+

+PARAMETERS

+  <TBD>.

+

+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_ERRORTYPE eRet = OMX_ErrorNone;

+  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header

+  unsigned                         i= 0; // Temporary counter

+

+  DEBUG_PRINT_HIGH("\n allocate_output_buffer()::");

+  if(!m_out_mem_ptr)

+  {

+    int nBufHdrSize        = 0;

+    DEBUG_PRINT_HIGH("%s: size = %d, actual cnt %d", __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);

+

+#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;

+    }

+#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;

+

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

+#endif

+      }

+    }

+    else

+    {

+      DEBUG_PRINT_ERROR("ERROR: calloc() failed for m_out_mem_ptr/m_pOutput_pmem");

+      eRet = OMX_ErrorInsufficientResources;

+    }

+  }

+

+  DEBUG_PRINT_HIGH("\n actual cnt = %u", 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)

+    {

+#ifdef USE_ION

+      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,CACHED);

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

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

+      }

+#endif

+      m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;

+      m_pOutput_pmem[i].offset = 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);

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

+#endif

+        return OMX_ErrorInsufficientResources;

+      }

+

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

+

+      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]\n", i);

+    }

+  }

+

+  return eRet;

+}

+

+

+// AllocateBuffer  -- API Call

+/* ======================================================================

+FUNCTION

+  omx_video::AllocateBuffer

+

+DESCRIPTION

+  Returns zero if all the buffers released..

+

+PARAMETERS

+  None.

+

+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_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;

+  }

+

+  // What if the client calls again.

+  if(port == PORT_INDEX_IN)

+  {

+#ifdef _ANDROID_ICS_

+    if(meta_mode_enable)

+      eRet = allocate_input_meta_buffer(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);

+      }

+    }

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

+      }

+    }

+  }

+  DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);

+  return eRet;

+}

+

+

+// Free Buffer - API call

+/* ======================================================================

+FUNCTION

+  omx_video::FreeBuffer

+

+DESCRIPTION

+

+PARAMETERS

+  None.

+

+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_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)))

+  {

+    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 - m_inp_mem_ptr;

+

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

+    }

+  }

+

+  return eRet;

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_video::EmptyThisBuffer

+

+DESCRIPTION

+  This routine is used to push the encoded video frames to

+  the video decoder.

+

+PARAMETERS

+  None.

+

+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_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;

+  }

+

+  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->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 - m_inp_mem_ptr;

+

+  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,OMX_COMPONENT_GENERATE_ETB);

+  return OMX_ErrorNone;

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_video::empty_this_buffer_proxy

+

+DESCRIPTION

+  This routine is used to push the encoded video frames to

+  the video decoder.

+

+PARAMETERS

+  None.

+

+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_U8 *pmem_data_buf = NULL;

+  int push_cnt = 0;

+  unsigned nBufIndex = 0;

+  OMX_ERRORTYPE ret = OMX_ErrorNone;

+

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

+

+  if(nBufIndex >= 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;

+  }

+#ifdef _ANDROID_ICS_

+  if(meta_mode_enable)

+  {

+    encoder_media_buffer_type *media_buffer;

+    bool met_error = false;

+    media_buffer = (encoder_media_buffer_type *)meta_buffer_hdr[nBufIndex].pBuffer;

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

+    }

+    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];

+      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 = 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)

+#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");

+  }

+#ifdef _COPPER_

+  if(dev_empty_buf(buffer, pmem_data_buf,nBufIndex,m_pInput_pmem[nBufIndex].fd) != true)

+#else

+  if(dev_empty_buf(buffer, pmem_data_buf,0,0) != true)

+#endif

+  {

+    DEBUG_PRINT_ERROR("\nERROR: ETBProxy: dev_empty_buf failed");

+#ifdef _ANDROID_ICS_

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

+}

+

+/* ======================================================================

+FUNCTION

+  omx_video::FillThisBuffer

+

+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(OMX_IN OMX_HANDLETYPE  hComp,

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

+  }

+

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

+  }

+

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

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

+{

+

+  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

+

+DESCRIPTION

+  OMX Use EGL Image method implementation <TBD>.

+

+PARAMETERS

+  <TBD>.

+

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

+{

+  DEBUG_PRINT_ERROR("ERROR: use_EGL_image:  Not Implemented \n");

+  return OMX_ErrorNotImplemented;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_venc::ComponentRoleEnum

+

+DESCRIPTION

+  OMX Component Role Enum method implementation.

+

+PARAMETERS

+  <TBD>.

+

+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_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;

+    }

+  }

+  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

+  {

+    DEBUG_PRINT_ERROR("\nERROR: Querying Role on Unknown Component\n");

+    eRet = OMX_ErrorInvalidComponentName;

+  }

+  return eRet;

+}

+

+

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::AllocateDone

+

+DESCRIPTION

+  Checks if entire buffer pool is allocated by IL Client or not.

+  Need this to move to IDLE state.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

+  true/false.

+

+========================================================================== */

+bool omx_video::allocate_done(void)

+{

+  bool bRet = false;

+  bool bRet_In = false;

+  bool bRet_Out = false;

+

+  bRet_In = allocate_input_done();

+  bRet_Out = allocate_output_done();

+

+  if(bRet_In && bRet_Out)

+  {

+    bRet = true;

+  }

+

+  return bRet;

+}

+/* ======================================================================

+FUNCTION

+  omx_venc::AllocateInputDone

+

+DESCRIPTION

+  Checks if I/P buffer pool is allocated by IL Client or not.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

+  true/false.

+

+========================================================================== */

+bool omx_video::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<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

+

+DESCRIPTION

+  Checks if entire O/P buffer pool is allocated by IL Client or not.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

+  true/false.

+

+========================================================================== */

+bool omx_video::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<m_sOutPortDef.nBufferCountActual;j++)

+    {

+      if(BITMASK_ABSENT(&m_out_bm_count,j))

+      {

+        break;

+      }

+    }

+  }

+

+  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

+

+DESCRIPTION

+  Checks if IL client has released all the buffers.

+

+PARAMETERS

+  None.

+

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

+    }

+  }

+  return bRet;

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::ReleaseOutputDone

+

+DESCRIPTION

+  Checks if IL client has released all the buffers.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

+  true/false

+

+========================================================================== */

+bool omx_video::release_output_done(void)

+{

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

+      }

+    }

+    if(j==m_sOutPortDef.nBufferCountActual)

+    {

+      bRet = true;

+    }

+  }

+  else

+  {

+    bRet = true;

+  }

+  return bRet;

+}

+/* ======================================================================

+FUNCTION

+  omx_venc::ReleaseInputDone

+

+DESCRIPTION

+  Checks if IL client has released all the buffers.

+

+PARAMETERS

+  None.

+

+RETURN VALUE

+  true/false

+

+========================================================================== */

+bool omx_video::release_input_done(void)

+{

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

+      }

+    }

+    if(j==m_sInPortDef.nBufferCountActual)

+    {

+      bRet = true;

+    }

+  }

+  else

+  {

+    bRet = true;

+  }

+  return bRet;

+}

+

+OMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp,

+                                          OMX_BUFFERHEADERTYPE * buffer)

+{

+  DEBUG_PRINT_LOW("fill_buffer_done: buffer->pBuffer[%p], flags=0x%x",

+     buffer->pBuffer, buffer->nFlags);

+  if(buffer == NULL || ((buffer - m_out_mem_ptr) > m_sOutPortDef.nBufferCountActual))

+  {

+    return OMX_ErrorBadParameter;

+  }

+

+  pending_output_buffers--;

+

+  extra_data_handle.create_extra_data(buffer);

+

+  if (m_sDebugSliceinfo) {

+    if(buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {

+       DEBUG_PRINT_HIGH("parsing extradata");

+       extra_data_handle.parse_extra_data(buffer);

+    }

+  }

+  /* 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);

+      }

+#endif

+    }

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

+{

+  DEBUG_PRINT_LOW("empty_buffer_done: buffer->pBuffer[%p]", buffer->pBuffer);

+  if(buffer == NULL || ((buffer - m_inp_mem_ptr) > m_sInPortDef.nBufferCountActual))

+  {

+    return OMX_ErrorBadParameter;

+  }

+

+  pending_input_buffers--;

+

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

+        }

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

+    }

+  }

+}

+

+#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;

+

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

+  }

+  DEBUG_PRINT_ERROR("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;

+

+  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_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 (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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%d, Level:%d\n",

+                    profileLevelType->eProfile,profileLevelType->eLevel);

+  return eRet;

+}

+

+#ifdef USE_ION

+int omx_video::alloc_map_ion_memory(int size,struct ion_allocation_data *alloc_data,

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

+	}

+        if(flag == CACHED) {

+             ion_dev_flags = O_RDONLY;

+	} else if(flag == UNCACHED) {

+             ion_dev_flags = O_RDONLY ;//| O_DSYNC;

+        }

+        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 = (ION_HEAP(MEM_HEAP_ID) |

+                              ION_HEAP(ION_IOMMU_HEAP_ID));

+        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 omx_video::free_ion_memory(struct venc_ion *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;

+}

+#endif

+#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;

+    bool meta_error = false;

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

+      }

+      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

diff --git a/mm-video/vidc/venc/src/omx_video_encoder.cpp b/mm-video/vidc/venc/src/omx_video_encoder.cpp
new file mode 100755
index 0000000..cbcb47c
--- /dev/null
+++ b/mm-video/vidc/venc/src/omx_video_encoder.cpp
@@ -0,0 +1,1650 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2012, Code Aurora Forum. 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 Code Aurora 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 "omx_video_encoder.h"

+#include <string.h>

+#include "video_encoder_device.h"

+#include <stdio.h>

+#ifdef _ANDROID_ICS_

+#include <media/hardware/HardwareAPI.h>

+#endif

+#ifdef _ANDROID_

+#include <cutils/properties.h>

+#endif

+#ifndef _ANDROID_

+#include <glib.h>

+#define strlcpy g_strlcpy

+#endif

+/*----------------------------------------------------------------------------

+* 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

+

+extern int m_pipe;

+

+// factory function executed by the core to create instances

+void *get_omx_component_factory_fn(void)

+{

+  return(new omx_venc);

+}

+

+//constructor

+

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

+  mUseProxyColorFormat = false;

+#endif

+}

+

+omx_venc::~omx_venc()

+{

+  //nothing to do

+}

+

+/* ======================================================================

+FUNCTION

+  omx_venc::ComponentInit

+

+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

+

+RETURN VALUE

+  None.

+

+========================================================================== */

+OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)

+{

+

+  OMX_ERRORTYPE eRet = OMX_ErrorNone;

+

+  int fds[2];

+  int r;

+

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

+

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

+  }

+  else

+  {

+    DEBUG_PRINT_ERROR("\nERROR: Unknown Component\n");

+    eRet = OMX_ErrorInvalidComponentName;

+  }

+

+

+  if(eRet != OMX_ErrorNone)

+  {

+    return eRet;

+  }

+

+  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_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;

+

+  m_state                   = OMX_StateLoaded;

+  m_sExtraData = 0;

+  m_sDebugSliceinfo = 0;

+#ifdef _ANDROID_

+  char value[PROPERTY_VALUE_MAX] = {0};

+  property_get("vidc.venc.debug.sliceinfo", value, "0");

+  m_sDebugSliceinfo = (OMX_U32)atoi(value);

+  DEBUG_PRINT_HIGH("vidc.venc.debug.sliceinfo value is %d", m_sDebugSliceinfo);

+#endif

+

+  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];

+      }

+    }

+    r = pthread_create(&msg_thread_id,0,message_thread,this);

+

+    if(r < 0)

+    {

+      eRet = OMX_ErrorInsufficientResources;

+    }

+    else

+    {

+      r = pthread_create(&async_thread_id,0,async_venc_message_thread,this);

+      if(r < 0)

+      {

+        eRet = OMX_ErrorInsufficientResources;

+      }

+    }

+  }

+

+  DEBUG_PRINT_HIGH("\n Component_init return value = 0x%x", eRet);

+  return eRet;

+}

+

+

+/* ======================================================================

+FUNCTION

+  omx_venc::Setparameter

+

+DESCRIPTION

+  OMX Set Parameter method implementation.

+

+PARAMETERS

+  <TBD>.

+

+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_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)

+      {

+        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(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;

+            mUseProxyColorFormat = true;

+        } //else case not needed as color format is already updated in the memcpy above

+#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(handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true)

+        {

+          DEBUG_PRINT_ERROR("\nERROR: venc_set_param output failed");

+          return OMX_ErrorUnsupportedSetting;

+        }

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

+            mUseProxyColorFormat = true;

+        }

+        else

+#endif

+        {

+            m_sInPortFormat.eColorFormat = portFmt->eColorFormat;

+        }

+        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

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

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

+      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 %d 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 %d 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 %d 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));

+      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: %d "

+                          "Level :%d", 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;

+        }

+      }

+      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_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;

+      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 = 32;

+            m_sInPortDef.nBufferCountMin = 32;

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

+          }

+        }

+      }

+      break;

+    }

+#endif

+#ifndef MAX_RES_720P

+  case OMX_QcomIndexParamIndexExtraDataType:

+    {

+      DEBUG_PRINT_LOW("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("set_param: m_sExtraData=%x", m_sExtraData);

+          if(handle->venc_set_param(&m_sExtraData,

+              (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) != true)

+          {

+            DEBUG_PRINT_ERROR("ERROR: Setting "

+               "OMX_QcomIndexParamIndexExtraDataType 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: slice information is "

+              "valid for output port only");

+          eRet = OMX_ErrorUnsupportedIndex;

+        }

+      }

+      else

+      {

+        DEBUG_PRINT_ERROR("set_parameter: unsupported index (%x), "

+            "only slice information extradata is supported", pParam->nIndex);

+        eRet = OMX_ErrorUnsupportedIndex;

+      }

+      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(%d)", 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(%d)", pParam->nPortIndex);

+        return OMX_ErrorBadPortIndex;

+      }

+      break;

+    }

+#endif

+  case OMX_IndexParamVideoSliceFMO:

+  default:

+    {

+      DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d\n", paramIndex);

+      eRet = OMX_ErrorUnsupportedIndex;

+      break;

+    }

+  }

+  return eRet;

+}

+

+bool omx_venc::update_profile_level()

+{

+  OMX_U32 eProfile, eLevel;

+

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

+

+  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

+

+DESCRIPTION

+  OMX Set Config method implementation

+

+PARAMETERS

+  <TBD>.

+

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

+{

+  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_LOW("\n omx_venc:: set_config(): OMX_IndexConfigVideoBitrate");

+

+      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: %u", pParam->nPortIndex);

+        return OMX_ErrorBadPortIndex;

+      }

+      break;

+    }

+  case OMX_IndexConfigVideoFramerate:

+    {

+      OMX_CONFIG_FRAMERATETYPE* pParam =

+        reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);

+      DEBUG_PRINT_LOW("\n omx_venc:: set_config(): OMX_IndexConfigVideoFramerate");

+

+      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: %u", pParam->nPortIndex);

+        return OMX_ErrorBadPortIndex;

+      }

+

+      break;

+    }

+  case QOMX_IndexConfigVideoIntraperiod:

+    {

+      QOMX_VIDEO_INTRAPERIODTYPE* pParam =

+        reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);

+

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

+        }

+#endif

+        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: %u", pParam->nPortIndex);

+        return OMX_ErrorBadPortIndex;

+      }

+

+      break;

+    }

+

+  case OMX_IndexConfigVideoIntraVOPRefresh:

+    {

+      OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =

+        reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);

+

+      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: %u", 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: %u", 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 %u", pParam->nRotation);

+      } else {

+          DEBUG_PRINT_ERROR("ERROR: un supported Rotation %u", 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:

+    {

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

+    }

+  default:

+    DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);

+    break;

+  }

+

+  return OMX_ErrorNone;

+}

+

+/* ======================================================================

+FUNCTION

+  omx_venc::ComponentDeInit

+

+DESCRIPTION

+  Destroys the component and release memory allocated to the heap.

+

+PARAMETERS

+  <TBD>.

+

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

+    }

+    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

+#ifdef _ANDROID_ICS_

+     && !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]);

+    }

+

+

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

+

+#ifdef _ANDROID_

+  // 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;

+}

+

+

+OMX_U32 omx_venc::dev_stop( void)

+{

+  return handle->venc_stop();

+}

+

+

+OMX_U32 omx_venc::dev_pause(void)

+{

+  return handle->venc_pause();

+}

+

+OMX_U32 omx_venc::dev_start(void)

+{

+  return handle->venc_start();

+}

+

+OMX_U32 omx_venc::dev_flush(unsigned port)

+{

+  return handle->venc_flush(port);

+}

+OMX_U32 omx_venc::dev_resume(void)

+{

+  return handle->venc_resume();

+}

+

+OMX_U32 omx_venc::dev_start_done(void)

+{

+  return handle->venc_start_done();

+}

+

+OMX_U32 omx_venc::dev_stop_done(void)

+{

+  return handle->venc_stop_done();

+}

+

+bool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned 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);

+}

+

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

+}

+

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

+}

+

+bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen)

+{

+  return handle->venc_get_seq_hdr(buffer, size, hdrlen);

+}

+

+bool omx_venc::dev_loaded_start()

+{

+  return handle->venc_loaded_start();

+}

+

+bool omx_venc::dev_loaded_stop()

+{

+  return handle->venc_loaded_stop();

+}

+

+bool omx_venc::dev_loaded_start_done()

+{

+  return handle->venc_loaded_start_done();

+}

+

+bool omx_venc::dev_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)

+{

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

+{

+  return handle->venc_set_buf_req(min_buff_count,

+                                  actual_buff_count,

+                                  buff_size,

+                                  port);

+

+}

+

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

+

+  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 = %d\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) )

+    {

+      omxhdr = NULL;

+      m_sVenc_msg->statuscode = VEN_S_EFAIL;

+    }

+#ifdef _ANDROID_ICS_

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

+

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

+      }

+

+    }

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

+  default:

+    break;

+  }

+  return 0;

+}

diff --git a/mm-video/vidc/venc/src/video_encoder_device.cpp b/mm-video/vidc/venc/src/video_encoder_device.cpp
new file mode 100755
index 0000000..6e9b63c
--- /dev/null
+++ b/mm-video/vidc/venc/src/video_encoder_device.cpp
@@ -0,0 +1,2935 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. 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 Code Aurora 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<string.h>
+#include <sys/ioctl.h>
+#include <sys/prctl.h>
+#include<unistd.h>
+#include <fcntl.h>
+#include "video_encoder_device.h"
+#include "omx_video_encoder.h"
+#include <linux/android_pmem.h>
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
+
+#define MPEG4_SP_START 0
+#define MPEG4_ASP_START (MPEG4_SP_START + 8)
+#define MPEG4_720P_LEVEL 6
+#define H263_BP_START 0
+#define H264_BP_START 0
+#define H264_HP_START (H264_BP_START + 13)
+#define H264_MP_START (H264_BP_START + 26)
+
+/* MPEG4 profile and level table*/
+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},
+    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
+    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
+    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
+    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+    {0,0,0,0,0},
+
+    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {0,0,0,0,0},
+};
+
+/* 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*/
+    {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},
+    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
+    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
+    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
+    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
+    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
+    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
+    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
+    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
+    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
+    {0,0,0,0,0},
+
+    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
+    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
+    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
+    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
+    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
+    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
+    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
+    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
+    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
+    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
+    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
+    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
+    {0,0,0,0,0},
+
+    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
+    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
+    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
+    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
+    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
+    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
+    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
+    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
+    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
+    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
+    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
+    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
+    {0,0,0,0,0}
+
+};
+
+/* H263 profile and level table*/
+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},
+    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
+    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
+    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
+    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
+    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
+    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
+    {0,0,0,0,0}
+};
+
+#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
+#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
+
+#ifdef INPUT_BUFFER_LOG
+FILE *inputBufferFile1;
+char inputfilename [] = "/data/input.yuv";
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+FILE *outputBufferFile1;
+char outputfilename [] = "/data/output-bitstream.\0\0\0\0";
+#endif
+//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");
+}
+
+venc_dev::~venc_dev()
+{
+  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);
+
+  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;
+
+    /*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_ERROR("\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;
+}
+
+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;
+
+  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;
+  }
+
+  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;
+  }
+#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;
+#ifdef MAX_RES_1080P
+  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+#else
+  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12;
+#endif
+  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");
+#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;
+#ifdef OUTPUT_BUFFER_LOG
+    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;
+#ifdef OUTPUT_BUFFER_LOG
+    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;
+  }
+#ifdef INPUT_BUFFER_LOG
+  inputBufferFile1 = fopen (inputfilename, "ab");
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+  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;
+  }
+
+  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;
+  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;
+  }
+#ifdef INPUT_BUFFER_LOG
+  fclose (inputBufferFile1);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+  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)
+{
+  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);
+    }
+  }
+
+  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));
+    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;
+}
+
+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));
+    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;
+}
+
+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;
+}
+
+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;
+}
+
+bool venc_dev::venc_get_seq_hdr(void *buffer,
+    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);
+
+  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_buf_req(unsigned long *min_buff_count,
+                                unsigned long *actual_buff_count,
+                                unsigned long *buff_size,
+                                unsigned long port)
+{
+  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;
+#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
+  {
+    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;
+  }
+
+  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_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;
+
+          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_LOW("\n 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_LOW("\n 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_LOW("\n 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_HIGH("\n %s(): Profile/Level setting success", __func__);
+          }
+        }
+        else
+        {
+          if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
+           (m_sInput_buff_property.maxcount >= portDefn->nBufferCountActual) &&
+            (m_sInput_buff_property.datasize == portDefn->nBufferSize))
+          {
+            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: ioctl VEN_IOCTL_SET_INPUT_BUFFER_REQ failed");
+              return false;
+            }
+          }
+          else
+          {
+            DEBUG_PRINT_ERROR("\nERROR: Setting Input buffer requirements failed");
+            return false;
+          }
+        }
+      }
+      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;
+    }
+  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;
+        }
+#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;
+            }
+          }
+        }
+#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(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;
+            }
+          }
+        }
+#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;
+    }
+  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_QcomIndexParamIndexExtraDataType 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_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)
+{
+  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;
+
+      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;
+    }
+  default:
+    DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
+    break;
+  }
+
+  return true;
+}
+
+unsigned venc_dev::venc_stop( void)
+{
+#ifdef MAX_RES_1080P
+    pmem_free();
+#endif
+  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);
+}
+
+unsigned venc_dev::venc_resume(void)
+{
+  return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_RESUME,NULL) ;
+}
+
+unsigned venc_dev::venc_start_done(void)
+{
+  return 0;
+}
+
+unsigned venc_dev::venc_stop_done(void)
+{
+  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);
+  }
+
+  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 (!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
+}
+
+#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;
+
+  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);
+
+  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;
+    }
+  }
+  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;
+
+#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].alloc_data.len = size;
+  recon_buff[count].alloc_data.flags = (ION_HEAP(MEM_HEAP_ID) |
+                                        ION_HEAP(ION_IOMMU_HEAP_ID));
+  recon_buff[count].alloc_data.align = clip2(alignment);
+  if (recon_buff[count].alloc_data.align != 8192)
+    recon_buff[count].alloc_data.align = 8192;
+
+  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_ERROR("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;
+#endif
+    return -1;
+  }
+
+  DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
+
+  recon_addr.buffer_size = size;
+  recon_addr.pmem_fd = pmem_fd;
+  recon_addr.offset = 0;
+  recon_addr.pbuffer = (unsigned char *)buf_addr;
+
+  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);
+#ifdef USE_ION
+      if(ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
+         &recon_buff[cnt].alloc_data.handle)) {
+        DEBUG_PRINT_ERROR("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;
+    }
+  }
+  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("\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: qpI: %d, qpP: %d, qpb: 0",
+                   session_qp.iframeqp, session_qp.pframqp);
+
+  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: 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);
+}
+
+unsigned venc_dev::venc_flush( unsigned port)
+{
+  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;
+
+    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
+
+
+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};
+
+  pmem_tmp = (struct pmem *)buf_addr;
+
+  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;
+
+    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;
+
+    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;
+    }
+  }
+  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 venc_ioctl_msg ioctl_msg = {NULL,NULL};
+  struct pmem *pmem_tmp;
+  struct venc_bufferpayload dev_buffer = {0};
+
+  pmem_tmp = (struct pmem *)buf_addr;
+
+  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;
+
+    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;
+
+    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;
+    }
+  }
+  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,unsigned)
+{
+  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;
+
+  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);
+    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;
+  }
+
+  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;
+
+  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(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]);
+#else
+  if(inputBufferFile1)
+  {
+    fwrite((const char *)frameinfo.ptrbuffer, frameinfo.len, 1,inputBufferFile1);
+  }
+#endif
+
+#endif
+  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;
+
+  if(buffer == NULL)
+  {
+    return false;
+  }
+  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+
+  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;
+  }
+
+  frameinfo.clientdata = buffer;
+  frameinfo.sz = bufhdr->nAllocLen;
+  frameinfo.flags = bufhdr->nFlags;
+  frameinfo.offset = bufhdr->nOffset;
+
+  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;
+    }
+  }
+  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;
+}
+
+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;
+  }
+
+  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_LOW("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;
+
+  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;
+  }
+
+  session_qp.iframeqp = i_frame_qp;
+  session_qp.pframqp = p_frame_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_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;
+  }
+
+  if(eProfile && eLevel)
+  {
+    /* non-zero values will be set by user, saving the same*/
+    m_eProfile = eProfile;
+    m_eLevel = eLevel;
+    DEBUG_PRINT_HIGH("Profile/Level set equal to %d/%d",m_eProfile, m_eLevel);
+  }
+
+  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 == 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;
+    }
+
+    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;
+  }
+
+  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;
+  }
+
+  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;
+
+  DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
+    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;
+  }
+
+  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;
+
+  DEBUG_PRINT_LOW("\n 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;
+#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;
+    }
+#endif
+  }
+  else
+    intraperiod_cfg.num_bframes = 0;
+
+  DEBUG_PRINT_ERROR("\n 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;
+  }
+
+  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;
+
+  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;
+      }
+#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;
+  }
+
+  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;
+
+  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;
+  }
+
+  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;
+}
+
+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;
+
+  // 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;
+}
+
+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;
+
+   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;
+   }
+
+   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 &&
+            error_resilience->bEnableDataPartitioning) {
+      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;
+}
+
+bool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
+{
+  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);
+
+  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;
+
+  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;
+
+  DEBUG_PRINT_LOW("\n 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);
+    }
+  }
+  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;
+
+  Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
+
+  DEBUG_PRINT_LOW("\n 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;
+  }
+
+  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\n",profile_level.level);
+    }
+  }
+  return true;
+}
+
+bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
+{
+  venc_ioctl_msg ioctl_msg = {NULL, NULL};
+  DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
+
+  if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
+  {
+#ifdef MAX_RES_1080P
+  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+#else
+    m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
+#endif
+  }
+  else
+  {
+    DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
+#ifdef MAX_RES_1080P
+    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+#else
+    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;
+}
+
+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;
+    }
+  }
+  else
+  {
+    DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
+  }
+  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;
+
+  //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;
+    }
+    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;
+  }
+
+  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;
+    }
+  }
+  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;
+
+  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;
+          }
+        }
+      }
+
+      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
+        {
+          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;
+          }
+        }
+      }
+
+      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
+        {
+          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;
+          }
+        }
+      }
+
+      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;
+      }
+  }
+  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;
+
+  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;
+          }
+        }
+      }
+      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;
+
+  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;
+      }
+
+      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;
+      }
+    }
+    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;
+}
+#endif
diff --git a/mm-video/vidc/venc/src/video_encoder_device_copper.cpp b/mm-video/vidc/venc/src/video_encoder_device_copper.cpp
new file mode 100755
index 0000000..1b387ed
--- /dev/null
+++ b/mm-video/vidc/venc/src/video_encoder_device_copper.cpp
@@ -0,0 +1,3012 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. 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 Code Aurora 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<string.h>
+#include <sys/ioctl.h>
+#include <sys/prctl.h>
+#include<unistd.h>
+#include <fcntl.h>
+#include "video_encoder_device_copper.h"
+#include "omx_video_encoder.h"
+#include <linux/android_pmem.h>
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
+
+#define MPEG4_SP_START 0
+#define MPEG4_ASP_START (MPEG4_SP_START + 8)
+#define MPEG4_720P_LEVEL 6
+#define H263_BP_START 0
+#define H264_BP_START 0
+#define H264_HP_START (H264_BP_START + 13)
+#define H264_MP_START (H264_BP_START + 26)
+
+/* MPEG4 profile and level table*/
+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},
+    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
+    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
+    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
+    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+    {0,0,0,0,0},
+
+    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+    {0,0,0,0,0},
+};
+
+/* 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*/
+    {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},
+    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
+    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
+    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
+    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
+    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
+    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
+    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
+    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
+    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
+    {0,0,0,0,0},
+
+    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
+    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
+    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
+    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
+    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
+    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
+    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
+    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
+    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
+    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
+    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
+    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
+    {0,0,0,0,0},
+
+    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
+    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
+    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
+    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
+    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
+    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
+    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
+    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
+    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
+    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
+    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
+    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
+    {0,0,0,0,0}
+
+};
+
+/* H263 profile and level table*/
+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},
+    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
+    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
+    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
+    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
+    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
+    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
+    {0,0,0,0,0}
+};
+
+#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
+#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
+
+#ifdef INPUT_BUFFER_LOG
+FILE *inputBufferFile1;
+char inputfilename [] = "/data/input.yuv";
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+FILE *outputBufferFile1;
+char outputfilename [] = "/data/output-bitstream.\0\0\0\0";
+#endif
+//constructor
+venc_dev::venc_dev(class omx_venc *venc_class)
+{
+//nothing to do
+venc_handle = venc_class;
+etb_count=0;
+}
+
+venc_dev::~venc_dev()
+{
+  //nothing to do
+}
+
+void* async_venc_message_thread (void *input)
+{
+  struct venc_timeout timeout;
+  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);
+  timeout.millisec = VEN_TIMEOUT_INFINITE;
+  struct v4l2_plane plane;
+  struct pollfd pfd;
+  struct v4l2_buffer v4l2_buf ={0};
+  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;
+  while(1)
+  {
+    	rc = poll(&pfd, 1, TIMEOUT);
+		if (!rc) {
+			printf("Poll timedout\n");
+			break;
+		} else if (rc < 0) {
+			printf("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 = 1;
+			v4l2_buf.m.planes = &plane;
+			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
+			if (rc) {
+				printf("Failed to dequeue buf: %d from capture capability\n", rc);
+				break;
+			}
+			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 = v4l2_buf.m.planes->reserved[1];
+                	venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
+
+			venc_msg.buf.clientdata=(void*)omxhdr;
+		} else 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;
+			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
+			if (rc) {
+				printf("Failed to dequeue buf: %d from output capability\n", rc);
+				break;
+			}
+                        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;
+		} else if (pfd.revents & POLLPRI){
+			rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+			printf("\n Data Recieved = %d \n",dqevent.u.data[0]);
+			if(dqevent.u.data[0] == MSM_VIDC_CLOSE_DONE){
+				break;
+			}
+		} else {
+			/*TODO: How to handle this case */		
+			continue;
+		}
+
+		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;
+}
+
+bool venc_dev::venc_open(OMX_U32 codec)
+{
+  int r;
+  unsigned int   alignment = 0,buffer_size = 0, temp =0;
+
+  m_nDriver_fd = open ("/dev/video33",O_RDWR);
+  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/video33",O_RDWR);
+  }
+
+  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;
+  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;
+  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");
+#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;
+#ifdef OUTPUT_BUFFER_LOG
+    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;
+#ifdef OUTPUT_BUFFER_LOG
+    strcat(outputfilename, "264");
+#endif
+  }
+  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");
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+  outputBufferFile1 = fopen (outputfilename, "ab");
+#endif
+	int ret;	
+	struct v4l2_event_subscription sub;
+	sub.type=V4L2_EVENT_ALL;
+	ret = ioctl(m_nDriver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+	if (ret) {
+		printf("\n Subscribe Event Failed \n");
+		return false;
+	}
+	struct v4l2_capability cap;
+	struct v4l2_fmtdesc fdesc;
+	struct v4l2_format fmt;
+	struct v4l2_requestbuffers bufreq;
+
+		ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
+		if (ret) {
+		  printf("Failed to query capabilities\n");
+		} else {
+		  printf("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);
+		}
+		//printf(" \n VIDIOC_QUERYCAP Successful  \n ");
+		ret=0;
+		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+		fdesc.index=0;
+		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+					fdesc.pixelformat, fdesc.flags);
+			fdesc.index++;
+		}
+		//printf("\n VIDIOC_ENUM_FMT CAPTURE Successful  \n ");
+		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+		fdesc.index=0;
+		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+
+			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+					fdesc.pixelformat, fdesc.flags);
+			fdesc.index++;
+		}
+		//printf(" \n VIDIOC_ENUM_FMT OUTPUT Successful \n ");
+		
+		m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
+
+		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);
+		//printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
+		m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+		//printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
+
+		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 = V4L2_PIX_FMT_H264;
+		
+		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
+		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+		//printf("m_sOutput_buff_property.datasize = %d\n",m_sOutput_buff_property.datasize);
+//		struct v4l2_requestbuffers bufreq;	
+
+		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.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
+		//printf(" \n VIDIOC_REQBUFS OUTPUT Successful \n ");
+		//printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
+		//printf("m_sInput_buff_property.mincount = %d\n",m_sInput_buff_property.mincount);
+		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.maxcount=m_sOutput_buff_property.actualcount=bufreq.count;
+		//printf(" \n VIDIOC_REQBUFS CAPTURE Successful  \n ");
+		//printf("m_sInput_buff_property.mincount = %d\n",m_sOutput_buff_property.mincount);
+
+  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;
+  }
+  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;
+  }
+	///printf("\n \n Setting Profile and Level \n \n ");
+  //m_profile_set = false;
+  //m_level_set = false;
+  if(/*venc_set_profile_level(0, 0)*/0)
+  {
+    DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
+        __func__);
+  }
+  recon_buffers_count = MAX_RECON_BUFFERS;
+  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");
+
+         int rc=0;
+	 enum v4l2_buf_type btype;
+	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+	 if (rc) {
+		/* STREAMOFF will never fail */	
+		printf("\n Failed to call streamoff on OUTPUT Port \n");
+		}
+	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+	 
+	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+	 if (rc) {
+		/* STREAMOFF will never fail */	
+		printf("\n Failed to call streamoff on CAPTURE Port \n");
+		}
+        struct v4l2_event_subscription sub;
+	sub.type=V4L2_EVENT_ALL;
+	rc = ioctl(m_nDriver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+	if (rc) {
+		printf("Failed to get control\n");
+		return ;
+	}
+    close(m_nDriver_fd);
+    m_nDriver_fd = -1;
+  }
+#ifdef INPUT_BUFFER_LOG
+  fclose (inputBufferFile1);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+  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 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;
+      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;
+      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()
+{
+  return true;
+}
+
+bool venc_dev::venc_loaded_stop()
+{
+  return true;
+}
+
+bool venc_dev::venc_loaded_start_done()
+{
+  return true;
+}
+
+bool venc_dev::venc_loaded_stop_done()
+{
+  return true;
+}
+
+bool venc_dev::venc_get_seq_hdr(void *buffer,
+    unsigned buffer_size, unsigned *header_len)
+{
+  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)
+{
+	struct v4l2_format fmt;
+	struct v4l2_requestbuffers bufreq;
+	int ret;
+  if(port == 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;
+    }
+
+	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);
+		//printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
+		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.maxcount=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
+  {
+    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;
+    }
+
+		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 = V4L2_PIX_FMT_H264;
+		
+		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
+		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 = V4L2_PIX_FMT_H264;
+		
+		ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
+		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
+		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+
+
+    *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 )
+{
+  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_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
+      if(portDefn->nPortIndex == PORT_INDEX_IN)
+      {
+        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;
+
+          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_LOW("\n Updating the buffer count/size for the new resolution");
+          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_LOW("\n 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);
+
+          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_LOW("\n 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);
+          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;
+            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_HIGH("\n %s(): Profile/Level setting success", __func__);
+          }
+        }
+        else
+        {
+          if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
+           (m_sInput_buff_property.maxcount >= portDefn->nBufferCountActual) &&
+            (m_sInput_buff_property.datasize == portDefn->nBufferSize))
+          {
+            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
+            if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+            {
+              DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_INPUT_BUFFER_REQ failed");
+              return false;
+            }
+          }
+          else
+          {
+            DEBUG_PRINT_ERROR("\nERROR: Setting Input buffer requirements failed");
+            return false;
+          }
+        }
+      }
+      else if(portDefn->nPortIndex == PORT_INDEX_OUT)
+      {
+        if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
+        {
+          return false;
+        }
+
+        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;
+          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");
+      }
+      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)
+            {
+              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;
+    }
+  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");
+		  printf("\n \n Returned here line line 903 \n \n ");
+          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_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");
+
+  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;
+
+      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;
+    }
+  default:
+    DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
+    break;
+  }
+
+  return true;
+}
+
+unsigned venc_dev::venc_stop( void)
+{
+    pmem_free();
+  return 0;
+}
+
+unsigned venc_dev::venc_pause(void)
+{
+  return 0;
+}
+
+unsigned venc_dev::venc_resume(void)
+{
+  return 0;
+}
+
+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;
+}
+
+unsigned venc_dev::venc_stop_done(void)
+{
+  struct venc_msg venc_msg;
+  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_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();
+
+
+  if((codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) ||
+     (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) ||
+     (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
+    recon_buffers_count = MAX_RECON_BUFFERS - 2;
+  else
+    recon_buffers_count = MAX_RECON_BUFFERS;
+
+	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;
+	}
+	else {
+		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 pmem_allocation allocation;
+  struct venc_recon_addr recon_addr;
+  int rc = 0;
+
+#ifdef USE_ION
+  recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY|O_DSYNC);
+  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;
+  recon_buff[count].alloc_data.flags = 0x1 << MEM_HEAP_ID;
+  recon_buff[count].alloc_data.align = clip2(alignment);
+  if (recon_buff[count].alloc_data.align != 8192)
+    recon_buff[count].alloc_data.align = 8192;
+
+  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
+  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_ERROR("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;
+#endif
+    return -1;
+  }
+
+  DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
+
+  recon_addr.buffer_size = size;
+  recon_addr.pmem_fd = pmem_fd;
+  recon_addr.offset = 0;
+  recon_addr.pbuffer = (unsigned char *)buf_addr;
+
+
+  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_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;
+      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_ERROR("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;
+    }
+  }
+  return 0;
+}
+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("\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: qpI: %d, qpP: %d, qpb: %d",
+                   session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
+
+  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: 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);
+}
+
+unsigned venc_dev::venc_flush( unsigned port)
+{
+  struct venc_bufferflush buffer_index;
+
+  if(port == PORT_INDEX_IN)
+  {
+	 int rc=0;
+	 enum v4l2_buf_type btype;
+	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+	 if (rc) {
+		/* STREAMOFF should never fail */	
+		printf("\n Failed to call streamoff on OUTPUT Port \n");
+		return -1;
+		}
+
+    return 0;
+  }
+  else if(port == PORT_INDEX_OUT)
+  {
+	 int rc=0;
+	 enum v4l2_buf_type btype;
+	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+	 if (rc) {
+		/* STREAMOFF should never fail  */	
+		printf("\n Failed to call streamoff on OUTPUT Port \n");
+		return -1;
+		}
+
+    return 0;
+
+  }
+  else
+  {
+    return -1;
+  }
+}
+
+//allocating I/P memory from pmem and register with the device
+
+
+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;
+	int rc=0;
+  
+  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.length = pmem_tmp->size;
+     plane.m.userptr = (unsigned long)pmem_tmp->buffer;
+     plane.reserved[0] = pmem_tmp->fd;
+     plane.reserved[1] = 0;
+     plane.data_offset = pmem_tmp->offset;
+     buf.m.planes = &plane;
+     buf.length = 1;
+
+
+	 rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
+                
+	if (rc) {
+		printf("VIDIOC_PREPARE_BUF Failed at line 1387 \n");
+	}
+
+    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)
+  {
+
+     buf.index = index;
+     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+     buf.memory = V4L2_MEMORY_USERPTR;
+     plane.length = pmem_tmp->size;
+     plane.m.userptr = (unsigned long)pmem_tmp->buffer;
+     plane.reserved[0] = pmem_tmp->fd;
+     plane.reserved[1] = 0;
+     plane.data_offset = pmem_tmp->offset;
+     buf.m.planes = &plane;
+     buf.length = 1;
+
+	rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+	if (rc) {
+		printf("VIDIOC_PREPARE_BUF Failed at line 1414 \n");
+	}
+
+    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;
+  }
+
+  return true;
+}
+
+bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
+{
+  struct pmem *pmem_tmp;
+  struct venc_bufferpayload dev_buffer = {0};
+
+  pmem_tmp = (struct pmem *)buf_addr;
+
+  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;
+    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;
+
+    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;
+    }
+  }
+  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;
+  
+  temp_buffer = (struct pmem *)buffer;
+  
+
+  if(buffer == NULL)
+  {
+    DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
+    return false;
+  }
+  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;
+  }
+  else
+  {
+    DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+    plane.m.userptr = (unsigned long)bufhdr->pBuffer;
+  }
+
+     buf.index = index;
+     buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+     buf.memory = V4L2_MEMORY_USERPTR;
+     plane.length = bufhdr->nAllocLen;
+     plane.bytesused = bufhdr->nFilledLen;
+     plane.reserved[0] = fd;
+     plane.reserved[1] = 0;
+     plane.data_offset = bufhdr->nOffset;
+     buf.m.planes = &plane;
+     buf.length = 1;
+
+
+  rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
+	if (rc) {
+		printf("Failed to qbuf to driver");
+		return false;
+	}
+
+	etb_count++;
+
+	if(etb_count == 1)
+	{
+	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) {
+		printf("Failed to call streamon\n");
+	}
+		
+	}
+
+  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
+
+  int y_size = 0;
+  int c_offset = 0;
+
+  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(inputBufferFile1)
+  {
+    fwrite((const char *)frameinfo.ptrbuffer, y_size, 1,inputBufferFile1);
+    fwrite((const char *)(frameinfo.ptrbuffer + c_offset), (y_size>>1), 1,inputBufferFile1);
+  }
+#endif
+
+  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;
+  int rc=0;
+  struct OMX_BUFFERHEADERTYPE *bufhdr;
+
+  if(buffer == NULL)
+  {
+    return false;
+  }
+  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.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.m.userptr = (unsigned long)bufhdr->pBuffer;
+  }
+
+     buf.index = index;
+     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+     buf.memory = V4L2_MEMORY_USERPTR;
+     plane.length = bufhdr->nAllocLen;
+     plane.bytesused = bufhdr->nFilledLen;
+     plane.reserved[0] = fd;
+     plane.reserved[1] = 0;
+     plane.data_offset = bufhdr->nOffset;
+     buf.m.planes = &plane;
+     buf.length = 1;
+
+	rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
+	if (rc) {
+		printf("Failed to qbuf to driver");
+		return false;
+	}
+
+
+  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_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
+{
+	int rc;
+	struct v4l2_control control;
+
+	control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
+	control.value = i_frame_qp;
+
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+	session_qp.iframeqp = control.value;
+
+	control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
+	control.value = p_frame_qp;
+
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+	session_qp.pframqp = control.value;
+
+	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;
+
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+	session_qp.bframqp = control.value;
+	}
+
+	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;
+}
+
+bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
+{
+  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_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;
+  }
+
+  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;
+      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 = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
+      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 == 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:
+        mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
+		if((requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) && (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 = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+        }
+        else
+        {
+          DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
+          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(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 == 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= %u",
+        requested_level.level);
+      return false;
+      break;
+    }
+  }
+  if(!m_profile_set)
+  {
+	int rc;
+	struct v4l2_control control;
+
+	control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
+	control.value = requested_profile.profile;
+
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+    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 = control.value;
+    m_profile_set = true;
+  }
+
+  if(!m_level_set)
+  {
+	int rc;
+	struct v4l2_control control;
+	control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
+	control.value = requested_level.level;
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+    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 = control.value;
+    m_level_set = true;
+  }
+
+  return true;
+}
+
+bool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
+{
+
+  struct venc_voptimingcfg vop_timing_cfg;
+
+  DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
+    TimeIncRes);
+
+  vop_timing_cfg.voptime_resolution = TimeIncRes;
+
+  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)
+{
+
+  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;
+  }
+
+	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
+	control.value = nPFrames;
+
+	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+	if (rc) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("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;
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+  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_bframes = control.value;
+  return true;
+}
+
+bool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
+{
+  //struct venc_entropycfg entropy_cfg;
+
+ // memset(&entropy_cfg,0,sizeof(entropy_cfg));
+	int rc;
+	struct v4l2_control control;
+
+  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)){
+
+	  control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
+	  control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
+
+	  printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("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;
+		printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("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;
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+	entropy.longentropysel=control.value;
+	//entropy_cfg.longentropysel = control.value;
+    }
+  else{
+    DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
+    return false;
+  }
+
+  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
+{
+	int rc;
+	struct v4l2_control control;
+  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;
+	  control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
+    }
+  else{
+   control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
+   //multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+    //multislice_cfg.mslice_size = 0;
+  }
+	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("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;
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+	multislice.mslice_size=control.value;
+
+	}
+
+
+  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)
+{
+  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;
+  }
+  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: %d, mb mode:%d", irMBs, ir_mode);
+    return false;
+  }
+
+	printf("Calling IOCTL set control for id=%d, val=%d\n", control_mode.id, control_mode.value);
+	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
+	if (rc) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
+
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
+
+  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 = control_mode.value;
+    intra_refresh.mbcount = control_mbs.value;
+  }
+  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;
+
+   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 (/*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;
+   }
+
+   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 &&
+            error_resilience->bEnableDataPartitioning) {
+      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);
+   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)
+{
+	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;
+  }
+
+	  printf("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;
+	}
+	printf("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;
+
+	printf("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;
+	}
+	printf("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;
+	printf("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;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+  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.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;
+	control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
+	control.value = nTargetBitrate/1000;
+
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+  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 = control.value*1000;
+  bitrate.target_bitrate = control.value*1000;
+  if(!config)
+  {
+    m_level_set = false;
+    if(venc_set_profile_level(0, 0))
+    {
+      DEBUG_PRINT_HIGH("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)
+{
+
+	struct v4l2_control control;
+	int rc;
+	control.id = V4L2_CID_MPEG_VIDC_VIDEO_FRAME_RATE;
+	control.value = encode_framerate;
+	printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+  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;
+  }
+
+  m_sVenc_cfg.fps_den = 1;
+  m_sVenc_cfg.fps_num = control.value;
+  if(!config)
+  {
+    m_level_set = false;
+    if(venc_set_profile_level(0, 0))
+    {
+      DEBUG_PRINT_HIGH("Calling set level (Framerate) with %d\n",profile_level.level);
+    }
+  }
+  return true;
+}
+
+bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
+{
+  DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
+
+  if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
+  {
+  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+  }
+  else
+  {
+    DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
+    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+    DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
+  }
+  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;
+    }
+  }
+  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;
+	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;
+  }
+
+  if(status)
+  {
+
+	  printf("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) {
+		printf("Failed to set control\n");
+		return false;
+	}
+	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+    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 = 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;
+  }
+
+  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;
+    }
+  }
+  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;
+
+  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;
+          }
+        }
+      }
+
+      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
+        {
+          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;
+          }
+        }
+      }
+
+      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
+        {
+          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;
+          }
+        }
+      }
+
+      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;
+      }
+  }
+  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 == V4L2_PIX_FMT_MPEG4))
+  {
+    if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
+      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+    if(codec_profile.profile == 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;
+
+  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;
+          }
+        }
+      }
+      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)
+{
+  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/vidc/venc/test/camera_test.cpp b/mm-video/vidc/venc/test/camera_test.cpp
new file mode 100755
index 0000000..1c4f8ae
--- /dev/null
+++ b/mm-video/vidc/venc/test/camera_test.cpp
@@ -0,0 +1,93 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/test/fb_test.c b/mm-video/vidc/venc/test/fb_test.c
new file mode 100755
index 0000000..6bbe088
--- /dev/null
+++ b/mm-video/vidc/venc/test/fb_test.c
@@ -0,0 +1,48 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/test/queue.c b/mm-video/vidc/venc/test/queue.c
new file mode 100755
index 0000000..98c27da
--- /dev/null
+++ b/mm-video/vidc/venc/test/queue.c
@@ -0,0 +1,174 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/test/venc_test.cpp b/mm-video/vidc/venc/test/venc_test.cpp
new file mode 100755
index 0000000..c525aab
--- /dev/null
+++ b/mm-video/vidc/venc/test/venc_test.cpp
@@ -0,0 +1,2333 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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 _ T E S T. C P P

+

+DESCRIPTION

+

+ This is the OMX test app .

+

+REFERENCES

+

+============================================================================*/

+

+//usage

+// FILE QVGA MP4 24 384000 100 enc_qvga.yuv QVGA_24.m4v

+// FILE QCIF MP4 15 96000 0 foreman.qcif.yuv output_qcif.m4v

+// FILE VGA MP4 24 1200000 218 enc_vga.yuv vga_output.m4v

+#include <sys/types.h>

+#include <sys/stat.h>

+#include <string.h>

+#include <unistd.h>

+#include <stdlib.h>

+#include <stdio.h>

+#include <pthread.h>

+#include <fcntl.h>

+#include <sys/mman.h>

+//#include <sys/time.h>

+#include <time.h>

+#include <sys/ioctl.h>

+#include <limits.h>

+#include <string.h>

+//#include <sys/stat.h>

+#include "OMX_QCOMExtns.h"

+#include "OMX_Core.h"

+

+#define QCOM_EXT 1

+

+#include "OMX_Core.h"

+#include "OMX_Video.h"

+#include "OMX_Component.h"

+#include "camera_test.h"

+#include "fb_test.h"

+#include "venc_util.h"

+#include "extra_data_handler.h"

+#ifdef USE_ION

+#include <ion_msm.h>

+#endif

+

+//////////////////////////

+// MACROS

+//////////////////////////

+

+#define CHK(result) if (result != OMX_ErrorNone) { E("*************** error *************"); exit(0); }

+#define TEST_LOG

+#ifdef VENC_SYSLOG

+#include "cutils/log.h"

+/// Debug message macro

+#define D(fmt, ...) LOGE("venc_test Debug %s::%d "fmt"\n",              \

+                         __FUNCTION__, __LINE__,                        \

+                         ## __VA_ARGS__)

+

+/// Error message macro

+#define E(fmt, ...) LOGE("venc_test Error %s::%d "fmt"\n",            \

+                         __FUNCTION__, __LINE__,                      \

+                         ## __VA_ARGS__)

+

+#else

+     #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

+

+#endif

+

+//////////////////////////

+// CONSTANTS

+//////////////////////////

+static const int MAX_MSG = 100;

+//#warning do not hardcode these use port definition

+static const int PORT_INDEX_IN = 0;

+static const int PORT_INDEX_OUT = 1;

+

+static const int NUM_IN_BUFFERS = 10;

+static const int NUM_OUT_BUFFERS = 10;

+

+unsigned int num_in_buffers = 0;

+unsigned int num_out_buffers = 0;

+

+//////////////////////////

+/* MPEG4 profile and level table*/

+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},

+    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},

+    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},

+    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},

+    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},

+    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},

+    {0,0,0,0,0},

+

+    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},

+    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},

+    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},

+    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},

+    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},

+    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},

+    {0,0,0,0,0},

+};

+

+/* 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*/

+    {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},

+    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},

+    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},

+    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},

+    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},

+    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},

+    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},

+    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},

+    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},

+    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},

+    {0,0,0,0,0},

+

+    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},

+    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},

+    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},

+    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},

+    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},

+    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},

+    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},

+    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},

+    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},

+    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},

+    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},

+    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},

+    {0,0,0,0,0},

+

+    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},

+    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},

+    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},

+    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},

+    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},

+    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},

+    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},

+    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},

+    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},

+    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},

+    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},

+    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},

+    {0,0,0,0,0}

+

+};

+

+/* H263 profile and level table*/

+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},

+    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},

+    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},

+    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},

+    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},

+    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},

+    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},

+    {0,0,0,0,0}

+};

+

+#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }

+#define FractionToQ16(q,num,den) { OMX_U32 power; Log2(den,power); q = num << (16 - power); }

+

+//////////////////////////

+// 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;

+#ifdef BADGER

+   OMX_U32 nFramestride;

+   OMX_U32 nFrameScanlines;

+   OMX_U32 nFrameRead;

+#endif

+   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

+};

+union MsgData

+{

+   struct

+   {

+      OMX_BUFFERHEADERTYPE* pBuffer;

+   } sBitstreamData;

+};

+struct Msg

+{

+   MsgId id;

+   MsgData data;

+};

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

+};

+

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

+};

+#endif

+

+//////////////////////////

+// MODULE VARS

+//////////////////////////

+static pthread_mutex_t m_mutex;

+static pthread_cond_t m_signal;

+static MsgQ m_sMsgQ;

+

+//#warning determine how many buffers we really have

+OMX_STATETYPE m_eState = OMX_StateInvalid;

+OMX_COMPONENTTYPE m_sComponent;

+OMX_HANDLETYPE m_hHandle = NULL;

+OMX_BUFFERHEADERTYPE* m_pOutBuffers[NUM_OUT_BUFFERS] = {NULL};

+OMX_BUFFERHEADERTYPE* m_pInBuffers[NUM_IN_BUFFERS] = {NULL};

+OMX_BOOL m_bInFrameFree[NUM_IN_BUFFERS];

+

+ProfileType m_sProfile;

+

+static int m_nFramePlay = 0;

+static int m_eMode = MODE_PREVIEW;

+static int m_nInFd = -1;

+static int m_nOutFd = -1;

+static int m_nTimeStamp = 0;

+static int m_nFrameIn = 0; // frames pushed to encoder

+static int m_nFrameOut = 0; // frames returned by encoder

+static int m_nAVCSliceMode = 0;

+static bool m_bWatchDogKicked = false;

+FILE  *m_pDynConfFile = NULL;

+static struct DynamicConfig dynamic_config;

+

+/* Statistics Logging */

+static long long tot_bufsize = 0;

+int ebd_cnt=0, fbd_cnt=0;

+

+#ifdef USE_ION

+static const char* PMEM_DEVICE = "/dev/ion";

+#elif MAX_RES_720P

+static const char* PMEM_DEVICE = "/dev/pmem_adsp";

+#elif MAX_RES_1080P_EBI

+static const char* PMEM_DEVICE  = "/dev/pmem_adsp";

+#elif MAX_RES_1080P

+static const char* PMEM_DEVICE = "/dev/pmem_smipool";

+#else

+#error PMEM_DEVICE cannot be determined.

+#endif

+

+#ifdef USE_ION

+struct enc_ion ion_data;

+#endif

+//////////////////////////

+// MODULE FUNCTIONS

+//////////////////////////

+

+void* PmemMalloc(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, int nSize)

+{

+   void *pvirt = NULL;

+   int rc = 0;

+

+   if (!pMem)

+      return NULL;

+

+#ifdef USE_ION

+  ion_data.ion_device_fd = open (PMEM_DEVICE,O_RDONLY/*|O_DSYNC*/);

+  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.flags = 0x1 << ION_CP_MM_HEAP_ID;

+  ion_data.alloc_data.align = 4096;

+

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

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

+    }

+    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 = %d pvirt=0x%x, pMem->phys=0x%x, 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;

+}

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

+}

+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;                                         \

+      }

+

+   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_PARAM_PORTDEFINITIONTYPE portdef; // OMX_IndexParamPortDefinition

+#ifdef QCOM_EXT

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

+

+   E ("\n Height %d width %d bit rate %d",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);

+

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

+   }

+

+   mb_per_frame = ((m_sProfile.nFrameHeight+15)>>4)*

+                ((m_sProfile.nFrameWidth+15)>>4);

+

+   mb_per_sec = mb_per_frame*(m_sProfile.nFramerate);

+

+   do{

+      if(mb_per_frame <= (int)profile_tbl[0])

+      {

+          if(mb_per_sec <= (int)profile_tbl[1])

+          {

+            if(m_sProfile.nBitrate <= (int)profile_tbl[2])

+            {

+              eLevel = (int)profile_tbl[3];

+              eProfile = (int)profile_tbl[4];

+              E("\n profile/level found: %d/%d\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...");

+

+      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 = %d level = %d",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 /////////////////

+

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

+

+/////////////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_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 ///////////////////

+

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

+      }

+

+

+///////////////////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 ///////////////////

+

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

+      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.

+

+      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_MB;

+          nResyncMarkerSpacing = 50;

+      }

+   }

+

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

+

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

+

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

+            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){

+            OMX_VIDEO_PARAM_MPEG4TYPE mp4;

+            mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output

+            result = OMX_GetParameter(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 ///////////////////

+#endif

+

+#if 1

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

+            }

+         }

+      }

+#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) )

+         {

+            //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;

+

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

+}

+////////////////////////////////////////////////////////////////////////////////

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

+}

+////////////////////////////////////////////////////////////////////////////////

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

+}

+////////////////////////////////////////////////////////////////////////////////

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

+{

+#define SET_STATE(eState)                                   \

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

+          }

+      }

+   }

+

+   else if (eEvent == OMX_EventError)

+   {

+      E("OMX_EventError");

+   }

+

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

+{

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

+      {

+

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

+

+   }

+   return OMX_ErrorNone;

+}

+////////////////////////////////////////////////////////////////////////////////

+OMX_ERRORTYPE FBD_CB(OMX_OUT OMX_HANDLETYPE hComponent,

+                     OMX_OUT OMX_PTR pAppData,

+                     OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)

+{

+   D("Got FBD callback ts=%lld", pBuffer->nTimeStamp);

+

+   static long long prevTime = 0;

+   long long currTime = GetTimeStamp();

+

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

+

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

+

+   for (i = 0; i < num_in_buffers; i++)

+   {

+      m_pInBuffers[i] = NULL;

+   }

+

+   result = OMX_Init();

+   CHK(result);

+

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

+   }

+   else

+   {

+      result = OMX_GetHandle(&m_hHandle,

+                             "OMX.qcom.video.encoder.avc",

+                             NULL,

+                             &sCallbacks);

+      CHK(result);

+   }

+

+

+   result = ConfigureEncoder();

+   CHK(result);

+

+   return result;

+}

+

+////////////////////////////////////////////////////////////////////////////////

+OMX_ERRORTYPE VencTest_RegisterYUVBuffer(OMX_BUFFERHEADERTYPE** ppBufferHeader,

+                                         OMX_U8 *pBuffer,

+                                         OMX_PTR pAppPrivate)

+{

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

+   }

+

+   return result;

+}

+////////////////////////////////////////////////////////////////////////////////

+OMX_ERRORTYPE VencTest_EncodeFrame(void* pYUVBuff,

+                                   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 VencTest_Exit(void)

+{

+   int i;

+   OMX_ERRORTYPE result = OMX_ErrorNone;

+   D("trying to exit venc");

+

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

+

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

+

+      }

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

+}

+////////////////////////////////////////////////////////////////////////////////

+

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

+

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

+  }

+}

+

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

+        }

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

+}

+

+////////////////////////////////////////////////////////////////////////////////

+OMX_ERRORTYPE VencTest_ReadAndEmpty(OMX_BUFFERHEADERTYPE* pYUVBuffer)

+{

+   OMX_ERRORTYPE result = OMX_ErrorNone;

+#ifdef T_ARM

+#ifdef MAX_RES_720P

+   if (read(m_nInFd,

+            pYUVBuffer->pBuffer,

+            m_sProfile.nFrameBytes) != m_sProfile.nFrameBytes)

+   {

+      return OMX_ErrorUndefined;

+   }

+#elif BADGER

+   int bytes;

+   E("will read YUV now: %d bytes to buffer %p\n", m_sProfile.nFrameRead, pYUVBuffer->pBuffer);

+   E("W: %d H: %d Str: %d scal: %d \n", m_sProfile.nFrameWidth, m_sProfile.nFrameHeight,

+		m_sProfile.nFramestride, m_sProfile.nFrameScanlines);

+   bytes = read(m_nInFd, pYUVBuffer->pBuffer, m_sProfile.nFrameRead);

+   if (bytes != m_sProfile.nFrameRead) {

+		E("read failed: %d != %d\n", read, m_sProfile.nFrameRead);

+		return OMX_ErrorUndefined;

+   }

+   E("\n\nRead %d bytes\n\n\n", 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;

+

+         // 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;

+         }

+

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

+

+   }

+#endif

+   if (m_pDynConfFile)

+     VencTest_ProcessDynamicConfigurationFile();

+   D("about to call VencTest_EncodeFrame...");

+   pthread_mutex_lock(&m_mutex);

+   ++m_nFrameIn;

+#ifdef BADGER

+   pYUVBuffer->nFilledLen = m_sProfile.nFrameRead;

+#else

+   pYUVBuffer->nFilledLen = m_sProfile.nFrameBytes;

+#endif

+   D("Called Buffer with Data filled length %d",pYUVBuffer->nFilledLen);

+

+      result = VencTest_EncodeFrame(pYUVBuffer->pBuffer,

+                                 m_nTimeStamp);

+

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

+{

+

+   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

+

+      CameraTest_ReleaseFrame(pPhys, pVirt);

+      return;

+   }

+

+   // see if we should stop

+   pthread_mutex_lock(&m_mutex);

+   ++m_nFrameIn;

+   pthread_mutex_unlock(&m_mutex);

+

+

+   if (m_eMode == MODE_LIVE_ENCODE)

+   {

+

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

+         }

+      }

+

+      if (i == num_in_buffers)

+      {

+         E("There are more camera buffers than we thought");

+         CHK(1);

+      }

+

+      // 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;

+

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

+

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

+                 }

+#else

+              if ((w * h >> 8) <= 8160)

+              {

+                 parseOK = true;

+                 *width = w;

+                 *height = h;

+                 }

+#endif

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

+

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

+

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

+               }

+            }

+         }

+      }

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

+   }

+

+

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

+   }

+

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

+   }

+   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 BADGER

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

+   E("stride: %d, Scanlines: %d, Size: %d",

+     m_sProfile.nFramestride, m_sProfile.nFrameScanlines, m_sProfile.nFrameBytes);

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

+      }

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

+}

+

+int main(int argc, char** argv)

+{

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

+

+   memset(&m_sMsgQ, 0, sizeof(MsgQ));

+   parseArgs(argc, argv);

+

+   D("fps=%d, bitrate=%d, width=%d, height=%d",

+     m_sProfile.nFramerate,

+     m_sProfile.nBitrate,

+     m_sProfile.nFrameWidth,

+     m_sProfile.nFrameHeight);

+

+

+   //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;

+   }

+

+

+    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 output buffers");

+   D("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);

+#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/vidc/venc/test/venc_util.c b/mm-video/vidc/venc/test/venc_util.c
new file mode 100755
index 0000000..1f03810
--- /dev/null
+++ b/mm-video/vidc/venc/test/venc_util.c
@@ -0,0 +1,51 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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/vidc/venc/test/video_encoder_test.c b/mm-video/vidc/venc/test/video_encoder_test.c
new file mode 100755
index 0000000..0eb5f3c
--- /dev/null
+++ b/mm-video/vidc/venc/test/video_encoder_test.c
@@ -0,0 +1,1064 @@
+/*--------------------------------------------------------------------------

+Copyright (c) 2010-2011, Code Aurora Forum. 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 Code Aurora 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;

+}