1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2010-2016, 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 #ifndef _ANDROID_ 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("vidc.debug.level", property_value, "1"); 143 debug_level = atoi(property_value); 144 property_value[0] = '\0'; 145 property_get("vidc.debug.bframes", property_value, "0"); 146 bframes = atoi(property_value); 147 property_value[0] = '\0'; 148 property_get("vidc.debug.entropy", property_value, "1"); 149 entropy = !!atoi(property_value); 150 property_value[0] = '\0'; 151 property_get("vidc.debug.perf.mode", property_value, "0"); 152 perfmode = atoi(property_value); 153 property_value[0] = '\0'; 154 handle = NULL; 155 property_get("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 } 439 440 // Initialize the video color format for input port 441 OMX_INIT_STRUCT(&m_sInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE); 442 m_sInPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_IN; 443 m_sInPortFormat.nIndex = 0; 444 m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE) 445 QOMX_DEFAULT_COLOR_FMT; 446 m_sInPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; 447 448 449 // Initialize the compression format for output port 450 OMX_INIT_STRUCT(&m_sOutPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE); 451 m_sOutPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 452 m_sOutPortFormat.nIndex = 0; 453 m_sOutPortFormat.eColorFormat = OMX_COLOR_FormatUnused; 454 if (codec_type == OMX_VIDEO_CodingMPEG4) { 455 m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingMPEG4; 456 } else if (codec_type == OMX_VIDEO_CodingH263) { 457 m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingH263; 458 } else if (codec_type == OMX_VIDEO_CodingAVC) { 459 m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingAVC; 460 } else if (codec_type == OMX_VIDEO_CodingVP8) { 461 m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingVP8; 462 } else if (codec_type == OMX_VIDEO_CodingHEVC) { 463 m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingHEVC; 464 } 465 466 // mandatory Indices for kronos test suite 467 OMX_INIT_STRUCT(&m_sPriorityMgmt, OMX_PRIORITYMGMTTYPE); 468 469 OMX_INIT_STRUCT(&m_sInBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE); 470 m_sInBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_IN; 471 472 OMX_INIT_STRUCT(&m_sOutBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE); 473 m_sOutBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 474 475 OMX_INIT_STRUCT(&m_sParamInitqp, QOMX_EXTNINDEX_VIDEO_INITIALQP); 476 m_sParamInitqp.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 477 478 // mp4 specific init 479 OMX_INIT_STRUCT(&m_sParamMPEG4, OMX_VIDEO_PARAM_MPEG4TYPE); 480 m_sParamMPEG4.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 481 m_sParamMPEG4.eProfile = OMX_VIDEO_MPEG4ProfileSimple; 482 m_sParamMPEG4.eLevel = OMX_VIDEO_MPEG4Level0; 483 m_sParamMPEG4.nSliceHeaderSpacing = 0; 484 m_sParamMPEG4.bSVH = OMX_FALSE; 485 m_sParamMPEG4.bGov = OMX_FALSE; 486 m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps 487 m_sParamMPEG4.bACPred = OMX_TRUE; 488 m_sParamMPEG4.nTimeIncRes = 30; // delta = 2 @ 15 fps 489 m_sParamMPEG4.nAllowedPictureTypes = 2; // pframe and iframe 490 m_sParamMPEG4.nHeaderExtension = 1; // number of video packet headers per vop 491 m_sParamMPEG4.bReversibleVLC = OMX_FALSE; 492 493 // h263 specific init 494 OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE); 495 m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 496 m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps 497 m_sParamH263.nBFrames = 0; 498 m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline; 499 m_sParamH263.eLevel = OMX_VIDEO_H263Level10; 500 m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE; 501 m_sParamH263.nAllowedPictureTypes = 2; 502 m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE; 503 m_sParamH263.nPictureHeaderRepetition = 0; 504 m_sParamH263.nGOBHeaderInterval = 1; 505 506 // h264 specific init 507 OMX_INIT_STRUCT(&m_sParamAVC, OMX_VIDEO_PARAM_AVCTYPE); 508 m_sParamAVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 509 m_sParamAVC.nSliceHeaderSpacing = 0; 510 m_sParamAVC.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps 511 m_sParamAVC.nBFrames = 0; 512 m_sParamAVC.bUseHadamard = OMX_FALSE; 513 m_sParamAVC.nRefIdx10ActiveMinus1 = 1; 514 m_sParamAVC.nRefIdx11ActiveMinus1 = 0; 515 m_sParamAVC.bEnableUEP = OMX_FALSE; 516 m_sParamAVC.bEnableFMO = OMX_FALSE; 517 m_sParamAVC.bEnableASO = OMX_FALSE; 518 m_sParamAVC.bEnableRS = OMX_FALSE; 519 m_sParamAVC.eProfile = OMX_VIDEO_AVCProfileBaseline; 520 m_sParamAVC.eLevel = OMX_VIDEO_AVCLevel1; 521 m_sParamAVC.nAllowedPictureTypes = 2; 522 m_sParamAVC.bFrameMBsOnly = OMX_FALSE; 523 m_sParamAVC.bMBAFF = OMX_FALSE; 524 m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE; 525 m_sParamAVC.bWeightedPPrediction = OMX_FALSE; 526 m_sParamAVC.nWeightedBipredicitonMode = 0; 527 m_sParamAVC.bconstIpred = OMX_FALSE; 528 m_sParamAVC.bDirect8x8Inference = OMX_FALSE; 529 m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE; 530 m_sParamAVC.nCabacInitIdc = 0; 531 m_sParamAVC.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 532 533 // VP8 specific init 534 OMX_INIT_STRUCT(&m_sParamVP8, OMX_VIDEO_PARAM_VP8TYPE); 535 m_sParamVP8.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 536 m_sParamVP8.eProfile = OMX_VIDEO_VP8ProfileMain; 537 m_sParamVP8.eLevel = OMX_VIDEO_VP8Level_Version0; 538 m_sParamVP8.nDCTPartitions = 0; 539 m_sParamVP8.bErrorResilientMode = OMX_FALSE; 540 541 // HEVC specific init 542 OMX_INIT_STRUCT(&m_sParamHEVC, OMX_VIDEO_PARAM_HEVCTYPE); 543 m_sParamHEVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 544 m_sParamHEVC.eProfile = OMX_VIDEO_HEVCProfileMain; 545 m_sParamHEVC.eLevel = OMX_VIDEO_HEVCMainTierLevel1; 546 547 OMX_INIT_STRUCT(&m_sParamLTRMode, QOMX_VIDEO_PARAM_LTRMODE_TYPE); 548 m_sParamLTRMode.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 549 m_sParamLTRMode.eLTRMode = QOMX_VIDEO_LTRMode_Disable; 550 551 OMX_INIT_STRUCT(&m_sParamLTRCount, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE); 552 m_sParamLTRCount.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 553 m_sParamLTRCount.nCount = 0; 554 555 OMX_INIT_STRUCT(&m_sConfigDeinterlace, OMX_VIDEO_CONFIG_DEINTERLACE); 556 m_sConfigDeinterlace.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 557 m_sConfigDeinterlace.nEnable = OMX_FALSE; 558 559 OMX_INIT_STRUCT(&m_sHierLayers, QOMX_VIDEO_HIERARCHICALLAYERS); 560 m_sHierLayers.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 561 m_sHierLayers.nNumLayers = 0; 562 m_sHierLayers.eHierarchicalCodingType = QOMX_HIERARCHICALCODING_P; 563 564 OMX_INIT_STRUCT(&m_sMBIStatistics, OMX_QOMX_VIDEO_MBI_STATISTICS); 565 m_sMBIStatistics.nPortIndex = (OMX_U32) PORT_INDEX_OUT; 566 m_sMBIStatistics.eMBIStatisticsType = QOMX_MBI_STATISTICS_MODE_DEFAULT; 567 568 OMX_INIT_STRUCT(&m_slowLatencyMode, QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE); 569 m_slowLatencyMode.bLowLatencyMode = OMX_FALSE; 570 571 OMX_INIT_STRUCT(&m_sParamTemporalLayers, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE); 572 m_sParamTemporalLayers.eSupportedPatterns = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid; 573 574 OMX_INIT_STRUCT(&m_sConfigTemporalLayers, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE); 575 576 m_state = OMX_StateLoaded; 577 m_sExtraData = 0; 578 579 if (eRet == OMX_ErrorNone) { 580 if (pipe(fds)) { 581 DEBUG_PRINT_ERROR("ERROR: pipe creation failed"); 582 eRet = OMX_ErrorInsufficientResources; 583 } else { 584 if (fds[0] == 0 || fds[1] == 0) { 585 if (pipe(fds)) { 586 DEBUG_PRINT_ERROR("ERROR: pipe creation failed"); 587 eRet = OMX_ErrorInsufficientResources; 588 } 589 } 590 if (eRet == OMX_ErrorNone) { 591 m_pipe_in = fds[0]; 592 m_pipe_out = fds[1]; 593 } 594 } 595 msg_thread_created = true; 596 r = pthread_create(&msg_thread_id,0, message_thread_enc, this); 597 if (r < 0) { 598 eRet = OMX_ErrorInsufficientResources; 599 msg_thread_created = false; 600 } else { 601 async_thread_created = true; 602 r = pthread_create(&async_thread_id,0, venc_dev::async_venc_message_thread, this); 603 if (r < 0) { 604 eRet = OMX_ErrorInsufficientResources; 605 async_thread_created = false; 606 } else 607 dev_set_message_thread_id(async_thread_id); 608 } 609 } 610 611 if (perfmode) { 612 QOMX_EXTNINDEX_VIDEO_PERFMODE pParam; 613 pParam.nPerfMode = perfmode; 614 DEBUG_PRINT_LOW("Perfmode = 0x%x", pParam.nPerfMode); 615 if (!handle->venc_set_config(&pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode)) 616 DEBUG_PRINT_ERROR("Failed setting PerfMode to %d", pParam.nPerfMode); 617 } 618 619 if (lowlatency) 620 { 621 QOMX_ENABLETYPE low_latency; 622 low_latency.bEnable = OMX_TRUE; 623 DEBUG_PRINT_LOW("Enable lowlatency mode"); 624 if (!handle->venc_set_param(&low_latency, 625 (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencLowLatencyMode)) { 626 DEBUG_PRINT_ERROR("Failed enabling low latency mode"); 627 } 628 } 629 DEBUG_PRINT_INFO("Component_init : %s : return = 0x%x", m_nkind, eRet); 630 return eRet; 631 init_error: 632 handle->venc_close(); 633 delete handle; 634 handle = NULL; 635 return eRet; 636 } 637 638 639 /* ====================================================================== 640 FUNCTION 641 omx_venc::Setparameter 642 643 DESCRIPTION 644 OMX Set Parameter method implementation. 645 646 PARAMETERS 647 <TBD>. 648 649 RETURN VALUE 650 OMX Error None if successful. 651 652 ========================================================================== */ 653 OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 654 OMX_IN OMX_INDEXTYPE paramIndex, 655 OMX_IN OMX_PTR paramData) 656 { 657 (void)hComp; 658 OMX_ERRORTYPE eRet = OMX_ErrorNone; 659 660 661 if (m_state == OMX_StateInvalid) { 662 DEBUG_PRINT_ERROR("ERROR: Set Param in Invalid State"); 663 return OMX_ErrorInvalidState; 664 } 665 if (paramData == NULL) { 666 DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData"); 667 return OMX_ErrorBadParameter; 668 } 669 670 /*set_parameter can be called in loaded state 671 or disabled port */ 672 if (m_state == OMX_StateLoaded 673 || m_sInPortDef.bEnabled == OMX_FALSE 674 || m_sOutPortDef.bEnabled == OMX_FALSE) { 675 DEBUG_PRINT_LOW("Set Parameter called in valid state"); 676 } else { 677 DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State"); 678 return OMX_ErrorIncorrectStateOperation; 679 } 680 681 switch ((int)paramIndex) { 682 case OMX_IndexParamPortDefinition: 683 { 684 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 685 OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 686 portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 687 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 688 (int)portDefn->format.video.nFrameHeight, 689 (int)portDefn->format.video.nFrameWidth); 690 691 if (PORT_INDEX_IN == portDefn->nPortIndex) { 692 if (!dev_is_video_session_supported(portDefn->format.video.nFrameWidth, 693 portDefn->format.video.nFrameHeight)) { 694 DEBUG_PRINT_ERROR("video session not supported"); 695 omx_report_unsupported_setting(); 696 return OMX_ErrorUnsupportedSetting; 697 } 698 DEBUG_PRINT_LOW("i/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual); 699 DEBUG_PRINT_LOW("i/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin); 700 DEBUG_PRINT_LOW("i/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize); 701 if (portDefn->nBufferCountActual > MAX_NUM_INPUT_BUFFERS) { 702 DEBUG_PRINT_ERROR("ERROR: (In_PORT) actual count (%u) exceeds max(%u)", 703 (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_INPUT_BUFFERS); 704 return OMX_ErrorUnsupportedSetting; 705 } 706 if (m_inp_mem_ptr && 707 (portDefn->nBufferCountActual != m_sInPortDef.nBufferCountActual || 708 portDefn->nBufferSize != m_sInPortDef.nBufferSize)) { 709 DEBUG_PRINT_ERROR("ERROR: (In_PORT) buffer count/size can change only if port is unallocated !"); 710 return OMX_ErrorInvalidState; 711 } 712 if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) { 713 DEBUG_PRINT_ERROR("ERROR: (In_PORT) Min buffers (%u) > actual count (%u)", 714 (unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual); 715 return OMX_ErrorUnsupportedSetting; 716 } 717 if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) { 718 DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed"); 719 return handle->hw_overload ? OMX_ErrorInsufficientResources : 720 OMX_ErrorUnsupportedSetting; 721 } 722 723 DEBUG_PRINT_LOW("i/p previous actual cnt = %u", (unsigned int)m_sInPortDef.nBufferCountActual); 724 DEBUG_PRINT_LOW("i/p previous min cnt = %u", (unsigned int)m_sInPortDef.nBufferCountMin); 725 memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 726 727 #ifdef _ANDROID_ICS_ 728 if (portDefn->format.video.eColorFormat == 729 (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) { 730 m_sInPortDef.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE) 731 QOMX_DEFAULT_COLOR_FMT; 732 if (!mUseProxyColorFormat) { 733 if (!c2d_conv.init()) { 734 DEBUG_PRINT_ERROR("C2D init failed"); 735 return OMX_ErrorUnsupportedSetting; 736 } 737 DEBUG_PRINT_HIGH("C2D init is successful"); 738 } 739 mUseProxyColorFormat = true; 740 m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ; 741 } else 742 mUseProxyColorFormat = false; 743 #endif 744 /*Query Input Buffer Requirements*/ 745 dev_get_buf_req (&m_sInPortDef.nBufferCountMin, 746 &m_sInPortDef.nBufferCountActual, 747 &m_sInPortDef.nBufferSize, 748 m_sInPortDef.nPortIndex); 749 750 /*Query ouput Buffer Requirements*/ 751 dev_get_buf_req (&m_sOutPortDef.nBufferCountMin, 752 &m_sOutPortDef.nBufferCountActual, 753 &m_sOutPortDef.nBufferSize, 754 m_sOutPortDef.nPortIndex); 755 m_sInPortDef.nBufferCountActual = portDefn->nBufferCountActual; 756 } else if (PORT_INDEX_OUT == portDefn->nPortIndex) { 757 DEBUG_PRINT_LOW("o/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual); 758 DEBUG_PRINT_LOW("o/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin); 759 DEBUG_PRINT_LOW("o/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize); 760 761 if (portDefn->nBufferCountActual > MAX_NUM_OUTPUT_BUFFERS) { 762 DEBUG_PRINT_ERROR("ERROR: (Out_PORT) actual count (%u) exceeds max(%u)", 763 (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_OUTPUT_BUFFERS); 764 return OMX_ErrorUnsupportedSetting; 765 } 766 if (m_out_mem_ptr && 767 (portDefn->nBufferCountActual != m_sOutPortDef.nBufferCountActual || 768 portDefn->nBufferSize != m_sOutPortDef.nBufferSize)) { 769 DEBUG_PRINT_ERROR("ERROR: (Out_PORT) buffer count/size can change only if port is unallocated !"); 770 return OMX_ErrorInvalidState; 771 } 772 773 if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) { 774 DEBUG_PRINT_ERROR("ERROR: (Out_PORT) Min buffers (%u) > actual count (%u)", 775 (unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual); 776 return OMX_ErrorUnsupportedSetting; 777 } 778 if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) { 779 DEBUG_PRINT_ERROR("ERROR: venc_set_param output failed"); 780 return OMX_ErrorUnsupportedSetting; 781 } 782 memcpy(&m_sOutPortDef,portDefn,sizeof(struct OMX_PARAM_PORTDEFINITIONTYPE)); 783 #ifdef _MSM8974_ 784 /*Query ouput Buffer Requirements*/ 785 dev_get_buf_req(&m_sOutPortDef.nBufferCountMin, 786 &m_sOutPortDef.nBufferCountActual, 787 &m_sOutPortDef.nBufferSize, 788 m_sOutPortDef.nPortIndex); 789 #endif 790 update_profile_level(); //framerate , bitrate 791 792 DEBUG_PRINT_LOW("o/p previous actual cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountActual); 793 DEBUG_PRINT_LOW("o/p previous min cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountMin); 794 m_sOutPortDef.nBufferCountActual = portDefn->nBufferCountActual; 795 } else { 796 DEBUG_PRINT_ERROR("ERROR: Set_parameter: Bad Port idx %d", 797 (int)portDefn->nPortIndex); 798 eRet = OMX_ErrorBadPortIndex; 799 } 800 m_sConfigFramerate.xEncodeFramerate = portDefn->format.video.xFramerate; 801 m_sConfigBitrate.nEncodeBitrate = portDefn->format.video.nBitrate; 802 m_sParamBitrate.nTargetBitrate = portDefn->format.video.nBitrate; 803 } 804 break; 805 806 case OMX_IndexParamVideoPortFormat: 807 { 808 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 809 OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 810 (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 811 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d", 812 portFmt->eColorFormat); 813 //set the driver with the corresponding values 814 if (PORT_INDEX_IN == portFmt->nPortIndex) { 815 if (handle->venc_set_param(paramData,OMX_IndexParamVideoPortFormat) != true) { 816 return OMX_ErrorUnsupportedSetting; 817 } 818 819 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d", 820 portFmt->eColorFormat); 821 update_profile_level(); //framerate 822 823 #ifdef _ANDROID_ICS_ 824 if (portFmt->eColorFormat == 825 (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) { 826 m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE) 827 QOMX_DEFAULT_COLOR_FMT; 828 if (!mUseProxyColorFormat) { 829 if (!c2d_conv.init()) { 830 DEBUG_PRINT_ERROR("C2D init failed"); 831 return OMX_ErrorUnsupportedSetting; 832 } 833 DEBUG_PRINT_HIGH("C2D init is successful"); 834 } 835 mUseProxyColorFormat = true; 836 m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ; 837 } else 838 #endif 839 { 840 m_sInPortFormat.eColorFormat = portFmt->eColorFormat; 841 m_sInPortDef.format.video.eColorFormat = portFmt->eColorFormat; 842 m_input_msg_id = OMX_COMPONENT_GENERATE_ETB; 843 mUseProxyColorFormat = false; 844 } 845 m_sInPortFormat.xFramerate = portFmt->xFramerate; 846 } 847 //TODO if no use case for O/P port,delet m_sOutPortFormat 848 } 849 break; 850 case OMX_IndexParamVideoInit: 851 { //TODO, do we need this index set param 852 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 853 OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData); 854 DEBUG_PRINT_LOW("Set OMX_IndexParamVideoInit called"); 855 break; 856 } 857 858 case OMX_IndexParamVideoBitrate: 859 { 860 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_BITRATETYPE); 861 OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData; 862 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate"); 863 if (handle->venc_set_param(paramData,OMX_IndexParamVideoBitrate) != true) { 864 return OMX_ErrorUnsupportedSetting; 865 } 866 m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate; 867 m_sParamBitrate.eControlRate = pParam->eControlRate; 868 update_profile_level(); //bitrate 869 m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate; 870 m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate; 871 m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate; 872 /* RC mode chan chage buffer requirements on Input port */ 873 dev_get_buf_req(&m_sInPortDef.nBufferCountMin, 874 &m_sInPortDef.nBufferCountActual, 875 &m_sInPortDef.nBufferSize, 876 m_sInPortDef.nPortIndex); 877 DEBUG_PRINT_LOW("bitrate = %u", (unsigned int)m_sOutPortDef.format.video.nBitrate); 878 break; 879 } 880 case OMX_IndexParamVideoMpeg4: 881 { 882 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_MPEG4TYPE); 883 OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData; 884 OMX_VIDEO_PARAM_MPEG4TYPE mp4_param; 885 memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE)); 886 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4"); 887 if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) { 888 #ifdef _MSM8974_ 889 if (pParam->nBFrames || bframes) 890 mp4_param.nBFrames = 1; 891 else 892 mp4_param.nBFrames = 0; 893 DEBUG_PRINT_HIGH("MPEG4: %u BFrames are being set", (unsigned int)mp4_param.nBFrames); 894 #endif 895 } else { 896 if (pParam->nBFrames) { 897 DEBUG_PRINT_ERROR("Warning: B frames not supported"); 898 mp4_param.nBFrames = 0; 899 } 900 } 901 if (handle->venc_set_param(&mp4_param,OMX_IndexParamVideoMpeg4) != true) { 902 return OMX_ErrorUnsupportedSetting; 903 } 904 memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE)); 905 m_sIntraperiod.nPFrames = m_sParamMPEG4.nPFrames; 906 if (pParam->nBFrames || bframes) 907 m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames = mp4_param.nBFrames; 908 else 909 m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames; 910 break; 911 } 912 case OMX_IndexParamVideoH263: 913 { 914 OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData; 915 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263"); 916 if (handle->venc_set_param(paramData,OMX_IndexParamVideoH263) != true) { 917 return OMX_ErrorUnsupportedSetting; 918 } 919 memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE)); 920 m_sIntraperiod.nPFrames = m_sParamH263.nPFrames; 921 m_sIntraperiod.nBFrames = m_sParamH263.nBFrames; 922 break; 923 } 924 case OMX_IndexParamVideoAvc: 925 { 926 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_AVCTYPE); 927 OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData; 928 OMX_VIDEO_PARAM_AVCTYPE avc_param; 929 memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE)); 930 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc"); 931 932 avc_param.nBFrames = 0; 933 if ((pParam->eProfile == OMX_VIDEO_AVCProfileHigh)|| 934 (pParam->eProfile == OMX_VIDEO_AVCProfileMain)) { 935 936 if (pParam->nBFrames) { 937 avc_param.nBFrames = pParam->nBFrames; 938 DEBUG_PRINT_LOW("B frames set using Client setparam to %d", 939 avc_param.nBFrames); 940 } 941 942 if (bframes ) { 943 avc_param.nBFrames = bframes; 944 DEBUG_PRINT_LOW("B frames set using setprop to %d", 945 avc_param.nBFrames); 946 } 947 948 DEBUG_PRINT_HIGH("AVC: BFrames: %u", (unsigned int)avc_param.nBFrames); 949 avc_param.bEntropyCodingCABAC = (OMX_BOOL)(avc_param.bEntropyCodingCABAC && entropy); 950 avc_param.nCabacInitIdc = entropy ? avc_param.nCabacInitIdc : 0; 951 } else { 952 if (pParam->nBFrames) { 953 DEBUG_PRINT_ERROR("Warning: B frames not supported"); 954 } 955 } 956 957 if (handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true) { 958 return OMX_ErrorUnsupportedSetting; 959 } 960 memcpy(&m_sParamAVC,pParam, sizeof(struct OMX_VIDEO_PARAM_AVCTYPE)); 961 m_sIntraperiod.nPFrames = m_sParamAVC.nPFrames; 962 if (pParam->nBFrames || bframes) 963 m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames = avc_param.nBFrames; 964 else 965 m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames; 966 break; 967 } 968 case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8: 969 { 970 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_VP8TYPE); 971 OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData; 972 OMX_VIDEO_PARAM_VP8TYPE vp8_param; 973 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoVp8"); 974 if (pParam->nDCTPartitions != m_sParamVP8.nDCTPartitions || 975 pParam->bErrorResilientMode != m_sParamVP8.bErrorResilientMode) { 976 DEBUG_PRINT_ERROR("VP8 doesn't support nDCTPartitions or bErrorResilientMode"); 977 } 978 memcpy(&vp8_param, pParam, sizeof( struct OMX_VIDEO_PARAM_VP8TYPE)); 979 if (handle->venc_set_param(&vp8_param, (OMX_INDEXTYPE)OMX_IndexParamVideoVp8) != true) { 980 return OMX_ErrorUnsupportedSetting; 981 } 982 memcpy(&m_sParamVP8,pParam, sizeof(struct OMX_VIDEO_PARAM_VP8TYPE)); 983 break; 984 } 985 case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc: 986 { 987 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_HEVCTYPE); 988 OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData; 989 OMX_VIDEO_PARAM_HEVCTYPE hevc_param; 990 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoHevc"); 991 memcpy(&hevc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_HEVCTYPE)); 992 if (handle->venc_set_param(&hevc_param, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc) != true) { 993 DEBUG_PRINT_ERROR("Failed : set_parameter: OMX_IndexParamVideoHevc"); 994 return OMX_ErrorUnsupportedSetting; 995 } 996 memcpy(&m_sParamHEVC, pParam, sizeof(struct OMX_VIDEO_PARAM_HEVCTYPE)); 997 break; 998 } 999 case OMX_IndexParamVideoProfileLevelCurrent: 1000 { 1001 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 1002 OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 1003 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent"); 1004 if (handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true) { 1005 DEBUG_PRINT_ERROR("set_parameter: OMX_IndexParamVideoProfileLevelCurrent failed for Profile: %u " 1006 "Level :%u", (unsigned int)pParam->eProfile, (unsigned int)pParam->eLevel); 1007 return OMX_ErrorUnsupportedSetting; 1008 } 1009 m_sParamProfileLevel.eProfile = pParam->eProfile; 1010 m_sParamProfileLevel.eLevel = pParam->eLevel; 1011 1012 if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\ 1013 OMX_MAX_STRINGNAME_SIZE)) { 1014 m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)m_sParamProfileLevel.eProfile; 1015 m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)m_sParamProfileLevel.eLevel; 1016 DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile, 1017 m_sParamMPEG4.eLevel); 1018 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\ 1019 OMX_MAX_STRINGNAME_SIZE)) { 1020 m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)m_sParamProfileLevel.eProfile; 1021 m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)m_sParamProfileLevel.eLevel; 1022 DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile, 1023 m_sParamH263.eLevel); 1024 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\ 1025 OMX_MAX_STRINGNAME_SIZE)) { 1026 m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile; 1027 m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel; 1028 DEBUG_PRINT_LOW("AVC profile = %d, level = %d", m_sParamAVC.eProfile, 1029 m_sParamAVC.eLevel); 1030 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\ 1031 OMX_MAX_STRINGNAME_SIZE)) { 1032 m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile; 1033 m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel; 1034 DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile, 1035 m_sParamAVC.eLevel); 1036 } 1037 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",\ 1038 OMX_MAX_STRINGNAME_SIZE)) { 1039 m_sParamVP8.eProfile = (OMX_VIDEO_VP8PROFILETYPE)m_sParamProfileLevel.eProfile; 1040 m_sParamVP8.eLevel = (OMX_VIDEO_VP8LEVELTYPE)m_sParamProfileLevel.eLevel; 1041 DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile, 1042 m_sParamVP8.eLevel); 1043 } 1044 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",\ 1045 OMX_MAX_STRINGNAME_SIZE)) { 1046 m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)m_sParamProfileLevel.eProfile; 1047 m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)m_sParamProfileLevel.eLevel; 1048 DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile, 1049 m_sParamHEVC.eLevel); 1050 } 1051 1052 break; 1053 } 1054 case OMX_IndexParamStandardComponentRole: 1055 { 1056 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 1057 OMX_PARAM_COMPONENTROLETYPE *comp_role; 1058 comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 1059 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 1060 comp_role->cRole); 1061 1062 if ((m_state == OMX_StateLoaded)&& 1063 !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 1064 DEBUG_PRINT_LOW("Set Parameter called in valid state"); 1065 } else { 1066 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 1067 return OMX_ErrorIncorrectStateOperation; 1068 } 1069 1070 if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 1071 if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 1072 strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE); 1073 } else { 1074 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole); 1075 eRet =OMX_ErrorUnsupportedSetting; 1076 } 1077 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) { 1078 if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 1079 strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE); 1080 } else { 1081 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole); 1082 eRet =OMX_ErrorUnsupportedSetting; 1083 } 1084 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 1085 if (!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 1086 strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 1087 } else { 1088 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole); 1089 eRet = OMX_ErrorUnsupportedSetting; 1090 } 1091 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 1092 if (!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 1093 strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE); 1094 } else { 1095 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole); 1096 eRet =OMX_ErrorUnsupportedSetting; 1097 } 1098 } 1099 #ifdef _MSM8974_ 1100 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 1101 if (!strncmp((const char*)comp_role->cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 1102 strlcpy((char*)m_cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE); 1103 } else { 1104 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole); 1105 eRet =OMX_ErrorUnsupportedSetting; 1106 } 1107 } 1108 #endif 1109 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 1110 if (!strncmp((const char*)comp_role->cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 1111 strlcpy((char*)m_cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE); 1112 } else { 1113 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole); 1114 eRet = OMX_ErrorUnsupportedSetting; 1115 } 1116 } 1117 1118 else { 1119 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s", m_nkind); 1120 eRet = OMX_ErrorInvalidComponentName; 1121 } 1122 break; 1123 } 1124 1125 case OMX_IndexParamPriorityMgmt: 1126 { 1127 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 1128 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt"); 1129 if (m_state != OMX_StateLoaded) { 1130 DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State"); 1131 return OMX_ErrorIncorrectStateOperation; 1132 } 1133 OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 1134 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u", 1135 (unsigned int)priorityMgmtype->nGroupID); 1136 1137 DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u", 1138 (unsigned int)priorityMgmtype->nGroupPriority); 1139 1140 m_sPriorityMgmt.nGroupID = priorityMgmtype->nGroupID; 1141 m_sPriorityMgmt.nGroupPriority = priorityMgmtype->nGroupPriority; 1142 1143 break; 1144 } 1145 1146 case OMX_IndexParamCompBufferSupplier: 1147 { 1148 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 1149 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier"); 1150 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 1151 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 1152 bufferSupplierType->eBufferSupplier); 1153 if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 1154 m_sInBufSupplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 1155 1156 else 1157 1158 eRet = OMX_ErrorBadPortIndex; 1159 1160 break; 1161 1162 } 1163 case OMX_IndexParamVideoQuantization: 1164 { 1165 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_QUANTIZATIONTYPE); 1166 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization"); 1167 OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData; 1168 if (session_qp->nPortIndex == PORT_INDEX_OUT) { 1169 if (handle->venc_set_param(paramData, OMX_IndexParamVideoQuantization) != true) { 1170 return OMX_ErrorUnsupportedSetting; 1171 } 1172 m_sSessionQuantization.nQpI = session_qp->nQpI; 1173 m_sSessionQuantization.nQpP = session_qp->nQpP; 1174 m_sSessionQuantization.nQpB = session_qp->nQpB; 1175 } else { 1176 DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for Session QP setting"); 1177 eRet = OMX_ErrorBadPortIndex; 1178 } 1179 break; 1180 } 1181 1182 case OMX_QcomIndexParamVideoQPRange: 1183 { 1184 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE); 1185 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange"); 1186 OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData; 1187 if (qp_range->nPortIndex == PORT_INDEX_OUT) { 1188 if (handle->venc_set_param(paramData, 1189 (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPRange) != true) { 1190 return OMX_ErrorUnsupportedSetting; 1191 } 1192 m_sSessionQPRange.minQP= qp_range->minQP; 1193 m_sSessionQPRange.maxQP= qp_range->maxQP; 1194 } else { 1195 DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for QP range setting"); 1196 eRet = OMX_ErrorBadPortIndex; 1197 } 1198 break; 1199 } 1200 1201 case OMX_QcomIndexParamVideoIPBQPRange: 1202 { 1203 DEBUG_PRINT_LOW("set_parameter: OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE"); 1204 OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE*) paramData; 1205 if (qp_range->nPortIndex == PORT_INDEX_OUT) { 1206 if (handle->venc_set_param(paramData, 1207 (OMX_INDEXTYPE)OMX_QcomIndexParamVideoIPBQPRange) != true) { 1208 return OMX_ErrorUnsupportedSetting; 1209 } 1210 m_sSessionIPBQPRange.minIQP = qp_range->minIQP; 1211 m_sSessionIPBQPRange.maxIQP = qp_range->maxIQP; 1212 m_sSessionIPBQPRange.minPQP = qp_range->minPQP; 1213 m_sSessionIPBQPRange.maxPQP = qp_range->maxPQP; 1214 m_sSessionIPBQPRange.minBQP = qp_range->minBQP; 1215 m_sSessionIPBQPRange.maxBQP = qp_range->maxBQP; 1216 } else { 1217 DEBUG_PRINT_ERROR("Unsupported port Index for IPB QP range setting"); 1218 eRet = OMX_ErrorBadPortIndex; 1219 } 1220 break; 1221 } 1222 1223 case OMX_QcomIndexPortDefn: 1224 { 1225 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE); 1226 OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam = 1227 (OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData; 1228 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn"); 1229 if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) { 1230 if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid && 1231 pParam->nMemRegion < OMX_QCOM_MemRegionMax) { 1232 m_use_input_pmem = OMX_TRUE; 1233 } else { 1234 m_use_input_pmem = OMX_FALSE; 1235 } 1236 } else if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 1237 if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid && 1238 pParam->nMemRegion < OMX_QCOM_MemRegionMax) { 1239 m_use_output_pmem = OMX_TRUE; 1240 } else { 1241 m_use_output_pmem = OMX_FALSE; 1242 } 1243 } else { 1244 DEBUG_PRINT_ERROR("ERROR: SetParameter called on unsupported Port Index for QcomPortDefn"); 1245 return OMX_ErrorBadPortIndex; 1246 } 1247 break; 1248 } 1249 1250 case OMX_IndexParamVideoErrorCorrection: 1251 { 1252 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE); 1253 DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection"); 1254 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam = 1255 (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData; 1256 if (!handle->venc_set_param(paramData, OMX_IndexParamVideoErrorCorrection)) { 1257 DEBUG_PRINT_ERROR("ERROR: Request for setting Error Resilience failed"); 1258 return OMX_ErrorUnsupportedSetting; 1259 } 1260 memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection)); 1261 break; 1262 } 1263 case OMX_IndexParamVideoIntraRefresh: 1264 { 1265 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_INTRAREFRESHTYPE); 1266 DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh"); 1267 OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam = 1268 (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData; 1269 if (!handle->venc_set_param(paramData,OMX_IndexParamVideoIntraRefresh)) { 1270 DEBUG_PRINT_ERROR("ERROR: Request for setting intra refresh failed"); 1271 return OMX_ErrorUnsupportedSetting; 1272 } 1273 memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh)); 1274 break; 1275 } 1276 #ifdef _ANDROID_ICS_ 1277 case OMX_QcomIndexParamVideoMetaBufferMode: 1278 { 1279 VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams); 1280 StoreMetaDataInBuffersParams *pParam = 1281 (StoreMetaDataInBuffersParams*)paramData; 1282 DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoMetaBufferMode: " 1283 "port_index = %u, meta_mode = %d", (unsigned int)pParam->nPortIndex, pParam->bStoreMetaData); 1284 if (pParam->nPortIndex == PORT_INDEX_IN) { 1285 if (pParam->bStoreMetaData != meta_mode_enable) { 1286 if (!handle->venc_set_meta_mode(pParam->bStoreMetaData)) { 1287 DEBUG_PRINT_ERROR("ERROR: set Metabuffer mode %d fail", 1288 pParam->bStoreMetaData); 1289 return OMX_ErrorUnsupportedSetting; 1290 } 1291 meta_mode_enable = pParam->bStoreMetaData; 1292 if (meta_mode_enable) { 1293 m_sInPortDef.nBufferCountActual = m_sInPortDef.nBufferCountMin; 1294 if (handle->venc_set_param(&m_sInPortDef,OMX_IndexParamPortDefinition) != true) { 1295 DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed"); 1296 return OMX_ErrorUnsupportedSetting; 1297 } 1298 } else { 1299 /*TODO: reset encoder driver Meta mode*/ 1300 dev_get_buf_req (&m_sOutPortDef.nBufferCountMin, 1301 &m_sOutPortDef.nBufferCountActual, 1302 &m_sOutPortDef.nBufferSize, 1303 m_sOutPortDef.nPortIndex); 1304 } 1305 } 1306 } else if (pParam->nPortIndex == PORT_INDEX_OUT && secure_session) { 1307 if (pParam->bStoreMetaData != meta_mode_enable) { 1308 if (!handle->venc_set_meta_mode(pParam->bStoreMetaData)) { 1309 DEBUG_PRINT_ERROR("\nERROR: set Metabuffer mode %d fail", 1310 pParam->bStoreMetaData); 1311 return OMX_ErrorUnsupportedSetting; 1312 } 1313 meta_mode_enable = pParam->bStoreMetaData; 1314 } 1315 } else { 1316 DEBUG_PRINT_ERROR("set_parameter: metamode is " 1317 "valid for input port only"); 1318 eRet = OMX_ErrorUnsupportedIndex; 1319 } 1320 } 1321 break; 1322 #endif 1323 #if !defined(MAX_RES_720P) || defined(_MSM8974_) 1324 case OMX_QcomIndexParamIndexExtraDataType: 1325 { 1326 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE); 1327 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType"); 1328 QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData; 1329 bool enable = false; 1330 OMX_U32 mask = 0; 1331 1332 if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) { 1333 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1334 mask = VENC_EXTRADATA_SLICEINFO; 1335 1336 DEBUG_PRINT_HIGH("SliceInfo extradata %s", 1337 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled")); 1338 } else { 1339 DEBUG_PRINT_ERROR("set_parameter: Slice information is " 1340 "valid for output port only"); 1341 eRet = OMX_ErrorUnsupportedIndex; 1342 break; 1343 } 1344 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderMBInfo) { 1345 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1346 mask = VENC_EXTRADATA_MBINFO; 1347 1348 DEBUG_PRINT_HIGH("MBInfo extradata %s", 1349 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled")); 1350 } else { 1351 DEBUG_PRINT_ERROR("set_parameter: MB information is " 1352 "valid for output port only"); 1353 eRet = OMX_ErrorUnsupportedIndex; 1354 break; 1355 } 1356 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataFrameDimension) { 1357 if (pParam->nPortIndex == PORT_INDEX_IN) { 1358 mask = VENC_EXTRADATA_FRAMEDIMENSION; 1359 DEBUG_PRINT_HIGH("Frame dimension extradata %s", 1360 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled")); 1361 } else { 1362 DEBUG_PRINT_ERROR("set_parameter: Frame Dimension is " 1363 "valid for input port only"); 1364 eRet = OMX_ErrorUnsupportedIndex; 1365 break; 1366 } 1367 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_QTIIndexParamVQZipSEIExtraData) { 1368 if (pParam->nPortIndex == PORT_INDEX_IN) { 1369 mask = VENC_EXTRADATA_VQZIP; 1370 DEBUG_PRINT_HIGH("VQZIP extradata %s", 1371 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled")); 1372 } else { 1373 DEBUG_PRINT_ERROR("set_parameter: VQZIP is " 1374 "valid for input port only"); 1375 eRet = OMX_ErrorUnsupportedIndex; 1376 break; 1377 } 1378 } 1379 1380 #ifndef _MSM8974_ 1381 else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) { 1382 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1383 if (pParam->bEnabled == OMX_TRUE) 1384 mask = VEN_EXTRADATA_LTRINFO; 1385 1386 DEBUG_PRINT_HIGH("LTRInfo extradata %s", 1387 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled")); 1388 } else { 1389 DEBUG_PRINT_ERROR("set_parameter: LTR information is " 1390 "valid for output port only"); 1391 eRet = OMX_ErrorUnsupportedIndex; 1392 break; 1393 } 1394 } 1395 #endif 1396 else { 1397 DEBUG_PRINT_ERROR("set_parameter: unsupported extrdata index (%x)", 1398 pParam->nIndex); 1399 eRet = OMX_ErrorUnsupportedIndex; 1400 break; 1401 } 1402 1403 1404 if (pParam->bEnabled == OMX_TRUE) 1405 m_sExtraData |= mask; 1406 else 1407 m_sExtraData &= ~mask; 1408 1409 enable = !!(m_sExtraData & mask); 1410 if (handle->venc_set_param(&enable, 1411 (OMX_INDEXTYPE)pParam->nIndex) != true) { 1412 DEBUG_PRINT_ERROR("ERROR: Setting Extradata (%x) failed", pParam->nIndex); 1413 return OMX_ErrorUnsupportedSetting; 1414 } 1415 1416 if (pParam->nPortIndex == PORT_INDEX_IN) { 1417 m_sInPortDef.nPortIndex = PORT_INDEX_IN; 1418 dev_get_buf_req(&m_sInPortDef.nBufferCountMin, 1419 &m_sInPortDef.nBufferCountActual, 1420 &m_sInPortDef.nBufferSize, 1421 m_sInPortDef.nPortIndex); 1422 DEBUG_PRINT_HIGH("updated in_buf_req: buffer cnt=%u, " 1423 "count min=%u, buffer size=%u", 1424 (unsigned int)m_sOutPortDef.nBufferCountActual, 1425 (unsigned int)m_sOutPortDef.nBufferCountMin, 1426 (unsigned int)m_sOutPortDef.nBufferSize); 1427 1428 } else { 1429 m_sOutPortDef.nPortIndex = PORT_INDEX_OUT; 1430 dev_get_buf_req(&m_sOutPortDef.nBufferCountMin, 1431 &m_sOutPortDef.nBufferCountActual, 1432 &m_sOutPortDef.nBufferSize, 1433 m_sOutPortDef.nPortIndex); 1434 DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%u, " 1435 "count min=%u, buffer size=%u", 1436 (unsigned int)m_sOutPortDef.nBufferCountActual, 1437 (unsigned int)m_sOutPortDef.nBufferCountMin, 1438 (unsigned int)m_sOutPortDef.nBufferSize); 1439 } 1440 break; 1441 } 1442 case QOMX_IndexParamVideoLTRMode: 1443 { 1444 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRMODE_TYPE); 1445 QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam = 1446 (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData; 1447 if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRMode)) { 1448 DEBUG_PRINT_ERROR("ERROR: Setting LTR mode failed"); 1449 return OMX_ErrorUnsupportedSetting; 1450 } 1451 memcpy(&m_sParamLTRMode, pParam, sizeof(m_sParamLTRMode)); 1452 break; 1453 } 1454 case QOMX_IndexParamVideoLTRCount: 1455 { 1456 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE); 1457 QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam = 1458 (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData; 1459 if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRCount)) { 1460 DEBUG_PRINT_ERROR("ERROR: Setting LTR count failed"); 1461 return OMX_ErrorUnsupportedSetting; 1462 } 1463 memcpy(&m_sParamLTRCount, pParam, sizeof(m_sParamLTRCount)); 1464 break; 1465 } 1466 #endif 1467 case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck: 1468 { 1469 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE); 1470 QOMX_EXTNINDEX_PARAMTYPE* pParam = 1471 (QOMX_EXTNINDEX_PARAMTYPE*)paramData; 1472 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1473 handle->m_max_allowed_bitrate_check = 1474 ((pParam->bEnable == OMX_TRUE) ? true : false); 1475 DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s", 1476 ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled")); 1477 } else { 1478 DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck " 1479 " called on wrong port(%u)", (unsigned int)pParam->nPortIndex); 1480 return OMX_ErrorBadPortIndex; 1481 } 1482 break; 1483 } 1484 #ifdef MAX_RES_1080P 1485 case OMX_QcomIndexEnableSliceDeliveryMode: 1486 { 1487 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE); 1488 QOMX_EXTNINDEX_PARAMTYPE* pParam = 1489 (QOMX_EXTNINDEX_PARAMTYPE*)paramData; 1490 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1491 if (!handle->venc_set_param(paramData, 1492 (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode)) { 1493 DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed"); 1494 return OMX_ErrorUnsupportedSetting; 1495 } 1496 } else { 1497 DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode " 1498 "called on wrong port(%u)", (unsigned int)pParam->nPortIndex); 1499 return OMX_ErrorBadPortIndex; 1500 } 1501 break; 1502 } 1503 #endif 1504 case OMX_QcomIndexEnableH263PlusPType: 1505 { 1506 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE); 1507 QOMX_EXTNINDEX_PARAMTYPE* pParam = 1508 (QOMX_EXTNINDEX_PARAMTYPE*)paramData; 1509 DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType"); 1510 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1511 if (!handle->venc_set_param(paramData, 1512 (OMX_INDEXTYPE)OMX_QcomIndexEnableH263PlusPType)) { 1513 DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed"); 1514 return OMX_ErrorUnsupportedSetting; 1515 } 1516 } else { 1517 DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType " 1518 "called on wrong port(%u)", (unsigned int)pParam->nPortIndex); 1519 return OMX_ErrorBadPortIndex; 1520 } 1521 break; 1522 } 1523 case OMX_QcomIndexParamSequenceHeaderWithIDR: 1524 { 1525 VALIDATE_OMX_PARAM_DATA(paramData, PrependSPSPPSToIDRFramesParams); 1526 if(!handle->venc_set_param(paramData, 1527 (OMX_INDEXTYPE)OMX_QcomIndexParamSequenceHeaderWithIDR)) { 1528 DEBUG_PRINT_ERROR("%s: %s", 1529 "OMX_QComIndexParamSequenceHeaderWithIDR:", 1530 "request for inband sps/pps failed."); 1531 return OMX_ErrorUnsupportedSetting; 1532 } 1533 memcpy(&m_sPrependSPSPPS, paramData, sizeof(m_sPrependSPSPPS)); 1534 break; 1535 } 1536 case OMX_QcomIndexParamH264AUDelimiter: 1537 { 1538 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_CONFIG_H264_AUD); 1539 if(!handle->venc_set_param(paramData, 1540 (OMX_INDEXTYPE)OMX_QcomIndexParamH264AUDelimiter)) { 1541 DEBUG_PRINT_ERROR("%s: %s", 1542 "OMX_QComIndexParamh264AUDelimiter:", 1543 "request for AU Delimiters failed."); 1544 return OMX_ErrorUnsupportedSetting; 1545 } 1546 break; 1547 } 1548 case OMX_QcomIndexParamMBIStatisticsMode: 1549 { 1550 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QOMX_VIDEO_MBI_STATISTICS); 1551 if(!handle->venc_set_param(paramData, 1552 (OMX_INDEXTYPE)OMX_QcomIndexParamMBIStatisticsMode)) { 1553 DEBUG_PRINT_ERROR("%s: %s", 1554 "OMX_QcomIndexParamMBIStatisticsMode:", 1555 "MBI Statistics mode setting failed."); 1556 return OMX_ErrorUnsupportedSetting; 1557 } 1558 break; 1559 } 1560 case OMX_QcomIndexHierarchicalStructure: 1561 { 1562 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_HIERARCHICALLAYERS); 1563 QOMX_VIDEO_HIERARCHICALLAYERS* pParam = 1564 (QOMX_VIDEO_HIERARCHICALLAYERS*)paramData; 1565 DEBUG_PRINT_LOW("OMX_QcomIndexHierarchicalStructure"); 1566 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1567 if (!handle->venc_set_param(paramData, 1568 (OMX_INDEXTYPE)OMX_QcomIndexHierarchicalStructure)) { 1569 DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed"); 1570 return OMX_ErrorUnsupportedSetting; 1571 } 1572 if((pParam->eHierarchicalCodingType == QOMX_HIERARCHICALCODING_B) && pParam->nNumLayers) 1573 hier_b_enabled = true; 1574 m_sHierLayers.nNumLayers = pParam->nNumLayers; 1575 m_sHierLayers.eHierarchicalCodingType = pParam->eHierarchicalCodingType; 1576 } else { 1577 DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexHierarchicalStructure called on wrong port(%u)", 1578 (unsigned int)pParam->nPortIndex); 1579 return OMX_ErrorBadPortIndex; 1580 } 1581 break; 1582 1583 } 1584 case OMX_QcomIndexParamPerfLevel: 1585 { 1586 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PERF_LEVEL); 1587 if (!handle->venc_set_param(paramData, 1588 (OMX_INDEXTYPE) OMX_QcomIndexParamPerfLevel)) { 1589 DEBUG_PRINT_ERROR("ERROR: Setting performance level"); 1590 return OMX_ErrorUnsupportedSetting; 1591 } 1592 break; 1593 } 1594 case OMX_QcomIndexParamH264VUITimingInfo: 1595 { 1596 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO); 1597 if (!handle->venc_set_param(paramData, 1598 (OMX_INDEXTYPE) OMX_QcomIndexParamH264VUITimingInfo)) { 1599 DEBUG_PRINT_ERROR("ERROR: Setting VUI timing info"); 1600 return OMX_ErrorUnsupportedSetting; 1601 } 1602 break; 1603 } 1604 case OMX_QcomIndexParamPeakBitrate: 1605 { 1606 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE); 1607 if (!handle->venc_set_param(paramData, 1608 (OMX_INDEXTYPE) OMX_QcomIndexParamPeakBitrate)) { 1609 DEBUG_PRINT_ERROR("ERROR: Setting peak bitrate"); 1610 return OMX_ErrorUnsupportedSetting; 1611 } 1612 break; 1613 } 1614 case QOMX_IndexParamVideoInitialQp: 1615 { 1616 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_INITIALQP); 1617 if(!handle->venc_set_param(paramData, 1618 (OMX_INDEXTYPE)QOMX_IndexParamVideoInitialQp)) { 1619 DEBUG_PRINT_ERROR("Request to Enable initial QP failed"); 1620 return OMX_ErrorUnsupportedSetting; 1621 } 1622 memcpy(&m_sParamInitqp, paramData, sizeof(m_sParamInitqp)); 1623 break; 1624 } 1625 case OMX_QcomIndexParamSetMVSearchrange: 1626 { 1627 if (!handle->venc_set_param(paramData, 1628 (OMX_INDEXTYPE) OMX_QcomIndexParamSetMVSearchrange)) { 1629 DEBUG_PRINT_ERROR("ERROR: Setting Searchrange"); 1630 return OMX_ErrorUnsupportedSetting; 1631 } 1632 break; 1633 } 1634 case OMX_QcomIndexParamVideoHybridHierpMode: 1635 { 1636 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE); 1637 if(!handle->venc_set_param(paramData, 1638 (OMX_INDEXTYPE)OMX_QcomIndexParamVideoHybridHierpMode)) { 1639 DEBUG_PRINT_ERROR("Request to Enable Hybrid Hier-P failed"); 1640 return OMX_ErrorUnsupportedSetting; 1641 } 1642 break; 1643 } 1644 case OMX_QcomIndexParamBatchSize: 1645 { 1646 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_U32TYPE); 1647 if(!handle->venc_set_param(paramData, 1648 (OMX_INDEXTYPE)OMX_QcomIndexParamBatchSize)) { 1649 DEBUG_PRINT_ERROR("Attempting to set batch size failed"); 1650 return OMX_ErrorUnsupportedSetting; 1651 } 1652 break; 1653 } 1654 case OMX_QcomIndexConfigH264EntropyCodingCabac: 1655 { 1656 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_H264ENTROPYCODINGTYPE); 1657 if(!handle->venc_set_param(paramData, 1658 (OMX_INDEXTYPE)OMX_QcomIndexConfigH264EntropyCodingCabac)) { 1659 DEBUG_PRINT_ERROR("Attempting to set Entropy failed"); 1660 return OMX_ErrorUnsupportedSetting; 1661 } 1662 break; 1663 } 1664 case OMX_QTIIndexParamVQZIPSEIType: 1665 { 1666 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE); 1667 if (!handle->venc_set_param(paramData, 1668 (OMX_INDEXTYPE) OMX_QTIIndexParamVQZIPSEIType)) { 1669 DEBUG_PRINT_ERROR("ERROR: Setting VQZIP SEI type"); 1670 return OMX_ErrorUnsupportedSetting; 1671 } 1672 m_sExtraData |= VENC_EXTRADATA_VQZIP; 1673 break; 1674 } 1675 case OMX_QcomIndexParamVencAspectRatio: 1676 { 1677 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_VENC_SAR); 1678 if (!handle->venc_set_param(paramData, 1679 (OMX_INDEXTYPE)OMX_QcomIndexParamVencAspectRatio)) { 1680 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexParamVencAspectRatio failed"); 1681 return OMX_ErrorUnsupportedSetting; 1682 } 1683 memcpy(&m_sSar, paramData, sizeof(m_sSar)); 1684 break; 1685 } 1686 case OMX_QTIIndexParamLowLatencyMode: 1687 { 1688 if (!handle->venc_set_param(paramData, 1689 (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode)) { 1690 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamLowLatencyMode failed"); 1691 return OMX_ErrorUnsupportedSetting; 1692 } 1693 memcpy(&m_slowLatencyMode, paramData, sizeof(m_slowLatencyMode)); 1694 break; 1695 } 1696 case OMX_QcomIndexConfigVideoVencLowLatencyMode: 1697 { 1698 if(!handle->venc_set_param(paramData, 1699 (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencLowLatencyMode)) { 1700 DEBUG_PRINT_ERROR("Request to Enable Low latency mode failed"); 1701 return OMX_ErrorUnsupportedSetting; 1702 } 1703 break; 1704 } 1705 case OMX_QTIIndexParamVideoEnableRoiInfo: 1706 { 1707 if (!handle->venc_set_param(paramData, 1708 (OMX_INDEXTYPE)OMX_QTIIndexParamVideoEnableRoiInfo)) { 1709 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamVideoEnableRoiInfo failed"); 1710 return OMX_ErrorUnsupportedSetting; 1711 } 1712 m_sExtraData |= VENC_EXTRADATA_ROI; 1713 break; 1714 } 1715 case OMX_IndexParamAndroidVideoTemporalLayering: 1716 { 1717 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE); 1718 if (!handle->venc_set_param(paramData, 1719 (OMX_INDEXTYPE)OMX_IndexParamAndroidVideoTemporalLayering)) { 1720 DEBUG_PRINT_ERROR("Failed to configure temporal layers"); 1721 return OMX_ErrorUnsupportedSetting; 1722 } 1723 // save the actual configuration applied 1724 memcpy(&m_sParamTemporalLayers, paramData, sizeof(m_sParamTemporalLayers)); 1725 // keep the config data in sync 1726 m_sConfigTemporalLayers.ePattern = m_sParamTemporalLayers.ePattern; 1727 m_sConfigTemporalLayers.nBLayerCountActual = m_sParamTemporalLayers.nBLayerCountActual; 1728 m_sConfigTemporalLayers.nPLayerCountActual = m_sParamTemporalLayers.nPLayerCountActual; 1729 m_sConfigTemporalLayers.bBitrateRatiosSpecified = m_sParamTemporalLayers.bBitrateRatiosSpecified; 1730 memcpy(&m_sConfigTemporalLayers.nBitrateRatios[0], 1731 &m_sParamTemporalLayers.nBitrateRatios[0], 1732 OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS * sizeof(OMX_U32)); 1733 break; 1734 } 1735 case OMX_IndexParamVideoSliceFMO: 1736 default: 1737 { 1738 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d", paramIndex); 1739 eRet = OMX_ErrorUnsupportedIndex; 1740 break; 1741 } 1742 } 1743 return eRet; 1744 } 1745 1746 bool omx_venc::update_profile_level() 1747 { 1748 OMX_U32 eProfile, eLevel; 1749 1750 if (!handle->venc_get_profile_level(&eProfile,&eLevel)) { 1751 DEBUG_PRINT_ERROR("Failed to update the profile_level"); 1752 return false; 1753 } 1754 1755 m_sParamProfileLevel.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile; 1756 m_sParamProfileLevel.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel; 1757 1758 if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\ 1759 OMX_MAX_STRINGNAME_SIZE)) { 1760 m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile; 1761 m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel; 1762 DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile, 1763 m_sParamMPEG4.eLevel); 1764 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\ 1765 OMX_MAX_STRINGNAME_SIZE)) { 1766 m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile; 1767 m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel; 1768 DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile, 1769 m_sParamH263.eLevel); 1770 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\ 1771 OMX_MAX_STRINGNAME_SIZE)) { 1772 m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile; 1773 m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel; 1774 DEBUG_PRINT_LOW("AVC profile = %d, level = %d", m_sParamAVC.eProfile, 1775 m_sParamAVC.eLevel); 1776 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\ 1777 OMX_MAX_STRINGNAME_SIZE)) { 1778 m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile; 1779 m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel; 1780 DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile, 1781 m_sParamAVC.eLevel); 1782 } 1783 else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",\ 1784 OMX_MAX_STRINGNAME_SIZE)) { 1785 m_sParamVP8.eProfile = (OMX_VIDEO_VP8PROFILETYPE)eProfile; 1786 m_sParamVP8.eLevel = (OMX_VIDEO_VP8LEVELTYPE)eLevel; 1787 DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile, 1788 m_sParamVP8.eLevel); 1789 } 1790 else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc",\ 1791 OMX_MAX_STRINGNAME_SIZE)) { 1792 m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)eProfile; 1793 m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)eLevel; 1794 DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile, 1795 m_sParamHEVC.eLevel); 1796 } 1797 1798 return true; 1799 } 1800 /* ====================================================================== 1801 FUNCTION 1802 omx_video::SetConfig 1803 1804 DESCRIPTION 1805 OMX Set Config method implementation 1806 1807 PARAMETERS 1808 <TBD>. 1809 1810 RETURN VALUE 1811 OMX Error None if successful. 1812 ========================================================================== */ 1813 OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp, 1814 OMX_IN OMX_INDEXTYPE configIndex, 1815 OMX_IN OMX_PTR configData) 1816 { 1817 (void)hComp; 1818 if (configData == NULL) { 1819 DEBUG_PRINT_ERROR("ERROR: param is null"); 1820 return OMX_ErrorBadParameter; 1821 } 1822 1823 if (m_state == OMX_StateInvalid) { 1824 DEBUG_PRINT_ERROR("ERROR: config called in Invalid state"); 1825 return OMX_ErrorIncorrectStateOperation; 1826 } 1827 1828 // params will be validated prior to venc_init 1829 switch ((int)configIndex) { 1830 case OMX_IndexConfigVideoBitrate: 1831 { 1832 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_BITRATETYPE); 1833 OMX_VIDEO_CONFIG_BITRATETYPE* pParam = 1834 reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData); 1835 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%u)", (unsigned int)pParam->nEncodeBitrate); 1836 1837 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1838 if (handle->venc_set_config(configData, OMX_IndexConfigVideoBitrate) != true) { 1839 DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoBitrate failed"); 1840 return OMX_ErrorUnsupportedSetting; 1841 } 1842 1843 m_sConfigBitrate.nEncodeBitrate = pParam->nEncodeBitrate; 1844 m_sParamBitrate.nTargetBitrate = pParam->nEncodeBitrate; 1845 m_sOutPortDef.format.video.nBitrate = pParam->nEncodeBitrate; 1846 } else { 1847 DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex); 1848 return OMX_ErrorBadPortIndex; 1849 } 1850 break; 1851 } 1852 case OMX_IndexConfigVideoFramerate: 1853 { 1854 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_FRAMERATETYPE); 1855 OMX_CONFIG_FRAMERATETYPE* pParam = 1856 reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData); 1857 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%x)", (unsigned int)pParam->xEncodeFramerate); 1858 1859 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1860 if (handle->venc_set_config(configData, OMX_IndexConfigVideoFramerate) != true) { 1861 DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoFramerate failed"); 1862 return OMX_ErrorUnsupportedSetting; 1863 } 1864 1865 m_sConfigFramerate.xEncodeFramerate = pParam->xEncodeFramerate; 1866 m_sOutPortDef.format.video.xFramerate = pParam->xEncodeFramerate; 1867 m_sOutPortFormat.xFramerate = pParam->xEncodeFramerate; 1868 /* 1869 * Frame rate can change buffer requirements. If query is not allowed, 1870 * failure is not FATAL here. 1871 */ 1872 dev_get_buf_req(&m_sInPortDef.nBufferCountMin, 1873 &m_sInPortDef.nBufferCountActual, 1874 &m_sInPortDef.nBufferSize, 1875 m_sInPortDef.nPortIndex); 1876 } else { 1877 DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex); 1878 return OMX_ErrorBadPortIndex; 1879 } 1880 1881 break; 1882 } 1883 case QOMX_IndexConfigVideoIntraperiod: 1884 { 1885 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_INTRAPERIODTYPE); 1886 QOMX_VIDEO_INTRAPERIODTYPE* pParam = 1887 reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData); 1888 1889 DEBUG_PRINT_HIGH("set_config(): QOMX_IndexConfigVideoIntraperiod"); 1890 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1891 #ifdef MAX_RES_720P 1892 if (pParam->nBFrames > 0) { 1893 DEBUG_PRINT_ERROR("B frames not supported"); 1894 return OMX_ErrorUnsupportedSetting; 1895 } 1896 #endif 1897 DEBUG_PRINT_HIGH("Old: P/B frames = %u/%u, New: P/B frames = %u/%u", 1898 (unsigned int)m_sIntraperiod.nPFrames, (unsigned int)m_sIntraperiod.nBFrames, 1899 (unsigned int)pParam->nPFrames, (unsigned int)pParam->nBFrames); 1900 if (m_sIntraperiod.nBFrames != pParam->nBFrames) { 1901 if(hier_b_enabled && m_state == OMX_StateLoaded) { 1902 DEBUG_PRINT_INFO("B-frames setting is supported if HierB is enabled"); 1903 } 1904 else { 1905 DEBUG_PRINT_HIGH("Dynamically changing B-frames not supported"); 1906 return OMX_ErrorUnsupportedSetting; 1907 } 1908 } 1909 if (handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true) { 1910 DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed"); 1911 return OMX_ErrorUnsupportedSetting; 1912 } 1913 m_sIntraperiod.nPFrames = pParam->nPFrames; 1914 m_sIntraperiod.nBFrames = pParam->nBFrames; 1915 m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod; 1916 1917 if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4) { 1918 m_sParamMPEG4.nPFrames = pParam->nPFrames; 1919 if (m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple) 1920 m_sParamMPEG4.nBFrames = pParam->nBFrames; 1921 else 1922 m_sParamMPEG4.nBFrames = 0; 1923 } else if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263) { 1924 m_sParamH263.nPFrames = pParam->nPFrames; 1925 } else { 1926 m_sParamAVC.nPFrames = pParam->nPFrames; 1927 if ((m_sParamAVC.eProfile != OMX_VIDEO_AVCProfileBaseline) && 1928 (m_sParamAVC.eProfile != (OMX_VIDEO_AVCPROFILETYPE) QOMX_VIDEO_AVCProfileConstrainedBaseline)) 1929 m_sParamAVC.nBFrames = pParam->nBFrames; 1930 else 1931 m_sParamAVC.nBFrames = 0; 1932 } 1933 } else { 1934 DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %u", (unsigned int)pParam->nPortIndex); 1935 return OMX_ErrorBadPortIndex; 1936 } 1937 1938 break; 1939 } 1940 1941 case OMX_IndexConfigVideoIntraVOPRefresh: 1942 { 1943 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_INTRAREFRESHVOPTYPE); 1944 OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam = 1945 reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData); 1946 1947 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoIntraVOPRefresh"); 1948 if (pParam->nPortIndex == PORT_INDEX_OUT) { 1949 if (handle->venc_set_config(configData, 1950 OMX_IndexConfigVideoIntraVOPRefresh) != true) { 1951 DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoIntraVOPRefresh failed"); 1952 return OMX_ErrorUnsupportedSetting; 1953 } 1954 1955 m_sConfigIntraRefreshVOP.IntraRefreshVOP = pParam->IntraRefreshVOP; 1956 } else { 1957 DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex); 1958 return OMX_ErrorBadPortIndex; 1959 } 1960 1961 break; 1962 } 1963 case OMX_IndexConfigCommonRotate: 1964 { 1965 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ROTATIONTYPE); 1966 OMX_CONFIG_ROTATIONTYPE *pParam = 1967 reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData); 1968 OMX_S32 nRotation; 1969 1970 if (pParam->nPortIndex != PORT_INDEX_OUT) { 1971 DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex); 1972 return OMX_ErrorBadPortIndex; 1973 } 1974 if ( pParam->nRotation == 0 || 1975 pParam->nRotation == 90 || 1976 pParam->nRotation == 180 || 1977 pParam->nRotation == 270 ) { 1978 DEBUG_PRINT_HIGH("set_config: Rotation Angle %u", (unsigned int)pParam->nRotation); 1979 } else { 1980 DEBUG_PRINT_ERROR("ERROR: un supported Rotation %u", (unsigned int)pParam->nRotation); 1981 return OMX_ErrorUnsupportedSetting; 1982 } 1983 nRotation = pParam->nRotation - m_sConfigFrameRotation.nRotation; 1984 if (nRotation < 0) 1985 nRotation = -nRotation; 1986 1987 DEBUG_PRINT_HIGH("set_config: updating device Dims"); 1988 1989 if (handle->venc_set_config(configData, 1990 OMX_IndexConfigCommonRotate) != true) { 1991 DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonRotate failed"); 1992 return OMX_ErrorUnsupportedSetting; 1993 } 1994 if (nRotation == 90 || nRotation == 270) { 1995 OMX_U32 nFrameWidth; 1996 OMX_U32 nFrameHeight; 1997 1998 DEBUG_PRINT_HIGH("set_config: updating port Dims Rotation angle = %d", 1999 pParam->nRotation); 2000 nFrameWidth = m_sOutPortDef.format.video.nFrameWidth; 2001 nFrameHeight = m_sOutPortDef.format.video.nFrameHeight; 2002 m_sOutPortDef.format.video.nFrameWidth = nFrameHeight; 2003 m_sOutPortDef.format.video.nFrameHeight = nFrameWidth; 2004 } 2005 m_sConfigFrameRotation.nRotation = pParam->nRotation; 2006 break; 2007 } 2008 case OMX_QcomIndexConfigVideoFramePackingArrangement: 2009 { 2010 DEBUG_PRINT_HIGH("set_config(): OMX_QcomIndexConfigVideoFramePackingArrangement"); 2011 if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC) { 2012 VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT); 2013 OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 2014 (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 2015 extra_data_handle.set_frame_pack_data(configFmt); 2016 } else { 2017 DEBUG_PRINT_ERROR("ERROR: FramePackingData not supported for non AVC compression"); 2018 } 2019 break; 2020 } 2021 case QOMX_IndexConfigVideoLTRPeriod: 2022 { 2023 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE); 2024 QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData; 2025 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRPeriod)) { 2026 DEBUG_PRINT_ERROR("ERROR: Setting LTR period failed"); 2027 return OMX_ErrorUnsupportedSetting; 2028 } 2029 memcpy(&m_sConfigLTRPeriod, pParam, sizeof(m_sConfigLTRPeriod)); 2030 break; 2031 } 2032 2033 case OMX_IndexConfigVideoVp8ReferenceFrame: 2034 { 2035 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_VP8REFERENCEFRAMETYPE); 2036 OMX_VIDEO_VP8REFERENCEFRAMETYPE* pParam = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) configData; 2037 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE) OMX_IndexConfigVideoVp8ReferenceFrame)) { 2038 DEBUG_PRINT_ERROR("ERROR: Setting VP8 reference frame"); 2039 return OMX_ErrorUnsupportedSetting; 2040 } 2041 memcpy(&m_sConfigVp8ReferenceFrame, pParam, sizeof(m_sConfigVp8ReferenceFrame)); 2042 break; 2043 } 2044 2045 case QOMX_IndexConfigVideoLTRUse: 2046 { 2047 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRUSE_TYPE); 2048 QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData; 2049 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse)) { 2050 DEBUG_PRINT_ERROR("ERROR: Setting LTR use failed"); 2051 return OMX_ErrorUnsupportedSetting; 2052 } 2053 memcpy(&m_sConfigLTRUse, pParam, sizeof(m_sConfigLTRUse)); 2054 break; 2055 } 2056 case QOMX_IndexConfigVideoLTRMark: 2057 { 2058 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRMARK_TYPE); 2059 QOMX_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRMARK_TYPE*)configData; 2060 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRMark)) { 2061 DEBUG_PRINT_ERROR("ERROR: Setting LTR mark failed"); 2062 return OMX_ErrorUnsupportedSetting; 2063 } 2064 break; 2065 } 2066 case OMX_IndexConfigVideoAVCIntraPeriod: 2067 { 2068 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_AVCINTRAPERIOD); 2069 OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData; 2070 DEBUG_PRINT_LOW("set_config: OMX_IndexConfigVideoAVCIntraPeriod"); 2071 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigVideoAVCIntraPeriod)) { 2072 DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoAVCIntraPeriod failed"); 2073 return OMX_ErrorUnsupportedSetting; 2074 } 2075 memcpy(&m_sConfigAVCIDRPeriod, pParam, sizeof(m_sConfigAVCIDRPeriod)); 2076 break; 2077 } 2078 case OMX_IndexConfigCommonDeinterlace: 2079 { 2080 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_DEINTERLACE); 2081 OMX_VIDEO_CONFIG_DEINTERLACE *pParam = (OMX_VIDEO_CONFIG_DEINTERLACE*) configData; 2082 DEBUG_PRINT_LOW("set_config: OMX_IndexConfigCommonDeinterlace"); 2083 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigCommonDeinterlace)) { 2084 DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigCommonDeinterlace failed"); 2085 return OMX_ErrorUnsupportedSetting; 2086 } 2087 memcpy(&m_sConfigDeinterlace, pParam, sizeof(m_sConfigDeinterlace)); 2088 break; 2089 } 2090 case OMX_QcomIndexConfigVideoVencPerfMode: 2091 { 2092 VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_PERFMODE); 2093 QOMX_EXTNINDEX_VIDEO_PERFMODE* pParam = (QOMX_EXTNINDEX_VIDEO_PERFMODE*)configData; 2094 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode)) { 2095 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigVideoVencPerfMode failed"); 2096 return OMX_ErrorUnsupportedSetting; 2097 } 2098 break; 2099 } 2100 case OMX_QcomIndexConfigNumHierPLayers: 2101 { 2102 VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS); 2103 QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS* pParam = 2104 (QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS*)configData; 2105 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigNumHierPLayers)) { 2106 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigNumHierPLayers failed"); 2107 return OMX_ErrorUnsupportedSetting; 2108 } 2109 memcpy(&m_sHPlayers, pParam, sizeof(m_sHPlayers)); 2110 break; 2111 } 2112 case OMX_QcomIndexConfigBaseLayerId: 2113 { 2114 VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID); 2115 OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID* pParam = 2116 (OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID*) configData; 2117 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigBaseLayerId)) { 2118 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigBaseLayerId failed"); 2119 return OMX_ErrorUnsupportedSetting; 2120 } 2121 memcpy(&m_sBaseLayerID, pParam, sizeof(m_sBaseLayerID)); 2122 break; 2123 } 2124 case OMX_QcomIndexConfigQp: 2125 { 2126 VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_QP); 2127 OMX_SKYPE_VIDEO_CONFIG_QP* pParam = 2128 (OMX_SKYPE_VIDEO_CONFIG_QP*) configData; 2129 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigQp)) { 2130 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigQp failed"); 2131 return OMX_ErrorUnsupportedSetting; 2132 } 2133 memcpy(&m_sConfigQP, pParam, sizeof(m_sConfigQP)); 2134 break; 2135 } 2136 case OMX_IndexConfigPriority: 2137 { 2138 VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE); 2139 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigPriority)) { 2140 DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigPriority"); 2141 return OMX_ErrorUnsupportedSetting; 2142 } 2143 break; 2144 } 2145 case OMX_IndexConfigOperatingRate: 2146 { 2147 VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE); 2148 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate)) { 2149 DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigOperatingRate"); 2150 return handle->hw_overload ? OMX_ErrorInsufficientResources : 2151 OMX_ErrorUnsupportedSetting; 2152 } 2153 break; 2154 } 2155 case OMX_QTIIndexConfigVideoRoiInfo: 2156 { 2157 VALIDATE_OMX_PARAM_DATA(configData, OMX_QTI_VIDEO_CONFIG_ROIINFO); 2158 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoRoiInfo)) { 2159 DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigVideoRoiInfo"); 2160 return OMX_ErrorUnsupportedSetting; 2161 } 2162 break; 2163 } 2164 case OMX_IndexConfigTimePosition: 2165 { 2166 OMX_TIME_CONFIG_TIMESTAMPTYPE* pParam = 2167 (OMX_TIME_CONFIG_TIMESTAMPTYPE*) configData; 2168 pthread_mutex_lock(×tamp.m_lock); 2169 timestamp.m_TimeStamp = (OMX_U64)pParam->nTimestamp; 2170 DEBUG_PRINT_LOW("Buffer = %p, Timestamp = %llu", timestamp.pending_buffer, (OMX_U64)pParam->nTimestamp); 2171 if (timestamp.is_buffer_pending && (OMX_U64)timestamp.pending_buffer->nTimeStamp == timestamp.m_TimeStamp) { 2172 DEBUG_PRINT_INFO("Queueing back pending buffer %p", timestamp.pending_buffer); 2173 this->post_event((unsigned long)hComp,(unsigned long)timestamp.pending_buffer,m_input_msg_id); 2174 timestamp.pending_buffer = NULL; 2175 timestamp.is_buffer_pending = false; 2176 } 2177 pthread_mutex_unlock(×tamp.m_lock); 2178 break; 2179 } 2180 #ifdef SUPPORT_CONFIG_INTRA_REFRESH 2181 case OMX_IndexConfigAndroidIntraRefresh: 2182 { 2183 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE); 2184 OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE* pParam = 2185 (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE*) configData; 2186 if (m_state == OMX_StateLoaded 2187 || m_sInPortDef.bEnabled == OMX_FALSE 2188 || m_sOutPortDef.bEnabled == OMX_FALSE) { 2189 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh)) { 2190 DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigVideoIntraRefreshType"); 2191 return OMX_ErrorUnsupportedSetting; 2192 } 2193 m_sConfigIntraRefresh.nRefreshPeriod = pParam->nRefreshPeriod; 2194 } else { 2195 DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigAndroidIntraRefresh supported only at start of session"); 2196 return OMX_ErrorUnsupportedSetting; 2197 } 2198 break; 2199 } 2200 #endif 2201 case OMX_QTIIndexConfigVideoBlurResolution: 2202 { 2203 VALIDATE_OMX_PARAM_DATA(configData, OMX_QTI_VIDEO_CONFIG_BLURINFO); 2204 OMX_QTI_VIDEO_CONFIG_BLURINFO* pParam = 2205 (OMX_QTI_VIDEO_CONFIG_BLURINFO*) configData; 2206 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoBlurResolution)) { 2207 DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigVideoBlurResolution"); 2208 return OMX_ErrorUnsupportedSetting; 2209 } 2210 memcpy(&m_blurInfo, pParam, sizeof(m_blurInfo)); 2211 break; 2212 } 2213 case OMX_QcomIndexConfigH264Transform8x8: 2214 { 2215 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QcomIndexConfigH264Transform8x8)) { 2216 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigH264Transform8x8 failed"); 2217 return OMX_ErrorUnsupportedSetting; 2218 } 2219 break; 2220 } 2221 case OMX_QTIIndexConfigDescribeColorAspects: 2222 { 2223 VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 2224 DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 2225 print_debug_color_aspects(&(params->sAspects), "set_config"); 2226 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects)) { 2227 DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigDescribeColorAspects"); 2228 return OMX_ErrorUnsupportedSetting; 2229 } 2230 memcpy(&m_sConfigColorAspects, configData, sizeof(m_sConfigColorAspects)); 2231 break; 2232 } 2233 case OMX_IndexConfigAndroidVideoTemporalLayering: 2234 { 2235 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE); 2236 DEBUG_PRINT_ERROR("Setting/modifying Temporal layers at run-time is not supported !"); 2237 return OMX_ErrorUnsupportedSetting; 2238 } 2239 default: 2240 DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex); 2241 break; 2242 } 2243 2244 return OMX_ErrorNone; 2245 } 2246 2247 /* ====================================================================== 2248 FUNCTION 2249 omx_venc::ComponentDeInit 2250 2251 DESCRIPTION 2252 Destroys the component and release memory allocated to the heap. 2253 2254 PARAMETERS 2255 <TBD>. 2256 2257 RETURN VALUE 2258 OMX Error None if everything successful. 2259 2260 ========================================================================== */ 2261 OMX_ERRORTYPE omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 2262 { 2263 (void) hComp; 2264 OMX_U32 i = 0; 2265 DEBUG_PRINT_HIGH("omx_venc(): Inside component_deinit()"); 2266 if (OMX_StateLoaded != m_state) { 2267 DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 2268 m_state); 2269 } 2270 if (m_out_mem_ptr) { 2271 DEBUG_PRINT_LOW("Freeing the Output Memory"); 2272 for (i=0; i< m_sOutPortDef.nBufferCountActual; i++ ) { 2273 if (BITMASK_PRESENT(&m_out_bm_count, i)) { 2274 BITMASK_CLEAR(&m_out_bm_count, i); 2275 free_output_buffer (&m_out_mem_ptr[i]); 2276 } 2277 2278 if (release_output_done()) { 2279 break; 2280 } 2281 } 2282 free(m_out_mem_ptr); 2283 m_out_mem_ptr = NULL; 2284 } 2285 2286 /*Check if the input buffers have to be cleaned up*/ 2287 if (m_inp_mem_ptr 2288 #ifdef _ANDROID_ICS_ 2289 && !meta_mode_enable 2290 #endif 2291 ) { 2292 DEBUG_PRINT_LOW("Freeing the Input Memory"); 2293 for (i=0; i<m_sInPortDef.nBufferCountActual; i++ ) { 2294 if (BITMASK_PRESENT(&m_inp_bm_count, i)) { 2295 BITMASK_CLEAR(&m_inp_bm_count, i); 2296 free_input_buffer (&m_inp_mem_ptr[i]); 2297 } 2298 2299 if (release_input_done()) { 2300 break; 2301 } 2302 } 2303 2304 2305 free(m_inp_mem_ptr); 2306 m_inp_mem_ptr = NULL; 2307 } 2308 2309 // Reset counters in mesg queues 2310 m_ftb_q.m_size=0; 2311 m_cmd_q.m_size=0; 2312 m_etb_q.m_size=0; 2313 m_ftb_q.m_read = m_ftb_q.m_write =0; 2314 m_cmd_q.m_read = m_cmd_q.m_write =0; 2315 m_etb_q.m_read = m_etb_q.m_write =0; 2316 2317 #ifdef _ANDROID_ 2318 // Clear the strong reference 2319 DEBUG_PRINT_HIGH("Calling m_heap_ptr.clear()"); 2320 m_heap_ptr.clear(); 2321 #endif // _ANDROID_ 2322 DEBUG_PRINT_HIGH("Calling venc_close()"); 2323 if (handle) { 2324 handle->venc_close(); 2325 DEBUG_PRINT_HIGH("Deleting HANDLE[%p]", handle); 2326 delete (handle); 2327 handle = NULL; 2328 } 2329 DEBUG_PRINT_INFO("Component Deinit"); 2330 return OMX_ErrorNone; 2331 } 2332 2333 2334 OMX_U32 omx_venc::dev_stop( void) 2335 { 2336 return handle->venc_stop(); 2337 } 2338 2339 2340 OMX_U32 omx_venc::dev_pause(void) 2341 { 2342 return handle->venc_pause(); 2343 } 2344 2345 OMX_U32 omx_venc::dev_start(void) 2346 { 2347 return handle->venc_start(); 2348 } 2349 2350 OMX_U32 omx_venc::dev_flush(unsigned port) 2351 { 2352 return handle->venc_flush(port); 2353 } 2354 OMX_U32 omx_venc::dev_resume(void) 2355 { 2356 return handle->venc_resume(); 2357 } 2358 2359 OMX_U32 omx_venc::dev_start_done(void) 2360 { 2361 return handle->venc_start_done(); 2362 } 2363 2364 OMX_U32 omx_venc::dev_set_message_thread_id(pthread_t tid) 2365 { 2366 return handle->venc_set_message_thread_id(tid); 2367 } 2368 2369 bool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned index) 2370 { 2371 return handle->venc_use_buf(buf_addr,port,index); 2372 } 2373 2374 bool omx_venc::dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer) 2375 { 2376 bool bRet = true; 2377 2378 pthread_mutex_lock(×tamp.m_lock); 2379 2380 if ((!m_slowLatencyMode.bLowLatencyMode) || ((OMX_U64)buffer->nTimeStamp == (OMX_U64)timestamp.m_TimeStamp)) { 2381 DEBUG_PRINT_LOW("ETB is ready to be queued"); 2382 } else { 2383 DEBUG_PRINT_INFO("ETB is defeffed due to timeStamp mismatch"); 2384 timestamp.is_buffer_pending = true; 2385 timestamp.pending_buffer = buffer; 2386 bRet = false; 2387 } 2388 pthread_mutex_unlock(×tamp.m_lock); 2389 return bRet; 2390 } 2391 2392 bool omx_venc::dev_free_buf(void *buf_addr,unsigned port) 2393 { 2394 return handle->venc_free_buf(buf_addr,port); 2395 } 2396 2397 bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd) 2398 { 2399 bool bret = false; 2400 bret = handle->venc_empty_buf(buffer, pmem_data_buf,index,fd); 2401 hw_overload = handle->hw_overload; 2402 return bret; 2403 } 2404 2405 bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd) 2406 { 2407 return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd); 2408 } 2409 2410 bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen) 2411 { 2412 return handle->venc_get_seq_hdr(buffer, size, hdrlen); 2413 } 2414 2415 bool omx_venc::dev_get_capability_ltrcount(OMX_U32 *min, OMX_U32 *max, OMX_U32 *step_size) 2416 { 2417 #ifdef _MSM8974_ 2418 (void) min; 2419 (void) max; 2420 (void) step_size; 2421 DEBUG_PRINT_ERROR("Get Capability LTR Count is not supported"); 2422 return false; 2423 #else 2424 return handle->venc_get_capability_ltrcount(min, max, step_size); 2425 #endif 2426 } 2427 2428 bool omx_venc::dev_get_performance_level(OMX_U32 *perflevel) 2429 { 2430 #ifdef _MSM8974_ 2431 return handle->venc_get_performance_level(perflevel); 2432 #else 2433 DEBUG_PRINT_ERROR("Get performance level is not supported"); 2434 return false; 2435 #endif 2436 } 2437 2438 bool omx_venc::dev_get_vui_timing_info(OMX_U32 *enabled) 2439 { 2440 #ifdef _MSM8974_ 2441 return handle->venc_get_vui_timing_info(enabled); 2442 #else 2443 DEBUG_PRINT_ERROR("Get vui timing information is not supported"); 2444 return false; 2445 #endif 2446 } 2447 2448 bool omx_venc::dev_get_vqzip_sei_info(OMX_U32 *enabled) 2449 { 2450 return handle->venc_get_vqzip_sei_info(enabled); 2451 } 2452 2453 bool omx_venc::dev_get_peak_bitrate(OMX_U32 *peakbitrate) 2454 { 2455 #ifdef _MSM8974_ 2456 return handle->venc_get_peak_bitrate(peakbitrate); 2457 #else 2458 DEBUG_PRINT_ERROR("Get peak bitrate is not supported"); 2459 return false; 2460 #endif 2461 } 2462 2463 bool omx_venc::dev_get_batch_size(OMX_U32 *size) 2464 { 2465 #ifdef _MSM8974_ 2466 return handle->venc_get_batch_size(size); 2467 #else 2468 DEBUG_PRINT_ERROR("Get batch size is not supported"); 2469 return false; 2470 #endif 2471 } 2472 2473 bool omx_venc::dev_get_temporal_layer_caps(OMX_U32 *nMaxLayers, 2474 OMX_U32 *nMaxBLayers) { 2475 return handle->venc_get_temporal_layer_caps(nMaxLayers, nMaxBLayers); 2476 } 2477 2478 bool omx_venc::dev_loaded_start() 2479 { 2480 return handle->venc_loaded_start(); 2481 } 2482 2483 bool omx_venc::dev_loaded_stop() 2484 { 2485 return handle->venc_loaded_stop(); 2486 } 2487 2488 bool omx_venc::dev_loaded_start_done() 2489 { 2490 return handle->venc_loaded_start_done(); 2491 } 2492 2493 bool omx_venc::dev_loaded_stop_done() 2494 { 2495 return handle->venc_loaded_stop_done(); 2496 } 2497 2498 bool omx_venc::dev_get_buf_req(OMX_U32 *min_buff_count, 2499 OMX_U32 *actual_buff_count, 2500 OMX_U32 *buff_size, 2501 OMX_U32 port) 2502 { 2503 return handle->venc_get_buf_req(min_buff_count, 2504 actual_buff_count, 2505 buff_size, 2506 port); 2507 2508 } 2509 2510 bool omx_venc::dev_set_buf_req(OMX_U32 *min_buff_count, 2511 OMX_U32 *actual_buff_count, 2512 OMX_U32 *buff_size, 2513 OMX_U32 port) 2514 { 2515 return handle->venc_set_buf_req(min_buff_count, 2516 actual_buff_count, 2517 buff_size, 2518 port); 2519 2520 } 2521 2522 bool omx_venc::dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) 2523 { 2524 #ifdef _MSM8974_ 2525 return handle->venc_is_video_session_supported(width,height); 2526 #else 2527 DEBUG_PRINT_LOW("Check against video capability not supported"); 2528 return true; 2529 #endif 2530 } 2531 2532 int omx_venc::dev_handle_output_extradata(void *buffer, int index) 2533 { 2534 return handle->handle_output_extradata(buffer, index); 2535 } 2536 2537 int omx_venc::dev_set_format(int color) 2538 { 2539 return handle->venc_set_format(color); 2540 } 2541 2542 int omx_venc::async_message_process (void *context, void* message) 2543 { 2544 omx_video* omx = NULL; 2545 struct venc_msg *m_sVenc_msg = NULL; 2546 OMX_BUFFERHEADERTYPE* omxhdr = NULL; 2547 struct venc_buffer *temp_buff = NULL; 2548 native_handle_t *nh = NULL; 2549 2550 if (context == NULL || message == NULL) { 2551 DEBUG_PRINT_ERROR("ERROR: omx_venc::async_message_process invalid i/p params"); 2552 return -1; 2553 } 2554 m_sVenc_msg = (struct venc_msg *)message; 2555 2556 omx = reinterpret_cast<omx_video*>(context); 2557 2558 if (m_sVenc_msg->statuscode != VEN_S_SUCCESS) { 2559 DEBUG_PRINT_ERROR("ERROR: async_msg_process() - Error statuscode = %lu", 2560 m_sVenc_msg->statuscode); 2561 if(m_sVenc_msg->msgcode == VEN_MSG_HW_OVERLOAD) { 2562 omx->post_event (0, m_sVenc_msg->statuscode,\ 2563 OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD); 2564 } else { 2565 omx->post_event (0, m_sVenc_msg->statuscode,\ 2566 OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 2567 } 2568 } 2569 2570 DEBUG_PRINT_LOW("omx_venc::async_message_process- msgcode = %lu", 2571 m_sVenc_msg->msgcode); 2572 switch (m_sVenc_msg->msgcode) { 2573 case VEN_MSG_START: 2574 omx->post_event (0,m_sVenc_msg->statuscode,\ 2575 OMX_COMPONENT_GENERATE_START_DONE); 2576 break; 2577 case VEN_MSG_STOP: 2578 omx->post_event (0,m_sVenc_msg->statuscode,\ 2579 OMX_COMPONENT_GENERATE_STOP_DONE); 2580 break; 2581 case VEN_MSG_RESUME: 2582 omx->post_event (0,m_sVenc_msg->statuscode,\ 2583 OMX_COMPONENT_GENERATE_RESUME_DONE); 2584 break; 2585 case VEN_MSG_PAUSE: 2586 omx->post_event (0,m_sVenc_msg->statuscode,\ 2587 OMX_COMPONENT_GENERATE_PAUSE_DONE); 2588 break; 2589 case VEN_MSG_FLUSH_INPUT_DONE: 2590 2591 omx->post_event (0,m_sVenc_msg->statuscode,\ 2592 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 2593 break; 2594 case VEN_MSG_FLUSH_OUPUT_DONE: 2595 omx->post_event (0,m_sVenc_msg->statuscode,\ 2596 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 2597 break; 2598 case VEN_MSG_INPUT_BUFFER_DONE: 2599 omxhdr = (OMX_BUFFERHEADERTYPE* )\ 2600 m_sVenc_msg->buf.clientdata; 2601 2602 if (omxhdr == NULL || 2603 (((OMX_U32)(omxhdr - omx->m_inp_mem_ptr) > omx->m_sInPortDef.nBufferCountActual) && 2604 ((OMX_U32)(omxhdr - omx->meta_buffer_hdr) > omx->m_sInPortDef.nBufferCountActual))) { 2605 omxhdr = NULL; 2606 m_sVenc_msg->statuscode = VEN_S_EFAIL; 2607 } 2608 2609 #ifdef _ANDROID_ICS_ 2610 omx->omx_release_meta_buffer(omxhdr); 2611 #endif 2612 omx->post_event ((unsigned long)omxhdr,m_sVenc_msg->statuscode, 2613 OMX_COMPONENT_GENERATE_EBD); 2614 break; 2615 case VEN_MSG_OUTPUT_BUFFER_DONE: 2616 omxhdr = (OMX_BUFFERHEADERTYPE*)m_sVenc_msg->buf.clientdata; 2617 2618 if ( (omxhdr != NULL) && 2619 ((OMX_U32)(omxhdr - omx->m_out_mem_ptr) < omx->m_sOutPortDef.nBufferCountActual)) { 2620 if (!omx->is_secure_session() && (m_sVenc_msg->buf.len <= omxhdr->nAllocLen)) { 2621 omxhdr->nFilledLen = m_sVenc_msg->buf.len; 2622 omxhdr->nOffset = m_sVenc_msg->buf.offset; 2623 omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp; 2624 DEBUG_PRINT_LOW("o/p TS = %u", (unsigned int)m_sVenc_msg->buf.timestamp); 2625 omxhdr->nFlags = m_sVenc_msg->buf.flags; 2626 2627 /*Use buffer case*/ 2628 if (omx->output_use_buffer && !omx->m_use_output_pmem && !omx->is_secure_session()) { 2629 DEBUG_PRINT_LOW("memcpy() for o/p Heap UseBuffer"); 2630 memcpy(omxhdr->pBuffer, 2631 (m_sVenc_msg->buf.ptrbuffer), 2632 m_sVenc_msg->buf.len); 2633 } 2634 } else if (omx->is_secure_session()) { 2635 output_metabuffer *meta_buf = (output_metabuffer *)(omxhdr->pBuffer); 2636 native_handle_t *nh = meta_buf->nh; 2637 nh->data[1] = m_sVenc_msg->buf.offset; 2638 nh->data[2] = m_sVenc_msg->buf.len; 2639 omxhdr->nFilledLen = sizeof(output_metabuffer); 2640 omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp; 2641 omxhdr->nFlags = m_sVenc_msg->buf.flags; 2642 } else { 2643 omxhdr->nFilledLen = 0; 2644 } 2645 2646 } else { 2647 omxhdr = NULL; 2648 m_sVenc_msg->statuscode = VEN_S_EFAIL; 2649 } 2650 omx->post_event ((unsigned long)omxhdr,m_sVenc_msg->statuscode, 2651 OMX_COMPONENT_GENERATE_FBD); 2652 break; 2653 case VEN_MSG_NEED_OUTPUT_BUFFER: 2654 //TBD what action needs to be done here?? 2655 break; 2656 #ifndef _MSM8974_ 2657 case VEN_MSG_LTRUSE_FAILED: 2658 DEBUG_PRINT_ERROR("LTRUSE Failed!"); 2659 omx->post_event (NULL,m_sVenc_msg->statuscode, 2660 OMX_COMPONENT_GENERATE_LTRUSE_FAILED); 2661 break; 2662 #endif 2663 default: 2664 DEBUG_PRINT_HIGH("Unknown msg received : %lu", m_sVenc_msg->msgcode); 2665 break; 2666 } 2667 return 0; 2668 } 2669 2670 bool omx_venc::dev_color_align(OMX_BUFFERHEADERTYPE *buffer, 2671 OMX_U32 width, OMX_U32 height) 2672 { 2673 if(secure_session) { 2674 DEBUG_PRINT_ERROR("Cannot align colors in secure session."); 2675 return OMX_FALSE; 2676 } 2677 return handle->venc_color_align(buffer, width,height); 2678 } 2679 2680 bool omx_venc::is_secure_session() 2681 { 2682 return secure_session; 2683 } 2684 2685 bool omx_venc::dev_get_output_log_flag() 2686 { 2687 return handle->venc_get_output_log_flag(); 2688 } 2689 2690 int omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen) 2691 { 2692 return handle->venc_output_log_buffers(buffer, bufferlen); 2693 } 2694 2695 int omx_venc::dev_extradata_log_buffers(char *buffer) 2696 { 2697 return handle->venc_extradata_log_buffers(buffer); 2698 } 2699