Home | History | Annotate | Download | only in src
      1 /*--------------------------------------------------------------------------
      2 Copyright (c) 2010-2017, The Linux Foundation. All rights reserved.
      3 
      4 Redistribution and use in source and binary forms, with or without
      5 modification, are permitted provided that the following conditions are met:
      6     * Redistributions of source code must retain the above copyright
      7       notice, this list of conditions and the following disclaimer.
      8     * Redistributions in binary form must reproduce the above copyright
      9       notice, this list of conditions and the following disclaimer in the
     10       documentation and/or other materials provided with the distribution.
     11     * Neither the name of The Linux Foundation nor
     12       the names of its contributors may be used to endorse or promote
     13       products derived from this software without specific prior written
     14       permission.
     15 
     16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18 IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     19 NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     20 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     23 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     25 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     26 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 --------------------------------------------------------------------------*/
     28 #include "omx_video_encoder.h"
     29 #include <string.h>
     30 #include <stdio.h>
     31 #include <fcntl.h>
     32 #include <dlfcn.h>
     33 #ifdef _ANDROID_ICS_
     34 #include <media/hardware/HardwareAPI.h>
     35 #endif
     36 #ifdef _ANDROID_
     37 #include <cutils/properties.h>
     38 #endif
     39 #ifdef _USE_GLIB_
     40 #include <glib.h>
     41 #define strlcpy g_strlcpy
     42 #endif
     43 
     44 extern int m_pipe;
     45 static int bframes;
     46 static int entropy;
     47 static int perfmode;
     48 static int lowlatency;
     49 // factory function executed by the core to create instances
     50 void *get_omx_component_factory_fn(void)
     51 {
     52     return(new omx_venc);
     53 }
     54 
     55 omx_venc::perf_control::perf_control()
     56 {
     57     m_perf_lib = NULL;
     58     m_perf_lock_acquire = NULL;
     59     m_perf_lock_release = NULL;
     60     m_perf_handle = 0;
     61 }
     62 
     63 omx_venc::perf_control::~perf_control()
     64 {
     65     if (m_perf_handle != 0 && m_perf_lock_release) {
     66         m_perf_lock_release(m_perf_handle);
     67     }
     68     if (m_perf_lib) {
     69         dlclose(m_perf_lib);
     70     }
     71 }
     72 
     73 void omx_venc::perf_control::send_hint_to_mpctl(bool state)
     74 {
     75     if (load_lib() == false) {
     76         return;
     77     }
     78     /* 0x4601 maps to video encode callback in
     79      * perflock, 46 is the enum number, 01 is
     80      * the state being sent when perflock
     81      * acquire succeeds
     82      */
     83     int arg = 0x4601;
     84 
     85     if (m_perf_lock_acquire && state == true) {
     86         m_perf_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int));
     87         DEBUG_PRINT_INFO("Video encode perflock acquired,handle=%d",m_perf_handle);
     88     } else if (m_perf_lock_release && state == false) {
     89         m_perf_lock_release(m_perf_handle);
     90         DEBUG_PRINT_INFO("Video encode perflock released");
     91     }
     92 }
     93 
     94 bool omx_venc::perf_control::load_lib()
     95 {
     96     char perf_lib_path[PROPERTY_VALUE_MAX] = {0};
     97     if (m_perf_lib)
     98         return true;
     99 
    100     if ((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) {
    101         DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library");
    102         goto handle_err;
    103     }
    104     if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) {
    105         DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror());
    106         goto handle_err;
    107     } else {
    108         m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq");
    109         if (m_perf_lock_acquire == NULL) {
    110             DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq");
    111             goto handle_err;
    112         }
    113         m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel");
    114         if (m_perf_lock_release == NULL) {
    115             DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel");
    116             goto handle_err;
    117         }
    118     }
    119     return true;
    120 
    121 handle_err:
    122     if(m_perf_lib != NULL) {
    123         dlclose(m_perf_lib);
    124     }
    125     return false;
    126 }
    127 
    128 //constructor
    129 
    130 omx_venc::omx_venc()
    131 {
    132 #ifdef _ANDROID_ICS_
    133     meta_mode_enable = false;
    134     memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
    135     memset(meta_buffers,0,sizeof(meta_buffers));
    136     memset(opaque_buffer_hdr,0,sizeof(opaque_buffer_hdr));
    137     mUseProxyColorFormat = false;
    138     get_syntaxhdr_enable = false;
    139 #endif
    140     bframes = entropy = 0;
    141     char property_value[PROPERTY_VALUE_MAX] = {0};
    142     property_get("vendor.vidc.debug.level", property_value, "1");
    143     debug_level = strtoul(property_value, NULL, 16);
    144     property_value[0] = '\0';
    145     property_get("vendor.vidc.debug.bframes", property_value, "0");
    146     bframes = atoi(property_value);
    147     property_value[0] = '\0';
    148     property_get("vendor.vidc.debug.entropy", property_value, "1");
    149     entropy = !!atoi(property_value);
    150     property_value[0] = '\0';
    151     property_get("vendor.vidc.debug.perf.mode", property_value, "0");
    152     perfmode = atoi(property_value);
    153     property_value[0] = '\0';
    154     handle = NULL;
    155     property_get("vendor.vidc.debug.lowlatency", property_value, "0");
    156     lowlatency = atoi(property_value);
    157     property_value[0] = '\0';
    158     m_perf_control.send_hint_to_mpctl(true);
    159 }
    160 
    161 omx_venc::~omx_venc()
    162 {
    163     get_syntaxhdr_enable = false;
    164     m_perf_control.send_hint_to_mpctl(false);
    165     //nothing to do
    166 }
    167 
    168 /* ======================================================================
    169    FUNCTION
    170    omx_venc::ComponentInit
    171 
    172    DESCRIPTION
    173    Initialize the component.
    174 
    175    PARAMETERS
    176    ctxt -- Context information related to the self.
    177    id   -- Event identifier. This could be any of the following:
    178    1. Command completion event
    179    2. Buffer done callback event
    180    3. Frame done callback event
    181 
    182    RETURN VALUE
    183    None.
    184 
    185    ========================================================================== */
    186 OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
    187 {
    188 
    189     OMX_ERRORTYPE eRet = OMX_ErrorNone;
    190 
    191     int fds[2];
    192     int r;
    193 
    194     OMX_VIDEO_CODINGTYPE codec_type;
    195 
    196     DEBUG_PRINT_HIGH("omx_venc(): Inside component_init()");
    197     // Copy the role information which provides the decoder m_nkind
    198     strlcpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
    199     secure_session = false;
    200 
    201     if (!strncmp((char *)m_nkind,"OMX.qcom.video.encoder.mpeg4",\
    202                 OMX_MAX_STRINGNAME_SIZE)) {
    203         strlcpy((char *)m_cRole, "video_encoder.mpeg4",\
    204                 OMX_MAX_STRINGNAME_SIZE);
    205         codec_type = OMX_VIDEO_CodingMPEG4;
    206     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
    207                 OMX_MAX_STRINGNAME_SIZE)) {
    208         strlcpy((char *)m_cRole, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
    209         codec_type = OMX_VIDEO_CodingH263;
    210     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
    211                 OMX_MAX_STRINGNAME_SIZE)) {
    212         strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
    213         codec_type = OMX_VIDEO_CodingAVC;
    214     } else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\
    215                 OMX_MAX_STRINGNAME_SIZE)) {
    216         strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
    217         codec_type = OMX_VIDEO_CodingAVC;
    218         secure_session = true;
    219     }
    220 #ifdef _MSM8974_
    221     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",    \
    222                 OMX_MAX_STRINGNAME_SIZE)) {
    223         strlcpy((char *)m_cRole, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
    224         codec_type = OMX_VIDEO_CodingVP8;
    225     }
    226 #endif
    227     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc",    \
    228                 OMX_MAX_STRINGNAME_SIZE)) {
    229         strlcpy((char *)m_cRole, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE);
    230         codec_type = OMX_VIDEO_CodingHEVC;
    231     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc.secure",    \
    232                 OMX_MAX_STRINGNAME_SIZE)) {
    233         strlcpy((char *)m_cRole, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE);
    234         codec_type = OMX_VIDEO_CodingHEVC;
    235         secure_session = true;
    236     } else {
    237         DEBUG_PRINT_ERROR("ERROR: Unknown Component");
    238         eRet = OMX_ErrorInvalidComponentName;
    239     }
    240 
    241     if (eRet != OMX_ErrorNone) {
    242         return eRet;
    243     }
    244 #ifdef ENABLE_GET_SYNTAX_HDR
    245     get_syntaxhdr_enable = true;
    246     DEBUG_PRINT_HIGH("Get syntax header enabled");
    247 #endif
    248 
    249     handle = new venc_dev(this);
    250 
    251     if (handle == NULL) {
    252         DEBUG_PRINT_ERROR("ERROR: handle is NULL");
    253         return OMX_ErrorInsufficientResources;
    254     }
    255 
    256     if (handle->venc_open(codec_type) != true) {
    257         DEBUG_PRINT_ERROR("ERROR: venc_open failed");
    258         eRet = OMX_ErrorInsufficientResources;
    259         goto init_error;
    260     }
    261 
    262     //Intialise the OMX layer variables
    263     memset(&m_pCallbacks,0,sizeof(OMX_CALLBACKTYPE));
    264 
    265     OMX_INIT_STRUCT(&m_sPortParam, OMX_PORT_PARAM_TYPE);
    266     m_sPortParam.nPorts = 0x2;
    267     m_sPortParam.nStartPortNumber = (OMX_U32) PORT_INDEX_IN;
    268 
    269     OMX_INIT_STRUCT(&m_sPortParam_audio, OMX_PORT_PARAM_TYPE);
    270     m_sPortParam_audio.nPorts = 0;
    271     m_sPortParam_audio.nStartPortNumber = 0;
    272 
    273     OMX_INIT_STRUCT(&m_sPortParam_img, OMX_PORT_PARAM_TYPE);
    274     m_sPortParam_img.nPorts = 0;
    275     m_sPortParam_img.nStartPortNumber = 0;
    276 
    277     OMX_INIT_STRUCT(&m_sParamBitrate, OMX_VIDEO_PARAM_BITRATETYPE);
    278     m_sParamBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    279     m_sParamBitrate.eControlRate = OMX_Video_ControlRateVariableSkipFrames;
    280     m_sParamBitrate.nTargetBitrate = 64000;
    281 
    282     OMX_INIT_STRUCT(&m_sConfigBitrate, OMX_VIDEO_CONFIG_BITRATETYPE);
    283     m_sConfigBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    284     m_sConfigBitrate.nEncodeBitrate = 64000;
    285 
    286     OMX_INIT_STRUCT(&m_sConfigFramerate, OMX_CONFIG_FRAMERATETYPE);
    287     m_sConfigFramerate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    288     m_sConfigFramerate.xEncodeFramerate = 30 << 16;
    289 
    290     OMX_INIT_STRUCT(&m_sConfigIntraRefreshVOP, OMX_CONFIG_INTRAREFRESHVOPTYPE);
    291     m_sConfigIntraRefreshVOP.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    292     m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
    293 
    294     OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
    295     m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    296     m_sConfigFrameRotation.nRotation = 0;
    297 
    298     OMX_INIT_STRUCT(&m_sConfigAVCIDRPeriod, OMX_VIDEO_CONFIG_AVCINTRAPERIOD);
    299     m_sConfigAVCIDRPeriod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    300 
    301     OMX_INIT_STRUCT(&m_sPrependSPSPPS, PrependSPSPPSToIDRFramesParams);
    302     m_sPrependSPSPPS.bEnable = OMX_FALSE;
    303 
    304     OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
    305     m_sSessionQuantization.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    306     m_sSessionQuantization.nQpI = 9;
    307     m_sSessionQuantization.nQpP = 6;
    308     m_sSessionQuantization.nQpB = 2;
    309 
    310     OMX_INIT_STRUCT(&m_sSessionQPRange, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
    311     OMX_INIT_STRUCT(&m_sSessionIPBQPRange, OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE);
    312     m_sSessionQPRange.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    313     m_sSessionIPBQPRange.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
    314     m_sSessionQPRange.minQP = 2;
    315     if (codec_type == OMX_VIDEO_CodingAVC) {
    316         m_sSessionQPRange.maxQP = 51;
    317     } else {
    318         m_sSessionQPRange.maxQP = 31;
    319     }
    320     m_sSessionIPBQPRange.minIQP =
    321                 m_sSessionIPBQPRange.minPQP =
    322                 m_sSessionIPBQPRange.minBQP = m_sSessionQPRange.minQP;
    323     m_sSessionIPBQPRange.maxIQP =
    324                 m_sSessionIPBQPRange.maxPQP =
    325                 m_sSessionIPBQPRange.maxBQP = m_sSessionQPRange.maxQP;
    326     OMX_INIT_STRUCT(&m_sAVCSliceFMO, OMX_VIDEO_PARAM_AVCSLICEFMO);
    327     m_sAVCSliceFMO.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    328     m_sAVCSliceFMO.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
    329     m_sAVCSliceFMO.nNumSliceGroups = 0;
    330     m_sAVCSliceFMO.nSliceGroupMapType = 0;
    331     OMX_INIT_STRUCT(&m_sParamProfileLevel, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
    332     m_sParamProfileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    333 
    334     OMX_INIT_STRUCT(&m_sIntraperiod, QOMX_VIDEO_INTRAPERIODTYPE);
    335     m_sIntraperiod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    336     m_sIntraperiod.nPFrames = (m_sConfigFramerate.xEncodeFramerate * 2) - 1;
    337 
    338     OMX_INIT_STRUCT(&m_sErrorCorrection, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
    339     m_sErrorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    340     m_sErrorCorrection.bEnableDataPartitioning = OMX_FALSE;
    341     m_sErrorCorrection.bEnableHEC = OMX_FALSE;
    342     m_sErrorCorrection.bEnableResync = OMX_FALSE;
    343     m_sErrorCorrection.bEnableRVLC = OMX_FALSE;
    344     m_sErrorCorrection.nResynchMarkerSpacing = 0;
    345 
    346     OMX_INIT_STRUCT(&m_sIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
    347     m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    348     m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax;
    349 
    350 #ifdef SUPPORT_CONFIG_INTRA_REFRESH
    351     OMX_INIT_STRUCT(&m_sConfigIntraRefresh, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE);
    352     m_sConfigIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    353     m_sConfigIntraRefresh.nRefreshPeriod = 0;
    354 #endif
    355 
    356     OMX_INIT_STRUCT(&m_sConfigColorAspects, DescribeColorAspectsParams);
    357     m_sConfigColorAspects.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    358     m_sConfigColorAspects.sAspects.mRange =  ColorAspects::RangeUnspecified;
    359     m_sConfigColorAspects.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
    360     m_sConfigColorAspects.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
    361     m_sConfigColorAspects.sAspects.mTransfer = ColorAspects::TransferUnspecified;
    362 
    363     if (codec_type == OMX_VIDEO_CodingMPEG4) {
    364         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple;
    365         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_MPEG4Level0;
    366     } else if (codec_type == OMX_VIDEO_CodingH263) {
    367         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_H263ProfileBaseline;
    368         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_H263Level10;
    369     } else if (codec_type == OMX_VIDEO_CodingAVC) {
    370         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_AVCProfileBaseline;
    371         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_AVCLevel1;
    372     } else if (codec_type == OMX_VIDEO_CodingVP8) {
    373         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_VP8ProfileMain;
    374         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_VP8Level_Version0;
    375     } else if (codec_type == OMX_VIDEO_CodingHEVC) {
    376         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_HEVCProfileMain;
    377         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_HEVCMainTierLevel1;
    378     }
    379 
    380     OMX_INIT_STRUCT(&m_sParamEntropy,  QOMX_VIDEO_H264ENTROPYCODINGTYPE);
    381     m_sParamEntropy.bCabac = OMX_FALSE;
    382 
    383     // Initialize the video parameters for input port
    384     OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
    385     m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN;
    386     m_sInPortDef.bEnabled = OMX_TRUE;
    387     m_sInPortDef.bPopulated = OMX_FALSE;
    388     m_sInPortDef.eDomain = OMX_PortDomainVideo;
    389     m_sInPortDef.eDir = OMX_DirInput;
    390     m_sInPortDef.format.video.cMIMEType = (char *)"YUV420";
    391     m_sInPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
    392     m_sInPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
    393     m_sInPortDef.format.video.nStride = OMX_CORE_QCIF_WIDTH;
    394     m_sInPortDef.format.video.nSliceHeight = OMX_CORE_QCIF_HEIGHT;
    395     m_sInPortDef.format.video.nBitrate = 64000;
    396     m_sInPortDef.format.video.xFramerate = 15 << 16;
    397     m_sInPortDef.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
    398         QOMX_DEFAULT_COLOR_FMT;
    399     m_sInPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingUnused;
    400 
    401     if (dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
    402                 &m_sInPortDef.nBufferCountActual,
    403                 &m_sInPortDef.nBufferSize,
    404                 m_sInPortDef.nPortIndex) != true) {
    405         eRet = OMX_ErrorUndefined;
    406         goto init_error;
    407     }
    408 
    409     // Initialize the video parameters for output port
    410     OMX_INIT_STRUCT(&m_sOutPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
    411     m_sOutPortDef.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    412     m_sOutPortDef.bEnabled = OMX_TRUE;
    413     m_sOutPortDef.bPopulated = OMX_FALSE;
    414     m_sOutPortDef.eDomain = OMX_PortDomainVideo;
    415     m_sOutPortDef.eDir = OMX_DirOutput;
    416     m_sOutPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
    417     m_sOutPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
    418     m_sOutPortDef.format.video.nBitrate = 64000;
    419     m_sOutPortDef.format.video.xFramerate = 15 << 16;
    420     m_sOutPortDef.format.video.eColorFormat =  OMX_COLOR_FormatUnused;
    421     if (codec_type == OMX_VIDEO_CodingMPEG4) {
    422         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
    423     } else if (codec_type == OMX_VIDEO_CodingH263) {
    424         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingH263;
    425     } else if (codec_type == OMX_VIDEO_CodingAVC) {
    426         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingAVC;
    427     } else if (codec_type == OMX_VIDEO_CodingVP8) {
    428         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingVP8;
    429     } else if (codec_type == OMX_VIDEO_CodingHEVC) {
    430         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingHEVC;
    431     }
    432 
    433     if (dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
    434                 &m_sOutPortDef.nBufferCountActual,
    435                 &m_sOutPortDef.nBufferSize,
    436                 m_sOutPortDef.nPortIndex) != true) {
    437         eRet = OMX_ErrorUndefined;
    438         goto init_error;
    439     }
    440 
    441     // Initialize the video color format for input port
    442     OMX_INIT_STRUCT(&m_sInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
    443     m_sInPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_IN;
    444     m_sInPortFormat.nIndex = 0;
    445     m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
    446         QOMX_DEFAULT_COLOR_FMT;
    447     m_sInPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
    448 
    449 
    450     // Initialize the compression format for output port
    451     OMX_INIT_STRUCT(&m_sOutPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
    452     m_sOutPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    453     m_sOutPortFormat.nIndex = 0;
    454     m_sOutPortFormat.eColorFormat = OMX_COLOR_FormatUnused;
    455     if (codec_type == OMX_VIDEO_CodingMPEG4) {
    456         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
    457     } else if (codec_type == OMX_VIDEO_CodingH263) {
    458         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingH263;
    459     } else if (codec_type == OMX_VIDEO_CodingAVC) {
    460         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingAVC;
    461     } else if (codec_type == OMX_VIDEO_CodingVP8) {
    462         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingVP8;
    463     } else if (codec_type == OMX_VIDEO_CodingHEVC) {
    464         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingHEVC;
    465     }
    466 
    467     // mandatory Indices for kronos test suite
    468     OMX_INIT_STRUCT(&m_sPriorityMgmt, OMX_PRIORITYMGMTTYPE);
    469 
    470     OMX_INIT_STRUCT(&m_sInBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
    471     m_sInBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_IN;
    472 
    473     OMX_INIT_STRUCT(&m_sOutBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
    474     m_sOutBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    475 
    476     OMX_INIT_STRUCT(&m_sParamInitqp, QOMX_EXTNINDEX_VIDEO_INITIALQP);
    477     m_sParamInitqp.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    478 
    479     // mp4 specific init
    480     OMX_INIT_STRUCT(&m_sParamMPEG4, OMX_VIDEO_PARAM_MPEG4TYPE);
    481     m_sParamMPEG4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    482     m_sParamMPEG4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
    483     m_sParamMPEG4.eLevel = OMX_VIDEO_MPEG4Level0;
    484     m_sParamMPEG4.nSliceHeaderSpacing = 0;
    485     m_sParamMPEG4.bSVH = OMX_FALSE;
    486     m_sParamMPEG4.bGov = OMX_FALSE;
    487     m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1);  // 2 second intra period for default outport fps
    488     m_sParamMPEG4.bACPred = OMX_TRUE;
    489     m_sParamMPEG4.nTimeIncRes = 30; // delta = 2 @ 15 fps
    490     m_sParamMPEG4.nAllowedPictureTypes = 2; // pframe and iframe
    491     m_sParamMPEG4.nHeaderExtension = 1; // number of video packet headers per vop
    492     m_sParamMPEG4.bReversibleVLC = OMX_FALSE;
    493 
    494     // h263 specific init
    495     OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE);
    496     m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    497     m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
    498     m_sParamH263.nBFrames = 0;
    499     m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
    500     m_sParamH263.eLevel = OMX_VIDEO_H263Level10;
    501     m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE;
    502     m_sParamH263.nAllowedPictureTypes = 2;
    503     m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE;
    504     m_sParamH263.nPictureHeaderRepetition = 0;
    505     m_sParamH263.nGOBHeaderInterval = 1;
    506 
    507     // h264 specific init
    508     OMX_INIT_STRUCT(&m_sParamAVC, OMX_VIDEO_PARAM_AVCTYPE);
    509     m_sParamAVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    510     m_sParamAVC.nSliceHeaderSpacing = 0;
    511     m_sParamAVC.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
    512     m_sParamAVC.nBFrames = 0;
    513     m_sParamAVC.bUseHadamard = OMX_FALSE;
    514     m_sParamAVC.nRefIdx10ActiveMinus1 = 1;
    515     m_sParamAVC.nRefIdx11ActiveMinus1 = 0;
    516     m_sParamAVC.bEnableUEP = OMX_FALSE;
    517     m_sParamAVC.bEnableFMO = OMX_FALSE;
    518     m_sParamAVC.bEnableASO = OMX_FALSE;
    519     m_sParamAVC.bEnableRS = OMX_FALSE;
    520     m_sParamAVC.eProfile = OMX_VIDEO_AVCProfileBaseline;
    521     m_sParamAVC.eLevel = OMX_VIDEO_AVCLevel1;
    522     m_sParamAVC.nAllowedPictureTypes = 2;
    523     m_sParamAVC.bFrameMBsOnly = OMX_FALSE;
    524     m_sParamAVC.bMBAFF = OMX_FALSE;
    525     m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE;
    526     m_sParamAVC.bWeightedPPrediction = OMX_FALSE;
    527     m_sParamAVC.nWeightedBipredicitonMode = 0;
    528     m_sParamAVC.bconstIpred = OMX_FALSE;
    529     m_sParamAVC.bDirect8x8Inference = OMX_FALSE;
    530     m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE;
    531     m_sParamAVC.nCabacInitIdc = 0;
    532     m_sParamAVC.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
    533 
    534     // VP8 specific init
    535     OMX_INIT_STRUCT(&m_sParamVP8, OMX_VIDEO_PARAM_VP8TYPE);
    536     m_sParamVP8.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    537     m_sParamVP8.eProfile = OMX_VIDEO_VP8ProfileMain;
    538     m_sParamVP8.eLevel = OMX_VIDEO_VP8Level_Version0;
    539     m_sParamVP8.nDCTPartitions = 0;
    540     m_sParamVP8.bErrorResilientMode = OMX_FALSE;
    541 
    542     // HEVC specific init
    543     OMX_INIT_STRUCT(&m_sParamHEVC, OMX_VIDEO_PARAM_HEVCTYPE);
    544     m_sParamHEVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    545     m_sParamHEVC.eProfile =  OMX_VIDEO_HEVCProfileMain;
    546     m_sParamHEVC.eLevel =  OMX_VIDEO_HEVCMainTierLevel1;
    547 
    548     OMX_INIT_STRUCT(&m_sParamLTRMode, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
    549     m_sParamLTRMode.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    550     m_sParamLTRMode.eLTRMode = QOMX_VIDEO_LTRMode_Disable;
    551 
    552     OMX_INIT_STRUCT(&m_sParamLTRCount, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE);
    553     m_sParamLTRCount.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    554     m_sParamLTRCount.nCount = 0;
    555 
    556     OMX_INIT_STRUCT(&m_sConfigDeinterlace, OMX_VIDEO_CONFIG_DEINTERLACE);
    557     m_sConfigDeinterlace.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    558     m_sConfigDeinterlace.nEnable = OMX_FALSE;
    559 
    560     OMX_INIT_STRUCT(&m_sHierLayers, QOMX_VIDEO_HIERARCHICALLAYERS);
    561     m_sHierLayers.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    562     m_sHierLayers.nNumLayers = 0;
    563     m_sHierLayers.eHierarchicalCodingType = QOMX_HIERARCHICALCODING_P;
    564 
    565     OMX_INIT_STRUCT(&m_sMBIStatistics, OMX_QOMX_VIDEO_MBI_STATISTICS);
    566     m_sMBIStatistics.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
    567     m_sMBIStatistics.eMBIStatisticsType = QOMX_MBI_STATISTICS_MODE_DEFAULT;
    568 
    569     OMX_INIT_STRUCT(&m_slowLatencyMode, QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE);
    570     m_slowLatencyMode.bLowLatencyMode = OMX_FALSE;
    571 
    572     OMX_INIT_STRUCT(&m_sParamTemporalLayers, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE);
    573     m_sParamTemporalLayers.eSupportedPatterns = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid;
    574 
    575     OMX_INIT_STRUCT(&m_sConfigTemporalLayers, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE);
    576 
    577     OMX_INIT_STRUCT(&m_sParamAVTimerTimestampMode, QOMX_ENABLETYPE);
    578     m_sParamAVTimerTimestampMode.bEnable = OMX_FALSE;
    579 
    580     m_state                   = OMX_StateLoaded;
    581     m_sExtraData = 0;
    582 
    583     if (eRet == OMX_ErrorNone) {
    584         if (pipe(fds)) {
    585             DEBUG_PRINT_ERROR("ERROR: pipe creation failed");
    586             eRet = OMX_ErrorInsufficientResources;
    587             goto init_error;
    588         } else {
    589             if (fds[0] == 0 || fds[1] == 0) {
    590                 if (pipe(fds)) {
    591                     DEBUG_PRINT_ERROR("ERROR: pipe creation failed");
    592                     eRet = OMX_ErrorInsufficientResources;
    593                     goto init_error;
    594                 }
    595             }
    596             if (eRet == OMX_ErrorNone) {
    597                 m_pipe_in = fds[0];
    598                 m_pipe_out = fds[1];
    599 
    600                 msg_thread_created = true;
    601                 r = pthread_create(&msg_thread_id,0, message_thread_enc, this);
    602                 if (r < 0) {
    603                     DEBUG_PRINT_ERROR("ERROR: message_thread_enc thread creation failed");
    604                     eRet = OMX_ErrorInsufficientResources;
    605                     msg_thread_created = false;
    606                     goto init_error;
    607                 } else {
    608                     async_thread_created = true;
    609                     r = pthread_create(&async_thread_id,0, venc_dev::async_venc_message_thread, this);
    610                     if (r < 0) {
    611                         DEBUG_PRINT_ERROR("ERROR: venc_dev::async_venc_message_thread thread creation failed");
    612                         eRet = OMX_ErrorInsufficientResources;
    613                         async_thread_created = false;
    614 
    615                         msg_thread_stop = true;
    616                         pthread_join(msg_thread_id,NULL);
    617                         msg_thread_created = false;
    618 
    619                         goto init_error;
    620                     } else
    621                         dev_set_message_thread_id(async_thread_id);
    622                 }
    623             }
    624         }
    625     }
    626 
    627     if (perfmode) {
    628         QOMX_EXTNINDEX_VIDEO_PERFMODE pParam;
    629         pParam.nPerfMode = perfmode;
    630         DEBUG_PRINT_LOW("Perfmode = 0x%x", pParam.nPerfMode);
    631         if (!handle->venc_set_config(&pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode))
    632             DEBUG_PRINT_ERROR("Failed setting PerfMode to %d", pParam.nPerfMode);
    633     }
    634 
    635     if (lowlatency)
    636     {
    637         QOMX_ENABLETYPE low_latency;
    638         low_latency.bEnable = OMX_TRUE;
    639         DEBUG_PRINT_LOW("Enable lowlatency mode");
    640         if (!handle->venc_set_param(&low_latency,
    641                (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencLowLatencyMode)) {
    642             DEBUG_PRINT_ERROR("Failed enabling low latency mode");
    643         }
    644     }
    645     DEBUG_PRINT_INFO("Component_init : %s : return = 0x%x", m_nkind, eRet);
    646 
    647     {
    648         VendorExtensionStore *extStore = const_cast<VendorExtensionStore *>(&mVendorExtensionStore);
    649         init_vendor_extensions(*extStore);
    650         mVendorExtensionStore.dumpExtensions((const char *)m_nkind);
    651     }
    652 
    653     return eRet;
    654 init_error:
    655     handle->venc_close();
    656     delete handle;
    657     handle = NULL;
    658     return eRet;
    659 }
    660 
    661 
    662 /* ======================================================================
    663    FUNCTION
    664    omx_venc::Setparameter
    665 
    666    DESCRIPTION
    667    OMX Set Parameter method implementation.
    668 
    669    PARAMETERS
    670    <TBD>.
    671 
    672    RETURN VALUE
    673    OMX Error None if successful.
    674 
    675    ========================================================================== */
    676 OMX_ERRORTYPE  omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
    677         OMX_IN OMX_INDEXTYPE paramIndex,
    678         OMX_IN OMX_PTR        paramData)
    679 {
    680     (void)hComp;
    681     OMX_ERRORTYPE eRet = OMX_ErrorNone;
    682 
    683 
    684     if (m_state == OMX_StateInvalid) {
    685         DEBUG_PRINT_ERROR("ERROR: Set Param in Invalid State");
    686         return OMX_ErrorInvalidState;
    687     }
    688     if (paramData == NULL) {
    689         DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData");
    690         return OMX_ErrorBadParameter;
    691     }
    692 
    693     /*set_parameter can be called in loaded state
    694       or disabled port */
    695     if (m_state == OMX_StateLoaded
    696             || m_sInPortDef.bEnabled == OMX_FALSE
    697             || m_sOutPortDef.bEnabled == OMX_FALSE) {
    698         DEBUG_PRINT_LOW("Set Parameter called in valid state");
    699     } else {
    700         DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
    701         return OMX_ErrorIncorrectStateOperation;
    702     }
    703 
    704     switch ((int)paramIndex) {
    705         case OMX_IndexParamPortDefinition:
    706             {
    707                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
    708                 OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
    709                 portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
    710                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
    711                         (int)portDefn->format.video.nFrameHeight,
    712                         (int)portDefn->format.video.nFrameWidth);
    713 
    714                 if (PORT_INDEX_IN == portDefn->nPortIndex) {
    715                     if (!dev_is_video_session_supported(portDefn->format.video.nFrameWidth,
    716                                 portDefn->format.video.nFrameHeight)) {
    717                         DEBUG_PRINT_ERROR("video session not supported");
    718                         omx_report_unsupported_setting();
    719                         return OMX_ErrorUnsupportedSetting;
    720                     }
    721                     DEBUG_PRINT_LOW("i/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual);
    722                     DEBUG_PRINT_LOW("i/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin);
    723                     DEBUG_PRINT_LOW("i/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize);
    724                     if (portDefn->nBufferCountActual > MAX_NUM_INPUT_BUFFERS) {
    725                         DEBUG_PRINT_ERROR("ERROR: (In_PORT) actual count (%u) exceeds max(%u)",
    726                                 (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_INPUT_BUFFERS);
    727                         return OMX_ErrorUnsupportedSetting;
    728                     }
    729                     if (m_inp_mem_ptr &&
    730                             (portDefn->nBufferCountActual != m_sInPortDef.nBufferCountActual ||
    731                             portDefn->nBufferSize != m_sInPortDef.nBufferSize)) {
    732                         DEBUG_PRINT_ERROR("ERROR: (In_PORT) buffer count/size can change only if port is unallocated !");
    733                         return OMX_ErrorInvalidState;
    734                     }
    735                     if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
    736                         DEBUG_PRINT_ERROR("ERROR: (In_PORT) Min buffers (%u) > actual count (%u)",
    737                                 (unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual);
    738                         return OMX_ErrorUnsupportedSetting;
    739                     }
    740                     if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
    741                         DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed");
    742                         return handle->hw_overload ? OMX_ErrorInsufficientResources :
    743                                 OMX_ErrorUnsupportedSetting;
    744                     }
    745 
    746                     DEBUG_PRINT_LOW("i/p previous actual cnt = %u", (unsigned int)m_sInPortDef.nBufferCountActual);
    747                     DEBUG_PRINT_LOW("i/p previous min cnt = %u", (unsigned int)m_sInPortDef.nBufferCountMin);
    748                     memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    749 
    750 #ifdef _ANDROID_ICS_
    751                     if (portDefn->format.video.eColorFormat ==
    752                             (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
    753                         m_sInPortDef.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
    754                             QOMX_DEFAULT_COLOR_FMT;
    755                         if (!mUseProxyColorFormat) {
    756                             if (!c2d_conv.init()) {
    757                                 DEBUG_PRINT_ERROR("C2D init failed");
    758                                 return OMX_ErrorUnsupportedSetting;
    759                             }
    760                             DEBUG_PRINT_HIGH("C2D init is successful");
    761                         }
    762                         mUseProxyColorFormat = true;
    763                         m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
    764                     } else
    765                         mUseProxyColorFormat = false;
    766 #endif
    767                     /*Query Input Buffer Requirements*/
    768                     dev_get_buf_req   (&m_sInPortDef.nBufferCountMin,
    769                             &m_sInPortDef.nBufferCountActual,
    770                             &m_sInPortDef.nBufferSize,
    771                             m_sInPortDef.nPortIndex);
    772 
    773                     /*Query ouput Buffer Requirements*/
    774                     dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
    775                             &m_sOutPortDef.nBufferCountActual,
    776                             &m_sOutPortDef.nBufferSize,
    777                             m_sOutPortDef.nPortIndex);
    778                     m_sInPortDef.nBufferCountActual = portDefn->nBufferCountActual;
    779                 } else if (PORT_INDEX_OUT == portDefn->nPortIndex) {
    780                     DEBUG_PRINT_LOW("o/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual);
    781                     DEBUG_PRINT_LOW("o/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin);
    782                     DEBUG_PRINT_LOW("o/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize);
    783 
    784                     if (portDefn->nBufferCountActual > MAX_NUM_OUTPUT_BUFFERS) {
    785                         DEBUG_PRINT_ERROR("ERROR: (Out_PORT) actual count (%u) exceeds max(%u)",
    786                                 (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_OUTPUT_BUFFERS);
    787                         return OMX_ErrorUnsupportedSetting;
    788                     }
    789                     if (m_out_mem_ptr &&
    790                             (portDefn->nBufferCountActual != m_sOutPortDef.nBufferCountActual ||
    791                             portDefn->nBufferSize != m_sOutPortDef.nBufferSize)) {
    792                         DEBUG_PRINT_ERROR("ERROR: (Out_PORT) buffer count/size can change only if port is unallocated !");
    793                         return OMX_ErrorInvalidState;
    794                     }
    795 
    796                     if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
    797                         DEBUG_PRINT_ERROR("ERROR: (Out_PORT) Min buffers (%u) > actual count (%u)",
    798                                 (unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual);
    799                         return OMX_ErrorUnsupportedSetting;
    800                     }
    801                     if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
    802                         DEBUG_PRINT_ERROR("ERROR: venc_set_param output failed");
    803                         return OMX_ErrorUnsupportedSetting;
    804                     }
    805                     memcpy(&m_sOutPortDef,portDefn,sizeof(struct OMX_PARAM_PORTDEFINITIONTYPE));
    806 #ifdef _MSM8974_
    807                     /*Query ouput Buffer Requirements*/
    808                     dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
    809                             &m_sOutPortDef.nBufferCountActual,
    810                             &m_sOutPortDef.nBufferSize,
    811                             m_sOutPortDef.nPortIndex);
    812 #endif
    813                     update_profile_level(); //framerate , bitrate
    814 
    815                     DEBUG_PRINT_LOW("o/p previous actual cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountActual);
    816                     DEBUG_PRINT_LOW("o/p previous min cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountMin);
    817                     m_sOutPortDef.nBufferCountActual = portDefn->nBufferCountActual;
    818                 } else {
    819                     DEBUG_PRINT_ERROR("ERROR: Set_parameter: Bad Port idx %d",
    820                             (int)portDefn->nPortIndex);
    821                     eRet = OMX_ErrorBadPortIndex;
    822                 }
    823                 m_sConfigFramerate.xEncodeFramerate = portDefn->format.video.xFramerate;
    824                 m_sConfigBitrate.nEncodeBitrate = portDefn->format.video.nBitrate;
    825                 m_sParamBitrate.nTargetBitrate = portDefn->format.video.nBitrate;
    826             }
    827             break;
    828 
    829         case OMX_IndexParamVideoPortFormat:
    830             {
    831                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
    832                 OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
    833                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
    834                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
    835                         portFmt->eColorFormat);
    836                 //set the driver with the corresponding values
    837                 if (PORT_INDEX_IN == portFmt->nPortIndex) {
    838                     if (handle->venc_set_param(paramData,OMX_IndexParamVideoPortFormat) != true) {
    839                         return OMX_ErrorUnsupportedSetting;
    840                     }
    841 
    842                     DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
    843                             portFmt->eColorFormat);
    844                     update_profile_level(); //framerate
    845 
    846 #ifdef _ANDROID_ICS_
    847                     if (portFmt->eColorFormat ==
    848                             (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
    849                         m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
    850                             QOMX_DEFAULT_COLOR_FMT;
    851                         if (!mUseProxyColorFormat) {
    852                             if (!c2d_conv.init()) {
    853                                 DEBUG_PRINT_ERROR("C2D init failed");
    854                                 return OMX_ErrorUnsupportedSetting;
    855                             }
    856                             DEBUG_PRINT_HIGH("C2D init is successful");
    857                         }
    858                         mUseProxyColorFormat = true;
    859                         m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
    860                     } else
    861 #endif
    862                     {
    863                         m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
    864                         m_sInPortDef.format.video.eColorFormat = portFmt->eColorFormat;
    865                         m_input_msg_id = OMX_COMPONENT_GENERATE_ETB;
    866                         mUseProxyColorFormat = false;
    867                     }
    868                     m_sInPortFormat.xFramerate = portFmt->xFramerate;
    869                 }
    870                 //TODO if no use case for O/P port,delet m_sOutPortFormat
    871             }
    872             break;
    873         case OMX_IndexParamVideoInit:
    874             { //TODO, do we need this index set param
    875                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
    876                 OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData);
    877                 DEBUG_PRINT_LOW("Set OMX_IndexParamVideoInit called");
    878                 break;
    879             }
    880 
    881         case OMX_IndexParamVideoBitrate:
    882             {
    883                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_BITRATETYPE);
    884                 OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
    885                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate");
    886                 if (handle->venc_set_param(paramData,OMX_IndexParamVideoBitrate) != true) {
    887                     return OMX_ErrorUnsupportedSetting;
    888                 }
    889                 m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate;
    890                 m_sParamBitrate.eControlRate = pParam->eControlRate;
    891                 update_profile_level(); //bitrate
    892                 m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate;
    893                 m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate;
    894                 m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate;
    895                 /* RC mode chan chage buffer requirements on Input port */
    896                 dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
    897                         &m_sInPortDef.nBufferCountActual,
    898                         &m_sInPortDef.nBufferSize,
    899                         m_sInPortDef.nPortIndex);
    900                 DEBUG_PRINT_LOW("bitrate = %u", (unsigned int)m_sOutPortDef.format.video.nBitrate);
    901                 break;
    902             }
    903         case OMX_IndexParamVideoMpeg4:
    904             {
    905                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_MPEG4TYPE);
    906                 OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
    907                 OMX_VIDEO_PARAM_MPEG4TYPE mp4_param;
    908                 memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
    909                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4");
    910                 if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
    911 #ifdef _MSM8974_
    912                     if (pParam->nBFrames || bframes)
    913                         mp4_param.nBFrames = 1;
    914                     else
    915                         mp4_param.nBFrames = 0;
    916                     DEBUG_PRINT_HIGH("MPEG4: %u BFrames are being set", (unsigned int)mp4_param.nBFrames);
    917 #endif
    918                 } else {
    919                     if (pParam->nBFrames) {
    920                         DEBUG_PRINT_ERROR("Warning: B frames not supported");
    921                         mp4_param.nBFrames = 0;
    922                     }
    923                 }
    924                 if (handle->venc_set_param(&mp4_param,OMX_IndexParamVideoMpeg4) != true) {
    925                     return OMX_ErrorUnsupportedSetting;
    926                 }
    927                 memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
    928                 m_sIntraperiod.nPFrames = m_sParamMPEG4.nPFrames;
    929                 if (pParam->nBFrames || bframes)
    930                     m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames = mp4_param.nBFrames;
    931                 else
    932                     m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames;
    933                 break;
    934             }
    935         case OMX_IndexParamVideoH263:
    936             {
    937                 OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
    938                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263");
    939                 if (handle->venc_set_param(paramData,OMX_IndexParamVideoH263) != true) {
    940                     return OMX_ErrorUnsupportedSetting;
    941                 }
    942                 memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE));
    943                 m_sIntraperiod.nPFrames = m_sParamH263.nPFrames;
    944                 m_sIntraperiod.nBFrames = m_sParamH263.nBFrames;
    945                 break;
    946             }
    947         case OMX_IndexParamVideoAvc:
    948             {
    949                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_AVCTYPE);
    950                 OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
    951                 OMX_VIDEO_PARAM_AVCTYPE avc_param;
    952                 memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE));
    953                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc");
    954 
    955                 avc_param.nBFrames = 0;
    956                 if ((pParam->eProfile == OMX_VIDEO_AVCProfileHigh)||
    957                         (pParam->eProfile == OMX_VIDEO_AVCProfileMain)) {
    958 
    959                     if (pParam->nBFrames) {
    960                         avc_param.nBFrames = pParam->nBFrames;
    961                         DEBUG_PRINT_LOW("B frames set using Client setparam to %d",
    962                             avc_param.nBFrames);
    963                     }
    964 
    965                     if (bframes ) {
    966                         avc_param.nBFrames = bframes;
    967                         DEBUG_PRINT_LOW("B frames set using setprop to %d",
    968                             avc_param.nBFrames);
    969                     }
    970 
    971                     DEBUG_PRINT_HIGH("AVC: BFrames: %u", (unsigned int)avc_param.nBFrames);
    972                     avc_param.bEntropyCodingCABAC = (OMX_BOOL)(avc_param.bEntropyCodingCABAC && entropy);
    973                     avc_param.nCabacInitIdc = entropy ? avc_param.nCabacInitIdc : 0;
    974                 } else {
    975                     if (pParam->nBFrames) {
    976                         DEBUG_PRINT_ERROR("Warning: B frames not supported");
    977                     }
    978                 }
    979 
    980                 if (handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true) {
    981                     return OMX_ErrorUnsupportedSetting;
    982                 }
    983                 memcpy(&m_sParamAVC,pParam, sizeof(struct OMX_VIDEO_PARAM_AVCTYPE));
    984                 m_sIntraperiod.nPFrames = m_sParamAVC.nPFrames;
    985                 if (pParam->nBFrames || bframes)
    986                     m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames = avc_param.nBFrames;
    987                 else
    988                     m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames;
    989                 break;
    990             }
    991         case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8:
    992             {
    993                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_VP8TYPE);
    994                 OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData;
    995                 OMX_VIDEO_PARAM_VP8TYPE vp8_param;
    996                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoVp8");
    997                 if (pParam->nDCTPartitions != m_sParamVP8.nDCTPartitions ||
    998                     pParam->bErrorResilientMode != m_sParamVP8.bErrorResilientMode) {
    999                     DEBUG_PRINT_ERROR("VP8 doesn't support nDCTPartitions or bErrorResilientMode");
   1000                 }
   1001                 memcpy(&vp8_param, pParam, sizeof( struct OMX_VIDEO_PARAM_VP8TYPE));
   1002                 if (handle->venc_set_param(&vp8_param, (OMX_INDEXTYPE)OMX_IndexParamVideoVp8) != true) {
   1003                     return OMX_ErrorUnsupportedSetting;
   1004                 }
   1005                 memcpy(&m_sParamVP8,pParam, sizeof(struct OMX_VIDEO_PARAM_VP8TYPE));
   1006                 break;
   1007             }
   1008         case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc:
   1009             {
   1010                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_HEVCTYPE);
   1011                 OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData;
   1012                 OMX_VIDEO_PARAM_HEVCTYPE hevc_param;
   1013                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoHevc");
   1014                 memcpy(&hevc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_HEVCTYPE));
   1015                 if (handle->venc_set_param(&hevc_param, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc) != true) {
   1016                     DEBUG_PRINT_ERROR("Failed : set_parameter: OMX_IndexParamVideoHevc");
   1017                     return OMX_ErrorUnsupportedSetting;
   1018                 }
   1019                 memcpy(&m_sParamHEVC, pParam, sizeof(struct OMX_VIDEO_PARAM_HEVCTYPE));
   1020                 break;
   1021             }
   1022         case OMX_IndexParamVideoProfileLevelCurrent:
   1023             {
   1024                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
   1025                 OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
   1026                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
   1027                 if (handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true) {
   1028                     DEBUG_PRINT_ERROR("set_parameter: OMX_IndexParamVideoProfileLevelCurrent failed for Profile: %u "
   1029                             "Level :%u", (unsigned int)pParam->eProfile, (unsigned int)pParam->eLevel);
   1030                     return OMX_ErrorUnsupportedSetting;
   1031                 }
   1032                 m_sParamProfileLevel.eProfile = pParam->eProfile;
   1033                 m_sParamProfileLevel.eLevel = pParam->eLevel;
   1034 
   1035                 if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
   1036                             OMX_MAX_STRINGNAME_SIZE)) {
   1037                     m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)m_sParamProfileLevel.eProfile;
   1038                     m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)m_sParamProfileLevel.eLevel;
   1039                     DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
   1040                             m_sParamMPEG4.eLevel);
   1041                 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
   1042                             OMX_MAX_STRINGNAME_SIZE)) {
   1043                     m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)m_sParamProfileLevel.eProfile;
   1044                     m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)m_sParamProfileLevel.eLevel;
   1045                     DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile,
   1046                             m_sParamH263.eLevel);
   1047                 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
   1048                             OMX_MAX_STRINGNAME_SIZE)) {
   1049                     m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
   1050                     m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
   1051                     DEBUG_PRINT_LOW("AVC profile = %d, level = %d", m_sParamAVC.eProfile,
   1052                             m_sParamAVC.eLevel);
   1053                 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\
   1054                             OMX_MAX_STRINGNAME_SIZE)) {
   1055                     m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
   1056                     m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
   1057                     DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
   1058                             m_sParamAVC.eLevel);
   1059                 }
   1060                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",\
   1061                             OMX_MAX_STRINGNAME_SIZE)) {
   1062                     m_sParamVP8.eProfile = (OMX_VIDEO_VP8PROFILETYPE)m_sParamProfileLevel.eProfile;
   1063                     m_sParamVP8.eLevel = (OMX_VIDEO_VP8LEVELTYPE)m_sParamProfileLevel.eLevel;
   1064                     DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile,
   1065                             m_sParamVP8.eLevel);
   1066                 }
   1067                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",\
   1068                             OMX_MAX_STRINGNAME_SIZE)) {
   1069                     m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)m_sParamProfileLevel.eProfile;
   1070                     m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)m_sParamProfileLevel.eLevel;
   1071                     DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile,
   1072                             m_sParamHEVC.eLevel);
   1073                 }
   1074 
   1075                 break;
   1076             }
   1077         case OMX_IndexParamStandardComponentRole:
   1078             {
   1079                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
   1080                 OMX_PARAM_COMPONENTROLETYPE *comp_role;
   1081                 comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
   1082                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
   1083                         comp_role->cRole);
   1084 
   1085                 if ((m_state == OMX_StateLoaded)&&
   1086                         !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
   1087                     DEBUG_PRINT_LOW("Set Parameter called in valid state");
   1088                 } else {
   1089                     DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
   1090                     return OMX_ErrorIncorrectStateOperation;
   1091                 }
   1092 
   1093                 if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
   1094                     if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
   1095                         strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
   1096                     } else {
   1097                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
   1098                         eRet =OMX_ErrorUnsupportedSetting;
   1099                     }
   1100                 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) {
   1101                     if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
   1102                         strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
   1103                     } else {
   1104                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
   1105                         eRet =OMX_ErrorUnsupportedSetting;
   1106                     }
   1107                 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
   1108                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
   1109                         strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
   1110                     } else {
   1111                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
   1112                         eRet = OMX_ErrorUnsupportedSetting;
   1113                     }
   1114                 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
   1115                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
   1116                         strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
   1117                     } else {
   1118                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
   1119                         eRet =OMX_ErrorUnsupportedSetting;
   1120                     }
   1121                 }
   1122 #ifdef _MSM8974_
   1123                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
   1124                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
   1125                         strlcpy((char*)m_cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
   1126                     } else {
   1127                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
   1128                         eRet =OMX_ErrorUnsupportedSetting;
   1129                     }
   1130                 }
   1131 #endif
   1132                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
   1133                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
   1134                         strlcpy((char*)m_cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE);
   1135                     } else {
   1136                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
   1137                         eRet = OMX_ErrorUnsupportedSetting;
   1138                     }
   1139                 }
   1140 
   1141                 else {
   1142                     DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s", m_nkind);
   1143                     eRet = OMX_ErrorInvalidComponentName;
   1144                 }
   1145                 break;
   1146             }
   1147 
   1148         case OMX_IndexParamPriorityMgmt:
   1149             {
   1150                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
   1151                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt");
   1152                 if (m_state != OMX_StateLoaded) {
   1153                     DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
   1154                     return OMX_ErrorIncorrectStateOperation;
   1155                 }
   1156                 OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
   1157                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
   1158                         (unsigned int)priorityMgmtype->nGroupID);
   1159 
   1160                 DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
   1161                         (unsigned int)priorityMgmtype->nGroupPriority);
   1162 
   1163                 m_sPriorityMgmt.nGroupID = priorityMgmtype->nGroupID;
   1164                 m_sPriorityMgmt.nGroupPriority = priorityMgmtype->nGroupPriority;
   1165 
   1166                 break;
   1167             }
   1168 
   1169         case OMX_IndexParamCompBufferSupplier:
   1170             {
   1171                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
   1172                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier");
   1173                 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
   1174                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
   1175                         bufferSupplierType->eBufferSupplier);
   1176                 if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
   1177                     m_sInBufSupplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
   1178 
   1179                 else
   1180 
   1181                     eRet = OMX_ErrorBadPortIndex;
   1182 
   1183                 break;
   1184 
   1185             }
   1186         case OMX_GoogleAndroidIndexAllocateNativeHandle:
   1187             {
   1188                 VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams);
   1189 
   1190                 AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData;
   1191 
   1192                 if (!secure_session) {
   1193                     DEBUG_PRINT_HIGH("Enable/Disable allocate-native-handle allowed only in secure session");
   1194                     eRet = OMX_ErrorUnsupportedSetting;
   1195                     break;
   1196                 } else if (allocateNativeHandleParams->nPortIndex != PORT_INDEX_OUT) {
   1197                     DEBUG_PRINT_HIGH("Enable/Disable allocate-native-handle allowed only on Output port!");
   1198                     eRet = OMX_ErrorUnsupportedSetting;
   1199                     break;
   1200                 } else if (m_out_mem_ptr) {
   1201                     DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Output port is not free !");
   1202                     eRet = OMX_ErrorInvalidState;
   1203                     break;
   1204                 }
   1205 
   1206                 if (allocateNativeHandleParams != NULL) {
   1207                     allocate_native_handle = allocateNativeHandleParams->enable;
   1208                 }
   1209                 break;
   1210             }
   1211         case OMX_IndexParamVideoQuantization:
   1212             {
   1213                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
   1214                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization");
   1215                 OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
   1216                 if (session_qp->nPortIndex == PORT_INDEX_OUT) {
   1217                     if (handle->venc_set_param(paramData, OMX_IndexParamVideoQuantization) != true) {
   1218                         return OMX_ErrorUnsupportedSetting;
   1219                     }
   1220                     m_sSessionQuantization.nQpI = session_qp->nQpI;
   1221                     m_sSessionQuantization.nQpP = session_qp->nQpP;
   1222                     m_sSessionQuantization.nQpB = session_qp->nQpB;
   1223                 } else {
   1224                     DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for Session QP setting");
   1225                     eRet = OMX_ErrorBadPortIndex;
   1226                 }
   1227                 break;
   1228             }
   1229 
   1230         case OMX_QcomIndexParamVideoQPRange:
   1231             {
   1232                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
   1233                 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange");
   1234                 OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
   1235                 if (qp_range->nPortIndex == PORT_INDEX_OUT) {
   1236                     if (handle->venc_set_param(paramData,
   1237                                 (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPRange) != true) {
   1238                         return OMX_ErrorUnsupportedSetting;
   1239                     }
   1240                     m_sSessionQPRange.minQP= qp_range->minQP;
   1241                     m_sSessionQPRange.maxQP= qp_range->maxQP;
   1242                 } else {
   1243                     DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for QP range setting");
   1244                     eRet = OMX_ErrorBadPortIndex;
   1245                 }
   1246                 break;
   1247             }
   1248 
   1249         case OMX_QcomIndexParamVideoIPBQPRange:
   1250             {
   1251                 DEBUG_PRINT_LOW("set_parameter: OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE");
   1252                 OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE*) paramData;
   1253                 if (qp_range->nPortIndex == PORT_INDEX_OUT) {
   1254                     if (handle->venc_set_param(paramData,
   1255                                 (OMX_INDEXTYPE)OMX_QcomIndexParamVideoIPBQPRange) != true) {
   1256                         return OMX_ErrorUnsupportedSetting;
   1257                     }
   1258                     m_sSessionIPBQPRange.minIQP = qp_range->minIQP;
   1259                     m_sSessionIPBQPRange.maxIQP = qp_range->maxIQP;
   1260                     m_sSessionIPBQPRange.minPQP = qp_range->minPQP;
   1261                     m_sSessionIPBQPRange.maxPQP = qp_range->maxPQP;
   1262                     m_sSessionIPBQPRange.minBQP = qp_range->minBQP;
   1263                     m_sSessionIPBQPRange.maxBQP = qp_range->maxBQP;
   1264                 } else {
   1265                     DEBUG_PRINT_ERROR("Unsupported port Index for IPB QP range setting");
   1266                     eRet = OMX_ErrorBadPortIndex;
   1267                 }
   1268                 break;
   1269             }
   1270 
   1271         case OMX_QcomIndexPortDefn:
   1272             {
   1273                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
   1274                 OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam =
   1275                     (OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData;
   1276                 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn");
   1277                 if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) {
   1278                     if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
   1279                             pParam->nMemRegion < OMX_QCOM_MemRegionMax) {
   1280                         m_use_input_pmem = OMX_TRUE;
   1281                     } else {
   1282                         m_use_input_pmem = OMX_FALSE;
   1283                     }
   1284                 } else if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
   1285                     if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
   1286                             pParam->nMemRegion < OMX_QCOM_MemRegionMax) {
   1287                         m_use_output_pmem = OMX_TRUE;
   1288                     } else {
   1289                         m_use_output_pmem = OMX_FALSE;
   1290                     }
   1291                 } else {
   1292                     DEBUG_PRINT_ERROR("ERROR: SetParameter called on unsupported Port Index for QcomPortDefn");
   1293                     return OMX_ErrorBadPortIndex;
   1294                 }
   1295                 break;
   1296             }
   1297 
   1298         case OMX_IndexParamVideoErrorCorrection:
   1299             {
   1300                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
   1301                 DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection");
   1302                 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
   1303                     (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
   1304                 if (!handle->venc_set_param(paramData, OMX_IndexParamVideoErrorCorrection)) {
   1305                     DEBUG_PRINT_ERROR("ERROR: Request for setting Error Resilience failed");
   1306                     return OMX_ErrorUnsupportedSetting;
   1307                 }
   1308                 memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection));
   1309                 break;
   1310             }
   1311         case OMX_IndexParamVideoIntraRefresh:
   1312             {
   1313                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
   1314                 DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh");
   1315                 OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
   1316                     (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
   1317                 if (!handle->venc_set_param(paramData,OMX_IndexParamVideoIntraRefresh)) {
   1318                     DEBUG_PRINT_ERROR("ERROR: Request for setting intra refresh failed");
   1319                     return OMX_ErrorUnsupportedSetting;
   1320                 }
   1321                 memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh));
   1322                 break;
   1323             }
   1324 #ifdef _ANDROID_ICS_
   1325         case OMX_QcomIndexParamVideoMetaBufferMode:
   1326             {
   1327                 VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
   1328                 StoreMetaDataInBuffersParams *pParam =
   1329                     (StoreMetaDataInBuffersParams*)paramData;
   1330                 DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoMetaBufferMode: "
   1331                         "port_index = %u, meta_mode = %d", (unsigned int)pParam->nPortIndex, pParam->bStoreMetaData);
   1332                 if (pParam->nPortIndex == PORT_INDEX_IN) {
   1333                     if (pParam->bStoreMetaData != meta_mode_enable) {
   1334                         if (!handle->venc_set_meta_mode(pParam->bStoreMetaData)) {
   1335                             DEBUG_PRINT_ERROR("ERROR: set Metabuffer mode %d fail",
   1336                                     pParam->bStoreMetaData);
   1337                             return OMX_ErrorUnsupportedSetting;
   1338                         }
   1339                         meta_mode_enable = pParam->bStoreMetaData;
   1340                         if (meta_mode_enable) {
   1341                             m_sInPortDef.nBufferCountActual = m_sInPortDef.nBufferCountMin;
   1342                             if (handle->venc_set_param(&m_sInPortDef,OMX_IndexParamPortDefinition) != true) {
   1343                                 DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed");
   1344                                 return OMX_ErrorUnsupportedSetting;
   1345                             }
   1346                         } else {
   1347                             /*TODO: reset encoder driver Meta mode*/
   1348                             dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
   1349                                     &m_sOutPortDef.nBufferCountActual,
   1350                                     &m_sOutPortDef.nBufferSize,
   1351                                     m_sOutPortDef.nPortIndex);
   1352                         }
   1353                     }
   1354                 } else if (pParam->nPortIndex == PORT_INDEX_OUT && secure_session) {
   1355                             DEBUG_PRINT_ERROR("set_parameter: metamode is "
   1356                             "valid for input port only in secure session");
   1357                             return OMX_ErrorUnsupportedSetting;
   1358                 } else {
   1359                     DEBUG_PRINT_HIGH("set_parameter: metamode is "
   1360                             "valid for input port only");
   1361                     eRet = OMX_ErrorUnsupportedIndex;
   1362                 }
   1363             }
   1364             break;
   1365 #endif
   1366 #if !defined(MAX_RES_720P) || defined(_MSM8974_)
   1367         case OMX_QcomIndexParamIndexExtraDataType:
   1368             {
   1369                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
   1370                 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
   1371                 QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
   1372                 bool enable = false;
   1373                 OMX_U32 mask = 0;
   1374 
   1375                 if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) {
   1376                     if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1377                         mask = VENC_EXTRADATA_SLICEINFO;
   1378 
   1379                         DEBUG_PRINT_HIGH("SliceInfo extradata %s",
   1380                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
   1381                     } else {
   1382                         DEBUG_PRINT_ERROR("set_parameter: Slice information is "
   1383                                 "valid for output port only");
   1384                         eRet = OMX_ErrorUnsupportedIndex;
   1385                         break;
   1386                     }
   1387                 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderMBInfo) {
   1388                     if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1389                         mask = VENC_EXTRADATA_MBINFO;
   1390 
   1391                         DEBUG_PRINT_HIGH("MBInfo extradata %s",
   1392                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
   1393                     } else {
   1394                         DEBUG_PRINT_ERROR("set_parameter: MB information is "
   1395                                 "valid for output port only");
   1396                         eRet = OMX_ErrorUnsupportedIndex;
   1397                         break;
   1398                     }
   1399                 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataFrameDimension) {
   1400                     if (pParam->nPortIndex == PORT_INDEX_IN) {
   1401                             mask = VENC_EXTRADATA_FRAMEDIMENSION;
   1402                         DEBUG_PRINT_HIGH("Frame dimension extradata %s",
   1403                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
   1404                     } else {
   1405                         DEBUG_PRINT_ERROR("set_parameter: Frame Dimension is "
   1406                                 "valid for input port only");
   1407                         eRet = OMX_ErrorUnsupportedIndex;
   1408                         break;
   1409                     }
   1410                 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_QTIIndexParamVQZipSEIExtraData) {
   1411                     if (pParam->nPortIndex == PORT_INDEX_IN) {
   1412                         mask = VENC_EXTRADATA_VQZIP;
   1413                         DEBUG_PRINT_HIGH("VQZIP extradata %s",
   1414                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
   1415                     } else {
   1416                         DEBUG_PRINT_ERROR("set_parameter: VQZIP is "
   1417                                 "valid for input port only");
   1418                         eRet = OMX_ErrorUnsupportedIndex;
   1419                         break;
   1420                     }
   1421                 }
   1422                 else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) {
   1423                     if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1424                         if (pParam->bEnabled == OMX_TRUE)
   1425                             mask = VEN_EXTRADATA_LTRINFO;
   1426 
   1427                         DEBUG_PRINT_HIGH("LTRInfo extradata %s",
   1428                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
   1429                     } else {
   1430                         DEBUG_PRINT_ERROR("set_parameter: LTR information is "
   1431                                 "valid for output port only");
   1432                         eRet = OMX_ErrorUnsupportedIndex;
   1433                         break;
   1434                     }
   1435                 }
   1436                 else {
   1437                     DEBUG_PRINT_ERROR("set_parameter: unsupported extrdata index (%x)",
   1438                             pParam->nIndex);
   1439                     eRet = OMX_ErrorUnsupportedIndex;
   1440                     break;
   1441                 }
   1442 
   1443 
   1444                 if (pParam->bEnabled == OMX_TRUE)
   1445                     m_sExtraData |= mask;
   1446                 else
   1447                     m_sExtraData &= ~mask;
   1448 
   1449                 enable = !!(m_sExtraData & mask);
   1450                 if (handle->venc_set_param(&enable,
   1451                             (OMX_INDEXTYPE)pParam->nIndex) != true) {
   1452                     DEBUG_PRINT_ERROR("ERROR: Setting Extradata (%x) failed", pParam->nIndex);
   1453                     return OMX_ErrorUnsupportedSetting;
   1454                 }
   1455 
   1456                 if (pParam->nPortIndex == PORT_INDEX_IN) {
   1457                     m_sInPortDef.nPortIndex = PORT_INDEX_IN;
   1458                     dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
   1459                             &m_sInPortDef.nBufferCountActual,
   1460                             &m_sInPortDef.nBufferSize,
   1461                             m_sInPortDef.nPortIndex);
   1462                     DEBUG_PRINT_HIGH("updated in_buf_req: buffer cnt=%u, "
   1463                             "count min=%u, buffer size=%u",
   1464                             (unsigned int)m_sOutPortDef.nBufferCountActual,
   1465                             (unsigned int)m_sOutPortDef.nBufferCountMin,
   1466                             (unsigned int)m_sOutPortDef.nBufferSize);
   1467 
   1468                 } else {
   1469                     m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
   1470                     dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
   1471                             &m_sOutPortDef.nBufferCountActual,
   1472                             &m_sOutPortDef.nBufferSize,
   1473                             m_sOutPortDef.nPortIndex);
   1474                     DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%u, "
   1475                             "count min=%u, buffer size=%u",
   1476                             (unsigned int)m_sOutPortDef.nBufferCountActual,
   1477                             (unsigned int)m_sOutPortDef.nBufferCountMin,
   1478                             (unsigned int)m_sOutPortDef.nBufferSize);
   1479                 }
   1480                 break;
   1481             }
   1482         case QOMX_IndexParamVideoLTRMode:
   1483             {
   1484                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
   1485                 QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
   1486                     (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
   1487                 if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRMode)) {
   1488                     DEBUG_PRINT_ERROR("ERROR: Setting LTR mode failed");
   1489                     return OMX_ErrorUnsupportedSetting;
   1490                 }
   1491                 memcpy(&m_sParamLTRMode, pParam, sizeof(m_sParamLTRMode));
   1492                 break;
   1493             }
   1494         case QOMX_IndexParamVideoLTRCount:
   1495             {
   1496                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE);
   1497                 QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
   1498                     (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
   1499                 if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRCount)) {
   1500                     DEBUG_PRINT_ERROR("ERROR: Setting LTR count failed");
   1501                     return OMX_ErrorUnsupportedSetting;
   1502                 }
   1503                 memcpy(&m_sParamLTRCount, pParam, sizeof(m_sParamLTRCount));
   1504                 break;
   1505             }
   1506 #endif
   1507         case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
   1508             {
   1509                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
   1510                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
   1511                     (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
   1512                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1513                     handle->m_max_allowed_bitrate_check =
   1514                         ((pParam->bEnable == OMX_TRUE) ? true : false);
   1515                     DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s",
   1516                             ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled"));
   1517                 } else {
   1518                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck "
   1519                             " called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
   1520                     return OMX_ErrorBadPortIndex;
   1521                 }
   1522                 break;
   1523             }
   1524 #ifdef MAX_RES_1080P
   1525         case OMX_QcomIndexEnableSliceDeliveryMode:
   1526             {
   1527                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
   1528                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
   1529                     (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
   1530                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1531                     if (!handle->venc_set_param(paramData,
   1532                                 (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode)) {
   1533                         DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
   1534                         return OMX_ErrorUnsupportedSetting;
   1535                     }
   1536                 } else {
   1537                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode "
   1538                             "called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
   1539                     return OMX_ErrorBadPortIndex;
   1540                 }
   1541                 break;
   1542             }
   1543 #endif
   1544         case OMX_QcomIndexEnableH263PlusPType:
   1545             {
   1546                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
   1547                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
   1548                     (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
   1549                 DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
   1550                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1551                     if (!handle->venc_set_param(paramData,
   1552                                 (OMX_INDEXTYPE)OMX_QcomIndexEnableH263PlusPType)) {
   1553                         DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
   1554                         return OMX_ErrorUnsupportedSetting;
   1555                     }
   1556                 } else {
   1557                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType "
   1558                             "called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
   1559                     return OMX_ErrorBadPortIndex;
   1560                 }
   1561                 break;
   1562             }
   1563         case OMX_QcomIndexParamSequenceHeaderWithIDR:
   1564             {
   1565                 VALIDATE_OMX_PARAM_DATA(paramData, PrependSPSPPSToIDRFramesParams);
   1566                 if(!handle->venc_set_param(paramData,
   1567                             (OMX_INDEXTYPE)OMX_QcomIndexParamSequenceHeaderWithIDR)) {
   1568                     DEBUG_PRINT_ERROR("%s: %s",
   1569                             "OMX_QComIndexParamSequenceHeaderWithIDR:",
   1570                             "request for inband sps/pps failed.");
   1571                     return OMX_ErrorUnsupportedSetting;
   1572                 }
   1573                 memcpy(&m_sPrependSPSPPS, paramData, sizeof(m_sPrependSPSPPS));
   1574                 break;
   1575             }
   1576         case OMX_QcomIndexParamH264AUDelimiter:
   1577             {
   1578                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_CONFIG_H264_AUD);
   1579                 if(!handle->venc_set_param(paramData,
   1580                             (OMX_INDEXTYPE)OMX_QcomIndexParamH264AUDelimiter)) {
   1581                     DEBUG_PRINT_ERROR("%s: %s",
   1582                             "OMX_QComIndexParamh264AUDelimiter:",
   1583                             "request for AU Delimiters failed.");
   1584                     return OMX_ErrorUnsupportedSetting;
   1585                 }
   1586                 break;
   1587             }
   1588         case OMX_QcomIndexParamMBIStatisticsMode:
   1589             {
   1590                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QOMX_VIDEO_MBI_STATISTICS);
   1591                 if(!handle->venc_set_param(paramData,
   1592                             (OMX_INDEXTYPE)OMX_QcomIndexParamMBIStatisticsMode)) {
   1593                     DEBUG_PRINT_ERROR("%s: %s",
   1594                             "OMX_QcomIndexParamMBIStatisticsMode:",
   1595                             "MBI Statistics mode setting failed.");
   1596                     return OMX_ErrorUnsupportedSetting;
   1597                 }
   1598                 break;
   1599             }
   1600        case OMX_QcomIndexHierarchicalStructure:
   1601            {
   1602                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_HIERARCHICALLAYERS);
   1603                 QOMX_VIDEO_HIERARCHICALLAYERS* pParam =
   1604                     (QOMX_VIDEO_HIERARCHICALLAYERS*)paramData;
   1605                 DEBUG_PRINT_LOW("OMX_QcomIndexHierarchicalStructure");
   1606                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1607                     if (!handle->venc_set_param(paramData,
   1608                                 (OMX_INDEXTYPE)OMX_QcomIndexHierarchicalStructure)) {
   1609                         DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
   1610                         return OMX_ErrorUnsupportedSetting;
   1611                     }
   1612                 if((pParam->eHierarchicalCodingType == QOMX_HIERARCHICALCODING_B) && pParam->nNumLayers)
   1613                     hier_b_enabled = true;
   1614                     m_sHierLayers.nNumLayers = pParam->nNumLayers;
   1615                     m_sHierLayers.eHierarchicalCodingType = pParam->eHierarchicalCodingType;
   1616                 } else {
   1617                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexHierarchicalStructure called on wrong port(%u)",
   1618                           (unsigned int)pParam->nPortIndex);
   1619                     return OMX_ErrorBadPortIndex;
   1620                 }
   1621                 break;
   1622 
   1623            }
   1624         case OMX_QcomIndexParamPerfLevel:
   1625             {
   1626                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PERF_LEVEL);
   1627                 if (!handle->venc_set_param(paramData,
   1628                             (OMX_INDEXTYPE) OMX_QcomIndexParamPerfLevel)) {
   1629                     DEBUG_PRINT_ERROR("ERROR: Setting performance level");
   1630                     return OMX_ErrorUnsupportedSetting;
   1631                 }
   1632                 break;
   1633             }
   1634         case OMX_QcomIndexParamH264VUITimingInfo:
   1635             {
   1636                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO);
   1637                 if (!handle->venc_set_param(paramData,
   1638                             (OMX_INDEXTYPE) OMX_QcomIndexParamH264VUITimingInfo)) {
   1639                     DEBUG_PRINT_ERROR("ERROR: Setting VUI timing info");
   1640                     return OMX_ErrorUnsupportedSetting;
   1641                 }
   1642                 break;
   1643             }
   1644         case OMX_QcomIndexParamPeakBitrate:
   1645             {
   1646                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE);
   1647                 if (!handle->venc_set_param(paramData,
   1648                             (OMX_INDEXTYPE) OMX_QcomIndexParamPeakBitrate)) {
   1649                     DEBUG_PRINT_ERROR("ERROR: Setting peak bitrate");
   1650                     return OMX_ErrorUnsupportedSetting;
   1651                 }
   1652                 break;
   1653              }
   1654        case QOMX_IndexParamVideoInitialQp:
   1655             {
   1656                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_INITIALQP);
   1657                 if(!handle->venc_set_param(paramData,
   1658                             (OMX_INDEXTYPE)QOMX_IndexParamVideoInitialQp)) {
   1659                     DEBUG_PRINT_ERROR("Request to Enable initial QP failed");
   1660                     return OMX_ErrorUnsupportedSetting;
   1661                 }
   1662                 memcpy(&m_sParamInitqp, paramData, sizeof(m_sParamInitqp));
   1663                 break;
   1664             }
   1665         case OMX_QcomIndexParamSetMVSearchrange:
   1666             {
   1667                 if (!handle->venc_set_param(paramData,
   1668                             (OMX_INDEXTYPE) OMX_QcomIndexParamSetMVSearchrange)) {
   1669                     DEBUG_PRINT_ERROR("ERROR: Setting Searchrange");
   1670                     return OMX_ErrorUnsupportedSetting;
   1671                 }
   1672                 break;
   1673             }
   1674         case OMX_QcomIndexParamVideoHybridHierpMode:
   1675             {
   1676                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE);
   1677                if(!handle->venc_set_param(paramData,
   1678                          (OMX_INDEXTYPE)OMX_QcomIndexParamVideoHybridHierpMode)) {
   1679                    DEBUG_PRINT_ERROR("Request to Enable Hybrid Hier-P failed");
   1680                    return OMX_ErrorUnsupportedSetting;
   1681                 }
   1682                 break;
   1683             }
   1684         case OMX_QcomIndexParamBatchSize:
   1685             {
   1686                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_U32TYPE);
   1687                 if(!handle->venc_set_param(paramData,
   1688                          (OMX_INDEXTYPE)OMX_QcomIndexParamBatchSize)) {
   1689                    DEBUG_PRINT_ERROR("Attempting to set batch size failed");
   1690                    return OMX_ErrorUnsupportedSetting;
   1691                 }
   1692                 break;
   1693             }
   1694         case OMX_QcomIndexConfigH264EntropyCodingCabac:
   1695             {
   1696                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_H264ENTROPYCODINGTYPE);
   1697                 if(!handle->venc_set_param(paramData,
   1698                          (OMX_INDEXTYPE)OMX_QcomIndexConfigH264EntropyCodingCabac)) {
   1699                    DEBUG_PRINT_ERROR("Attempting to set Entropy failed");
   1700                    return OMX_ErrorUnsupportedSetting;
   1701                 }
   1702                break;
   1703             }
   1704         case OMX_QTIIndexParamVQZIPSEIType:
   1705             {
   1706                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE);
   1707                 if (!handle->venc_set_param(paramData,
   1708                             (OMX_INDEXTYPE) OMX_QTIIndexParamVQZIPSEIType)) {
   1709                     DEBUG_PRINT_ERROR("ERROR: Setting VQZIP SEI type");
   1710                     return OMX_ErrorUnsupportedSetting;
   1711                 }
   1712                 m_sExtraData |= VENC_EXTRADATA_VQZIP;
   1713                 break;
   1714             }
   1715         case OMX_QcomIndexParamVencAspectRatio:
   1716             {
   1717                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_VENC_SAR);
   1718                 if (!handle->venc_set_param(paramData,
   1719                         (OMX_INDEXTYPE)OMX_QcomIndexParamVencAspectRatio)) {
   1720                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexParamVencAspectRatio failed");
   1721                     return OMX_ErrorUnsupportedSetting;
   1722                 }
   1723                 memcpy(&m_sSar, paramData, sizeof(m_sSar));
   1724                 break;
   1725             }
   1726         case OMX_QTIIndexParamLowLatencyMode:
   1727             {
   1728                 if (!handle->venc_set_param(paramData,
   1729                         (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode)) {
   1730                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamLowLatencyMode failed");
   1731                     return OMX_ErrorUnsupportedSetting;
   1732                 }
   1733                 memcpy(&m_slowLatencyMode, paramData, sizeof(m_slowLatencyMode));
   1734                 break;
   1735             }
   1736         case OMX_QcomIndexConfigVideoVencLowLatencyMode:
   1737             {
   1738                 if(!handle->venc_set_param(paramData,
   1739                             (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencLowLatencyMode)) {
   1740                     DEBUG_PRINT_ERROR("Request to Enable Low latency mode failed");
   1741                     return OMX_ErrorUnsupportedSetting;
   1742                 }
   1743                 break;
   1744             }
   1745         case OMX_QTIIndexParamVideoEnableRoiInfo:
   1746             {
   1747                 if (!handle->venc_set_param(paramData,
   1748                             (OMX_INDEXTYPE)OMX_QTIIndexParamVideoEnableRoiInfo)) {
   1749                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamVideoEnableRoiInfo failed");
   1750                     return OMX_ErrorUnsupportedSetting;
   1751                 }
   1752                 m_sExtraData |= VENC_EXTRADATA_ROI;
   1753                 break;
   1754             }
   1755         case OMX_IndexParamAndroidVideoTemporalLayering:
   1756             {
   1757                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE);
   1758                 if (!handle->venc_set_param(paramData,
   1759                         (OMX_INDEXTYPE)OMX_IndexParamAndroidVideoTemporalLayering)) {
   1760                     DEBUG_PRINT_ERROR("Failed to configure temporal layers");
   1761                     return OMX_ErrorUnsupportedSetting;
   1762                 }
   1763                 // save the actual configuration applied
   1764                 memcpy(&m_sParamTemporalLayers, paramData, sizeof(m_sParamTemporalLayers));
   1765                 // keep the config data in sync
   1766                 m_sConfigTemporalLayers.ePattern = m_sParamTemporalLayers.ePattern;
   1767                 m_sConfigTemporalLayers.nBLayerCountActual = m_sParamTemporalLayers.nBLayerCountActual;
   1768                 m_sConfigTemporalLayers.nPLayerCountActual = m_sParamTemporalLayers.nPLayerCountActual;
   1769                 m_sConfigTemporalLayers.bBitrateRatiosSpecified = m_sParamTemporalLayers.bBitrateRatiosSpecified;
   1770                 memcpy(&m_sConfigTemporalLayers.nBitrateRatios[0],
   1771                         &m_sParamTemporalLayers.nBitrateRatios[0],
   1772                         OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS * sizeof(OMX_U32));
   1773                 break;
   1774             }
   1775         case OMX_QTIIndexParamDisablePQ:
   1776             {
   1777                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_DISABLETYPE);
   1778                 handle->venc_set_param(paramData,
   1779                         (OMX_INDEXTYPE)OMX_QTIIndexParamDisablePQ);
   1780                 break;
   1781             }
   1782         case OMX_QTIIndexParamIframeSizeType:
   1783             {
   1784                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_IFRAMESIZE);
   1785                 if (!handle->venc_set_param(paramData,
   1786                             (OMX_INDEXTYPE)OMX_QTIIndexParamIframeSizeType)) {
   1787                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamIframeSizeType failed");
   1788                     return OMX_ErrorUnsupportedSetting;
   1789                 }
   1790                 break;
   1791             }
   1792         case OMX_QTIIndexParamEnableAVTimerTimestamps:
   1793             {
   1794                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
   1795                 if (!handle->venc_set_param(paramData,
   1796                             (OMX_INDEXTYPE)OMX_QTIIndexParamEnableAVTimerTimestamps)) {
   1797                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamEnableAVTimerTimestamps failed");
   1798                     return OMX_ErrorUnsupportedSetting;
   1799                 }
   1800                 memcpy(&m_sParamAVTimerTimestampMode, paramData, sizeof(QOMX_ENABLETYPE));
   1801                 break;
   1802             }
   1803         case OMX_IndexParamVideoSliceFMO:
   1804         default:
   1805             {
   1806                 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d", paramIndex);
   1807                 eRet = OMX_ErrorUnsupportedIndex;
   1808                 break;
   1809             }
   1810     }
   1811     return eRet;
   1812 }
   1813 
   1814 bool omx_venc::update_profile_level()
   1815 {
   1816     OMX_U32 eProfile, eLevel;
   1817 
   1818     if (!handle->venc_get_profile_level(&eProfile,&eLevel)) {
   1819         DEBUG_PRINT_ERROR("Failed to update the profile_level");
   1820         return false;
   1821     }
   1822 
   1823     m_sParamProfileLevel.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
   1824     m_sParamProfileLevel.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
   1825 
   1826     if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
   1827                 OMX_MAX_STRINGNAME_SIZE)) {
   1828         m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
   1829         m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
   1830         DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
   1831                 m_sParamMPEG4.eLevel);
   1832     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
   1833                 OMX_MAX_STRINGNAME_SIZE)) {
   1834         m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
   1835         m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
   1836         DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile,
   1837                 m_sParamH263.eLevel);
   1838     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
   1839                 OMX_MAX_STRINGNAME_SIZE)) {
   1840         m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
   1841         m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
   1842         DEBUG_PRINT_LOW("AVC profile = %d, level = %d", m_sParamAVC.eProfile,
   1843                 m_sParamAVC.eLevel);
   1844     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\
   1845                 OMX_MAX_STRINGNAME_SIZE)) {
   1846         m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
   1847         m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
   1848         DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
   1849                 m_sParamAVC.eLevel);
   1850     }
   1851     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",\
   1852                 OMX_MAX_STRINGNAME_SIZE)) {
   1853         m_sParamVP8.eProfile = (OMX_VIDEO_VP8PROFILETYPE)eProfile;
   1854         m_sParamVP8.eLevel = (OMX_VIDEO_VP8LEVELTYPE)eLevel;
   1855         DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile,
   1856                 m_sParamVP8.eLevel);
   1857     }
   1858     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc",\
   1859                 OMX_MAX_STRINGNAME_SIZE)) {
   1860         m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)eProfile;
   1861         m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)eLevel;
   1862         DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile,
   1863                 m_sParamHEVC.eLevel);
   1864     }
   1865 
   1866     return true;
   1867 }
   1868 /* ======================================================================
   1869    FUNCTION
   1870    omx_video::SetConfig
   1871 
   1872    DESCRIPTION
   1873    OMX Set Config method implementation
   1874 
   1875    PARAMETERS
   1876    <TBD>.
   1877 
   1878    RETURN VALUE
   1879    OMX Error None if successful.
   1880    ========================================================================== */
   1881 OMX_ERRORTYPE  omx_venc::set_config(OMX_IN OMX_HANDLETYPE      hComp,
   1882         OMX_IN OMX_INDEXTYPE configIndex,
   1883         OMX_IN OMX_PTR        configData)
   1884 {
   1885     (void)hComp;
   1886     if (configData == NULL) {
   1887         DEBUG_PRINT_ERROR("ERROR: param is null");
   1888         return OMX_ErrorBadParameter;
   1889     }
   1890 
   1891     if (m_state == OMX_StateInvalid) {
   1892         DEBUG_PRINT_ERROR("ERROR: config called in Invalid state");
   1893         return OMX_ErrorIncorrectStateOperation;
   1894     }
   1895 
   1896     // params will be validated prior to venc_init
   1897     switch ((int)configIndex) {
   1898         case OMX_IndexConfigVideoBitrate:
   1899             {
   1900                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_BITRATETYPE);
   1901                 OMX_VIDEO_CONFIG_BITRATETYPE* pParam =
   1902                     reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
   1903                 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%u)", (unsigned int)pParam->nEncodeBitrate);
   1904 
   1905                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1906                     if (handle->venc_set_config(configData, OMX_IndexConfigVideoBitrate) != true) {
   1907                         DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoBitrate failed");
   1908                         return OMX_ErrorUnsupportedSetting;
   1909                     }
   1910 
   1911                     m_sConfigBitrate.nEncodeBitrate = pParam->nEncodeBitrate;
   1912                     m_sParamBitrate.nTargetBitrate = pParam->nEncodeBitrate;
   1913                     m_sOutPortDef.format.video.nBitrate = pParam->nEncodeBitrate;
   1914                 } else {
   1915                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
   1916                     return OMX_ErrorBadPortIndex;
   1917                 }
   1918                 break;
   1919             }
   1920         case OMX_IndexConfigVideoFramerate:
   1921             {
   1922                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_FRAMERATETYPE);
   1923                 OMX_CONFIG_FRAMERATETYPE* pParam =
   1924                     reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
   1925                 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%x)", (unsigned int)pParam->xEncodeFramerate);
   1926 
   1927                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1928                     if (handle->venc_set_config(configData, OMX_IndexConfigVideoFramerate) != true) {
   1929                         DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoFramerate failed");
   1930                         return OMX_ErrorUnsupportedSetting;
   1931                     }
   1932 
   1933                     m_sConfigFramerate.xEncodeFramerate = pParam->xEncodeFramerate;
   1934                     m_sOutPortDef.format.video.xFramerate = pParam->xEncodeFramerate;
   1935                     m_sOutPortFormat.xFramerate = pParam->xEncodeFramerate;
   1936                     /*
   1937                      * Frame rate can change buffer requirements. If query is not allowed,
   1938                      * failure is not FATAL here.
   1939                      */
   1940                     dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
   1941                             &m_sInPortDef.nBufferCountActual,
   1942                             &m_sInPortDef.nBufferSize,
   1943                             m_sInPortDef.nPortIndex);
   1944                 } else {
   1945                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
   1946                     return OMX_ErrorBadPortIndex;
   1947                 }
   1948 
   1949                 break;
   1950             }
   1951         case QOMX_IndexConfigVideoIntraperiod:
   1952             {
   1953                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_INTRAPERIODTYPE);
   1954                 QOMX_VIDEO_INTRAPERIODTYPE* pParam =
   1955                     reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
   1956 
   1957                 DEBUG_PRINT_HIGH("set_config(): QOMX_IndexConfigVideoIntraperiod");
   1958                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   1959 #ifdef MAX_RES_720P
   1960                     if (pParam->nBFrames > 0) {
   1961                         DEBUG_PRINT_ERROR("B frames not supported");
   1962                         return OMX_ErrorUnsupportedSetting;
   1963                     }
   1964 #endif
   1965                     DEBUG_PRINT_HIGH("Old: P/B frames = %u/%u, New: P/B frames = %u/%u",
   1966                             (unsigned int)m_sIntraperiod.nPFrames, (unsigned int)m_sIntraperiod.nBFrames,
   1967                             (unsigned int)pParam->nPFrames, (unsigned int)pParam->nBFrames);
   1968                     if (m_sIntraperiod.nBFrames != pParam->nBFrames) {
   1969                         if(hier_b_enabled && m_state == OMX_StateLoaded) {
   1970                             DEBUG_PRINT_INFO("B-frames setting is supported if HierB is enabled");
   1971                         }
   1972                     }
   1973                     if (handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true) {
   1974                         DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed");
   1975                         return OMX_ErrorUnsupportedSetting;
   1976                     }
   1977                     m_sIntraperiod.nPFrames = pParam->nPFrames;
   1978                     m_sIntraperiod.nBFrames = pParam->nBFrames;
   1979                     m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod;
   1980 
   1981                     if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4) {
   1982                         m_sParamMPEG4.nPFrames = pParam->nPFrames;
   1983                         if (m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple)
   1984                             m_sParamMPEG4.nBFrames = pParam->nBFrames;
   1985                         else
   1986                             m_sParamMPEG4.nBFrames = 0;
   1987                     } else if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263) {
   1988                         m_sParamH263.nPFrames = pParam->nPFrames;
   1989                     } else {
   1990                         m_sParamAVC.nPFrames = pParam->nPFrames;
   1991                         if ((m_sParamAVC.eProfile != OMX_VIDEO_AVCProfileBaseline) &&
   1992                             (m_sParamAVC.eProfile != (OMX_VIDEO_AVCPROFILETYPE) OMX_VIDEO_AVCProfileConstrainedBaseline) &&
   1993                             (m_sParamAVC.eProfile != (OMX_VIDEO_AVCPROFILETYPE) QOMX_VIDEO_AVCProfileConstrainedBaseline))
   1994                             m_sParamAVC.nBFrames = pParam->nBFrames;
   1995                         else
   1996                             m_sParamAVC.nBFrames = 0;
   1997                     }
   1998                 } else {
   1999                     DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
   2000                     return OMX_ErrorBadPortIndex;
   2001                 }
   2002 
   2003                 break;
   2004             }
   2005 
   2006         case OMX_IndexConfigVideoIntraVOPRefresh:
   2007             {
   2008                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_INTRAREFRESHVOPTYPE);
   2009                 OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
   2010                     reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);
   2011 
   2012                 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoIntraVOPRefresh");
   2013                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
   2014                     if (handle->venc_set_config(configData,
   2015                                 OMX_IndexConfigVideoIntraVOPRefresh) != true) {
   2016                         DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoIntraVOPRefresh failed");
   2017                         return OMX_ErrorUnsupportedSetting;
   2018                     }
   2019 
   2020                     m_sConfigIntraRefreshVOP.IntraRefreshVOP = pParam->IntraRefreshVOP;
   2021                 } else {
   2022                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
   2023                     return OMX_ErrorBadPortIndex;
   2024                 }
   2025 
   2026                 break;
   2027             }
   2028         case OMX_IndexConfigCommonRotate:
   2029             {
   2030                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ROTATIONTYPE);
   2031                 OMX_CONFIG_ROTATIONTYPE *pParam =
   2032                     reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
   2033                 OMX_S32 nRotation;
   2034 
   2035                 if (pParam->nPortIndex != PORT_INDEX_OUT) {
   2036                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
   2037                     return OMX_ErrorBadPortIndex;
   2038                 }
   2039                 if ( pParam->nRotation == 0   ||
   2040                         pParam->nRotation == 90  ||
   2041                         pParam->nRotation == 180 ||
   2042                         pParam->nRotation == 270 ) {
   2043                     DEBUG_PRINT_HIGH("set_config: Rotation Angle %u", (unsigned int)pParam->nRotation);
   2044                 } else {
   2045                     DEBUG_PRINT_ERROR("ERROR: un supported Rotation %u", (unsigned int)pParam->nRotation);
   2046                     return OMX_ErrorUnsupportedSetting;
   2047                 }
   2048                 nRotation = pParam->nRotation - m_sConfigFrameRotation.nRotation;
   2049                 if (nRotation < 0)
   2050                     nRotation = -nRotation;
   2051 
   2052                 DEBUG_PRINT_HIGH("set_config: updating device Dims");
   2053 
   2054                 if (handle->venc_set_config(configData,
   2055                     OMX_IndexConfigCommonRotate) != true) {
   2056                         DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonRotate failed");
   2057                         return OMX_ErrorUnsupportedSetting;
   2058                 }
   2059                 m_sConfigFrameRotation.nRotation = pParam->nRotation;
   2060 
   2061                 // Update output-port resolution (since it might have been flipped by rotation)
   2062                 if (handle->venc_get_dimensions(PORT_INDEX_OUT,
   2063                         &m_sOutPortDef.format.video.nFrameWidth,
   2064                         &m_sOutPortDef.format.video.nFrameHeight)) {
   2065                     DEBUG_PRINT_HIGH("set Rotation: updated dimensions = %u x %u",
   2066                             m_sOutPortDef.format.video.nFrameWidth,
   2067                             m_sOutPortDef.format.video.nFrameHeight);
   2068                 }
   2069                 break;
   2070             }
   2071         case OMX_QcomIndexConfigVideoFramePackingArrangement:
   2072             {
   2073                 DEBUG_PRINT_HIGH("set_config(): OMX_QcomIndexConfigVideoFramePackingArrangement");
   2074                 if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC) {
   2075                     VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
   2076                     OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
   2077                         (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
   2078                     extra_data_handle.set_frame_pack_data(configFmt);
   2079                 } else {
   2080                     DEBUG_PRINT_ERROR("ERROR: FramePackingData not supported for non AVC compression");
   2081                 }
   2082                 break;
   2083             }
   2084         case QOMX_IndexConfigVideoLTRPeriod:
   2085             {
   2086                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE);
   2087                 QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
   2088                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRPeriod)) {
   2089                     DEBUG_PRINT_ERROR("ERROR: Setting LTR period failed");
   2090                     return OMX_ErrorUnsupportedSetting;
   2091                 }
   2092                 memcpy(&m_sConfigLTRPeriod, pParam, sizeof(m_sConfigLTRPeriod));
   2093                 break;
   2094             }
   2095 
   2096        case OMX_IndexConfigVideoVp8ReferenceFrame:
   2097            {
   2098                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_VP8REFERENCEFRAMETYPE);
   2099                OMX_VIDEO_VP8REFERENCEFRAMETYPE* pParam = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) configData;
   2100                if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE) OMX_IndexConfigVideoVp8ReferenceFrame)) {
   2101                    DEBUG_PRINT_ERROR("ERROR: Setting VP8 reference frame");
   2102                    return OMX_ErrorUnsupportedSetting;
   2103                }
   2104                memcpy(&m_sConfigVp8ReferenceFrame, pParam, sizeof(m_sConfigVp8ReferenceFrame));
   2105                break;
   2106            }
   2107 
   2108        case QOMX_IndexConfigVideoLTRUse:
   2109             {
   2110                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRUSE_TYPE);
   2111                 QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
   2112                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse)) {
   2113                     DEBUG_PRINT_ERROR("ERROR: Setting LTR use failed");
   2114                     return OMX_ErrorUnsupportedSetting;
   2115                 }
   2116                 memcpy(&m_sConfigLTRUse, pParam, sizeof(m_sConfigLTRUse));
   2117                 break;
   2118             }
   2119         case QOMX_IndexConfigVideoLTRMark:
   2120             {
   2121                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRMARK_TYPE);
   2122                 QOMX_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRMARK_TYPE*)configData;
   2123                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRMark)) {
   2124                     DEBUG_PRINT_ERROR("ERROR: Setting LTR mark failed");
   2125                     return OMX_ErrorUnsupportedSetting;
   2126                 }
   2127                 break;
   2128             }
   2129         case OMX_IndexConfigVideoAVCIntraPeriod:
   2130             {
   2131                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_AVCINTRAPERIOD);
   2132                 OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
   2133                 DEBUG_PRINT_LOW("set_config: OMX_IndexConfigVideoAVCIntraPeriod");
   2134                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigVideoAVCIntraPeriod)) {
   2135                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoAVCIntraPeriod failed");
   2136                     return OMX_ErrorUnsupportedSetting;
   2137                 }
   2138                 memcpy(&m_sConfigAVCIDRPeriod, pParam, sizeof(m_sConfigAVCIDRPeriod));
   2139                 break;
   2140             }
   2141         case OMX_IndexConfigCommonDeinterlace:
   2142             {
   2143                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_DEINTERLACE);
   2144                 OMX_VIDEO_CONFIG_DEINTERLACE *pParam = (OMX_VIDEO_CONFIG_DEINTERLACE*) configData;
   2145                 DEBUG_PRINT_LOW("set_config: OMX_IndexConfigCommonDeinterlace");
   2146                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigCommonDeinterlace)) {
   2147                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigCommonDeinterlace failed");
   2148                     return OMX_ErrorUnsupportedSetting;
   2149                 }
   2150                 memcpy(&m_sConfigDeinterlace, pParam, sizeof(m_sConfigDeinterlace));
   2151                 break;
   2152             }
   2153         case OMX_QcomIndexConfigVideoVencPerfMode:
   2154             {
   2155                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_PERFMODE);
   2156                 QOMX_EXTNINDEX_VIDEO_PERFMODE* pParam = (QOMX_EXTNINDEX_VIDEO_PERFMODE*)configData;
   2157                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode)) {
   2158                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigVideoVencPerfMode failed");
   2159                     return OMX_ErrorUnsupportedSetting;
   2160                 }
   2161                 break;
   2162             }
   2163         case OMX_QcomIndexConfigNumHierPLayers:
   2164         {
   2165             VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS);
   2166             QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS* pParam =
   2167                 (QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS*)configData;
   2168             if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigNumHierPLayers)) {
   2169                 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigNumHierPLayers failed");
   2170                 return OMX_ErrorUnsupportedSetting;
   2171             }
   2172             memcpy(&m_sHPlayers, pParam, sizeof(m_sHPlayers));
   2173             break;
   2174         }
   2175         case OMX_QcomIndexConfigBaseLayerId:
   2176         {
   2177             VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID);
   2178             OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID* pParam =
   2179                 (OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID*) configData;
   2180             if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigBaseLayerId)) {
   2181                 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigBaseLayerId failed");
   2182                 return OMX_ErrorUnsupportedSetting;
   2183             }
   2184             memcpy(&m_sBaseLayerID, pParam, sizeof(m_sBaseLayerID));
   2185             break;
   2186         }
   2187         case OMX_QcomIndexConfigQp:
   2188         {
   2189             VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_QP);
   2190             OMX_SKYPE_VIDEO_CONFIG_QP* pParam =
   2191                 (OMX_SKYPE_VIDEO_CONFIG_QP*) configData;
   2192             if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigQp)) {
   2193                 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigQp failed");
   2194                 return OMX_ErrorUnsupportedSetting;
   2195             }
   2196             memcpy(&m_sConfigQP, pParam, sizeof(m_sConfigQP));
   2197             break;
   2198         }
   2199         case OMX_IndexConfigPriority:
   2200             {
   2201                 VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE);
   2202                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigPriority)) {
   2203                     DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigPriority");
   2204                     return OMX_ErrorUnsupportedSetting;
   2205                 }
   2206                 break;
   2207             }
   2208         case OMX_IndexConfigOperatingRate:
   2209             {
   2210                 VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE);
   2211                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate)) {
   2212                     DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigOperatingRate");
   2213                     return handle->hw_overload ? OMX_ErrorInsufficientResources :
   2214                             OMX_ErrorUnsupportedSetting;
   2215                 }
   2216                 break;
   2217             }
   2218         case OMX_QTIIndexConfigVideoRoiInfo:
   2219             {
   2220                 VALIDATE_OMX_PARAM_DATA(configData, OMX_QTI_VIDEO_CONFIG_ROIINFO);
   2221                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoRoiInfo)) {
   2222                     DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigVideoRoiInfo");
   2223                     return OMX_ErrorUnsupportedSetting;
   2224                 }
   2225                 break;
   2226             }
   2227         case OMX_IndexConfigTimePosition:
   2228             {
   2229                 OMX_TIME_CONFIG_TIMESTAMPTYPE* pParam =
   2230                     (OMX_TIME_CONFIG_TIMESTAMPTYPE*) configData;
   2231                 pthread_mutex_lock(&timestamp.m_lock);
   2232                 timestamp.m_TimeStamp = (OMX_U64)pParam->nTimestamp;
   2233                 DEBUG_PRINT_LOW("Buffer = %p, Timestamp = %llu", timestamp.pending_buffer, (OMX_U64)pParam->nTimestamp);
   2234                 if (timestamp.is_buffer_pending && (OMX_U64)timestamp.pending_buffer->nTimeStamp == timestamp.m_TimeStamp) {
   2235                     DEBUG_PRINT_INFO("Queueing back pending buffer %p", timestamp.pending_buffer);
   2236                     this->post_event((unsigned long)hComp,(unsigned long)timestamp.pending_buffer,m_input_msg_id);
   2237                     timestamp.pending_buffer = NULL;
   2238                     timestamp.is_buffer_pending = false;
   2239                 }
   2240                 pthread_mutex_unlock(&timestamp.m_lock);
   2241                 break;
   2242             }
   2243 #ifdef SUPPORT_CONFIG_INTRA_REFRESH
   2244        case OMX_IndexConfigAndroidIntraRefresh:
   2245            {
   2246                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE);
   2247                 OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE* pParam =
   2248                     (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE*) configData;
   2249                 if (m_state == OMX_StateLoaded
   2250                         || m_sInPortDef.bEnabled == OMX_FALSE
   2251                         || m_sOutPortDef.bEnabled == OMX_FALSE) {
   2252                     if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh)) {
   2253                         DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigVideoIntraRefreshType");
   2254                         return OMX_ErrorUnsupportedSetting;
   2255                     }
   2256                     m_sConfigIntraRefresh.nRefreshPeriod = pParam->nRefreshPeriod;
   2257                } else {
   2258                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigAndroidIntraRefresh supported only at start of session");
   2259                     return OMX_ErrorUnsupportedSetting;
   2260                 }
   2261                break;
   2262            }
   2263 #endif
   2264         case OMX_QTIIndexConfigVideoBlurResolution:
   2265            {
   2266                 VALIDATE_OMX_PARAM_DATA(configData, OMX_QTI_VIDEO_CONFIG_BLURINFO);
   2267                 OMX_QTI_VIDEO_CONFIG_BLURINFO* pParam =
   2268                               (OMX_QTI_VIDEO_CONFIG_BLURINFO*) configData;
   2269                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoBlurResolution)) {
   2270                     DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigVideoBlurResolution");
   2271                     return OMX_ErrorUnsupportedSetting;
   2272                 }
   2273                 memcpy(&m_blurInfo, pParam, sizeof(m_blurInfo));
   2274                 break;
   2275            }
   2276         case OMX_QcomIndexConfigH264Transform8x8:
   2277            {
   2278                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QcomIndexConfigH264Transform8x8)) {
   2279                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigH264Transform8x8 failed");
   2280                     return OMX_ErrorUnsupportedSetting;
   2281                 }
   2282                 break;
   2283             }
   2284         case OMX_QTIIndexConfigDescribeColorAspects:
   2285            {
   2286                VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
   2287                DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
   2288                print_debug_color_aspects(&(params->sAspects), "set_config");
   2289 
   2290                // WA: Android client does not set the correct color-aspects (from dataspace).
   2291                // Such a dataspace change is detected and set while in executing. This leads to
   2292                // a race condition where client is trying to set (wrong) color and component trying
   2293                // to set (right) color from ETB.
   2294                // Hence ignore this config in Executing state till the framework starts setting right color.
   2295                if (m_state == OMX_StateExecuting) {
   2296                     DEBUG_PRINT_HIGH("Ignoring ColorSpace setting in Executing state");
   2297                     return OMX_ErrorUnsupportedSetting;
   2298                }
   2299 
   2300                if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects)) {
   2301                    DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigDescribeColorAspects");
   2302                    return OMX_ErrorUnsupportedSetting;
   2303                }
   2304                memcpy(&m_sConfigColorAspects, configData, sizeof(m_sConfigColorAspects));
   2305                break;
   2306            }
   2307         case OMX_IndexConfigAndroidVideoTemporalLayering:
   2308             {
   2309                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE);
   2310                 DEBUG_PRINT_ERROR("Setting/modifying Temporal layers at run-time is not supported !");
   2311                 return OMX_ErrorUnsupportedSetting;
   2312             }
   2313         case OMX_QcomIndexConfigPerfLevel:
   2314             {
   2315                 VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL);
   2316                 if (!handle->venc_set_config(configData,
   2317                         (OMX_INDEXTYPE)OMX_QcomIndexConfigPerfLevel)) {
   2318                     DEBUG_PRINT_ERROR("Failed to set perf level");
   2319                     return OMX_ErrorUnsupportedSetting;
   2320                 }
   2321             }
   2322         case OMX_IndexConfigAndroidVendorExtension:
   2323             {
   2324                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE);
   2325 
   2326                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext =
   2327                     reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData);
   2328                 VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext);
   2329 
   2330                 return set_vendor_extension_config(ext);
   2331             }
   2332 
   2333         default:
   2334             DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
   2335             break;
   2336     }
   2337 
   2338     return OMX_ErrorNone;
   2339 }
   2340 
   2341 /* ======================================================================
   2342    FUNCTION
   2343    omx_venc::ComponentDeInit
   2344 
   2345    DESCRIPTION
   2346    Destroys the component and release memory allocated to the heap.
   2347 
   2348    PARAMETERS
   2349    <TBD>.
   2350 
   2351    RETURN VALUE
   2352    OMX Error None if everything successful.
   2353 
   2354    ========================================================================== */
   2355 OMX_ERRORTYPE  omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
   2356 {
   2357     (void) hComp;
   2358     OMX_U32 i = 0;
   2359     DEBUG_PRINT_HIGH("omx_venc(): Inside component_deinit()");
   2360     if (OMX_StateLoaded != m_state) {
   2361         DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
   2362                 m_state);
   2363     }
   2364 
   2365     auto_lock l(m_buf_lock);
   2366     if (m_out_mem_ptr) {
   2367         DEBUG_PRINT_LOW("Freeing the Output Memory");
   2368         for (i=0; i< m_sOutPortDef.nBufferCountActual; i++ ) {
   2369             if (BITMASK_PRESENT(&m_out_bm_count, i)) {
   2370                 BITMASK_CLEAR(&m_out_bm_count, i);
   2371                 if (BITMASK_PRESENT(&m_client_out_bm_count, i))
   2372                     BITMASK_CLEAR(&m_client_out_bm_count, i);
   2373                 free_output_buffer (&m_out_mem_ptr[i]);
   2374             }
   2375 
   2376             if (release_output_done()) {
   2377                 break;
   2378             }
   2379         }
   2380         free(m_out_mem_ptr);
   2381         m_out_mem_ptr = NULL;
   2382     }
   2383 
   2384     /*Check if the input buffers have to be cleaned up*/
   2385     if (m_inp_mem_ptr
   2386 #ifdef _ANDROID_ICS_
   2387             && !meta_mode_enable
   2388 #endif
   2389        ) {
   2390         DEBUG_PRINT_LOW("Freeing the Input Memory");
   2391         for (i=0; i<m_sInPortDef.nBufferCountActual; i++ ) {
   2392             if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
   2393                 BITMASK_CLEAR(&m_inp_bm_count, i);
   2394                 if (BITMASK_PRESENT(&m_client_in_bm_count, i))
   2395                     BITMASK_CLEAR(&m_client_in_bm_count, i);
   2396                 free_input_buffer (&m_inp_mem_ptr[i]);
   2397             }
   2398 
   2399             if (release_input_done()) {
   2400                 break;
   2401             }
   2402         }
   2403 
   2404 
   2405         free(m_inp_mem_ptr);
   2406         m_inp_mem_ptr = NULL;
   2407     }
   2408 
   2409     // Reset counters in mesg queues
   2410     m_ftb_q.m_size=0;
   2411     m_cmd_q.m_size=0;
   2412     m_etb_q.m_size=0;
   2413     m_ftb_q.m_read = m_ftb_q.m_write =0;
   2414     m_cmd_q.m_read = m_cmd_q.m_write =0;
   2415     m_etb_q.m_read = m_etb_q.m_write =0;
   2416 
   2417     DEBUG_PRINT_HIGH("Calling venc_close()");
   2418     if (handle) {
   2419         handle->venc_close();
   2420         DEBUG_PRINT_HIGH("Deleting HANDLE[%p]", handle);
   2421         delete (handle);
   2422         handle = NULL;
   2423     }
   2424     DEBUG_PRINT_INFO("Component Deinit");
   2425     return OMX_ErrorNone;
   2426 }
   2427 
   2428 
   2429 OMX_U32 omx_venc::dev_stop( void)
   2430 {
   2431     return handle->venc_stop();
   2432 }
   2433 
   2434 
   2435 OMX_U32 omx_venc::dev_pause(void)
   2436 {
   2437     return handle->venc_pause();
   2438 }
   2439 
   2440 OMX_U32 omx_venc::dev_start(void)
   2441 {
   2442     return handle->venc_start();
   2443 }
   2444 
   2445 OMX_U32 omx_venc::dev_flush(unsigned port)
   2446 {
   2447     return handle->venc_flush(port);
   2448 }
   2449 OMX_U32 omx_venc::dev_resume(void)
   2450 {
   2451     return handle->venc_resume();
   2452 }
   2453 
   2454 OMX_U32 omx_venc::dev_start_done(void)
   2455 {
   2456     return handle->venc_start_done();
   2457 }
   2458 
   2459 OMX_U32 omx_venc::dev_set_message_thread_id(pthread_t tid)
   2460 {
   2461     return handle->venc_set_message_thread_id(tid);
   2462 }
   2463 
   2464 bool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned index)
   2465 {
   2466     return handle->venc_use_buf(buf_addr,port,index);
   2467 }
   2468 
   2469 bool omx_venc::dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer)
   2470 {
   2471     bool bRet = true;
   2472 
   2473     pthread_mutex_lock(&timestamp.m_lock);
   2474 
   2475     if ((!m_slowLatencyMode.bLowLatencyMode) || ((OMX_U64)buffer->nTimeStamp == (OMX_U64)timestamp.m_TimeStamp)) {
   2476         DEBUG_PRINT_LOW("ETB is ready to be queued");
   2477     } else {
   2478         DEBUG_PRINT_INFO("ETB is defeffed due to timeStamp mismatch");
   2479         timestamp.is_buffer_pending = true;
   2480         timestamp.pending_buffer = buffer;
   2481         bRet = false;
   2482     }
   2483     pthread_mutex_unlock(&timestamp.m_lock);
   2484     return bRet;
   2485 }
   2486 
   2487 bool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
   2488 {
   2489     return handle->venc_free_buf(buf_addr,port);
   2490 }
   2491 
   2492 bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
   2493 {
   2494     bool bret = false;
   2495     bret = handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
   2496     hw_overload = handle->hw_overload;
   2497     return bret;
   2498 }
   2499 
   2500 bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
   2501 {
   2502     return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd);
   2503 }
   2504 
   2505 bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen)
   2506 {
   2507     return handle->venc_get_seq_hdr(buffer, size, hdrlen);
   2508 }
   2509 
   2510 bool omx_venc::dev_get_capability_ltrcount(OMX_U32 *min, OMX_U32 *max, OMX_U32 *step_size)
   2511 {
   2512 #ifdef _MSM8974_
   2513     (void) min;
   2514     (void) max;
   2515     (void) step_size;
   2516     DEBUG_PRINT_ERROR("Get Capability LTR Count is not supported");
   2517     return false;
   2518 #else
   2519     return handle->venc_get_capability_ltrcount(min, max, step_size);
   2520 #endif
   2521 }
   2522 
   2523 bool omx_venc::dev_get_performance_level(OMX_U32 *perflevel)
   2524 {
   2525 #ifdef _MSM8974_
   2526     return handle->venc_get_performance_level(perflevel);
   2527 #else
   2528     DEBUG_PRINT_ERROR("Get performance level is not supported");
   2529     return false;
   2530 #endif
   2531 }
   2532 
   2533 bool omx_venc::dev_get_vui_timing_info(OMX_U32 *enabled)
   2534 {
   2535 #ifdef _MSM8974_
   2536     return handle->venc_get_vui_timing_info(enabled);
   2537 #else
   2538     DEBUG_PRINT_ERROR("Get vui timing information is not supported");
   2539     return false;
   2540 #endif
   2541 }
   2542 
   2543 bool omx_venc::dev_get_vqzip_sei_info(OMX_U32 *enabled)
   2544 {
   2545     return handle->venc_get_vqzip_sei_info(enabled);
   2546 }
   2547 
   2548 bool omx_venc::dev_get_peak_bitrate(OMX_U32 *peakbitrate)
   2549 {
   2550 #ifdef _MSM8974_
   2551     return handle->venc_get_peak_bitrate(peakbitrate);
   2552 #else
   2553     DEBUG_PRINT_ERROR("Get peak bitrate is not supported");
   2554     return false;
   2555 #endif
   2556 }
   2557 
   2558 bool omx_venc::dev_get_batch_size(OMX_U32 *size)
   2559 {
   2560 #ifdef _MSM8974_
   2561     return handle->venc_get_batch_size(size);
   2562 #else
   2563     DEBUG_PRINT_ERROR("Get batch size is not supported");
   2564     return false;
   2565 #endif
   2566 }
   2567 
   2568 bool omx_venc::dev_get_temporal_layer_caps(OMX_U32 *nMaxLayers,
   2569         OMX_U32 *nMaxBLayers) {
   2570     return handle->venc_get_temporal_layer_caps(nMaxLayers, nMaxBLayers);
   2571 }
   2572 
   2573 bool omx_venc::dev_get_pq_status(OMX_BOOL *pq_status) {
   2574     return handle->venc_get_pq_status(pq_status);
   2575 }
   2576 
   2577 bool omx_venc::dev_loaded_start()
   2578 {
   2579     return handle->venc_loaded_start();
   2580 }
   2581 
   2582 bool omx_venc::dev_loaded_stop()
   2583 {
   2584     return handle->venc_loaded_stop();
   2585 }
   2586 
   2587 bool omx_venc::dev_loaded_start_done()
   2588 {
   2589     return handle->venc_loaded_start_done();
   2590 }
   2591 
   2592 bool omx_venc::dev_loaded_stop_done()
   2593 {
   2594     return handle->venc_loaded_stop_done();
   2595 }
   2596 
   2597 bool omx_venc::dev_get_buf_req(OMX_U32 *min_buff_count,
   2598         OMX_U32 *actual_buff_count,
   2599         OMX_U32 *buff_size,
   2600         OMX_U32 port)
   2601 {
   2602     return handle->venc_get_buf_req(min_buff_count,
   2603             actual_buff_count,
   2604             buff_size,
   2605             port);
   2606 
   2607 }
   2608 
   2609 bool omx_venc::dev_set_buf_req(OMX_U32 *min_buff_count,
   2610         OMX_U32 *actual_buff_count,
   2611         OMX_U32 *buff_size,
   2612         OMX_U32 port)
   2613 {
   2614     return handle->venc_set_buf_req(min_buff_count,
   2615             actual_buff_count,
   2616             buff_size,
   2617             port);
   2618 
   2619 }
   2620 
   2621 bool omx_venc::dev_is_video_session_supported(OMX_U32 width, OMX_U32 height)
   2622 {
   2623 #ifdef _MSM8974_
   2624     return handle->venc_is_video_session_supported(width,height);
   2625 #else
   2626     DEBUG_PRINT_LOW("Check against video capability not supported");
   2627     return true;
   2628 #endif
   2629 }
   2630 
   2631 int omx_venc::dev_handle_output_extradata(void *buffer, int index)
   2632 {
   2633     return handle->handle_output_extradata(buffer, index);
   2634 }
   2635 
   2636 int omx_venc::dev_set_format(int color)
   2637 {
   2638     return handle->venc_set_format(color);
   2639 }
   2640 
   2641 int omx_venc::async_message_process (void *context, void* message)
   2642 {
   2643     omx_video* omx = NULL;
   2644     struct venc_msg *m_sVenc_msg = NULL;
   2645     OMX_BUFFERHEADERTYPE* omxhdr = NULL;
   2646     struct venc_buffer *temp_buff = NULL;
   2647     native_handle_t *nh = NULL;
   2648 
   2649     if (context == NULL || message == NULL) {
   2650         DEBUG_PRINT_ERROR("ERROR: omx_venc::async_message_process invalid i/p params");
   2651         return -1;
   2652     }
   2653     m_sVenc_msg = (struct venc_msg *)message;
   2654 
   2655     omx = reinterpret_cast<omx_video*>(context);
   2656 
   2657     if (m_sVenc_msg->statuscode != VEN_S_SUCCESS) {
   2658         DEBUG_PRINT_ERROR("ERROR: async_msg_process() - Error statuscode = %lu",
   2659                 m_sVenc_msg->statuscode);
   2660         if(m_sVenc_msg->msgcode == VEN_MSG_HW_OVERLOAD) {
   2661             omx->post_event (0, m_sVenc_msg->statuscode,\
   2662                     OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
   2663         } else {
   2664             omx->post_event (0, m_sVenc_msg->statuscode,\
   2665                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
   2666         }
   2667     }
   2668 
   2669     DEBUG_PRINT_LOW("omx_venc::async_message_process- msgcode = %lu",
   2670             m_sVenc_msg->msgcode);
   2671     switch (m_sVenc_msg->msgcode) {
   2672         case VEN_MSG_START:
   2673             omx->post_event (0,m_sVenc_msg->statuscode,\
   2674                     OMX_COMPONENT_GENERATE_START_DONE);
   2675             break;
   2676         case VEN_MSG_STOP:
   2677             omx->post_event (0,m_sVenc_msg->statuscode,\
   2678                     OMX_COMPONENT_GENERATE_STOP_DONE);
   2679             break;
   2680         case VEN_MSG_RESUME:
   2681             omx->post_event (0,m_sVenc_msg->statuscode,\
   2682                     OMX_COMPONENT_GENERATE_RESUME_DONE);
   2683             break;
   2684         case VEN_MSG_PAUSE:
   2685             omx->post_event (0,m_sVenc_msg->statuscode,\
   2686                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
   2687             break;
   2688         case VEN_MSG_FLUSH_INPUT_DONE:
   2689 
   2690             omx->post_event (0,m_sVenc_msg->statuscode,\
   2691                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
   2692             break;
   2693         case VEN_MSG_FLUSH_OUPUT_DONE:
   2694             omx->post_event (0,m_sVenc_msg->statuscode,\
   2695                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
   2696             break;
   2697         case VEN_MSG_INPUT_BUFFER_DONE:
   2698             omxhdr = (OMX_BUFFERHEADERTYPE* )\
   2699                      m_sVenc_msg->buf.clientdata;
   2700 
   2701             if (omxhdr == NULL ||
   2702                     (((OMX_U32)(omxhdr - omx->m_inp_mem_ptr) > omx->m_sInPortDef.nBufferCountActual) &&
   2703                      ((OMX_U32)(omxhdr - omx->meta_buffer_hdr) > omx->m_sInPortDef.nBufferCountActual))) {
   2704                 omxhdr = NULL;
   2705                 m_sVenc_msg->statuscode = VEN_S_EFAIL;
   2706             }
   2707 
   2708 #ifdef _ANDROID_ICS_
   2709             omx->omx_release_meta_buffer(omxhdr);
   2710 #endif
   2711             omx->post_event ((unsigned long)omxhdr,m_sVenc_msg->statuscode,
   2712                     OMX_COMPONENT_GENERATE_EBD);
   2713             break;
   2714         case VEN_MSG_OUTPUT_BUFFER_DONE:
   2715         {
   2716             omxhdr = (OMX_BUFFERHEADERTYPE*)m_sVenc_msg->buf.clientdata;
   2717             OMX_U32 bufIndex = (OMX_U32)(omxhdr - omx->m_out_mem_ptr);
   2718 
   2719             if ( (omxhdr != NULL) &&
   2720                     (bufIndex  < omx->m_sOutPortDef.nBufferCountActual)) {
   2721                 auto_lock l(omx->m_buf_lock);
   2722                 if (BITMASK_ABSENT(&(omx->m_out_bm_count), bufIndex)) {
   2723                     DEBUG_PRINT_ERROR("Recieved FBD for buffer that is already freed !");
   2724                     break;
   2725                 }
   2726                 if (!omx->is_secure_session() && (m_sVenc_msg->buf.len <=  omxhdr->nAllocLen)) {
   2727                     omxhdr->nFilledLen = m_sVenc_msg->buf.len;
   2728                     omxhdr->nOffset = m_sVenc_msg->buf.offset;
   2729                     omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
   2730                     DEBUG_PRINT_LOW("o/p TS = %u", (unsigned int)m_sVenc_msg->buf.timestamp);
   2731                     omxhdr->nFlags = m_sVenc_msg->buf.flags;
   2732 
   2733                     /*Use buffer case*/
   2734                     if (BITMASK_PRESENT(&(omx->m_client_out_bm_count), bufIndex) &&
   2735                         omx->output_use_buffer && !omx->m_use_output_pmem && !omx->is_secure_session()) {
   2736                         DEBUG_PRINT_LOW("memcpy() for o/p Heap UseBuffer");
   2737                         memcpy(omxhdr->pBuffer,
   2738                                 (m_sVenc_msg->buf.ptrbuffer),
   2739                                 m_sVenc_msg->buf.len);
   2740                     }
   2741                 } else if (omx->is_secure_session()) {
   2742                     if (omx->allocate_native_handle) {
   2743                         native_handle_t *nh = (native_handle_t *)(omxhdr->pBuffer);
   2744                         nh->data[1] = m_sVenc_msg->buf.offset;
   2745                         nh->data[2] = m_sVenc_msg->buf.len;
   2746                         omxhdr->nFilledLen = m_sVenc_msg->buf.len;
   2747                         omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
   2748                         omxhdr->nFlags = m_sVenc_msg->buf.flags;
   2749                     } else {
   2750                         output_metabuffer *meta_buf = (output_metabuffer *)(omxhdr->pBuffer);
   2751                         native_handle_t *nh = meta_buf->nh;
   2752                         nh->data[1] = m_sVenc_msg->buf.offset;
   2753                         nh->data[2] = m_sVenc_msg->buf.len;
   2754                         omxhdr->nFilledLen = sizeof(output_metabuffer);
   2755                         omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
   2756                         omxhdr->nFlags = m_sVenc_msg->buf.flags;
   2757                     }
   2758                 } else {
   2759                     omxhdr->nFilledLen = 0;
   2760                 }
   2761 
   2762             } else {
   2763                 omxhdr = NULL;
   2764                 m_sVenc_msg->statuscode = VEN_S_EFAIL;
   2765             }
   2766             omx->post_event ((unsigned long)omxhdr,m_sVenc_msg->statuscode,
   2767                     OMX_COMPONENT_GENERATE_FBD);
   2768             break;
   2769         }
   2770         case VEN_MSG_NEED_OUTPUT_BUFFER:
   2771             //TBD what action needs to be done here??
   2772             break;
   2773 #ifndef _MSM8974_
   2774         case VEN_MSG_LTRUSE_FAILED:
   2775             DEBUG_PRINT_ERROR("LTRUSE Failed!");
   2776             omx->post_event (NULL,m_sVenc_msg->statuscode,
   2777                     OMX_COMPONENT_GENERATE_LTRUSE_FAILED);
   2778             break;
   2779 #endif
   2780         default:
   2781             DEBUG_PRINT_HIGH("Unknown msg received : %lu", m_sVenc_msg->msgcode);
   2782             break;
   2783     }
   2784     return 0;
   2785 }
   2786 
   2787 bool omx_venc::dev_color_align(OMX_BUFFERHEADERTYPE *buffer,
   2788                 OMX_U32 width, OMX_U32 height)
   2789 {
   2790     if(secure_session) {
   2791         DEBUG_PRINT_ERROR("Cannot align colors in secure session.");
   2792         return OMX_FALSE;
   2793     }
   2794     return handle->venc_color_align(buffer, width,height);
   2795 }
   2796 
   2797 bool omx_venc::is_secure_session()
   2798 {
   2799     return secure_session;
   2800 }
   2801 
   2802 bool omx_venc::dev_get_output_log_flag()
   2803 {
   2804     return handle->venc_get_output_log_flag();
   2805 }
   2806 
   2807 int omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen)
   2808 {
   2809     return handle->venc_output_log_buffers(buffer, bufferlen);
   2810 }
   2811 
   2812 int omx_venc::dev_extradata_log_buffers(char *buffer)
   2813 {
   2814     return handle->venc_extradata_log_buffers(buffer);
   2815 }
   2816