diff options
author | Sunita Nadampalli <sunitan@ti.com> | 2016-08-24 13:01:06 -0500 |
---|---|---|
committer | Vishal Mahaveer <vishalm@ti.com> | 2016-09-15 13:09:07 -0500 |
commit | fa29dcbac2dbc6d5f7cc705ddb69ded98fe32a00 (patch) | |
tree | 484e6872e87af52990a19881d038fa7dfcf78d54 | |
parent | a706e55444d7a82454e9c8c127e751340f9e7559 (diff) | |
download | dra7xx-fa29dcbac2dbc6d5f7cc705ddb69ded98fe32a00.tar.gz |
OMX: Video Encoder: Add support for strided 1D input buffer
During Android surface encoding scenarios, the input surface
buffer and the encoder input buffer (for color conversion using SGX)
are allocated from gralloc. Due to gralloc ALIGN requirements,
for few resolutions, the buffer sizes are different than the video
resolutions. This patch adds support for configuring encoder
with the strided buffers.
Change-Id: I86c3c87dd2d2a8abb4d68860e7ddab44450d2a9e
Signed-off-by: Sunita Nadampalli <sunitan@ti.com>
-rw-r--r-- | omx/videoencode/omx_h264_enc/src/omx_H264videoencoder.c | 33 | ||||
-rw-r--r-- | omx/videoencode/omx_h264_enc/src/omx_H264videoencoderutils.c | 2 |
2 files changed, 17 insertions, 18 deletions
diff --git a/omx/videoencode/omx_h264_enc/src/omx_H264videoencoder.c b/omx/videoencode/omx_h264_enc/src/omx_H264videoencoder.c index 60e799a..44c8a60 100644 --- a/omx/videoencode/omx_h264_enc/src/omx_H264videoencoder.c +++ b/omx/videoencode/omx_h264_enc/src/omx_H264videoencoder.c @@ -568,6 +568,10 @@ static OMX_ERRORTYPE OMXH264VE_SetParameter(OMX_HANDLETYPE hComponent, pH264VEComp->sBase.pPorts[nPortIndex]->sPortDef.nBufferCountActual = pPortDef->nBufferCountActual; /*if frame height/widht changes then change the buffer requirements accordingly*/ if( nPortIndex == OMX_H264VE_INPUT_PORT ) { + if (pH264VEComp->bInputMetaDataBufferMode) { + pPortDef->format.video.nStride = ALIGN(pPortDef->format.video.nStride, HW_ALIGN); + } + OMX_CHECK(((pPortDef->format.video.nFrameWidth & 0x0F) == 0), OMX_ErrorUnsupportedSetting); /*Width should be multiple of 16*/ if( pH264VEComp->pVidEncStaticParams->videnc2Params.inputContentType == IVIDEO_PROGRESSIVE ) { OMX_CHECK(((pPortDef->format.video.nFrameHeight & 0x01) == 0), OMX_ErrorUnsupportedSetting); /* Width should be multiple of 16 */ @@ -613,8 +617,7 @@ static OMX_ERRORTYPE OMXH264VE_SetParameter(OMX_HANDLETYPE hComponent, pH264VEComp->pVidEncStaticParams->videnc2Params.maxWidth = pPortDef->format.video.nFrameWidth; pH264VEComp->pVidEncDynamicParams->videnc2DynamicParams.inputWidth = pPortDef->format.video.nFrameWidth; - pH264VEComp->pVidEncDynamicParams->videnc2DynamicParams.captureWidth = - pH264VEComp->pVidEncDynamicParams->videnc2DynamicParams.inputWidth; + pH264VEComp->pVidEncDynamicParams->videnc2DynamicParams.captureWidth = pPortDef->format.video.nStride; pH264VEComp->pVidEncDynamicParams->videnc2DynamicParams.inputHeight = pPortDef->format.video.nFrameHeight; pH264VEComp->sBase.pPorts[OMX_H264VE_OUTPUT_PORT]->sPortDef.nBufferSize = @@ -627,8 +630,9 @@ static OMX_ERRORTYPE OMXH264VE_SetParameter(OMX_HANDLETYPE hComponent, pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.nBufferSize = (pPortDef->format.video.nFrameHeight * pPortDef->format.video.nStride * 3) / 2; - if (pH264VEComp->bInputMetaDataBufferMode) + if (pH264VEComp->bInputMetaDataBufferMode) { pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.nBufferSize = sizeof(OMX_MetaDataBuffer); + } /* read only field value. update with the frame height.for now codec does not supports the sub frame processing*/ pLocalPortDef->format.video.nSliceHeight=pPortDef->format.video.nFrameHeight; @@ -1017,6 +1021,8 @@ static OMX_ERRORTYPE OMXH264VE_SetParameter(OMX_HANDLETYPE hComponent, pH264VEComp->hCC = (void *) ((IMG_gralloc_module_public_t const *)module); pH264VEComp->bInputMetaDataBufferMode = OMX_TRUE; pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.nBufferSize = sizeof(OMX_MetaDataBuffer); + pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nStride = + ALIGN(pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nStride, HW_ALIGN); } } else { eError = OMX_ErrorUnsupportedSetting; @@ -1832,10 +1838,6 @@ static OMX_ERRORTYPE OMXH264VE_DataNotify(OMX_HANDLETYPE hComponent) (XDAS_Int8 *)&(pH264VEComp->pCodecInBufferBackupArray[InBufferHdrIndex].sMemHdr[0]); pH264VEComp->pVedEncInBufs->planeDesc[i].memType = XDM_MEMTYPE_TILEDPAGE; - pH264VEComp->pVedEncInBufs->imagePitch[0] = pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth; - if (pH264VEComp->pVedEncInBufs->imagePitch[0] % 32) { - pH264VEComp->pVedEncInBufs->imagePitch[0] += (pH264VEComp->pVedEncInBufs->imagePitch[0] % 32); - } } } } else { @@ -1844,26 +1846,23 @@ static OMX_ERRORTYPE OMXH264VE_DataNotify(OMX_HANDLETYPE hComponent) pH264VEComp->pVedEncInBufs->planeDesc[i].buf = (XDAS_Int8 *)&(((OMXBase_BufHdrPvtData *)(pH264VEComp->pCodecInBufferArray[InBufferHdrIndex]->pPlatformPrivate))->sMemHdr[0]); pH264VEComp->pVedEncInBufs->planeDesc[i].memType = XDM_MEMTYPE_RAW; - pH264VEComp->pVedEncInBufs->imagePitch[0] = pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth; } - - pH264VEComp->pVedEncInBufs->planeDesc[i].bufSize.bytes = (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth) * (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameHeight); + pH264VEComp->pVedEncInBufs->imagePitch[0] = pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nStride; + pH264VEComp->pVedEncInBufs->planeDesc[i].bufSize.bytes = (pH264VEComp->pVedEncInBufs->imagePitch[0]) * (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameHeight); } else if( i == 1 ) { if (pH264VEComp->bInputMetaDataBufferMode) { //Nothing to be done; color conversion and fd xlation is done during the plane0 processing memcpy(&(pH264VEComp->pCodecInBufferBackupArray[InBufferHdrIndex].sMemHdr[1]), &(pH264VEComp->pCodecInBufferBackupArray[InBufferHdrIndex].sMemHdr[0]), sizeof(MemHeader)); - pH264VEComp->pCodecInBufferBackupArray[InBufferHdrIndex].sMemHdr[1].offset = ((pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth) * (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameHeight)); + pH264VEComp->pCodecInBufferBackupArray[InBufferHdrIndex].sMemHdr[1].offset = + ((pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nStride) * + (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameHeight)); pH264VEComp->pVedEncInBufs->planeDesc[i].buf = (XDAS_Int8 *)&(pH264VEComp->pCodecInBufferBackupArray[InBufferHdrIndex].sMemHdr[1]); pH264VEComp->pVedEncInBufs->planeDesc[i].memType = XDM_MEMTYPE_TILEDPAGE; - pH264VEComp->pVedEncInBufs->imagePitch[1] = pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth; - if (pH264VEComp->pVedEncInBufs->imagePitch[1] % 32) { - pH264VEComp->pVedEncInBufs->imagePitch[1] += (pH264VEComp->pVedEncInBufs->imagePitch[1] % 32); - } } else { memcpy(&((OMXBase_BufHdrPvtData *)(pH264VEComp->pCodecInBufferArray[InBufferHdrIndex]->pPlatformPrivate))->sMemHdr[1], &((OMXBase_BufHdrPvtData *)(pH264VEComp->pCodecInBufferArray[InBufferHdrIndex]->pPlatformPrivate))->sMemHdr[0], sizeof(MemHeader)); @@ -1872,9 +1871,9 @@ static OMX_ERRORTYPE OMXH264VE_DataNotify(OMX_HANDLETYPE hComponent) pH264VEComp->pVedEncInBufs->planeDesc[i].buf = (XDAS_Int8 *)&(((OMXBase_BufHdrPvtData *)(pH264VEComp->pCodecInBufferArray[InBufferHdrIndex]->pPlatformPrivate))->sMemHdr[1]); pH264VEComp->pVedEncInBufs->planeDesc[i].memType = XDM_MEMTYPE_RAW; - pH264VEComp->pVedEncInBufs->imagePitch[1] = pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth; } - pH264VEComp->pVedEncInBufs->planeDesc[i].bufSize.bytes = (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameWidth) * (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameHeight) / 2; + pH264VEComp->pVedEncInBufs->imagePitch[1] = pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nStride; + pH264VEComp->pVedEncInBufs->planeDesc[i].bufSize.bytes = (pH264VEComp->pVedEncInBufs->imagePitch[1]) * (pH264VEComp->sBase.pPorts[OMX_H264VE_INPUT_PORT]->sPortDef.format.video.nFrameHeight) / 2; } else { eError = OMX_ErrorUnsupportedSetting; diff --git a/omx/videoencode/omx_h264_enc/src/omx_H264videoencoderutils.c b/omx/videoencode/omx_h264_enc/src/omx_H264videoencoderutils.c index 4fe289c..4632fde 100644 --- a/omx/videoencode/omx_h264_enc/src/omx_H264videoencoderutils.c +++ b/omx/videoencode/omx_h264_enc/src/omx_H264videoencoderutils.c @@ -436,7 +436,7 @@ OMX_ERRORTYPE OMXH264VE_SetBufferDesc(OMX_HANDLETYPE hComponent, OMX_U32 nPortIn pH264VEComp->pVedEncInBufs->imageRegion.topLeft.x = 0; pH264VEComp->pVedEncInBufs->imageRegion.topLeft.y = 0; - pH264VEComp->pVedEncInBufs->imageRegion.bottomRight.x = extWidth; + pH264VEComp->pVedEncInBufs->imageRegion.bottomRight.x = extStride; pH264VEComp->pVedEncInBufs->activeFrameRegion.topLeft.x = 0; pH264VEComp->pVedEncInBufs->activeFrameRegion.topLeft.y = 0; |