OMX_ERRORTYPE OMXVideoDecoderBase::InitOutputPort(void) { this->ports[OUTPORT_INDEX] = new PortVideo; if (this->ports[OUTPORT_INDEX] == NULL) { return OMX_ErrorInsufficientResources; } PortVideo *port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); // OMX_PARAM_PORTDEFINITIONTYPE OMX_PARAM_PORTDEFINITIONTYPE paramPortDefinitionOutput; memset(¶mPortDefinitionOutput, 0, sizeof(paramPortDefinitionOutput)); SetTypeHeader(¶mPortDefinitionOutput, sizeof(paramPortDefinitionOutput)); paramPortDefinitionOutput.nPortIndex = OUTPORT_INDEX; paramPortDefinitionOutput.eDir = OMX_DirOutput; paramPortDefinitionOutput.nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT; paramPortDefinitionOutput.nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT; paramPortDefinitionOutput.nBufferSize = sizeof(VideoRenderBuffer); paramPortDefinitionOutput.bEnabled = OMX_TRUE; paramPortDefinitionOutput.bPopulated = OMX_FALSE; paramPortDefinitionOutput.eDomain = OMX_PortDomainVideo; paramPortDefinitionOutput.format.video.cMIMEType = (OMX_STRING)VA_RAW_MIME_TYPE; paramPortDefinitionOutput.format.video.pNativeRender = NULL; paramPortDefinitionOutput.format.video.nFrameWidth = 176; paramPortDefinitionOutput.format.video.nFrameHeight = 144; paramPortDefinitionOutput.format.video.nStride = 176; paramPortDefinitionOutput.format.video.nSliceHeight = 144; paramPortDefinitionOutput.format.video.nBitrate = 64000; paramPortDefinitionOutput.format.video.xFramerate = 15 << 16; paramPortDefinitionOutput.format.video.bFlagErrorConcealment = OMX_FALSE; paramPortDefinitionOutput.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; paramPortDefinitionOutput.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; paramPortDefinitionOutput.format.video.pNativeWindow = NULL; paramPortDefinitionOutput.bBuffersContiguous = OMX_FALSE; paramPortDefinitionOutput.nBufferAlignment = 0; // no format specific to initialize output port InitOutputPortFormatSpecific(¶mPortDefinitionOutput); port->SetPortDefinition(¶mPortDefinitionOutput, true); // OMX_VIDEO_PARAM_PORTFORMATTYPE OMX_VIDEO_PARAM_PORTFORMATTYPE paramPortFormat; SetTypeHeader(¶mPortFormat, sizeof(paramPortFormat)); paramPortFormat.nPortIndex = OUTPORT_INDEX; paramPortFormat.nIndex = 0; paramPortFormat.eCompressionFormat = paramPortDefinitionOutput.format.video.eCompressionFormat; paramPortFormat.eColorFormat = paramPortDefinitionOutput.format.video.eColorFormat; paramPortFormat.xFramerate = paramPortDefinitionOutput.format.video.xFramerate; port->SetPortVideoParam(¶mPortFormat, true); return OMX_ErrorNone; }
OMX_ERRORTYPE OMXVideoEncoderBase::InitOutputPort(void) { this->ports[OUTPORT_INDEX] = new PortVideo; if (this->ports[OUTPORT_INDEX] == NULL) { return OMX_ErrorInsufficientResources; } PortVideo *port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); // OMX_VIDEO_PARAM_BITRATETYPE memset(&mParamBitrate, 0, sizeof(mParamBitrate)); SetTypeHeader(&mParamBitrate, sizeof(mParamBitrate)); mParamBitrate.nPortIndex = OUTPORT_INDEX; mParamBitrate.eControlRate = OMX_Video_ControlRateVariable; mParamBitrate.nTargetBitrate = 192000; // to be overridden // OMX_VIDEO_CONFIG_PRI_INFOTYPE memset(&mConfigPriInfo, 0, sizeof(mConfigPriInfo)); SetTypeHeader(&mConfigPriInfo, sizeof(mConfigPriInfo)); mConfigPriInfo.nPortIndex = OUTPORT_INDEX; mConfigPriInfo.nCapacity = 0; mConfigPriInfo.nHolder = NULL; // OMX_VIDEO_CONFIG_INTEL_BITRATETYPE memset(&mConfigIntelBitrate, 0, sizeof(mConfigIntelBitrate)); SetTypeHeader(&mConfigIntelBitrate, sizeof(mConfigIntelBitrate)); mConfigIntelBitrate.nPortIndex = OUTPORT_INDEX; mConfigIntelBitrate.nMaxEncodeBitrate = 0; // Maximum bitrate mConfigIntelBitrate.nTargetPercentage = 95; // Target bitrate as percentage of maximum bitrate; e.g. 95 is 95% mConfigIntelBitrate.nWindowSize = 0; // Window size in milliseconds allowed for bitrate to reach target mConfigIntelBitrate.nInitialQP = 0; // Initial QP for I frames mConfigIntelBitrate.nMinQP = 0; mConfigIntelBitrate.nMaxQP = 0; mConfigIntelBitrate.nFrameRate = 0; mConfigIntelBitrate.nTemporalID = 0; // OMX_VIDEO_CONFIG_BITRATETYPE memset(&mConfigBitrate, 0, sizeof(mConfigBitrate)); SetTypeHeader(&mConfigBitrate, sizeof(mConfigBitrate)); mConfigBitrate.nPortIndex = OUTPORT_INDEX; mConfigBitrate.nEncodeBitrate = 0; // Maximum bitrate // OMX_VIDEO_CONFIG_INTEL_AIR memset(&mConfigIntelAir, 0, sizeof(mConfigIntelAir)); SetTypeHeader(&mConfigIntelAir, sizeof(mConfigIntelAir)); mConfigIntelAir.nPortIndex = OUTPORT_INDEX; mConfigIntelAir.bAirEnable = OMX_FALSE; mConfigIntelAir.bAirAuto = OMX_FALSE; mConfigIntelAir.nAirMBs = 0; mConfigIntelAir.nAirThreshold = 0; // OMX_VIDEO_CONFIG_INTEL_AIR memset(&mParamVideoRefresh, 0, sizeof(mParamVideoRefresh)); SetTypeHeader(&mParamVideoRefresh, sizeof(mParamVideoRefresh)); mParamVideoRefresh.nPortIndex = OUTPORT_INDEX; mParamVideoRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshAdaptive; mParamVideoRefresh.nAirMBs = 0; mParamVideoRefresh.nAirRef = 0; mParamVideoRefresh.nCirMBs = 0; // OMX_CONFIG_FRAMERATETYPE memset(&mConfigFramerate, 0, sizeof(mConfigFramerate)); SetTypeHeader(&mConfigFramerate, sizeof(mConfigFramerate)); mConfigFramerate.nPortIndex = OUTPORT_INDEX; mConfigFramerate.xEncodeFramerate = 0; // Q16 format // OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL memset(&mParamIntelAdaptiveSliceControl, 0, sizeof(mParamIntelAdaptiveSliceControl)); SetTypeHeader(&mParamIntelAdaptiveSliceControl, sizeof(mParamIntelAdaptiveSliceControl)); mParamIntelAdaptiveSliceControl.nPortIndex = OUTPORT_INDEX; mParamIntelAdaptiveSliceControl.bEnable = OMX_FALSE; mParamIntelAdaptiveSliceControl.nMinPSliceNumber = 5; mParamIntelAdaptiveSliceControl.nNumPFramesToSkip = 8; mParamIntelAdaptiveSliceControl.nSliceSizeThreshold = 1200; // OMX_VIDEO_PARAM_PROFILELEVELTYPE memset(&mParamProfileLevel, 0, sizeof(mParamProfileLevel)); SetTypeHeader(&mParamProfileLevel, sizeof(mParamProfileLevel)); mParamProfileLevel.nPortIndex = OUTPORT_INDEX; mParamProfileLevel.eProfile = 0; // undefined profile, to be overridden mParamProfileLevel.eLevel = 0; // undefined level, to be overridden // OMX_PARAM_PORTDEFINITIONTYPE OMX_PARAM_PORTDEFINITIONTYPE paramPortDefinitionOutput; memset(¶mPortDefinitionOutput, 0, sizeof(paramPortDefinitionOutput)); SetTypeHeader(¶mPortDefinitionOutput, sizeof(paramPortDefinitionOutput)); paramPortDefinitionOutput.nPortIndex = OUTPORT_INDEX; paramPortDefinitionOutput.eDir = OMX_DirOutput; paramPortDefinitionOutput.nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT; // to be overridden paramPortDefinitionOutput.nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT; paramPortDefinitionOutput.nBufferSize = OUTPORT_BUFFER_SIZE; // to be overridden paramPortDefinitionOutput.bEnabled = OMX_TRUE; paramPortDefinitionOutput.bPopulated = OMX_FALSE; paramPortDefinitionOutput.eDomain = OMX_PortDomainVideo; paramPortDefinitionOutput.format.video.cMIMEType = NULL; // to be overridden paramPortDefinitionOutput.format.video.pNativeRender = NULL; paramPortDefinitionOutput.format.video.nFrameWidth = 176; paramPortDefinitionOutput.format.video.nFrameHeight = 144; paramPortDefinitionOutput.format.video.nStride = 176; paramPortDefinitionOutput.format.video.nSliceHeight = 144; paramPortDefinitionOutput.format.video.nBitrate = 64000; paramPortDefinitionOutput.format.video.xFramerate = 15 << 16; paramPortDefinitionOutput.format.video.bFlagErrorConcealment = OMX_FALSE; paramPortDefinitionOutput.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; // to be overridden paramPortDefinitionOutput.format.video.eColorFormat = OMX_COLOR_FormatUnused; paramPortDefinitionOutput.format.video.pNativeWindow = NULL; paramPortDefinitionOutput.bBuffersContiguous = OMX_FALSE; paramPortDefinitionOutput.nBufferAlignment = 0; InitOutputPortFormatSpecific(¶mPortDefinitionOutput); port->SetPortDefinition(¶mPortDefinitionOutput, true); port->SetPortBitrateParam(&mParamBitrate, true); // OMX_VIDEO_PARAM_PORTFORMATTYPE OMX_VIDEO_PARAM_PORTFORMATTYPE paramPortFormat; memset(¶mPortFormat, 0, sizeof(paramPortFormat)); SetTypeHeader(¶mPortFormat, sizeof(paramPortFormat)); paramPortFormat.nPortIndex = OUTPORT_INDEX; paramPortFormat.nIndex = 0; paramPortFormat.eCompressionFormat = paramPortDefinitionOutput.format.video.eCompressionFormat; paramPortFormat.eColorFormat = paramPortDefinitionOutput.format.video.eColorFormat; paramPortFormat.xFramerate = paramPortDefinitionOutput.format.video.xFramerate; port->SetPortVideoParam(¶mPortFormat, true); return OMX_ErrorNone; }