summaryrefslogtreecommitdiff
path: root/mm-video-v4l2
diff options
context:
space:
mode:
authorAmit Shekhar <ashekhar@codeaurora.org>2018-03-08 21:38:18 -0800
committerAmit Shekhar <ashekhar@codeaurora.org>2018-03-08 21:38:18 -0800
commitc2ed297f76296ceee66d6b197c609887cbfa6720 (patch)
treeda5e9beb1a8e9e73a76f9fb5da52b413c0b9cfdd /mm-video-v4l2
parent3eb78b4cec7bc9de5c9cf467edb0c448d1b09c7e (diff)
downloadmedia-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.h3
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp28
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");
}