diff options
| author | Luca Stefani <luca020400@lineageos.org> | 2017-02-28 14:41:22 +0100 |
|---|---|---|
| committer | Luca Stefani <luca020400@lineageos.org> | 2017-02-28 18:28:17 +0100 |
| commit | 726d5c5370704d79ba1b54f361fe7deebd6dba6d (patch) | |
| tree | fc9089d371dac0034272ddd414e1a8da62820443 | |
| parent | b5a8b18081278b8d3cce3f6bd2b7cfcbdf76e459 (diff) | |
| parent | be8de4353c7ac12047ae82a557e393bdd047d1f5 (diff) | |
| download | android_hardware_qcom_media-cm-14.1-caf-8952.tar.gz android_hardware_qcom_media-cm-14.1-caf-8952.tar.bz2 android_hardware_qcom_media-cm-14.1-caf-8952.zip | |
Merge remote-tracking branch 'caf/LA.BR.1.3.6_rb1.14' into HEADcm-14.1-caf-8952
Change-Id: I58383cbbb9a7ef87c581a912cd00a0044c6d3a58
| -rw-r--r-- | mm-core/inc/OMX_QCOMExtns.h | 16 | ||||
| -rw-r--r-- | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 1 | ||||
| -rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp | 10 | ||||
| -rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 49 |
4 files changed, 76 insertions, 0 deletions
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h index 39ea5e5d..93da3b54 100644 --- a/mm-core/inc/OMX_QCOMExtns.h +++ b/mm-core/inc/OMX_QCOMExtns.h @@ -575,6 +575,9 @@ enum OMX_QCOM_EXTN_INDEXTYPE OMX_QTIIndexParamVPXColorSpaceExtraData = 0x7F000066, /* Enable client extradata */ OMX_QTIIndexParamVideoClientExtradata = 0x7F000060, + + /* Suggest how big Iframe sizes should be */ + OMX_QTIIndexParamIframeSizeType = 0x7F000070, }; /** @@ -1742,6 +1745,19 @@ typedef struct QOMX_VIDEO_H264ENTROPYCODINGTYPE { OMX_U32 nCabacInitIdc; } QOMX_VIDEO_H264ENTROPYCODINGTYPE; +typedef enum QOMX_VIDEO_IFRAMESIZE_TYPE { + QOMX_IFRAMESIZE_DEFAULT, + QOMX_IFRAMESIZE_MEDIUM, + QOMX_IFRAMESIZE_HUGE, + QOMX_IFRAMESIZE_UNLIMITED, +} QOMX_VIDEO_IFRAMESIZE_TYPE; + +typedef struct QOMX_VIDEO_IFRAMESIZE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + QOMX_VIDEO_IFRAMESIZE_TYPE eType; +} QOMX_VIDEO_IFRAMESIZE; + /* VIDEO POSTPROCESSING CTRLS AND ENUMS */ /* MUST KEEP SAME AS IN vpp.h */ #define QOMX_VPP_HQV_CUSTOMPAYLOAD_SZ 256 diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h index c65b7897..7cf19096 100644 --- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h +++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h @@ -443,6 +443,7 @@ class venc_dev void venc_clip_luma_chroma(int fd, OMX_U32 offset, OMX_U32 size); bool venc_set_layer_bitrates(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hpmode); bool venc_set_colorspace(OMX_U32 primaries, OMX_U32 range, OMX_U32 transfer_chars, OMX_U32 matrix_coeffs); + bool venc_set_iframesize_type(QOMX_VIDEO_IFRAMESIZE_TYPE type); #ifdef MAX_RES_1080P OMX_U32 pmem_free(); diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp index 1104dafb..54b1949c 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp @@ -1606,6 +1606,16 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp, } break; } + case OMX_QTIIndexParamIframeSizeType: + { + VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_IFRAMESIZE); + if (!handle->venc_set_param(paramData, + (OMX_INDEXTYPE)OMX_QTIIndexParamIframeSizeType)) { + DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamIframeSizeType failed"); + return OMX_ErrorUnsupportedSetting; + } + break; + } case OMX_IndexParamVideoSliceFMO: default: { diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 25a03580..6f43692c 100644 --- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -1437,6 +1437,7 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) struct v4l2_format fmt; struct v4l2_requestbuffers bufreq; int ret; + bool isCBR; switch ((int)index) { case OMX_IndexParamPortDefinition: @@ -2065,6 +2066,23 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) } break; } + case OMX_QTIIndexParamIframeSizeType: + { + QOMX_VIDEO_IFRAMESIZE* pParam = + (QOMX_VIDEO_IFRAMESIZE *)paramData; + isCBR = rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR || + rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR; + if (!isCBR) { + DEBUG_PRINT_ERROR("venc_set_param: OMX_QTIIndexParamIframeSizeType not allowed for this configuration isCBR(%d)", + isCBR); + return OMX_ErrorUnsupportedSetting; + } + if (!venc_set_iframesize_type(pParam->eType)) { + DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamIframeSizeType failed"); + return OMX_ErrorUnsupportedSetting; + } + break; + } case OMX_IndexParamVideoSliceFMO: default: DEBUG_PRINT_ERROR("ERROR: Unsupported parameter in venc_set_param: %u", @@ -5344,6 +5362,37 @@ bool venc_dev::venc_set_lowlatency_mode(OMX_BOOL enable) return true; } +bool venc_dev::venc_set_iframesize_type(QOMX_VIDEO_IFRAMESIZE_TYPE type) +{ + struct v4l2_control control; + control.id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE; + + switch (type) { + case QOMX_IFRAMESIZE_DEFAULT: + control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT; + break; + case QOMX_IFRAMESIZE_MEDIUM: + control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM; + break; + case QOMX_IFRAMESIZE_HUGE: + control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE; + break; + case QOMX_IFRAMESIZE_UNLIMITED: + control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED; + break; + default: + DEBUG_PRINT_INFO("Unknown Iframe Size found setting it to default"); + control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT; + } + + if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { + DEBUG_PRINT_ERROR("Failed to set iframe size hint"); + return false; + } + + return true; +} + bool venc_dev::venc_set_vui_timing_info(OMX_BOOL enable) { struct v4l2_control control; |
