summaryrefslogtreecommitdiffstats
path: root/exynos_omx
diff options
context:
space:
mode:
authorSeungBeom Kim <sbcrux.kim@samsung.com>2013-06-04 16:37:06 +0900
committerjp abgrall <jpa@google.com>2013-08-30 18:32:27 +0000
commit1021eb3052b6af322b604a07f3cafaf3d45e711f (patch)
tree8dca603166ffcce050ba5eb650d85c4aa6ed8529 /exynos_omx
parent1e1f2adea2506cd1d2e30cd1b3dbe5f8389f9dc9 (diff)
downloadandroid_hardware_samsung_slsi_exynos5-1021eb3052b6af322b604a07f3cafaf3d45e711f.tar.gz
android_hardware_samsung_slsi_exynos5-1021eb3052b6af322b604a07f3cafaf3d45e711f.tar.bz2
android_hardware_samsung_slsi_exynos5-1021eb3052b6af322b604a07f3cafaf3d45e711f.zip
exynos_omx: multi_thread: Added prependSPSPPSToIDRFrames to support the expansion of Google.
When using "OMX.google.android.index.prependSPSPPSToIDRFrames" extension index, support prepending SPS/PPS at every IDR/I frame. Change-Id: Idf6669708d627ede013f053de9c8bfaa78181675 Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com> Bug: 10192533
Diffstat (limited to 'exynos_omx')
-rw-r--r--exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c47
-rw-r--r--exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include/ExynosVideoApi.h1
-rw-r--r--exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c20
-rw-r--r--exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.h1
-rw-r--r--exynos_omx/openmax/exynos_omx/include/exynos/Exynos_OMX_Def.h3
-rw-r--r--exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp19
-rw-r--r--exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h2
7 files changed, 81 insertions, 12 deletions
diff --git a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c
index b779784..8d646db 100644
--- a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c
+++ b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c
@@ -824,6 +824,30 @@ EXIT:
}
/*
+ * [Encoder OPS] Enable Prepend SPS and PPS to every IDR Frames
+ */
+static ExynosVideoErrorType MFC_Encoder_Enable_PrependSpsPpsToIdr(void *pHandle)
+{
+ ExynosVideoEncContext *pCtx = (ExynosVideoEncContext *)pHandle;
+ ExynosVideoErrorType ret = VIDEO_ERROR_NONE;
+
+ if (pCtx == NULL) {
+ ALOGE("%s: Video context info must be supplied", __func__);
+ ret = VIDEO_ERROR_BADPARAM;
+ goto EXIT;
+ }
+
+ if (exynos_v4l2_s_ctrl(pCtx->hEnc, V4L2_CID_MPEG_VIDEO_H264_PREPEND_SPSPPS_TO_IDR, 1) != 0) {
+ ALOGE("%s: Failed to s_ctrl", __func__);
+ ret = VIDEO_ERROR_APIFAIL;
+ goto EXIT;
+ }
+
+EXIT:
+ return ret;
+}
+
+/*
* [Encoder Buffer OPS] Enable Cacheable (Input)
*/
static ExynosVideoErrorType MFC_Encoder_Enable_Cacheable_Inbuf(void *pHandle)
@@ -2245,17 +2269,18 @@ EXIT:
* [Encoder OPS] Common
*/
static ExynosVideoEncOps defEncOps = {
- .nSize = 0,
- .Init = MFC_Encoder_Init,
- .Finalize = MFC_Encoder_Finalize,
- .Set_EncParam = MFC_Encoder_Set_EncParam,
- .Set_FrameType = MFC_Encoder_Set_FrameType,
- .Set_FrameRate = MFC_Encoder_Set_FrameRate,
- .Set_BitRate = MFC_Encoder_Set_BitRate,
- .Set_FrameSkip = MFC_Encoder_Set_FrameSkip,
- .Set_IDRPeriod = MFC_Encoder_Set_IDRPeriod,
- .Set_FrameTag = MFC_Encoder_Set_FrameTag,
- .Get_FrameTag = MFC_Encoder_Get_FrameTag,
+ .nSize = 0,
+ .Init = MFC_Encoder_Init,
+ .Finalize = MFC_Encoder_Finalize,
+ .Set_EncParam = MFC_Encoder_Set_EncParam,
+ .Set_FrameType = MFC_Encoder_Set_FrameType,
+ .Set_FrameRate = MFC_Encoder_Set_FrameRate,
+ .Set_BitRate = MFC_Encoder_Set_BitRate,
+ .Set_FrameSkip = MFC_Encoder_Set_FrameSkip,
+ .Set_IDRPeriod = MFC_Encoder_Set_IDRPeriod,
+ .Set_FrameTag = MFC_Encoder_Set_FrameTag,
+ .Get_FrameTag = MFC_Encoder_Get_FrameTag,
+ .Enable_PrependSpsPpsToIdr = MFC_Encoder_Enable_PrependSpsPpsToIdr,
};
/*
diff --git a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include/ExynosVideoApi.h b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include/ExynosVideoApi.h
index b8197de..b26cb2e 100644
--- a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include/ExynosVideoApi.h
+++ b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include/ExynosVideoApi.h
@@ -247,6 +247,7 @@ typedef struct _ExynosVideoEncOps {
ExynosVideoErrorType (*Set_BitRate)(void *pHandle, int bitRate);
ExynosVideoErrorType (*Set_FrameSkip)(void *pHandle, int frameSkip);
ExynosVideoErrorType (*Set_IDRPeriod)(void *pHandle, int period);
+ ExynosVideoErrorType (*Enable_PrependSpsPpsToIdr)(void *pHandle);
} ExynosVideoEncOps;
typedef struct _ExynosVideoDecBufferOps {
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
index 497366b..1349a0a 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
@@ -796,6 +796,13 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
}
}
+ if (pMFCH264Handle->bPrependSpsPpsToIdr == OMX_TRUE) {
+ if (pEncOps->Enable_PrependSpsPpsToIdr)
+ pEncOps->Enable_PrependSpsPpsToIdr(pH264Enc->hMFCH264Handle.hMFCHandle);
+ else
+ Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: Not supported control: Enable_PrependSpsPpsToIdr", __func__);
+ }
+
/* input buffer info: only 3 config values needed */
Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;//VIDEO_COLORFORMAT_NV12;
@@ -1299,6 +1306,13 @@ OMX_ERRORTYPE Exynos_H264Enc_SetParameter(
pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
}
break;
+ case OMX_IndexParamPrependSPSPPSToIDR:
+ {
+ EXYNOS_H264ENC_HANDLE *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+
+ ret = Exynos_OSAL_SetPrependSPSPPSToIDR(pComponentParameterStructure, &(pH264Enc->hMFCH264Handle.bPrependSpsPpsToIdr));
+ }
+ break;
default:
ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
break;
@@ -1481,6 +1495,9 @@ OMX_ERRORTYPE Exynos_H264Enc_GetExtensionIndex(
if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) {
*pIndexType = OMX_IndexConfigVideoIntraPeriod;
ret = OMX_ErrorNone;
+ } else if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_PREPEND_SPSPPS_TO_IDR) == 0) {
+ *pIndexType = OMX_IndexParamPrependSPSPPSToIDR;
+ ret = OMX_ErrorNone;
} else {
ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
}
@@ -1525,7 +1542,7 @@ OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
EXYNOS_H264ENC_HANDLE *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;;
- EXYNOS_MFC_H264ENC_HANDLE *pMFCH264Handle = &pH264Enc->hMFCH264Handle;
+ EXYNOS_MFC_H264ENC_HANDLE *pMFCH264Handle = NULL;
OMX_PTR hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
OMX_COLOR_FORMATTYPE eColorFormat;
@@ -1559,6 +1576,7 @@ OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
if (ret != OMX_ErrorNone) {
goto EXIT;
}
+ pMFCH264Handle = &pH264Enc->hMFCH264Handle;
pEncOps = pH264Enc->hMFCH264Handle.pEncOps;
pInbufOps = pH264Enc->hMFCH264Handle.pInbufOps;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.h b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.h
index 4e66be6..62b13f9 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.h
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.h
@@ -47,6 +47,7 @@ typedef struct _EXYNOS_MFC_H264ENC_HANDLE
OMX_U32 outputIndexTimestamp;
OMX_BOOL bConfiguredMFCSrc;
OMX_BOOL bConfiguredMFCDst;
+ OMX_BOOL bPrependSpsPpsToIdr;
EXTRA_DATA headerData;
ExynosVideoDecOps *pEncOps;
diff --git a/exynos_omx/openmax/exynos_omx/include/exynos/Exynos_OMX_Def.h b/exynos_omx/openmax/exynos_omx/include/exynos/Exynos_OMX_Def.h
index 94461ef..048dea1 100644
--- a/exynos_omx/openmax/exynos_omx/include/exynos/Exynos_OMX_Def.h
+++ b/exynos_omx/openmax/exynos_omx/include/exynos/Exynos_OMX_Def.h
@@ -83,6 +83,9 @@ typedef enum _EXYNOS_OMX_INDEXTYPE
/* for Android Store Metadata Inbuffer */
#define EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER "OMX.google.android.index.storeMetaDataInBuffers"
OMX_IndexParamStoreMetaDataBuffer = 0x7F000014,
+ /* prepend SPS/PPS to I/IDR for H.264 Encoder */
+#define EXYNOS_INDEX_PARAM_PREPEND_SPSPPS_TO_IDR "OMX.google.android.index.prependSPSPPSToIDRFrames"
+ OMX_IndexParamPrependSPSPPSToIDR = 0x7F000015,
/* for Android PV OpenCore*/
OMX_COMPONENT_CAPABILITY_TYPE_INDEX = 0xFF7A347
diff --git a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp
index 17d410f..3220345 100644
--- a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp
+++ b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp
@@ -598,6 +598,25 @@ EXIT:
return ret;
}
+OMX_ERRORTYPE Exynos_OSAL_SetPrependSPSPPSToIDR(
+ OMX_PTR pComponentParameterStructure,
+ OMX_PTR pbPrependSpsPpsToIdr)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ PrependSPSPPSToIDRFramesParams *pANBParams = (PrependSPSPPSToIDRFramesParams *)pComponentParameterStructure;
+
+ ret = Exynos_OMX_Check_SizeVersion(pANBParams, sizeof(PrependSPSPPSToIDRFramesParams));
+ if (ret != OMX_ErrorNone) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_Check_SizeVersion(PrependSPSPPSToIDRFrames) is failed", __func__);
+ goto EXIT;
+ }
+
+ (*((OMX_BOOL *)pbPrependSpsPpsToIdr)) = pANBParams->bEnable;
+
+EXIT:
+ return ret;
+}
+
OMX_COLOR_FORMATTYPE Exynos_OSAL_Hal2OMXPixelFormat(
unsigned int hal_format)
{
diff --git a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h
index ee1e342..381b9f9 100644
--- a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h
+++ b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h
@@ -70,6 +70,8 @@ OMX_ERRORTYPE Exynos_OSAL_GetInfoFromMetaData(OMX_IN OMX_BYTE pBuffer,
OMX_ERRORTYPE Exynos_OSAL_CheckANB(OMX_IN EXYNOS_OMX_DATA *pBuffer,
OMX_OUT OMX_BOOL *bIsANBEnabled);
+OMX_ERRORTYPE Exynos_OSAL_SetPrependSPSPPSToIDR(OMX_PTR pComponentParameterStructure,
+ OMX_PTR pbPrependSpsPpsToIdr);
OMX_COLOR_FORMATTYPE Exynos_OSAL_Hal2OMXPixelFormat(unsigned int hal_format);
unsigned int Exynos_OSAL_OMX2HalPixelFormat(OMX_COLOR_FORMATTYPE omx_format);