aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-05-23 05:22:53 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-05-23 05:22:52 -0700
commit30a7c50b1a26269c93e3ebb2623d040891b8a018 (patch)
tree0aa165c9b37b1c4b5442e1fe042bc6938c34acfa
parent8d0edcc26e32a696e12b0f7f69b7edd6b2f95b6f (diff)
parentad24a330be2f619ac6e980c57b6ee4d18bd4b71a (diff)
Merge "msm: vidc: Add support for setting dynamic QP range" into kernel.lnx.4.9.r24-relLA.UM.6.8.1.r2-02100-QCS605.0
-rw-r--r--drivers/media/platform/msm/vidc/hfi_packetization.c31
-rw-r--r--drivers/media/platform/msm/vidc/msm_venc.c61
-rw-r--r--drivers/media/platform/msm/vidc/vidc_hfi_api.h1
-rw-r--r--drivers/media/platform/msm/vidc/vidc_hfi_helper.h4
-rw-r--r--include/uapi/linux/v4l2-controls.h3
5 files changed, 97 insertions, 3 deletions
diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c
index 9ef9d05d92f4..8c801d5080c4 100644
--- a/drivers/media/platform/msm/vidc/hfi_packetization.c
+++ b/drivers/media/platform/msm/vidc/hfi_packetization.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1396,6 +1396,35 @@ int create_pkt_cmd_session_set_property(
sizeof(struct hfi_quantization_range);
break;
}
+ case HAL_CONFIG_VENC_FRAME_QP_RANGE:
+ {
+ struct hfi_quantization_range *hfi;
+ struct hal_quantization_range *hal_range =
+ (struct hal_quantization_range *) pdata;
+
+ pkt->rg_property_data[0] =
+ HFI_PROPERTY_CONFIG_VENC_FRAME_QP_RANGE;
+ hfi = (struct hfi_quantization_range *)
+ &pkt->rg_property_data[1];
+
+ /*
+ * When creating the packet, pack the qp value as
+ * 0xbbppii, where ii = qp range for I-frames,
+ * pp = qp range for P-frames, etc.
+ */
+ hfi->min_qp.qp_packed = hal_range->qpi_min |
+ hal_range->qpp_min << 8 |
+ hal_range->qpb_min << 16;
+ hfi->max_qp.qp_packed = hal_range->qpi_max |
+ hal_range->qpp_max << 8 |
+ hal_range->qpb_max << 16;
+ hfi->max_qp.layer_id = hal_range->layer_id;
+ hfi->min_qp.layer_id = hal_range->layer_id;
+
+ pkt->size += sizeof(u32) +
+ sizeof(struct hfi_quantization_range);
+ break;
+ }
case HAL_CONFIG_VENC_INTRA_PERIOD:
{
struct hfi_intra_period *hfi;
diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c
index 148df7dc857b..9416ab4e1374 100644
--- a/drivers/media/platform/msm/vidc/msm_venc.c
+++ b/drivers/media/platform/msm/vidc/msm_venc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -904,6 +904,16 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
.qmenu = NULL,
},
{
+ .id = V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP,
+ .name = "Dynamic Frame QP",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .minimum = 0,
+ .maximum = MSM_VIDC_ALL_LAYER_ID,
+ .default_value = 0,
+ .step = 1,
+ .qmenu = NULL,
+ },
+ {
.id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH,
.name = "SAR Width",
.type = V4L2_CTRL_TYPE_INTEGER,
@@ -2301,6 +2311,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH:
case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT:
case V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID:
+ case V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP:
case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN:
case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN:
@@ -2512,6 +2523,54 @@ int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
i++;
}
break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP:
+ qp.layer_id = control[i].value;
+ /* Enable QP for all frame types by default */
+ qp.enable = 7;
+ qp_range.layer_id = control[i].value;
+ i++;
+ while (i < ctrl->count) {
+ switch (control[i].id) {
+ case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN:
+ qp_range.qpi_min = control[i].value;
+ property_id =
+ HAL_CONFIG_VENC_FRAME_QP_RANGE;
+ pdata = &qp_range;
+ break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN:
+ qp_range.qpp_min = control[i].value;
+ property_id =
+ HAL_CONFIG_VENC_FRAME_QP_RANGE;
+ pdata = &qp_range;
+ break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN:
+ qp_range.qpb_min = control[i].value;
+ property_id =
+ HAL_CONFIG_VENC_FRAME_QP_RANGE;
+ pdata = &qp_range;
+ break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX:
+ qp_range.qpi_max = control[i].value;
+ property_id =
+ HAL_CONFIG_VENC_FRAME_QP_RANGE;
+ pdata = &qp_range;
+ break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX:
+ qp_range.qpp_max = control[i].value;
+ property_id =
+ HAL_CONFIG_VENC_FRAME_QP_RANGE;
+ pdata = &qp_range;
+ break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX:
+ qp_range.qpb_max = control[i].value;
+ property_id =
+ HAL_CONFIG_VENC_FRAME_QP_RANGE;
+ pdata = &qp_range;
+ break;
+ }
+ i++;
+ }
+ break;
case V4L2_CID_MPEG_VIDC_VENC_HDR_INFO:
if (control[i].value ==
V4L2_MPEG_VIDC_VENC_HDR_INFO_DISABLED ||
diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
index 7da7d5206987..ec843d065887 100644
--- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h
+++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
@@ -235,6 +235,7 @@ enum hal_property {
HAL_CONFIG_HEIC_FRAME_CROP_INFO,
HAL_CONFIG_HEIC_FRAME_QUALITY,
HAL_CONFIG_HEIC_GRID_ENABLE,
+ HAL_CONFIG_VENC_FRAME_QP_RANGE,
};
enum hal_domain {
diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h
index dd94a888deff..b86f7d58f0e9 100644
--- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h
+++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -362,6 +362,8 @@ struct hfi_buffer_info {
(HFI_PROPERTY_CONFIG_VENC_COMMON_START + 0x014)
#define HFI_PROPERTY_CONFIG_HEIC_GRID_ENABLE \
(HFI_PROPERTY_CONFIG_VENC_COMMON_START + 0x015)
+#define HFI_PROPERTY_CONFIG_VENC_FRAME_QP_RANGE \
+ (HFI_PROPERTY_CONFIG_VENC_COMMON_START + 0x016)
#define HFI_PROPERTY_PARAM_VPE_COMMON_START \
(HFI_DOMAIN_BASE_VPE + HFI_ARCH_COMMON_OFFSET + 0x7000)
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index d14cd8fabee1..97f1057b3c9d 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1350,6 +1350,9 @@ enum v4l2_mpeg_vidc_video_divx_format_type {
#define V4L2_CID_MPEG_VIDC_IMG_GRID_DIMENSION \
(V4L2_CID_MPEG_MSM_VIDC_BASE+161)
+#define V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP \
+ (V4L2_CID_MPEG_MSM_VIDC_BASE+162)
+
enum v4l2_mpeg_vidc_video_mbi_statistics_mode {
V4L2_CID_MPEG_VIDC_VIDEO_MBI_MODE_DEFAULT = 0,
V4L2_CID_MPEG_VIDC_VIDEO_MBI_MODE_1 = 1,