diff options
Diffstat (limited to 'exynos_omx')
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); |