diff options
author | Amit Shekhar <ashekhar@codeaurora.org> | 2018-03-08 21:38:18 -0800 |
---|---|---|
committer | Amit Shekhar <ashekhar@codeaurora.org> | 2018-03-08 21:38:18 -0800 |
commit | c2ed297f76296ceee66d6b197c609887cbfa6720 (patch) | |
tree | da5e9beb1a8e9e73a76f9fb5da52b413c0b9cfdd /mm-video-v4l2 | |
parent | 3eb78b4cec7bc9de5c9cf467edb0c448d1b09c7e (diff) | |
download | media-c2ed297f76296ceee66d6b197c609887cbfa6720.tar.gz |
media: Support constant quality and quality factor for HEVC
Add support for ConstantQuality rate control type.
Add support for QualityFactor.
Change-Id: Idd2af4aee60bc4c40429281eec963a13dd51ae53
CRs-Fixed: 2197138
Diffstat (limited to 'mm-video-v4l2')
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 3 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 28 |
2 files changed, 28 insertions, 3 deletions
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 9885b8c6..e7d56eff 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 @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2012-2018, 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 @@ -468,6 +468,7 @@ class venc_dev bool bframe_implicitly_enabled; bool client_req_disable_temporal_layers; bool client_req_turbo_mode; + static const unsigned int QFQPMapping[21]; bool venc_query_cap(struct v4l2_queryctrl &cap); bool venc_validate_range(OMX_S32 id, OMX_S32 val); 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 f1eecbe6..bd1e9ef4 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 @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2010-2018, 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: @@ -86,6 +86,10 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define VENC_BFRAME_MAX_WIDTH 1920 #define VENC_BFRAME_MAX_HEIGHT 1088 +// Scaled quality factor - QP mapping +#define SCALED_QUALITY_FACTOR_MAX 20 +const unsigned int venc_dev::QFQPMapping[21] = {51, 47, 43, 39, 35, 31, 28, 25, 22, 19, 16, 13, 11, 9, 7, 5, 6, 4, 3, 2}; + #undef LOG_TAG #define LOG_TAG "OMX-VENC: venc_dev" @@ -2105,8 +2109,16 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate"); if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { + // Quality factor setting + unsigned int scaledQF; + if (pParam->eControlRate == OMX_Video_ControlRateConstantQuality) { + pParam->eControlRate = OMX_Video_ControlRateDisable; + scaledQF = pParam->nQualityFactor / 5; + scaledQF = (scaledQF > SCALED_QUALITY_FACTOR_MAX) ? SCALED_QUALITY_FACTOR_MAX : scaledQF; + } + if (!venc_set_target_bitrate(pParam->nTargetBitrate)) { - DEBUG_PRINT_ERROR("ERROR: Target Bit Rate setting failed"); + DEBUG_PRINT_ERROR("ERROR: Setting Target Bit Rate / Quality Factor failed"); return false; } @@ -2114,6 +2126,18 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) DEBUG_PRINT_ERROR("ERROR: Rate Control setting failed"); return false; } + // Setting QP values + if (((OMX_VIDEO_PARAM_BITRATETYPE*)paramData)->eControlRate == OMX_Video_ControlRateDisable) { + if (venc_set_qp(QFQPMapping[scaledQF], + QFQPMapping[scaledQF], + QFQPMapping[scaledQF], + ENABLE_I_QP | ENABLE_P_QP | ENABLE_B_QP) == false) { + DEBUG_PRINT_ERROR("ERROR: Setting QP values failed"); + return false; + } + DEBUG_PRINT_LOW("Rate control: %u Quality factor(client): %u scaledQF: %u", + pParam->eControlRate, pParam->nQualityFactor, scaledQF); + } } else { DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoBitrate"); } |