1 /* 2 * Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 #define LOG_TAG "OMXVideoEncoderBase" 19 #include "OMXVideoEncoderBase.h" 20 #include "IntelMetadataBuffer.h" 21 #include <cutils/properties.h> 22 #include <wrs_omxil_core/log.h> 23 24 static const char *RAW_MIME_TYPE = "video/raw"; 25 26 OMXVideoEncoderBase::OMXVideoEncoderBase() 27 :mVideoEncoder(NULL) 28 ,mEncoderParams(NULL) 29 ,mFrameInputCount(0) 30 ,mFrameOutputCount(0) 31 ,mFirstFrame(OMX_TRUE) 32 ,mFrameRetrieved(OMX_TRUE) 33 ,mStoreMetaDataInBuffers(OMX_FALSE) 34 ,mSyncEncoding(OMX_TRUE) 35 ,mOmxLogLevel(0) 36 ,mBlackFramePointer(NULL) { 37 mEncoderParams = new VideoParamsCommon(); 38 if (!mEncoderParams) LOGE("OMX_ErrorInsufficientResources"); 39 40 char logLevelProp[128]; 41 if (property_get("omxenc.debug", logLevelProp, NULL)) { 42 mOmxLogLevel = atoi(logLevelProp); 43 LOGD("Debug level is %d", mOmxLogLevel); 44 } 45 46 LOGV("OMXVideoEncoderBase::OMXVideoEncoderBase end"); 47 } 48 49 OMXVideoEncoderBase::~OMXVideoEncoderBase() { 50 51 // destroy ports 52 if (this->ports) { 53 if (this->ports[INPORT_INDEX]) { 54 delete this->ports[INPORT_INDEX]; 55 this->ports[INPORT_INDEX] = NULL; 56 } 57 58 if (this->ports[OUTPORT_INDEX]) { 59 delete this->ports[OUTPORT_INDEX]; 60 this->ports[OUTPORT_INDEX] = NULL; 61 } 62 } 63 64 if (mBlackFramePointer) { 65 free(mBlackFramePointer); 66 mBlackFramePointer = NULL; 67 } 68 // Release video encoder object 69 if(mVideoEncoder) { 70 releaseVideoEncoder(mVideoEncoder); 71 mVideoEncoder = NULL; 72 } 73 74 if(mEncoderParams) { 75 delete mEncoderParams; 76 mEncoderParams = NULL; 77 } 78 79 } 80 81 OMX_ERRORTYPE OMXVideoEncoderBase::InitInputPort(void) { 82 this->ports[INPORT_INDEX] = new PortVideo; 83 if (this->ports[INPORT_INDEX] == NULL) { 84 return OMX_ErrorInsufficientResources; 85 } 86 87 PortVideo *port = static_cast<PortVideo *>(this->ports[INPORT_INDEX]); 88 89 // OMX_PARAM_PORTDEFINITIONTYPE 90 OMX_PARAM_PORTDEFINITIONTYPE paramPortDefinitionInput; 91 memset(¶mPortDefinitionInput, 0, sizeof(paramPortDefinitionInput)); 92 SetTypeHeader(¶mPortDefinitionInput, sizeof(paramPortDefinitionInput)); 93 paramPortDefinitionInput.nPortIndex = INPORT_INDEX; 94 paramPortDefinitionInput.eDir = OMX_DirInput; 95 paramPortDefinitionInput.nBufferCountActual = INPORT_ACTUAL_BUFFER_COUNT; 96 paramPortDefinitionInput.nBufferCountMin = INPORT_MIN_BUFFER_COUNT; 97 paramPortDefinitionInput.nBufferSize = INPORT_BUFFER_SIZE; 98 paramPortDefinitionInput.bEnabled = OMX_TRUE; 99 paramPortDefinitionInput.bPopulated = OMX_FALSE; 100 paramPortDefinitionInput.eDomain = OMX_PortDomainVideo; 101 paramPortDefinitionInput.format.video.cMIMEType = (OMX_STRING)RAW_MIME_TYPE; 102 paramPortDefinitionInput.format.video.pNativeRender = NULL; 103 paramPortDefinitionInput.format.video.nFrameWidth = 176; 104 paramPortDefinitionInput.format.video.nFrameHeight = 144; 105 paramPortDefinitionInput.format.video.nStride = 0; 106 paramPortDefinitionInput.format.video.nSliceHeight = 0; 107 paramPortDefinitionInput.format.video.nBitrate = 64000; 108 paramPortDefinitionInput.format.video.xFramerate = 15 << 16; 109 paramPortDefinitionInput.format.video.bFlagErrorConcealment = OMX_FALSE; 110 paramPortDefinitionInput.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 111 paramPortDefinitionInput.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 112 paramPortDefinitionInput.format.video.pNativeWindow = NULL; 113 paramPortDefinitionInput.bBuffersContiguous = OMX_FALSE; 114 paramPortDefinitionInput.nBufferAlignment = 0; 115 116 // Nothing specific to initialize input port. 117 InitInputPortFormatSpecific(¶mPortDefinitionInput); 118 119 port->SetPortDefinition(¶mPortDefinitionInput, true); 120 121 // Set port buffer 4k aligned 122 port->SetMemAlignment(4096); 123 124 // OMX_VIDEO_PARAM_PORTFORMATTYPE 125 OMX_VIDEO_PARAM_PORTFORMATTYPE paramPortFormat; 126 memset(¶mPortFormat, 0, sizeof(paramPortFormat)); 127 SetTypeHeader(¶mPortFormat, sizeof(paramPortFormat)); 128 paramPortFormat.nPortIndex = INPORT_INDEX; 129 paramPortFormat.nIndex = 0; 130 paramPortFormat.eCompressionFormat = paramPortDefinitionInput.format.video.eCompressionFormat; 131 paramPortFormat.eColorFormat = paramPortDefinitionInput.format.video.eColorFormat; 132 paramPortFormat.xFramerate = paramPortDefinitionInput.format.video.xFramerate; 133 134 port->SetPortVideoParam(¶mPortFormat, true); 135 136 return OMX_ErrorNone; 137 } 138 139 140 OMX_ERRORTYPE OMXVideoEncoderBase::InitOutputPort(void) { 141 this->ports[OUTPORT_INDEX] = new PortVideo; 142 if (this->ports[OUTPORT_INDEX] == NULL) { 143 return OMX_ErrorInsufficientResources; 144 } 145 146 PortVideo *port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); 147 148 // OMX_VIDEO_PARAM_BITRATETYPE 149 memset(&mParamBitrate, 0, sizeof(mParamBitrate)); 150 SetTypeHeader(&mParamBitrate, sizeof(mParamBitrate)); 151 mParamBitrate.nPortIndex = OUTPORT_INDEX; 152 mParamBitrate.eControlRate = OMX_Video_ControlRateVariable; 153 mParamBitrate.nTargetBitrate = 192000; // to be overridden 154 155 // OMX_VIDEO_CONFIG_PRI_INFOTYPE 156 memset(&mConfigPriInfo, 0, sizeof(mConfigPriInfo)); 157 SetTypeHeader(&mConfigPriInfo, sizeof(mConfigPriInfo)); 158 mConfigPriInfo.nPortIndex = OUTPORT_INDEX; 159 mConfigPriInfo.nCapacity = 0; 160 mConfigPriInfo.nHolder = NULL; 161 162 // OMX_VIDEO_CONFIG_INTEL_BITRATETYPE 163 memset(&mConfigIntelBitrate, 0, sizeof(mConfigIntelBitrate)); 164 SetTypeHeader(&mConfigIntelBitrate, sizeof(mConfigIntelBitrate)); 165 mConfigIntelBitrate.nPortIndex = OUTPORT_INDEX; 166 mConfigIntelBitrate.nMaxEncodeBitrate = 0; // Maximum bitrate 167 mConfigIntelBitrate.nTargetPercentage = 95; // Target bitrate as percentage of maximum bitrate; e.g. 95 is 95% 168 mConfigIntelBitrate.nWindowSize = 0; // Window size in milliseconds allowed for bitrate to reach target 169 mConfigIntelBitrate.nInitialQP = 0; // Initial QP for I frames 170 mConfigIntelBitrate.nMinQP = 0; 171 mConfigIntelBitrate.nMaxQP = 0; 172 mConfigIntelBitrate.nFrameRate = 0; 173 mConfigIntelBitrate.nTemporalID = 0; 174 175 // OMX_VIDEO_CONFIG_BITRATETYPE 176 memset(&mConfigBitrate, 0, sizeof(mConfigBitrate)); 177 SetTypeHeader(&mConfigBitrate, sizeof(mConfigBitrate)); 178 mConfigBitrate.nPortIndex = OUTPORT_INDEX; 179 mConfigBitrate.nEncodeBitrate = 0; // Maximum bitrate 180 181 // OMX_VIDEO_CONFIG_INTEL_AIR 182 memset(&mConfigIntelAir, 0, sizeof(mConfigIntelAir)); 183 SetTypeHeader(&mConfigIntelAir, sizeof(mConfigIntelAir)); 184 mConfigIntelAir.nPortIndex = OUTPORT_INDEX; 185 mConfigIntelAir.bAirEnable = OMX_FALSE; 186 mConfigIntelAir.bAirAuto = OMX_FALSE; 187 mConfigIntelAir.nAirMBs = 0; 188 mConfigIntelAir.nAirThreshold = 0; 189 190 // OMX_VIDEO_CONFIG_INTEL_AIR 191 memset(&mParamVideoRefresh, 0, sizeof(mParamVideoRefresh)); 192 SetTypeHeader(&mParamVideoRefresh, sizeof(mParamVideoRefresh)); 193 mParamVideoRefresh.nPortIndex = OUTPORT_INDEX; 194 mParamVideoRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshAdaptive; 195 mParamVideoRefresh.nAirMBs = 0; 196 mParamVideoRefresh.nAirRef = 0; 197 mParamVideoRefresh.nCirMBs = 0; 198 199 // OMX_CONFIG_FRAMERATETYPE 200 memset(&mConfigFramerate, 0, sizeof(mConfigFramerate)); 201 SetTypeHeader(&mConfigFramerate, sizeof(mConfigFramerate)); 202 mConfigFramerate.nPortIndex = OUTPORT_INDEX; 203 mConfigFramerate.xEncodeFramerate = 0; // Q16 format 204 205 // OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL 206 memset(&mParamIntelAdaptiveSliceControl, 0, sizeof(mParamIntelAdaptiveSliceControl)); 207 SetTypeHeader(&mParamIntelAdaptiveSliceControl, sizeof(mParamIntelAdaptiveSliceControl)); 208 mParamIntelAdaptiveSliceControl.nPortIndex = OUTPORT_INDEX; 209 mParamIntelAdaptiveSliceControl.bEnable = OMX_FALSE; 210 mParamIntelAdaptiveSliceControl.nMinPSliceNumber = 5; 211 mParamIntelAdaptiveSliceControl.nNumPFramesToSkip = 8; 212 mParamIntelAdaptiveSliceControl.nSliceSizeThreshold = 1200; 213 214 // OMX_VIDEO_PARAM_PROFILELEVELTYPE 215 memset(&mParamProfileLevel, 0, sizeof(mParamProfileLevel)); 216 SetTypeHeader(&mParamProfileLevel, sizeof(mParamProfileLevel)); 217 mParamProfileLevel.nPortIndex = OUTPORT_INDEX; 218 mParamProfileLevel.eProfile = 0; // undefined profile, to be overridden 219 mParamProfileLevel.eLevel = 0; // undefined level, to be overridden 220 221 // OMX_PARAM_PORTDEFINITIONTYPE 222 OMX_PARAM_PORTDEFINITIONTYPE paramPortDefinitionOutput; 223 memset(¶mPortDefinitionOutput, 0, sizeof(paramPortDefinitionOutput)); 224 SetTypeHeader(¶mPortDefinitionOutput, sizeof(paramPortDefinitionOutput)); 225 paramPortDefinitionOutput.nPortIndex = OUTPORT_INDEX; 226 paramPortDefinitionOutput.eDir = OMX_DirOutput; 227 paramPortDefinitionOutput.nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT; // to be overridden 228 paramPortDefinitionOutput.nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT; 229 paramPortDefinitionOutput.nBufferSize = OUTPORT_BUFFER_SIZE; // to be overridden 230 paramPortDefinitionOutput.bEnabled = OMX_TRUE; 231 paramPortDefinitionOutput.bPopulated = OMX_FALSE; 232 paramPortDefinitionOutput.eDomain = OMX_PortDomainVideo; 233 paramPortDefinitionOutput.format.video.cMIMEType = NULL; // to be overridden 234 paramPortDefinitionOutput.format.video.pNativeRender = NULL; 235 paramPortDefinitionOutput.format.video.nFrameWidth = 176; 236 paramPortDefinitionOutput.format.video.nFrameHeight = 144; 237 paramPortDefinitionOutput.format.video.nStride = 176; 238 paramPortDefinitionOutput.format.video.nSliceHeight = 144; 239 paramPortDefinitionOutput.format.video.nBitrate = 64000; 240 paramPortDefinitionOutput.format.video.xFramerate = 15 << 16; 241 paramPortDefinitionOutput.format.video.bFlagErrorConcealment = OMX_FALSE; 242 paramPortDefinitionOutput.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; // to be overridden 243 paramPortDefinitionOutput.format.video.eColorFormat = OMX_COLOR_FormatUnused; 244 paramPortDefinitionOutput.format.video.pNativeWindow = NULL; 245 paramPortDefinitionOutput.bBuffersContiguous = OMX_FALSE; 246 paramPortDefinitionOutput.nBufferAlignment = 0; 247 248 InitOutputPortFormatSpecific(¶mPortDefinitionOutput); 249 250 port->SetPortDefinition(¶mPortDefinitionOutput, true); 251 port->SetPortBitrateParam(&mParamBitrate, true); 252 253 // OMX_VIDEO_PARAM_PORTFORMATTYPE 254 OMX_VIDEO_PARAM_PORTFORMATTYPE paramPortFormat; 255 memset(¶mPortFormat, 0, sizeof(paramPortFormat)); 256 SetTypeHeader(¶mPortFormat, sizeof(paramPortFormat)); 257 paramPortFormat.nPortIndex = OUTPORT_INDEX; 258 paramPortFormat.nIndex = 0; 259 paramPortFormat.eCompressionFormat = paramPortDefinitionOutput.format.video.eCompressionFormat; 260 paramPortFormat.eColorFormat = paramPortDefinitionOutput.format.video.eColorFormat; 261 paramPortFormat.xFramerate = paramPortDefinitionOutput.format.video.xFramerate; 262 263 port->SetPortVideoParam(¶mPortFormat, true); 264 return OMX_ErrorNone; 265 } 266 267 OMX_ERRORTYPE OMXVideoEncoderBase::InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *) { 268 // no format specific to initialize input 269 return OMX_ErrorNone; 270 } 271 272 OMX_ERRORTYPE OMXVideoEncoderBase::SetVideoEncoderParam() { 273 274 Encode_Status ret = ENCODE_SUCCESS; 275 PortVideo *port_in = NULL; 276 const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput = NULL; 277 LOGV("OMXVideoEncoderBase::SetVideoEncoderParam called\n"); 278 279 port_in = static_cast<PortVideo *>(ports[INPORT_INDEX]); 280 paramPortDefinitionInput = port_in->GetPortDefinition(); 281 mEncoderParams->resolution.height = paramPortDefinitionInput->format.video.nFrameHeight; 282 mEncoderParams->resolution.width = paramPortDefinitionInput->format.video.nFrameWidth; 283 284 mEncoderParams->frameRate.frameRateDenom = 1; 285 if(mConfigFramerate.xEncodeFramerate != 0) { 286 mEncoderParams->frameRate.frameRateNum = mConfigFramerate.xEncodeFramerate; 287 } else { 288 mEncoderParams->frameRate.frameRateNum = paramPortDefinitionInput->format.video.xFramerate >> 16; 289 mConfigFramerate.xEncodeFramerate = paramPortDefinitionInput->format.video.xFramerate >> 16; 290 } 291 292 if(mEncoderParams->intraPeriod == 0) { 293 OMX_U32 intraPeriod = mEncoderParams->frameRate.frameRateNum / 2; 294 mEncoderParams->intraPeriod = (intraPeriod < 15) ? 15 : intraPeriod; // Limit intra frame period to ensure video quality for low bitrate application. 295 } 296 297 if (paramPortDefinitionInput->format.video.eColorFormat == OMX_COLOR_FormatAndroidOpaque) 298 mEncoderParams->rawFormat = RAW_FORMAT_OPAQUE; 299 else 300 mEncoderParams->rawFormat = RAW_FORMAT_NV12; 301 302 LOGV("frameRate.frameRateDenom = %d\n", mEncoderParams->frameRate.frameRateDenom); 303 LOGV("frameRate.frameRateNum = %d\n", mEncoderParams->frameRate.frameRateNum); 304 LOGV("intraPeriod = %d\n ", mEncoderParams->intraPeriod); 305 mEncoderParams->rcParams.initQP = mConfigIntelBitrate.nInitialQP; 306 mEncoderParams->rcParams.minQP = mConfigIntelBitrate.nMinQP; 307 mEncoderParams->rcParams.maxQP = 0; 308 mEncoderParams->rcParams.I_minQP = 0; 309 mEncoderParams->rcParams.I_maxQP = 0; 310 mEncoderParams->rcParams.windowSize = mConfigIntelBitrate.nWindowSize; 311 mEncoderParams->rcParams.targetPercentage = mConfigIntelBitrate.nTargetPercentage; 312 mEncoderParams->rcParams.enableIntraFrameQPControl = 0; 313 314 mEncoderParams->rcParams.bitRate = mParamBitrate.nTargetBitrate; 315 if ((mParamBitrate.eControlRate == OMX_Video_ControlRateConstant )|| 316 (mParamBitrate.eControlRate == OMX_Video_ControlRateConstantSkipFrames)) { 317 LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateConstant", __func__); 318 mEncoderParams->rcMode = RATE_CONTROL_CBR; 319 } else if ((mParamBitrate.eControlRate == OMX_Video_ControlRateVariable) || 320 (mParamBitrate.eControlRate == OMX_Video_ControlRateVariableSkipFrames)) { 321 LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateVariable", __func__); 322 mEncoderParams->rcMode = RATE_CONTROL_VBR; 323 } else if (mParamBitrate.eControlRate == (OMX_VIDEO_CONTROLRATETYPE)OMX_Video_Intel_ControlRateVideoConferencingMode) { 324 LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateVideoConferencingMode ", __func__); 325 mEncoderParams->rcMode = RATE_CONTROL_VCM; 326 if(mConfigIntelBitrate.nMaxEncodeBitrate >0) 327 mEncoderParams->rcParams.bitRate = mConfigIntelBitrate.nMaxEncodeBitrate; 328 if(mConfigIntelAir.bAirEnable == OMX_TRUE) { 329 mEncoderParams->airParams.airAuto = mConfigIntelAir.bAirAuto; 330 mEncoderParams->airParams.airMBs = mConfigIntelAir.nAirMBs; 331 mEncoderParams->airParams.airThreshold = mConfigIntelAir.nAirThreshold; 332 mEncoderParams->refreshType = VIDEO_ENC_AIR; 333 } else { 334 mEncoderParams->refreshType = VIDEO_ENC_NONIR; 335 } 336 LOGV("refreshType = %d\n", mEncoderParams->refreshType); 337 } else { 338 mEncoderParams->rcMode = RATE_CONTROL_NONE; 339 } 340 341 ret = mVideoEncoder->setParameters(mEncoderParams); 342 CHECK_ENCODE_STATUS("setParameters"); 343 return OMX_ErrorNone; 344 } 345 346 OMX_ERRORTYPE OMXVideoEncoderBase::ProcessorInit(void) { 347 OMX_ERRORTYPE ret = OMX_ErrorNone; 348 ret = SetVideoEncoderParam(); 349 CHECK_STATUS("SetVideoEncoderParam"); 350 351 Encode_Status status = mVideoEncoder->start(); 352 if (status != ENCODE_SUCCESS) { 353 LOGE("Start failed, status = 0x%08x\n", status); 354 return OMX_ErrorUndefined; 355 } 356 357 return OMX_ErrorNone; 358 } 359 360 OMX_ERRORTYPE OMXVideoEncoderBase::ProcessorDeinit(void) { 361 if(mVideoEncoder) { 362 mVideoEncoder->stop(); 363 } 364 365 return OMX_ErrorNone; 366 } 367 368 OMX_ERRORTYPE OMXVideoEncoderBase::ProcessorStop(void) { 369 370 this->ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); 371 return OMX_ErrorNone; 372 } 373 OMX_ERRORTYPE OMXVideoEncoderBase:: ProcessorProcess( 374 OMX_BUFFERHEADERTYPE **, 375 buffer_retain_t *, 376 OMX_U32) { 377 378 LOGV("OMXVideoEncoderBase:: ProcessorProcess \n"); 379 return OMX_ErrorNone; 380 } 381 382 OMX_ERRORTYPE OMXVideoEncoderBase::ProcessorFlush(OMX_U32 portIndex) { 383 LOGV("OMXVideoEncoderBase::ProcessorFlush\n"); 384 if (portIndex == INPORT_INDEX || portIndex == OMX_ALL) { 385 this->ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); 386 mVideoEncoder->flush(); 387 } 388 return OMX_ErrorNone; 389 } 390 391 OMX_ERRORTYPE OMXVideoEncoderBase::BuildHandlerList(void) { 392 OMXComponentCodecBase::BuildHandlerList(); 393 AddHandler(OMX_IndexParamVideoPortFormat, GetParamVideoPortFormat, SetParamVideoPortFormat); 394 AddHandler(OMX_IndexParamVideoBitrate, GetParamVideoBitrate, SetParamVideoBitrate); 395 AddHandler((OMX_INDEXTYPE)OMX_IndexIntelPrivateInfo, GetIntelPrivateInfo, SetIntelPrivateInfo); 396 AddHandler((OMX_INDEXTYPE)OMX_IndexConfigIntelBitrate, GetConfigIntelBitrate, SetConfigIntelBitrate); 397 AddHandler((OMX_INDEXTYPE)OMX_IndexConfigIntelAIR, GetConfigIntelAIR, SetConfigIntelAIR); 398 AddHandler((OMX_INDEXTYPE)OMX_IndexParamVideoIntraRefresh, GetParamVideoIntraRefresh, SetParamVideoIntraRefresh); 399 AddHandler(OMX_IndexConfigVideoFramerate, GetConfigVideoFramerate, SetConfigVideoFramerate); 400 AddHandler(OMX_IndexConfigVideoIntraVOPRefresh, GetConfigVideoIntraVOPRefresh, SetConfigVideoIntraVOPRefresh); 401 //AddHandler(OMX_IndexParamIntelAdaptiveSliceControl, GetParamIntelAdaptiveSliceControl, SetParamIntelAdaptiveSliceControl); 402 //AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetParamVideoProfileLevelQuerySupported, SetParamVideoProfileLevelQuerySupported); 403 AddHandler((OMX_INDEXTYPE)OMX_IndexStoreMetaDataInBuffers, GetStoreMetaDataInBuffers, SetStoreMetaDataInBuffers); 404 AddHandler((OMX_INDEXTYPE)OMX_IndexExtSyncEncoding, GetSyncEncoding, SetSyncEncoding); 405 AddHandler((OMX_INDEXTYPE)OMX_IndexExtPrependSPSPPS, GetPrependSPSPPS, SetPrependSPSPPS); 406 AddHandler((OMX_INDEXTYPE)OMX_IndexExtTemporalLayer, GetTemporalLayer,SetTemporalLayer); 407 AddHandler((OMX_INDEXTYPE)OMX_IndexConfigVideoBitrate, GetConfigVideoBitrate, SetConfigVideoBitrate); 408 AddHandler((OMX_INDEXTYPE)OMX_IndexExtRequestBlackFramePointer, GetBlackFramePointer, GetBlackFramePointer); 409 return OMX_ErrorNone; 410 } 411 412 OMX_ERRORTYPE OMXVideoEncoderBase::GetParamVideoPortFormat(OMX_PTR pStructure) { 413 OMX_ERRORTYPE ret; 414 OMX_U32 index; 415 OMX_VIDEO_PARAM_PORTFORMATTYPE *p = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pStructure; 416 417 CHECK_TYPE_HEADER(p); 418 CHECK_PORT_INDEX_RANGE(p); 419 CHECK_ENUMERATION_RANGE(p->nIndex, 2); 420 421 PortVideo *port = NULL; 422 port = static_cast<PortVideo *>(this->ports[p->nPortIndex]); 423 index = p->nIndex; 424 memcpy(p, port->GetPortVideoParam(), sizeof(*p)); 425 // port supports OMX_COLOR_FormatYUV420SemiPlanar & OMX_COLOR_FormatAndroidOpaque 426 if (index == 1) { 427 p->nIndex = 1; 428 p->eColorFormat = OMX_COLOR_FormatAndroidOpaque; 429 } 430 return OMX_ErrorNone; 431 } 432 433 OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoPortFormat(OMX_PTR pStructure) { 434 OMX_ERRORTYPE ret; 435 OMX_VIDEO_PARAM_PORTFORMATTYPE *p = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pStructure; 436 437 CHECK_TYPE_HEADER(p); 438 CHECK_PORT_INDEX_RANGE(p); 439 CHECK_SET_PARAM_STATE(); 440 441 // TODO: do we need to check if port is enabled? 442 PortVideo *port = NULL; 443 port = static_cast<PortVideo *>(this->ports[p->nPortIndex]); 444 #if 0 445 if (p->eColorFormat == OMX_COLOR_FormatAndroidOpaque) { 446 p->nIndex = 0; 447 p->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 448 } 449 #endif 450 port->SetPortVideoParam(p, false); 451 return OMX_ErrorNone; 452 } 453 454 OMX_ERRORTYPE OMXVideoEncoderBase::GetParamVideoBitrate(OMX_PTR pStructure) { 455 OMX_ERRORTYPE ret; 456 OMX_VIDEO_PARAM_BITRATETYPE *p = (OMX_VIDEO_PARAM_BITRATETYPE *)pStructure; 457 458 CHECK_TYPE_HEADER(p); 459 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 460 memcpy(p, &mParamBitrate, sizeof(*p)); 461 return OMX_ErrorNone; 462 } 463 464 OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoBitrate(OMX_PTR pStructure) { 465 OMX_ERRORTYPE ret; 466 OMX_VIDEO_PARAM_BITRATETYPE *p = (OMX_VIDEO_PARAM_BITRATETYPE *)pStructure; 467 CHECK_TYPE_HEADER(p); 468 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 469 CHECK_SET_PARAM_STATE(); 470 OMX_U32 index = p->nPortIndex; 471 PortVideo *port = NULL; 472 // This disables other type of bitrate control mechanism 473 // TODO: check if it is desired 474 475 // TODO: can we override mParamBitrate.nPortIndex (See SetPortBitrateParam) 476 mParamBitrate.eControlRate = p->eControlRate; 477 mParamBitrate.nTargetBitrate = p->nTargetBitrate; 478 479 port = static_cast<PortVideo *>(ports[index]); 480 ret = port->SetPortBitrateParam(p, false); 481 return OMX_ErrorNone; 482 } 483 484 OMX_ERRORTYPE OMXVideoEncoderBase::GetIntelPrivateInfo(OMX_PTR pStructure) { 485 OMX_ERRORTYPE ret; 486 OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)pStructure; 487 488 CHECK_TYPE_HEADER(p); 489 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 490 memcpy(p, &mConfigPriInfo, sizeof(*p)); 491 return OMX_ErrorNone; 492 } 493 494 OMX_ERRORTYPE OMXVideoEncoderBase::SetIntelPrivateInfo(OMX_PTR pStructure) { 495 OMX_ERRORTYPE ret; 496 OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)pStructure; 497 CHECK_TYPE_HEADER(p); 498 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 499 500 // OMX_VIDEO_CONFIG_PRI_INFOTYPE is static parameter? 501 CHECK_SET_PARAM_STATE(); 502 503 // TODO: can we override mConfigPriInfo.nPortIndex (See SetPortPrivateInfoParam) 504 505 if(p->nHolder != NULL) { 506 // TODO: do we need to free nHolder? 507 if (mConfigPriInfo.nHolder) { 508 free(mConfigPriInfo.nHolder); 509 } 510 mConfigPriInfo.nCapacity = p->nCapacity; 511 // TODO: nCapacity is in 8-bit unit or 32-bit unit? 512 // TODO: check memory allocation 513 mConfigPriInfo.nHolder = (OMX_PTR)malloc(sizeof(OMX_U32) * p->nCapacity); 514 memcpy(mConfigPriInfo.nHolder, p->nHolder, sizeof(OMX_U32) * p->nCapacity); 515 } else { 516 mConfigPriInfo.nCapacity = 0; 517 mConfigPriInfo.nHolder = NULL; 518 } 519 520 return OMX_ErrorNone; 521 } 522 523 OMX_ERRORTYPE OMXVideoEncoderBase::GetConfigIntelBitrate(OMX_PTR pStructure) { 524 OMX_ERRORTYPE ret; 525 OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *p = (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *)pStructure; 526 527 CHECK_TYPE_HEADER(p); 528 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 529 memcpy(p, &mConfigIntelBitrate, sizeof(*p)); 530 return OMX_ErrorNone; 531 } 532 533 OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigIntelBitrate(OMX_PTR pStructure) { 534 OMX_ERRORTYPE ret; 535 Encode_Status retStatus = ENCODE_SUCCESS; 536 if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax){ 537 LOGE("SetConfigIntelBitrate failed. Feature is disabled."); 538 return OMX_ErrorUnsupportedIndex; 539 } 540 OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *p = (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *)pStructure; 541 CHECK_TYPE_HEADER(p); 542 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 543 544 // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 545 mConfigIntelBitrate = *p; 546 547 // return OMX_ErrorNone if not in Executing state 548 // TODO: return OMX_ErrorIncorrectStateOperation? 549 CHECK_SET_CONFIG_STATE(); 550 551 VideoConfigBitRate configBitRate; 552 configBitRate.rcParams.bitRate = mConfigIntelBitrate.nMaxEncodeBitrate; 553 configBitRate.rcParams.initQP = mConfigIntelBitrate.nInitialQP; 554 configBitRate.rcParams.minQP = mConfigIntelBitrate.nMinQP; 555 configBitRate.rcParams.maxQP = mConfigIntelBitrate.nMaxQP; 556 configBitRate.rcParams.I_minQP = 0; 557 configBitRate.rcParams.I_maxQP = 0; 558 configBitRate.rcParams.windowSize = mConfigIntelBitrate.nWindowSize; 559 configBitRate.rcParams.targetPercentage = mConfigIntelBitrate.nTargetPercentage; 560 configBitRate.rcParams.enableIntraFrameQPControl = 0; 561 configBitRate.rcParams.temporalFrameRate = mConfigIntelBitrate.nFrameRate; 562 configBitRate.rcParams.temporalID = mConfigIntelBitrate.nTemporalID; 563 retStatus = mVideoEncoder->setConfig(&configBitRate); 564 if(retStatus != ENCODE_SUCCESS) { 565 LOGW("failed to set IntelBitrate"); 566 } 567 return OMX_ErrorNone; 568 } 569 570 OMX_ERRORTYPE OMXVideoEncoderBase::GetConfigIntelAIR(OMX_PTR pStructure) { 571 OMX_ERRORTYPE ret; 572 OMX_VIDEO_CONFIG_INTEL_AIR *p = (OMX_VIDEO_CONFIG_INTEL_AIR *)pStructure; 573 574 CHECK_TYPE_HEADER(p); 575 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 576 memcpy(p, &mConfigIntelAir, sizeof(*p)); 577 return OMX_ErrorNone; 578 } 579 580 OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigIntelAIR(OMX_PTR pStructure) { 581 OMX_ERRORTYPE ret; 582 Encode_Status retStatus = ENCODE_SUCCESS; 583 584 OMX_VIDEO_CONFIG_INTEL_AIR *p = (OMX_VIDEO_CONFIG_INTEL_AIR *)pStructure; 585 CHECK_TYPE_HEADER(p); 586 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 587 588 // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 589 mConfigIntelAir = *p; 590 591 // return OMX_ErrorNone if not in Executing state 592 // TODO: return OMX_ErrorIncorrectStateOperation? 593 CHECK_SET_CONFIG_STATE(); 594 595 VideoConfigAIR configAIR; 596 VideoConfigIntraRefreshType configIntraRefreshType; 597 if(mConfigIntelAir.bAirEnable == OMX_TRUE) { 598 configAIR.airParams.airAuto = mConfigIntelAir.bAirAuto; 599 configAIR.airParams.airMBs = mConfigIntelAir.nAirMBs; 600 configAIR.airParams.airThreshold = mConfigIntelAir.nAirThreshold; 601 configIntraRefreshType.refreshType = VIDEO_ENC_AIR; 602 } else { 603 configIntraRefreshType.refreshType = VIDEO_ENC_NONIR; 604 } 605 606 retStatus = mVideoEncoder->setConfig(&configAIR); 607 if(retStatus != ENCODE_SUCCESS) { 608 LOGW("Failed to set AIR config"); 609 } 610 611 retStatus = mVideoEncoder->setConfig(&configIntraRefreshType); 612 if(retStatus != ENCODE_SUCCESS) { 613 LOGW("Failed to set refresh config"); 614 } 615 return OMX_ErrorNone; 616 } 617 618 OMX_ERRORTYPE OMXVideoEncoderBase::GetParamVideoIntraRefresh(OMX_PTR pStructure) { 619 OMX_ERRORTYPE ret; 620 OMX_VIDEO_PARAM_INTRAREFRESHTYPE *p = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pStructure; 621 622 CHECK_TYPE_HEADER(p); 623 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 624 memcpy(p, &mParamVideoRefresh, sizeof(*p)); 625 return OMX_ErrorNone; 626 } 627 628 OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoIntraRefresh(OMX_PTR pStructure) { 629 OMX_ERRORTYPE ret; 630 Encode_Status retStatus = ENCODE_SUCCESS; 631 632 OMX_VIDEO_PARAM_INTRAREFRESHTYPE *p = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pStructure; 633 CHECK_TYPE_HEADER(p); 634 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 635 636 // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 637 mParamVideoRefresh = *p; 638 639 // return OMX_ErrorNone if not in Executing state 640 // TODO: return OMX_ErrorIncorrectStateOperation? 641 CHECK_SET_PARAM_STATE(); 642 643 VideoConfigIntraRefreshType configIntraRefreshType; 644 configIntraRefreshType.refreshType = (VideoIntraRefreshType)(mParamVideoRefresh.eRefreshMode + 1); 645 if(configIntraRefreshType.refreshType == VIDEO_ENC_CIR){ 646 VideoConfigCIR configCIR; 647 VideoConfigIntraRefreshType configIntraRefreshType; 648 configCIR.cirParams.cir_num_mbs = mParamVideoRefresh.nCirMBs; 649 configIntraRefreshType.refreshType = VIDEO_ENC_CIR; 650 651 retStatus = mVideoEncoder->setConfig(&configCIR); 652 if(retStatus != ENCODE_SUCCESS) { 653 LOGW("Failed to set CIR config"); 654 } 655 }else{ 656 VideoConfigAIR configAIR; 657 658 configAIR.airParams.airMBs = mParamVideoRefresh.nAirMBs; 659 configAIR.airParams.airThreshold = mParamVideoRefresh.nAirRef; 660 661 retStatus = mVideoEncoder->setConfig(&configAIR); 662 if(retStatus != ENCODE_SUCCESS) { 663 LOGW("Failed to set AIR config"); 664 } 665 666 } 667 668 retStatus = mVideoEncoder->setConfig(&configIntraRefreshType); 669 if(retStatus != ENCODE_SUCCESS) { 670 LOGW("Failed to set refresh config"); 671 } 672 673 return OMX_ErrorNone; 674 } 675 676 OMX_ERRORTYPE OMXVideoEncoderBase::GetConfigVideoFramerate(OMX_PTR pStructure) { 677 OMX_ERRORTYPE ret; 678 OMX_CONFIG_FRAMERATETYPE *p = (OMX_CONFIG_FRAMERATETYPE *)pStructure; 679 680 CHECK_TYPE_HEADER(p); 681 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 682 memcpy(p, &mConfigFramerate, sizeof(*p)); 683 return OMX_ErrorNone; 684 } 685 686 OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigVideoFramerate(OMX_PTR pStructure) { 687 OMX_ERRORTYPE ret; 688 Encode_Status retStatus = ENCODE_SUCCESS; 689 if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax){ 690 LOGE("SetConfigVideoFramerate failed. Feature is disabled."); 691 return OMX_ErrorUnsupportedIndex; 692 } 693 OMX_CONFIG_FRAMERATETYPE *p = (OMX_CONFIG_FRAMERATETYPE *)pStructure; 694 CHECK_TYPE_HEADER(p); 695 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 696 697 // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 698 mConfigFramerate = *p; 699 700 // return OMX_ErrorNone if not in Executing state 701 // TODO, return OMX_ErrorIncorrectStateOperation? 702 CHECK_SET_CONFIG_STATE(); 703 704 VideoConfigFrameRate framerate; 705 framerate.frameRate.frameRateDenom = 1; 706 framerate.frameRate.frameRateNum = mConfigFramerate.xEncodeFramerate >> 16; 707 retStatus = mVideoEncoder->setConfig(&framerate); 708 if(retStatus != ENCODE_SUCCESS) { 709 LOGW("Failed to set frame rate config"); 710 } 711 return OMX_ErrorNone; 712 } 713 714 OMX_ERRORTYPE OMXVideoEncoderBase::GetConfigVideoIntraVOPRefresh(OMX_PTR) { 715 LOGW("GetConfigVideoIntraVOPRefresh is not supported."); 716 return OMX_ErrorUnsupportedSetting; 717 } 718 719 OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigVideoIntraVOPRefresh(OMX_PTR pStructure) { 720 OMX_ERRORTYPE ret; 721 Encode_Status retStatus = ENCODE_SUCCESS; 722 OMX_CONFIG_INTRAREFRESHVOPTYPE *p = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pStructure; 723 CHECK_TYPE_HEADER(p); 724 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 725 726 // return OMX_ErrorNone if not in Executing state 727 // TODO: return OMX_ErrorIncorrectStateOperation? 728 CHECK_SET_CONFIG_STATE(); 729 730 if(p->IntraRefreshVOP == OMX_TRUE) { 731 VideoParamConfigSet configIDRRequest; 732 configIDRRequest.type = VideoConfigTypeIDRRequest; 733 retStatus = mVideoEncoder->setConfig(&configIDRRequest); 734 if(retStatus != ENCODE_SUCCESS) { 735 LOGW("Failed to set refresh config"); 736 } 737 } 738 739 return OMX_ErrorNone; 740 } 741 742 OMX_ERRORTYPE OMXVideoEncoderBase::GetParamIntelAdaptiveSliceControl(OMX_PTR pStructure) { 743 744 OMX_ERRORTYPE ret; 745 OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL *p = (OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL *)pStructure; 746 747 CHECK_TYPE_HEADER(p); 748 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 749 memcpy(p, &mParamIntelAdaptiveSliceControl, sizeof(*p)); 750 751 return OMX_ErrorNone; 752 } 753 754 OMX_ERRORTYPE OMXVideoEncoderBase::SetParamIntelAdaptiveSliceControl(OMX_PTR pStructure) { 755 756 OMX_ERRORTYPE ret; 757 if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax) { 758 LOGE("SetParamIntelAdaptiveSliceControl failed. Feature is disabled."); 759 return OMX_ErrorUnsupportedIndex; 760 } 761 OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL *p = (OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL *)pStructure; 762 CHECK_TYPE_HEADER(p); 763 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 764 765 // set only in Loaded state (ComponentSetParam) 766 CHECK_SET_PARAM_STATE(); 767 768 mParamIntelAdaptiveSliceControl = *p; 769 770 return OMX_ErrorNone; 771 } 772 773 /* 774 OMX_ERRORTYPE OMXVideoEncoderBase::GetParamVideoProfileLevelQuerySupported(OMX_PTR pStructure) { 775 OMX_ERRORTYPE ret; 776 OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure; 777 778 CHECK_TYPE_HEADER(p); 779 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 780 781 // assign values instead of memory coping to avoid nProfileIndex being overridden 782 p->eProfile = mParamProfileLevel.eProfile; 783 p->eLevel = mParamProfileLevel.eLevel; 784 785 return OMX_ErrorNone; 786 } 787 788 OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoProfileLevelQuerySupported(OMX_PTR pStructure) { 789 LOGW("SetParamVideoProfileLevelQuerySupported is not supported."); 790 return OMX_ErrorUnsupportedSetting; 791 } 792 */ 793 794 OMX_ERRORTYPE OMXVideoEncoderBase::GetStoreMetaDataInBuffers(OMX_PTR pStructure) { 795 OMX_ERRORTYPE ret; 796 StoreMetaDataInBuffersParams *p = (StoreMetaDataInBuffersParams *)pStructure; 797 798 CHECK_TYPE_HEADER(p); 799 CHECK_PORT_INDEX(p, INPORT_INDEX); 800 801 p->bStoreMetaData = mStoreMetaDataInBuffers; 802 803 return OMX_ErrorNone; 804 }; 805 OMX_ERRORTYPE OMXVideoEncoderBase::SetStoreMetaDataInBuffers(OMX_PTR pStructure) { 806 OMX_ERRORTYPE ret; 807 StoreMetaDataInBuffersParams *p = (StoreMetaDataInBuffersParams *)pStructure; 808 VideoParamsStoreMetaDataInBuffers StoreMetaDataInBuffers; 809 PortVideo *port = static_cast<PortVideo *>(this->ports[INPORT_INDEX]); 810 811 CHECK_TYPE_HEADER(p); 812 CHECK_PORT_INDEX(p, INPORT_INDEX); 813 814 LOGD("SetStoreMetaDataInBuffers (enabled = %x)", p->bStoreMetaData); 815 if(mStoreMetaDataInBuffers == p->bStoreMetaData) 816 return OMX_ErrorNone; 817 818 StoreMetaDataInBuffers.isEnabled = p->bStoreMetaData; 819 if (mVideoEncoder->setParameters(&StoreMetaDataInBuffers) != ENCODE_SUCCESS) 820 return OMX_ErrorNotReady; 821 822 mStoreMetaDataInBuffers = p->bStoreMetaData; 823 824 if(mStoreMetaDataInBuffers){ 825 // for input port buffer 826 OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput; 827 const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput_get; 828 829 paramPortDefinitionInput_get = port->GetPortDefinition(); 830 paramPortDefinitionInput = (OMX_PARAM_PORTDEFINITIONTYPE *)paramPortDefinitionInput_get; 831 paramPortDefinitionInput->nBufferSize = IntelMetadataBuffer::GetMaxBufferSize(); 832 } 833 else 834 { 835 const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput_get; 836 837 paramPortDefinitionInput_get = port->GetPortDefinition(); 838 port->SetPortDefinition(paramPortDefinitionInput_get, true); 839 } 840 841 LOGD("SetStoreMetaDataInBuffers success"); 842 return OMX_ErrorNone; 843 }; 844 845 OMX_ERRORTYPE OMXVideoEncoderBase::GetSyncEncoding(OMX_PTR pStructure) { 846 OMX_BOOL* syncEncoding = static_cast<OMX_BOOL*>(pStructure); 847 848 *syncEncoding = mSyncEncoding; 849 850 return OMX_ErrorNone; 851 }; 852 853 OMX_ERRORTYPE OMXVideoEncoderBase::SetSyncEncoding(OMX_PTR pStructure) { 854 CHECK_SET_PARAM_STATE(); 855 856 mSyncEncoding = *(static_cast<OMX_BOOL*>(pStructure)); 857 858 LOGD("SetSyncEncoding %d", mSyncEncoding); 859 860 return OMX_ErrorNone; 861 }; 862 863 OMX_ERRORTYPE OMXVideoEncoderBase::GetPrependSPSPPS(OMX_PTR) { 864 return OMX_ErrorNone; 865 }; 866 867 OMX_ERRORTYPE OMXVideoEncoderBase::SetPrependSPSPPS(OMX_PTR) { 868 LOGD("SetPrependSPSPPS success"); 869 return OMX_ErrorNone; 870 }; 871 872 OMX_ERRORTYPE OMXVideoEncoderBase::GetTemporalLayer(OMX_PTR pStructure) { 873 OMX_ERRORTYPE ret; 874 OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER* p = static_cast<OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER*>(pStructure); 875 876 CHECK_TYPE_HEADER(p); 877 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 878 memcpy(p, &mTemporalLayer, sizeof(*p)); 879 return OMX_ErrorNone; 880 } 881 882 OMX_ERRORTYPE OMXVideoEncoderBase::SetTemporalLayer(OMX_PTR pStructure) { 883 OMX_ERRORTYPE ret; 884 OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER *p = (OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER *)pStructure; 885 VideoParamsTemporalLayer TemporalLayer; 886 OMX_U32 i; 887 888 CHECK_TYPE_HEADER(p); 889 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 890 891 LOGE("SetTemporalLayer (enabled = %d)", p->nNumberOfTemporalLayer); 892 893 TemporalLayer.numberOfLayer = p->nNumberOfTemporalLayer; 894 TemporalLayer.nPeriodicity = p->nPeriodicity; 895 for(i=0;i<p->nPeriodicity;i++) 896 TemporalLayer.nLayerID[i] = p->nLayerID[i]; 897 898 if (mVideoEncoder->setParameters(&TemporalLayer) != ENCODE_SUCCESS) 899 return OMX_ErrorNotReady; 900 901 LOGE("SetTemporalLayer success"); 902 return OMX_ErrorNone; 903 } 904 905 OMX_ERRORTYPE OMXVideoEncoderBase::GetBlackFramePointer(OMX_PTR pStructure) { 906 OMX_ERRORTYPE ret; 907 OMX_VIDEO_INTEL_REQUEST_BALCK_FRAME_POINTER *p = (OMX_VIDEO_INTEL_REQUEST_BALCK_FRAME_POINTER *)pStructure; 908 909 CHECK_TYPE_HEADER(p); 910 CHECK_PORT_INDEX(p, INPORT_INDEX); 911 912 PortVideo *port_in = static_cast<PortVideo *>(ports[INPORT_INDEX]); 913 const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput = port_in->GetPortDefinition(); 914 OMX_U32 width = paramPortDefinitionInput->format.video.nFrameWidth; 915 OMX_U32 height = paramPortDefinitionInput->format.video.nFrameHeight; 916 OMX_U32 lumaSize = width * height; 917 OMX_U32 bufferSize = width * height * 3 / 2; 918 919 if(mBlackFramePointer) { 920 free(mBlackFramePointer); 921 mBlackFramePointer = NULL; 922 } else { 923 mBlackFramePointer = (OMX_PTR)memalign(4096, bufferSize); // align to page size 924 if(!mBlackFramePointer) { 925 return OMX_ErrorInsufficientResources; 926 } 927 memset(mBlackFramePointer, 0x0, lumaSize); 928 memset((OMX_PTR)((uint64_t)mBlackFramePointer + lumaSize), 0x80, lumaSize / 2); 929 p->nFramePointer = (OMX_U32)mBlackFramePointer; 930 } 931 return OMX_ErrorNone; 932 } 933 934 OMX_ERRORTYPE OMXVideoEncoderBase::SetBlackFramePointer(OMX_PTR) { 935 return OMX_ErrorUnsupportedSetting; 936 } 937 938 OMX_ERRORTYPE OMXVideoEncoderBase::GetConfigVideoBitrate(OMX_PTR pStructure) { 939 940 OMX_ERRORTYPE ret; 941 OMX_VIDEO_CONFIG_BITRATETYPE *p = (OMX_VIDEO_CONFIG_BITRATETYPE *)pStructure; 942 943 CHECK_TYPE_HEADER(p); 944 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 945 memcpy(p, &mConfigBitrate, sizeof(*p)); 946 return OMX_ErrorNone; 947 } 948 OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigVideoBitrate(OMX_PTR pStructure){ 949 OMX_ERRORTYPE ret; 950 Encode_Status retStatus = ENCODE_SUCCESS; 951 if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax){ 952 LOGE("SetConfigIntelBitrate failed. Feature is disabled."); 953 return OMX_ErrorUnsupportedIndex; 954 } 955 OMX_VIDEO_CONFIG_BITRATETYPE *p = (OMX_VIDEO_CONFIG_BITRATETYPE *)pStructure; 956 CHECK_TYPE_HEADER(p); 957 CHECK_PORT_INDEX(p, OUTPORT_INDEX); 958 959 // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 960 mConfigBitrate = *p; 961 962 // return OMX_ErrorNone if not in Executing state 963 // TODO: return OMX_ErrorIncorrectStateOperation? 964 // CHECK_SET_CONFIG_STATE(); 965 966 VideoConfigBitRate configBitRate; 967 configBitRate.rcParams.bitRate = mConfigBitrate.nEncodeBitrate; 968 configBitRate.rcParams.temporalID = 0; 969 retStatus = mVideoEncoder->setConfig(&configBitRate); 970 if(retStatus != ENCODE_SUCCESS) { 971 LOGW("failed to set IntelBitrate"); 972 } 973 return OMX_ErrorNone; 974 } 975