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

Commit db880bce authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Update planes when extradata is set"

parents 18015f29 98c252b7
Loading
Loading
Loading
Loading
+18 −24
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
 */
@@ -132,9 +132,9 @@ static struct msm_vidc_ctrl msm_vdec_ctrls[] = {
		.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA,
		.name = "Extradata Type",
		.type = V4L2_CTRL_TYPE_BITMASK,
		.minimum = 0,
		.maximum = 0x3,
		.default_value = 0,
		.minimum = EXTRADATA_NONE,
		.maximum = EXTRADATA_DEFAULT | EXTRADATA_ADVANCED,
		.default_value = EXTRADATA_DEFAULT,
		.menu_skip_mask = 0,
		.qmenu = NULL,
	},
@@ -539,6 +539,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
			goto err_invalid_fmt;
		}

		inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat;
		if (inst->fmts[fmt->type].fourcc == f->fmt.pix_mp.pixelformat &&
			inst->prop.width[CAPTURE_PORT] == f->fmt.pix_mp.width &&
			inst->prop.height[CAPTURE_PORT] ==
@@ -558,7 +559,6 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
			goto err_invalid_fmt;
		}

		inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat;
		f->fmt.pix_mp.plane_fmt[0].sizeimage =
			inst->fmts[fmt->type].get_frame_size(0,
			f->fmt.pix_mp.height, f->fmt.pix_mp.width);
@@ -836,6 +836,15 @@ int msm_vdec_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
			inst->flags |= VIDC_SECURE;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
		inst->bufq[CAPTURE_PORT].num_planes = 1;
		inst->bufq[CAPTURE_PORT].plane_sizes[1] = 0;
		if (ctrl->val != EXTRADATA_NONE) {
			inst->bufq[CAPTURE_PORT].num_planes = 2;
			inst->bufq[CAPTURE_PORT].plane_sizes[1] =
				VENUS_EXTRADATA_SIZE(
					inst->prop.height[CAPTURE_PORT],
					inst->prop.width[CAPTURE_PORT]);
		}
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT:
		inst->buffer_size_limit = ctrl->val;
@@ -1419,7 +1428,6 @@ int msm_vdec_set_conceal_color(struct msm_vidc_inst *inst)

int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
{
	uint32_t enabled = false;
	uint32_t display_info = HAL_EXTRADATA_VUI_DISPLAY_INFO;
	struct v4l2_ctrl *ctrl;

@@ -1444,14 +1452,14 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
		break;
	}

	if (!ctrl->val) {
	if (ctrl->val == EXTRADATA_NONE) {
		// Disable all Extradata
		msm_comm_set_extradata(inst, HAL_EXTRADATA_OUTPUT_CROP, 0x0);
		msm_comm_set_extradata(inst,
			HAL_EXTRADATA_INTERLACE_VIDEO, 0x0);
		msm_comm_set_extradata(inst, display_info, 0x0);
		msm_comm_set_extradata(inst,
			HAL_EXTRADATA_UBWC_CR_STATS_INFO, 0x1);
			HAL_EXTRADATA_UBWC_CR_STATS_INFO, 0x0);
		msm_comm_set_extradata(inst,
			HAL_EXTRADATA_NUM_CONCEALED_MB, 0x0);
		if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) {
@@ -1472,9 +1480,8 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
			HAL_EXTRADATA_RECOVERY_POINT_SEI, 0x0);
		msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x0);
		msm_comm_set_extradata(inst, HAL_EXTRADATA_FRAME_QP, 0x0);
		enabled = false;
	}
	if (ctrl->val & 0x1) {
	if (ctrl->val & EXTRADATA_DEFAULT) {
		// Enable Default Extradata
		msm_comm_set_extradata(inst, HAL_EXTRADATA_OUTPUT_CROP, 0x1);
		msm_comm_set_extradata(inst,
@@ -1489,9 +1496,8 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
			msm_comm_set_extradata(inst,
				HAL_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI, 0x1);
		}
		enabled = true;
	}
	if (ctrl->val & 0x2) {
	if (ctrl->val & EXTRADATA_ADVANCED) {
		// Enable Advanced Extradata
		msm_comm_set_extradata(inst,
			HAL_EXTRADATA_STREAM_USERDATA, 0x1);
@@ -1504,18 +1510,6 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
			HAL_EXTRADATA_RECOVERY_POINT_SEI, 0x1);
		msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x1);
		msm_comm_set_extradata(inst, HAL_EXTRADATA_FRAME_QP, 0x1);
		enabled = true;
	}

	if (enabled) {
		inst->bufq[CAPTURE_PORT].num_planes = 2;
		inst->bufq[CAPTURE_PORT].plane_sizes[EXTRADATA_IDX(2)] =
			VENUS_EXTRADATA_SIZE(
			   inst->prop.height[CAPTURE_PORT],
			   inst->prop.width[CAPTURE_PORT]);
	} else {
		inst->bufq[CAPTURE_PORT].num_planes = 1;
		inst->bufq[CAPTURE_PORT].plane_sizes[EXTRADATA_IDX(2)] = 0;
	}

	return 0;
