summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunita Nadampalli <sunitan@ti.com>2016-08-24 13:01:06 -0500
committerVishal Mahaveer <vishalm@ti.com>2016-09-15 13:09:07 -0500
commitfa29dcbac2dbc6d5f7cc705ddb69ded98fe32a00 (patch)
tree484e6872e87af52990a19881d038fa7dfcf78d54
parenta706e55444d7a82454e9c8c127e751340f9e7559 (diff)
downloaddra7xx-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.c33
-rw-r--r--omx/videoencode/omx_h264_enc/src/omx_H264videoencoderutils.c2
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;