OMX_ERRORTYPE OMXVideoDecoderAVC::SetParamVideoAvc(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, INPORT_INDEX); CHECK_SET_PARAM_STATE(); // TODO: do we need to check if port is enabled? // TODO: see SetPortAvcParam implementation - Can we make simple copy???? memcpy(&mParamAvc, p, sizeof(mParamAvc)); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderBase::GetParamVideoPortFormat(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_PORTFORMATTYPE *p = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX_RANGE(p); CHECK_ENUMERATION_RANGE(p->nIndex, 1); PortVideo *port = NULL; port = static_cast<PortVideo *>(this->ports[p->nPortIndex]); memcpy(p, port->GetPortVideoParam(), sizeof(*p)); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderBase::SetErrorReportMode(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_CONFIG_INTEL_ERROR_REPORT *p = (OMX_VIDEO_CONFIG_INTEL_ERROR_REPORT *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); mErrorReportEnabled = p->bEnable; LOGD("Error reporting is %s", mErrorReportEnabled ? "enabled" : "disabled"); mVideoDecoder->enableErrorReport(mErrorReportEnabled); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderBase::SetParamVideoPortFormat(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_PORTFORMATTYPE *p = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX_RANGE(p); CHECK_SET_PARAM_STATE(); // TODO: do we need to check if port is enabled? PortVideo *port = NULL; port = static_cast<PortVideo *>(this->ports[p->nPortIndex]); port->SetPortVideoParam(p, false); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoIntraRefresh(OMX_PTR pStructure) { OMX_ERRORTYPE ret; Encode_Status retStatus = ENCODE_SUCCESS; OMX_VIDEO_PARAM_INTRAREFRESHTYPE *p = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) mParamVideoRefresh = *p; // return OMX_ErrorNone if not in Executing state // TODO: return OMX_ErrorIncorrectStateOperation? CHECK_SET_PARAM_STATE(); VideoConfigIntraRefreshType configIntraRefreshType; configIntraRefreshType.refreshType = (VideoIntraRefreshType)(mParamVideoRefresh.eRefreshMode + 1); if(configIntraRefreshType.refreshType == VIDEO_ENC_CIR){ VideoConfigCIR configCIR; VideoConfigIntraRefreshType configIntraRefreshType; configCIR.cirParams.cir_num_mbs = mParamVideoRefresh.nCirMBs; configIntraRefreshType.refreshType = VIDEO_ENC_CIR; retStatus = mVideoEncoder->setConfig(&configCIR); if(retStatus != ENCODE_SUCCESS) { LOGW("Failed to set CIR config"); } }else{ VideoConfigAIR configAIR; configAIR.airParams.airMBs = mParamVideoRefresh.nAirMBs; configAIR.airParams.airThreshold = mParamVideoRefresh.nAirRef; retStatus = mVideoEncoder->setConfig(&configAIR); if(retStatus != ENCODE_SUCCESS) { LOGW("Failed to set AIR config"); } } retStatus = mVideoEncoder->setConfig(&configIntraRefreshType); if(retStatus != ENCODE_SUCCESS) { LOGW("Failed to set refresh config"); } return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetParamIntelAdaptiveSliceControl(OMX_PTR pStructure) { OMX_ERRORTYPE ret; if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax) { LOGE("SetParamIntelAdaptiveSliceControl failed. Feature is disabled."); return OMX_ErrorUnsupportedIndex; } OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL *p = (OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); // set only in Loaded state (ComponentSetParam) CHECK_SET_PARAM_STATE(); mParamIntelAdaptiveSliceControl = *p; return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoBitrate(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_BITRATETYPE *p = (OMX_VIDEO_PARAM_BITRATETYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); CHECK_SET_PARAM_STATE(); OMX_U32 index = p->nPortIndex; PortVideo *port = NULL; // This disables other type of bitrate control mechanism // TODO: check if it is desired // TODO: can we override mParamBitrate.nPortIndex (See SetPortBitrateParam) mParamBitrate.eControlRate = p->eControlRate; mParamBitrate.nTargetBitrate = p->nTargetBitrate; port = static_cast<PortVideo *>(ports[index]); ret = port->SetPortBitrateParam(p, false); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderAVC::SetParamIntelAVCDecodeSettings(OMX_PTR pStructure) { LOGW("SetParamIntelAVCDecodeSettings"); OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS *p = (OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, INPORT_INDEX); CHECK_SET_PARAM_STATE(); if(p->nMaxNumberOfReferenceFrame == 0) { // TODO: check if we just return in this case. p->nMaxNumberOfReferenceFrame = NUM_REFERENCE_FRAME; } LOGI("Maximum width = %u, height = %u, dpb = %u", p->nMaxWidth, p->nMaxHeight, p->nMaxNumberOfReferenceFrame); mDecodeSettings = *p; return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderH263::GetParamVideoH263ProfileLevel(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure; CHECK_TYPE_HEADER(p); struct ProfileLevelTable { OMX_U32 profile; OMX_U32 level; } plTable[] = { {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70} }; OMX_U32 count = sizeof(plTable)/sizeof(ProfileLevelTable); CHECK_ENUMERATION_RANGE(p->nProfileIndex,count); p->eProfile = plTable[p->nProfileIndex].profile; p->eLevel = plTable[p->nProfileIndex].level; return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::GetParamVideoPortFormat(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_U32 index; OMX_VIDEO_PARAM_PORTFORMATTYPE *p = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX_RANGE(p); CHECK_ENUMERATION_RANGE(p->nIndex, 2); PortVideo *port = NULL; port = static_cast<PortVideo *>(this->ports[p->nPortIndex]); index = p->nIndex; memcpy(p, port->GetPortVideoParam(), sizeof(*p)); // port supports OMX_COLOR_FormatYUV420SemiPlanar & OMX_COLOR_FormatAndroidOpaque if (index == 1) { p->nIndex = 1; p->eColorFormat = OMX_COLOR_FormatAndroidOpaque; } return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderBase::GetDecoderOutputCropSpecific(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_CONFIG_RECTTYPE *rectParams = (OMX_CONFIG_RECTTYPE *)pStructure; CHECK_TYPE_HEADER(rectParams); if (rectParams->nPortIndex != OUTPORT_INDEX) { return OMX_ErrorUndefined; } const VideoFormatInfo *formatInfo = mVideoDecoder->getFormatInfo(); if (formatInfo->valid == true) { rectParams->nLeft = formatInfo->cropLeft; rectParams->nTop = formatInfo->cropTop; rectParams->nWidth = formatInfo->width - formatInfo->cropLeft - formatInfo->cropRight; rectParams->nHeight = formatInfo->height - formatInfo->cropTop - formatInfo->cropBottom; return OMX_ErrorNone; } else { return OMX_ErrorFormatNotDetected; } }
OMX_ERRORTYPE OMXVideoEncoderBase::SetParamVideoPortFormat(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_PORTFORMATTYPE *p = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX_RANGE(p); CHECK_SET_PARAM_STATE(); // TODO: do we need to check if port is enabled? PortVideo *port = NULL; port = static_cast<PortVideo *>(this->ports[p->nPortIndex]); #if 0 if (p->eColorFormat == OMX_COLOR_FormatAndroidOpaque) { p->nIndex = 0; p->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; } #endif port->SetPortVideoParam(p, false); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderBase::SetNativeBufferModeSpecific(OMX_PTR pStructure) { OMX_ERRORTYPE ret; EnableAndroidNativeBuffersParams *param = (EnableAndroidNativeBuffersParams*)pStructure; CHECK_TYPE_HEADER(param); CHECK_PORT_INDEX_RANGE(param); CHECK_SET_PARAM_STATE(); PortVideo *port = NULL; port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); OMX_PARAM_PORTDEFINITIONTYPE port_def; memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def)); if (!param->enable) { mWorkingMode = RAWDATA_MODE; // If it is fallback from native mode the color format has been // already set to INTEL format. // We need to set back the default color format and Native stuff. port_def.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; port_def.format.video.pNativeRender = NULL; port_def.format.video.pNativeWindow = NULL; port->SetPortDefinition(&port_def,true); return OMX_ErrorNone; } mWorkingMode = GRAPHICBUFFER_MODE; port_def.nBufferCountMin = mNativeBufferCount; if (mEnableAdaptivePlayback) { SetMaxOutputBufferCount(&port_def); } else { port_def.nBufferCountActual = mNativeBufferCount; } port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE; port_def.format.video.eColorFormat = OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar; port_def.format.video.nFrameHeight = (port_def.format.video.nFrameHeight + 0x1f) & ~0x1f; port_def.format.video.eColorFormat = GetOutputColorFormat( port_def.format.video.nFrameWidth); port->SetPortDefinition(&port_def,true); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetStoreMetaDataInBuffers(OMX_PTR pStructure) { OMX_ERRORTYPE ret; StoreMetaDataInBuffersParams *p = (StoreMetaDataInBuffersParams *)pStructure; VideoParamsStoreMetaDataInBuffers StoreMetaDataInBuffers; PortVideo *port = static_cast<PortVideo *>(this->ports[INPORT_INDEX]); PortVideo *output_port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); uint32_t maxSize = 0; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, INPORT_INDEX); LOGD("SetStoreMetaDataInBuffers (enabled = %x)", p->bStoreMetaData); if(mStoreMetaDataInBuffers == p->bStoreMetaData) return OMX_ErrorNone; StoreMetaDataInBuffers.isEnabled = p->bStoreMetaData; if (mVideoEncoder->setParameters(&StoreMetaDataInBuffers) != ENCODE_SUCCESS) return OMX_ErrorNotReady; mStoreMetaDataInBuffers = p->bStoreMetaData; if(mStoreMetaDataInBuffers){ // for input port buffer OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput; const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput_get; paramPortDefinitionInput_get = port->GetPortDefinition(); paramPortDefinitionInput = (OMX_PARAM_PORTDEFINITIONTYPE *)paramPortDefinitionInput_get; paramPortDefinitionInput->nBufferSize = IntelMetadataBuffer::GetMaxBufferSize(); } else { const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput_get; paramPortDefinitionInput_get = port->GetPortDefinition(); port->SetPortDefinition(paramPortDefinitionInput_get, true); } LOGD("SetStoreMetaDataInBuffers success"); return OMX_ErrorNone; };
OMX_ERRORTYPE OMXVideoEncoderMPEG4::GetParamVideoProfileLevelQuerySupported(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); struct ProfileLevelTable { OMX_U32 profile; OMX_U32 level; } plTable[] = { {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5}, }; OMX_U32 count = sizeof(plTable)/sizeof(ProfileLevelTable); CHECK_ENUMERATION_RANGE(p->nProfileIndex,count); p->eProfile = plTable[p->nProfileIndex].profile; p->eLevel = plTable[p->nProfileIndex].level; return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::GetDecoderOutputCropSpecific(OMX_PTR pStructure) { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_CONFIG_RECTTYPE *rectParams = (OMX_CONFIG_RECTTYPE *)pStructure; CHECK_TYPE_HEADER(rectParams); if (rectParams->nPortIndex != OUTPORT_INDEX) { return OMX_ErrorUndefined; } const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput = this->ports[INPORT_INDEX]->GetPortDefinition(); rectParams->nLeft = VPX_DECODE_BORDER; rectParams->nTop = VPX_DECODE_BORDER; rectParams->nWidth = paramPortDefinitionInput->format.video.nFrameWidth; rectParams->nHeight = paramPortDefinitionInput->format.video.nFrameHeight; return ret; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetTemporalLayer(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER *p = (OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER *)pStructure; VideoParamsTemporalLayer TemporalLayer; OMX_U32 i; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); LOGE("SetTemporalLayer (enabled = %d)", p->nNumberOfTemporalLayer); TemporalLayer.numberOfLayer = p->nNumberOfTemporalLayer; TemporalLayer.nPeriodicity = p->nPeriodicity; for(i=0;i<p->nPeriodicity;i++) TemporalLayer.nLayerID[i] = p->nLayerID[i]; if (mVideoEncoder->setParameters(&TemporalLayer) != ENCODE_SUCCESS) return OMX_ErrorNotReady; LOGE("SetTemporalLayer success"); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigVideoIntraVOPRefresh(OMX_PTR pStructure) { OMX_ERRORTYPE ret; Encode_Status retStatus = ENCODE_SUCCESS; OMX_CONFIG_INTRAREFRESHVOPTYPE *p = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); // return OMX_ErrorNone if not in Executing state // TODO: return OMX_ErrorIncorrectStateOperation? CHECK_SET_CONFIG_STATE(); if(p->IntraRefreshVOP == OMX_TRUE) { VideoParamConfigSet configIDRRequest; configIDRRequest.type = VideoConfigTypeIDRRequest; retStatus = mVideoEncoder->setConfig(&configIDRRequest); if(retStatus != ENCODE_SUCCESS) { LOGW("Failed to set refresh config"); } } return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoDecoderAVCSecure::GetParamVideoAVCProfileLevel(OMX_PTR pStructure) { OMX_ERRORTYPE ret; OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, INPORT_INDEX); struct ProfileLevelTable { OMX_U32 profile; OMX_U32 level; } plTable[] = { {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42}, {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel42}, {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel42} }; OMX_U32 count = sizeof(plTable)/sizeof(ProfileLevelTable); CHECK_ENUMERATION_RANGE(p->nProfileIndex,count); p->eProfile = plTable[p->nProfileIndex].profile; p->eLevel = plTable[p->nProfileIndex].level; return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigIntelAIR(OMX_PTR pStructure) { OMX_ERRORTYPE ret; Encode_Status retStatus = ENCODE_SUCCESS; OMX_VIDEO_CONFIG_INTEL_AIR *p = (OMX_VIDEO_CONFIG_INTEL_AIR *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) mConfigIntelAir = *p; // return OMX_ErrorNone if not in Executing state // TODO: return OMX_ErrorIncorrectStateOperation? CHECK_SET_CONFIG_STATE(); VideoConfigAIR configAIR; VideoConfigIntraRefreshType configIntraRefreshType; if(mConfigIntelAir.bAirEnable == OMX_TRUE) { configAIR.airParams.airAuto = mConfigIntelAir.bAirAuto; configAIR.airParams.airMBs = mConfigIntelAir.nAirMBs; configAIR.airParams.airThreshold = mConfigIntelAir.nAirThreshold; configIntraRefreshType.refreshType = VIDEO_ENC_AIR; } else { configIntraRefreshType.refreshType = VIDEO_ENC_NONIR; } retStatus = mVideoEncoder->setConfig(&configAIR); if(retStatus != ENCODE_SUCCESS) { LOGW("Failed to set AIR config"); } retStatus = mVideoEncoder->setConfig(&configIntraRefreshType); if(retStatus != ENCODE_SUCCESS) { LOGW("Failed to set refresh config"); } return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigIntelBitrate(OMX_PTR pStructure) { OMX_ERRORTYPE ret; Encode_Status retStatus = ENCODE_SUCCESS; if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax){ LOGE("SetConfigIntelBitrate failed. Feature is disabled."); return OMX_ErrorUnsupportedIndex; } OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *p = (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *)pStructure; CHECK_TYPE_HEADER(p); CHECK_PORT_INDEX(p, OUTPORT_INDEX); // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) mConfigIntelBitrate = *p; // return OMX_ErrorNone if not in Executing state // TODO: return OMX_ErrorIncorrectStateOperation? CHECK_SET_CONFIG_STATE(); VideoConfigBitRate configBitRate; configBitRate.rcParams.bitRate = mConfigIntelBitrate.nMaxEncodeBitrate; configBitRate.rcParams.initQP = mConfigIntelBitrate.nInitialQP; configBitRate.rcParams.minQP = mConfigIntelBitrate.nMinQP; configBitRate.rcParams.maxQP = mConfigIntelBitrate.nMaxQP; configBitRate.rcParams.I_minQP = 0; configBitRate.rcParams.I_maxQP = 0; configBitRate.rcParams.windowSize = mConfigIntelBitrate.nWindowSize; configBitRate.rcParams.targetPercentage = mConfigIntelBitrate.nTargetPercentage; configBitRate.rcParams.enableIntraFrameQPControl = 0; configBitRate.rcParams.temporalFrameRate = mConfigIntelBitrate.nFrameRate; configBitRate.rcParams.temporalID = mConfigIntelBitrate.nTemporalID; retStatus = mVideoEncoder->setConfig(&configBitRate); if(retStatus != ENCODE_SUCCESS) { LOGW("failed to set IntelBitrate"); } return OMX_ErrorNone; }