+66 −52
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
 */
@@ -499,9 +499,10 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
		.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA,
		.name = "Extradata Type",
		.type = V4L2_CTRL_TYPE_BITMASK,
		.minimum = 0,
		.maximum = 0xF,
		.default_value = 0,
		.minimum = EXTRADATA_NONE,
		.maximum = EXTRADATA_ADVANCED | EXTRADATA_ENC_INPUT_ROI |
			EXTRADATA_ENC_INPUT_HDR10PLUS,
		.default_value = EXTRADATA_NONE,
		.menu_skip_mask = 0,
		.qmenu = NULL,
	},
@@ -1296,6 +1297,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
	int rc = 0;
	struct msm_vidc_mastering_display_colour_sei_payload *mdisp_sei = NULL;
	struct msm_vidc_content_light_level_sei_payload *cll_sei = NULL;
	struct hal_buffer_requirements *buff_req_buffer = NULL;

	if (!inst || !inst->core || !inst->core->device || !ctrl) {
		dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
@@ -1491,6 +1493,54 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
					info_type);
			}
		}
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
		inst->bufq[OUTPUT_PORT].num_planes = 1;
		inst->bufq[CAPTURE_PORT].num_planes = 1;

		if (ctrl->val & EXTRADATA_ADVANCED)
			inst->bufq[CAPTURE_PORT].num_planes = 2;

		if ((ctrl->val & EXTRADATA_ENC_INPUT_ROI) ||
			(ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS))
			inst->bufq[OUTPUT_PORT].num_planes = 2;

		/* Needs internal calculation of extradata */
		rc = msm_comm_try_get_bufreqs(inst);
		if (rc) {
			dprintk(VIDC_ERR,
				"Failed to get buffer requirements: %d\n", rc);
			break;
		}

		if (inst->bufq[OUTPUT_PORT].num_planes == 2) {
			buff_req_buffer = get_buff_req_buffer(inst,
						HAL_BUFFER_EXTRADATA_INPUT);
			if (!buff_req_buffer) {
				dprintk(VIDC_ERR,
				"Failed to get extradata buff info\n");
				rc = -EINVAL;
				break;
			}

			inst->bufq[OUTPUT_PORT].plane_sizes[1] =
					buff_req_buffer->buffer_size;
		}

		if (inst->bufq[CAPTURE_PORT].num_planes == 2) {
			buff_req_buffer = get_buff_req_buffer(inst,
						HAL_BUFFER_EXTRADATA_OUTPUT);
			if (!buff_req_buffer) {
				dprintk(VIDC_ERR,
				"Failed to get extradata buff info\n");
				rc = -EINVAL;
				break;
			}

			inst->bufq[CAPTURE_PORT].plane_sizes[1] =
					buff_req_buffer->buffer_size;
		}

		break;
	case V4L2_CID_MPEG_VIDEO_B_FRAMES:
	case V4L2_CID_ROTATE:
@@ -1543,7 +1593,6 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
	case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT:
	case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_DIMENSIONS:
	case V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY:
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
			dprintk(VIDC_DBG, "Control set: ID : %x Val : %d\n",
			ctrl->id, ctrl->val);
		break;
