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