Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f44c22ba authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Add support for setting dynamic QP range"

parents e241aa9b cb2c57de
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
/* 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;
+60 −1
Original line number Diff line number Diff line
/* 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
@@ -903,6 +903,16 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
		.step = 1,
		.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",
@@ -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 ||
+1 −0
Original line number Diff line number Diff line
@@ -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 {
+3 −1
Original line number Diff line number Diff line
/* 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)
+3 −0
Original line number Diff line number Diff line
@@ -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,