diff options
author | SeungBeom Kim <sbcrux.kim@samsung.com> | 2013-06-13 12:17:56 +0900 |
---|---|---|
committer | jp abgrall <jpa@google.com> | 2013-08-30 18:33:18 +0000 |
commit | e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107 (patch) | |
tree | 3a293a63280dc780a0027f5af566aaa027f0e479 /exynos_omx | |
parent | 1021eb3052b6af322b604a07f3cafaf3d45e711f (diff) | |
download | exynos5-e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107.tar.gz |
exynos_omx: multi_thread: Add ThumbnailMode decoding.
Extension name:
- EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL "OMX.SEC.index.enableThumbnailMode"
if you want enable thumbnail decoding,
Use SetParameter and EXYNOS_OMX_VIDEO_THUMBNAILMODE struct.
typedef struct _EXYNOS_OMX_VIDEO_THUMBNAILMODE {
OMX_U32 nSize;
OMX_VERSIONTYPE nVersion;
OMX_U32 nPortIndex;
OMX_BOOL bEnable;
} EXYNOS_OMX_VIDEO_THUMBNAILMODE;
Change-Id: I199f286bfbd35266b6f319538a55e64a71070f8e
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
Bug: 10192533
Diffstat (limited to 'exynos_omx')
8 files changed, 90 insertions, 47 deletions
diff --git a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/dec/src/ExynosVideoDecoder.c b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/dec/src/ExynosVideoDecoder.c index 9dec8e1..abf7ae7 100644 --- a/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/dec/src/ExynosVideoDecoder.c +++ b/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/dec/src/ExynosVideoDecoder.c @@ -354,6 +354,30 @@ EXIT: } /* + * [Decoder OPS] Set I-Frame Decoding + */ +static ExynosVideoErrorType MFC_Decoder_Set_IFrameDecoding( + void *pHandle) +{ + ExynosVideoDecContext *pCtx = (ExynosVideoDecContext *)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->hDec, V4L2_CID_MPEG_MFC51_VIDEO_I_FRAME_DECODING, 1) != 0) { + ret = VIDEO_ERROR_APIFAIL; + goto EXIT; + } + +EXIT: + return ret; +} + +/* * [Decoder OPS] Enable Packed PB */ static ExynosVideoErrorType MFC_Decoder_Enable_PackedPB(void *pHandle) @@ -1719,6 +1743,7 @@ static ExynosVideoDecOps defDecOps = { .Init = MFC_Decoder_Init, .Finalize = MFC_Decoder_Finalize, .Set_DisplayDelay = MFC_Decoder_Set_DisplayDelay, + .Set_IFrameDecoding = MFC_Decoder_Set_IFrameDecoding, .Enable_PackedPB = MFC_Decoder_Enable_PackedPB, .Enable_LoopFilter = MFC_Decoder_Enable_LoopFilter, .Enable_SliceMode = MFC_Decoder_Enable_SliceMode, 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 b26cb2e..35c0b47 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 @@ -226,6 +226,7 @@ typedef struct _ExynosVideoDecOps { int (*Get_FrameTag)(void *pHandle); int (*Get_ActualBufferCount)(void *pHandle); ExynosVideoErrorType (*Set_DisplayDelay)(void *pHandle, int delay); + ExynosVideoErrorType (*Set_IFrameDecoding)(void *pHandle); ExynosVideoErrorType (*Enable_PackedPB)(void *pHandle); ExynosVideoErrorType (*Enable_LoopFilter)(void *pHandle); ExynosVideoErrorType (*Enable_SliceMode)(void *pHandle); diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h index 664c899..7f1be9b 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h @@ -60,6 +60,8 @@ #define MFC_INPUT_BUFFER_PLANE 1 #define MFC_OUTPUT_BUFFER_PLANE 2 +#define PLATFORM_DISPLAY_BUFFER 1 + typedef struct { void *pAddrY; diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c index 5aff7b1..ca1ae4d 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c @@ -1343,6 +1343,26 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter( } break; #endif + case OMX_IndexParamEnableThumbnailMode: + { + EXYNOS_OMX_VIDEO_THUMBNAILMODE *pThumbnailMode = (EXYNOS_OMX_VIDEO_THUMBNAILMODE *)ComponentParameterStructure; + EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; + + ret = Exynos_OMX_Check_SizeVersion(pThumbnailMode, sizeof(EXYNOS_OMX_VIDEO_THUMBNAILMODE)); + if (ret != OMX_ErrorNone) { + goto EXIT; + } + + pVideoDec->bThumbnailMode = pThumbnailMode->bEnable; + if (pVideoDec->bThumbnailMode == OMX_TRUE) { + EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; + pExynosOutputPort->portDefinition.nBufferCountMin = 1; + pExynosOutputPort->portDefinition.nBufferCountActual = 1; + } + + ret = OMX_ErrorNone; + } + break; default: { ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure); @@ -1437,14 +1457,6 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetConfig( } switch (nIndex) { - case OMX_IndexVendorThumbnailMode: - { - EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; - pVideoDec->bThumbnailMode = *((OMX_BOOL *)pComponentConfigStructure); - - ret = OMX_ErrorNone; - } - break; default: ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure); break; @@ -1493,17 +1505,25 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex( } #ifdef USE_ANB - if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0) + if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0) { *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamEnableAndroidBuffers; - else if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_GET_ANB) == 0) + goto EXIT; + } + if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_GET_ANB) == 0) { *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamGetAndroidNativeBuffer; - else if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_USE_ANB) == 0) + goto EXIT; + } + if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_USE_ANB) == 0) { *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamUseAndroidNativeBuffer; - else - ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType); -#else - ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType); + goto EXIT; + } #endif + if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { + *pIndexType = OMX_IndexParamEnableThumbnailMode; + goto EXIT; + } + + ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType); EXIT: FunctionOut(); diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c index a62c025..52d17d7 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c @@ -620,7 +620,7 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT } if (pVideoDec->bThumbnailMode == OMX_TRUE) - pDecOps->Set_DisplayDelay(hMFCHandle, 0); + pDecOps->Set_IFrameDecoding(hMFCHandle); /* input buffer info */ Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); @@ -726,6 +726,8 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT pH264Dec->hMFCH264Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); if (pVideoDec->bThumbnailMode == OMX_FALSE) pH264Dec->hMFCH264Handle.maxDPBNum += EXTRA_DPB_NUM; + else + pH264Dec->hMFCH264Handle.maxDPBNum += PLATFORM_DISPLAY_BUFFER; Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "H264CodecSetup nOutbufs: %d", pH264Dec->hMFCH264Handle.maxDPBNum); pH264Dec->hMFCH264Handle.bConfiguredMFCSrc = OMX_TRUE; @@ -764,8 +766,8 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - pExynosOutputPort->portDefinition.nBufferCountActual = pH264Dec->hMFCH264Handle.maxDPBNum - 1; - pExynosOutputPort->portDefinition.nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum - 1; + pExynosOutputPort->portDefinition.nBufferCountActual = pH264Dec->hMFCH264Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; + pExynosOutputPort->portDefinition.nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; Exynos_UpdateFrameSize(pOMXComponent); pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; @@ -1387,13 +1389,7 @@ OMX_ERRORTYPE Exynos_H264Dec_GetExtensionIndex( goto EXIT; } - if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { - EXYNOS_H264DEC_HANDLE *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; - *pIndexType = OMX_IndexVendorThumbnailMode; - ret = OMX_ErrorNone; - } else { - ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); - } + ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); EXIT: FunctionOut(); diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c index 614069e..0bc6bae 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c @@ -724,7 +724,7 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA } if (pVideoDec->bThumbnailMode == OMX_TRUE) - pDecOps->Set_DisplayDelay(hMFCHandle, 0); + pDecOps->Set_IFrameDecoding(hMFCHandle); /* input buffer info */ Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); @@ -829,6 +829,8 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); if (pVideoDec->bThumbnailMode == OMX_FALSE) pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += EXTRA_DPB_NUM; + else + pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += PLATFORM_DISPLAY_BUFFER; Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Mpeg4CodecSetup nOutbufs: %d", pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum); pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE; @@ -862,8 +864,8 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 1; - pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 1; + pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; + pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; Exynos_UpdateFrameSize(pOMXComponent); pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; @@ -1504,13 +1506,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_GetExtensionIndex( goto EXIT; } - if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { - EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; - *pIndexType = OMX_IndexVendorThumbnailMode; - ret = OMX_ErrorNone; - } else { - ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); - } + ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); EXIT: FunctionOut(); diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c index cebb103..8a18f15 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c @@ -539,7 +539,7 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA } if (pVideoDec->bThumbnailMode == OMX_TRUE) - pDecOps->Set_DisplayDelay(hMFCHandle, 0); + pDecOps->Set_IFrameDecoding(hMFCHandle); /* input buffer info */ Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf)); @@ -640,6 +640,8 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); if (pVideoDec->bThumbnailMode == OMX_FALSE) pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM; + else + pVp8Dec->hMFCVp8Handle.maxDPBNum += PLATFORM_DISPLAY_BUFFER; Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum); pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE; @@ -673,8 +675,8 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 1; - pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 1; + pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; + pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; Exynos_UpdateFrameSize(pOMXComponent); pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; @@ -1115,13 +1117,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex( goto EXIT; } - if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { - EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle; - *pIndexType = OMX_IndexVendorThumbnailMode; - ret = OMX_ErrorNone; - } else { - ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); - } + ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType); EXIT: FunctionOut(); 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 048dea1..1980735 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 @@ -68,8 +68,8 @@ typedef struct _EXYNOS_OMX_PRIORITYMGMTTYPE typedef enum _EXYNOS_OMX_INDEXTYPE { -#define EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL "OMX.SEC.index.ThumbnailMode" - OMX_IndexVendorThumbnailMode = 0x7F000001, +#define EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL "OMX.SEC.index.enableThumbnailMode" + OMX_IndexParamEnableThumbnailMode = 0x7F000001, #define EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD "OMX.SEC.index.VideoIntraPeriod" OMX_IndexConfigVideoIntraPeriod = 0x7F000002, @@ -161,6 +161,13 @@ typedef struct _EXYNOS_OMX_VIDEO_PROFILELEVEL OMX_S32 level; } EXYNOS_OMX_VIDEO_PROFILELEVEL; +typedef struct _EXYNOS_OMX_VIDEO_THUMBNAILMODE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; +} EXYNOS_OMX_VIDEO_THUMBNAILMODE; + #define OMX_VIDEO_CodingVPX 0x09 /**< Google VPX, formerly known as On2 VP8 */ #ifndef __OMX_EXPORTS |