diff options
author | Deva Ramasubramanian <dramasub@codeaurora.org> | 2013-01-28 20:15:29 -0800 |
---|---|---|
committer | Arne Coucheron <arco68@gmail.com> | 2015-12-17 06:55:10 +0100 |
commit | beb3f68bcef45fc63f4c0bc21cc2a655a2cf8c88 (patch) | |
tree | e04f566291323101bfa6730a41ced6e135c19386 | |
parent | 799cd1d99314a3717f68c75f2bb6f0e785aace8d (diff) | |
download | android_hardware_qcom_media-stable/cm-13.0-caf-8960-ZNH0E.tar.gz android_hardware_qcom_media-stable/cm-13.0-caf-8960-ZNH0E.tar.bz2 android_hardware_qcom_media-stable/cm-13.0-caf-8960-ZNH0E.zip |
mm-video: vidc: Add support for picture order countstable/cm-13.0-caf-8960-ZNH0E
Add support for picture order count. By default PicOrderType
is set to 2 for H264 encode. Setting this parameter in the
sps/pps to 2 causes the decoder to return the first I-frame
immediately after decode, as opposed to holding onto it
until the next frame. Apps can configure it via OMX
Get/Set API.
Change-Id: I57c6287603747ef7e838e7017e2378a6c9e736af
-rw-r--r-- | mm-core/inc/OMX_QCOMExtns.h | 7 | ||||
-rw-r--r-- | mm-video/vidc/venc/inc/omx_video_base.h | 1 | ||||
-rw-r--r-- | mm-video/vidc/venc/inc/video_encoder_device.h | 3 | ||||
-rw-r--r-- | mm-video/vidc/venc/src/omx_video_base.cpp | 8 | ||||
-rw-r--r-- | mm-video/vidc/venc/src/omx_video_encoder.cpp | 55 | ||||
-rw-r--r-- | mm-video/vidc/venc/src/video_encoder_device.cpp | 26 |
6 files changed, 85 insertions, 15 deletions
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h index 3532fd4e..9017a6a0 100644 --- a/mm-core/inc/OMX_QCOMExtns.h +++ b/mm-core/inc/OMX_QCOMExtns.h @@ -433,6 +433,7 @@ enum OMX_QCOM_EXTN_INDEXTYPE /* Enable VQZIP SEI NAL type */ OMX_QTIIndexParamVQZIPSEIType = 0x7F000053, + OMX_QcomIndexParamPictureOrderCountType = 0x7F000054, }; /** @@ -1596,6 +1597,12 @@ typedef struct QOMX_VPP_ENABLE { OMX_BOOL enable_vpp; } QOMX_VPP_ENABLE; +typedef struct QOMX_PICTURE_ORDER_COUNT_TYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nType; +} QOMX_PICTURE_ORDER_COUNT_TYPE; + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/mm-video/vidc/venc/inc/omx_video_base.h b/mm-video/vidc/venc/inc/omx_video_base.h index 71b30e5d..bb8d7c3b 100644 --- a/mm-video/vidc/venc/inc/omx_video_base.h +++ b/mm-video/vidc/venc/inc/omx_video_base.h @@ -542,6 +542,7 @@ public: QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount; QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod; QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse; + QOMX_PICTURE_ORDER_COUNT_TYPE m_sPicureOrderCount; // fill this buffer queue omx_cmd_queue m_ftb_q; // Command Q for rest of the events diff --git a/mm-video/vidc/venc/inc/video_encoder_device.h b/mm-video/vidc/venc/inc/video_encoder_device.h index 3f8e3007..7d71732a 100644 --- a/mm-video/vidc/venc/inc/video_encoder_device.h +++ b/mm-video/vidc/venc/inc/video_encoder_device.h @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. +Copyright (c) 2010-2013, 2015, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -161,6 +161,7 @@ private: bool venc_set_ltrcount(OMX_U32 count); bool venc_set_ltrperiod(OMX_U32 period); bool venc_set_ltruse(OMX_U32 id, OMX_U32 frames); + bool venc_set_picture_order_count_type(OMX_U32 type); #ifdef MAX_RES_1080P OMX_U32 pmem_free(); diff --git a/mm-video/vidc/venc/src/omx_video_base.cpp b/mm-video/vidc/venc/src/omx_video_base.cpp index 10f80de3..257ccb79 100644 --- a/mm-video/vidc/venc/src/omx_video_base.cpp +++ b/mm-video/vidc/venc/src/omx_video_base.cpp @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. +Copyright (c) 2010-2013, 2015, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1944,6 +1944,12 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp, } break; } + case OMX_QcomIndexParamPictureOrderCountType: + { + QOMX_PICTURE_ORDER_COUNT_TYPE *pParam = (QOMX_PICTURE_ORDER_COUNT_TYPE *)paramData; + memcpy(pParam, &m_sPicureOrderCount, sizeof(m_sPicureOrderCount)); + break; + } case OMX_IndexParamVideoSliceFMO: default: { diff --git a/mm-video/vidc/venc/src/omx_video_encoder.cpp b/mm-video/vidc/venc/src/omx_video_encoder.cpp index 3a215bf0..6d7a34de 100644 --- a/mm-video/vidc/venc/src/omx_video_encoder.cpp +++ b/mm-video/vidc/venc/src/omx_video_encoder.cpp @@ -256,6 +256,10 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role) m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_AVCLevel1; } + OMX_INIT_STRUCT(&m_sPicureOrderCount, QOMX_PICTURE_ORDER_COUNT_TYPE); + if(codec_type == OMX_VIDEO_CodingAVC) + m_sPicureOrderCount.nType = 2; + // Initialize the video parameters for input port OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE); m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN; @@ -415,19 +419,6 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role) m_state = OMX_StateLoaded; m_sExtraData = 0; - // For H264 enable some parameters in VUI by default - if (codec_type == OMX_VIDEO_CodingAVC) - { - QOMX_VUI_BITSTREAM_RESTRICT parm; - OMX_INIT_STRUCT(&parm, QOMX_VUI_BITSTREAM_RESTRICT); - parm.bEnable = OMX_TRUE; - if (set_parameter(NULL, (OMX_INDEXTYPE)OMX_QcomIndexParamEnableVUIStreamRestrictFlag, - (OMX_PTR)&parm)) { - // Don't treat this as a fatal error - DEBUG_PRINT_ERROR("Unable to set EnableVUIStreamRestrictFlag as default"); - } - } - if(eRet == OMX_ErrorNone) { if(pipe(fds)) @@ -776,7 +767,33 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp, DEBUG_PRINT_ERROR("Warning: B frames not supported\n"); avc_param.nBFrames = 0; } + +#ifdef MAX_RES_1080P + // These settings are geared toward the WFD usecase + if (pParam->eProfile == OMX_VIDEO_AVCProfileBaseline) + { + //set the BITSTREAM_RESTRICT flag in the vui + QOMX_VUI_BITSTREAM_RESTRICT br; + OMX_INIT_STRUCT(&br, QOMX_VUI_BITSTREAM_RESTRICT); + br.bEnable = OMX_TRUE; + if (!handle->venc_set_param((OMX_PTR)&br, + (OMX_INDEXTYPE)OMX_QcomIndexParamEnableVUIStreamRestrictFlag)) { + DEBUG_PRINT_ERROR("Unable to set EnableVUIStreamRestrictFlag as default"); + return OMX_ErrorHardware; + } + } + if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC) + { + //set the PIC_ORDER_CNT_TYPE flag in the sps + if (!handle->venc_set_param((OMX_PTR)&m_sPicureOrderCount, + (OMX_INDEXTYPE)OMX_QcomIndexParamPictureOrderCountType)) { + DEBUG_PRINT_ERROR("Unable to set PictureOrderCountType as default"); + return OMX_ErrorHardware; + } + } +#endif } + if(handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true) { return OMX_ErrorUnsupportedSetting; @@ -1235,6 +1252,18 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp, } break; } + case OMX_QcomIndexParamPictureOrderCountType: + { + if(!handle->venc_set_param(paramData, + (OMX_INDEXTYPE)OMX_QcomIndexParamPictureOrderCountType)) + { + DEBUG_PRINT_ERROR("ERROR: Request for setting poc failed"); + return OMX_ErrorUnsupportedSetting; + } + memcpy(&m_sPicureOrderCount, (QOMX_PICTURE_ORDER_COUNT_TYPE *)paramData, + sizeof(m_sPicureOrderCount)); + break; + } case OMX_IndexParamVideoSliceFMO: default: { diff --git a/mm-video/vidc/venc/src/video_encoder_device.cpp b/mm-video/vidc/venc/src/video_encoder_device.cpp index d8f6f942..1c3c7956 100644 --- a/mm-video/vidc/venc/src/video_encoder_device.cpp +++ b/mm-video/vidc/venc/src/video_encoder_device.cpp @@ -1150,6 +1150,18 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index ) } break; } + case OMX_QcomIndexParamPictureOrderCountType: + { + QOMX_PICTURE_ORDER_COUNT_TYPE *pParam = + (QOMX_PICTURE_ORDER_COUNT_TYPE *)paramData; + + if(venc_set_picture_order_count_type(pParam->nType) == false) + { + DEBUG_PRINT_ERROR("Setting poc type failed"); + return false; + } + break; + } case OMX_IndexParamVideoSliceFMO: default: DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u", @@ -3303,3 +3315,17 @@ bool venc_dev::venc_get_uncache_flag() return m_use_uncache_buffers; } +bool venc_dev::venc_set_picture_order_count_type(OMX_U32 type) +{ + venc_poctype temp; + venc_ioctl_msg ioctl_msg = {&temp, NULL}; + + temp.poc_type = type; + DEBUG_PRINT_HIGH("Setting poc type: %d", type); + if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_PIC_ORDER_CNT_TYPE, (void *)&ioctl_msg) < 0) + { + DEBUG_PRINT_ERROR("Request for setting poc type failed"); + return false; + } + return true; +} |