@@ -1999,12 +2048,12 @@ int msm_venc_set_rate_control(struct msm_vidc_inst *inst)
	if ((bitrate_mode->val == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR_VFR) &&
		(inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_H264)) {
		hier_layers = msm_venc_get_ctrl(inst,
			V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING);
			V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER);
		hier_type = msm_venc_get_ctrl(inst,
			V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE);
			V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE);
		if ((hier_layers && hier_layers->val) &&
			(hier_type && hier_type->val ==
			V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P)){
			V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P)){
			dprintk(VIDC_ERR,
				"%s: CBR_VFR not allowed with Hybrid HP\n",
				__func__);
@@ -2646,7 +2695,7 @@ int msm_venc_set_hierp_layers(struct msm_vidc_inst *inst)
		return 0;

	ctrl = msm_venc_get_ctrl(inst,
			V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING);
			V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE);
	if (!ctrl) {
		dprintk(VIDC_ERR,
			"%s: get heirp num layers failed\n", __func__);
@@ -3221,8 +3270,6 @@ int msm_venc_set_hdr_info(struct msm_vidc_inst *inst)
int msm_venc_set_extradata(struct msm_vidc_inst *inst)
{
	int rc = 0;
	struct hal_buffer_requirements *buff_req_buffer = NULL;
	int extra_idx = 0;
	struct v4l2_ctrl *ctrl = msm_venc_get_ctrl(inst,
		V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA);

@@ -3232,7 +3279,7 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst)
		return -EINVAL;
	}

	if (!ctrl->val) {
	if (ctrl->val == EXTRADATA_NONE) {
		// Disable all Extradata
		msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x0);
		msm_comm_set_extradata(inst, HAL_EXTRADATA_LTR_INFO, 0x0);
@@ -3241,55 +3288,22 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst)
			msm_comm_set_extradata(inst,
					HAL_EXTRADATA_HDR10PLUS_METADATA, 0x0);
		}
		inst->bufq[OUTPUT_PORT].num_planes = 1;
		inst->bufq[CAPTURE_PORT].num_planes = 1;
	}
	if (ctrl->val & 0x2) {
		// Enable Advanced Extradata
		msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x1);
		inst->bufq[OUTPUT_PORT].num_planes = 2;

	if (ctrl->val & EXTRADATA_ADVANCED)
		// Enable Advanced Extradata - LTR Info
		msm_comm_set_extradata(inst, HAL_EXTRADATA_LTR_INFO, 0x1);
		inst->bufq[CAPTURE_PORT].num_planes = 2;
	}
	if (ctrl->val & 0x4) {

	if (ctrl->val & EXTRADATA_ENC_INPUT_ROI)
		// Enable ROIQP Extradata
		msm_comm_set_extradata(inst, HAL_EXTRADATA_ROI_QP, 0x1);
		inst->bufq[OUTPUT_PORT].num_planes = 2;
	}
	if (ctrl->val & 0x8) {

	if (ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS) {
		// Enable HDR10+ Extradata
		if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) {
			msm_comm_set_extradata(inst,
					HAL_EXTRADATA_HDR10PLUS_METADATA, 0x1);
		}
		inst->bufq[OUTPUT_PORT].num_planes = 2;
	}

	rc = msm_comm_try_get_bufreqs(inst);
	if (rc) {
		dprintk(VIDC_ERR,
			"Failed to get buffer requirements: %d\n", rc);
		return rc;
	}

	extra_idx = EXTRADATA_IDX(inst->bufq[OUTPUT_PORT].num_planes);
	if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
		buff_req_buffer = get_buff_req_buffer(inst,
					HAL_BUFFER_EXTRADATA_INPUT);

		inst->bufq[OUTPUT_PORT].plane_sizes[extra_idx] =
				buff_req_buffer ?
				buff_req_buffer->buffer_size : 0;
	}

	extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes);
	if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
		buff_req_buffer = get_buff_req_buffer(inst,
					HAL_BUFFER_EXTRADATA_OUTPUT);

		inst->bufq[CAPTURE_PORT].plane_sizes[extra_idx] =
			buff_req_buffer ?
			buff_req_buffer->buffer_size : 0;
	}

	return rc;
+3 −0
Original line number Diff line number Diff line
@@ -814,6 +814,9 @@ enum v4l2_mpeg_vidc_video_stream_format {
#define V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA \
		(V4L2_CID_MPEG_MSM_VIDC_BASE + 17)
enum v4l2_mpeg_vidc_extradata {
#define EXTRADATA_NONE \
	EXTRADATA_NONE
	EXTRADATA_NONE = 0,
	EXTRADATA_DEFAULT = 1,
	EXTRADATA_ADVANCED = 2,
	EXTRADATA_ENC_INPUT_ROI = 4,