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

Commit 7c2aa20c authored by Mihir Ganu's avatar Mihir Ganu
Browse files

msm: vidc: Update extradata control API



Introduce an instance variable to cache extradata control values set
by client. Clients can set single or multiple extradata controls
and this variable caches the set controls.

CRs-Fixed: 2384822
Change-Id: I1457d8a6e18aaed4c776b687ba65c449ababfa11
Signed-off-by: default avatarMihir Ganu <mganu@codeaurora.org>
parent 60c70142
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -761,6 +761,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
	inst->prop.width[CAPTURE_PORT] = DEFAULT_WIDTH;
	inst->prop.width[CAPTURE_PORT] = DEFAULT_WIDTH;
	inst->prop.height[OUTPUT_PORT] = DEFAULT_HEIGHT;
	inst->prop.height[OUTPUT_PORT] = DEFAULT_HEIGHT;
	inst->prop.width[OUTPUT_PORT] = DEFAULT_WIDTH;
	inst->prop.width[OUTPUT_PORT] = DEFAULT_WIDTH;
	inst->prop.extradata_ctrls = EXTRADATA_DEFAULT;
	inst->buffer_mode_set[OUTPUT_PORT] = HAL_BUFFER_MODE_STATIC;
	inst->buffer_mode_set[OUTPUT_PORT] = HAL_BUFFER_MODE_STATIC;
	inst->buffer_mode_set[CAPTURE_PORT] = HAL_BUFFER_MODE_DYNAMIC;
	inst->buffer_mode_set[CAPTURE_PORT] = HAL_BUFFER_MODE_DYNAMIC;
	inst->stream_output_mode = HAL_VIDEO_DECODER_PRIMARY;
	inst->stream_output_mode = HAL_VIDEO_DECODER_PRIMARY;
@@ -886,6 +887,10 @@ int msm_vdec_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
		inst->clk_data.frame_rate = ctrl->val;
		inst->clk_data.frame_rate = ctrl->val;
		break;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
		if (ctrl->val == EXTRADATA_NONE)
			inst->prop.extradata_ctrls = 0;
		else
			inst->prop.extradata_ctrls |= ctrl->val;
		/*
		/*
		 * nothing to do here as inst->bufq[CAPTURE_PORT].num_planes
		 * nothing to do here as inst->bufq[CAPTURE_PORT].num_planes
		 * and inst->bufq[CAPTURE_PORT].plane_sizes[1] are already
		 * and inst->bufq[CAPTURE_PORT].plane_sizes[1] are already
@@ -1379,11 +1384,9 @@ int msm_vdec_set_conceal_color(struct msm_vidc_inst *inst)
int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
{
{
	uint32_t display_info = HFI_PROPERTY_PARAM_VUI_DISPLAY_INFO_EXTRADATA;
	uint32_t display_info = HFI_PROPERTY_PARAM_VUI_DISPLAY_INFO_EXTRADATA;
	struct v4l2_ctrl *ctrl;
	u32 value = 0x0;
	u32 value = 0x0;
	u32 hdr10_hist = 0x0;
	u32 hdr10_hist = 0x0;


	ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA);
	switch (inst->fmts[OUTPUT_PORT].fourcc) {
	switch (inst->fmts[OUTPUT_PORT].fourcc) {
	case V4L2_PIX_FMT_H264:
	case V4L2_PIX_FMT_H264:
	case V4L2_PIX_FMT_HEVC:
	case V4L2_PIX_FMT_HEVC:
@@ -1422,7 +1425,7 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst)
	}
	}


	/* Enable / Disable Advanced Extradata */
	/* Enable / Disable Advanced Extradata */
	if (ctrl->val == EXTRADATA_ADVANCED)
	if (inst->prop.extradata_ctrls & EXTRADATA_ADVANCED)
		value = 0x1;
		value = 0x1;
	msm_comm_set_extradata(inst,
	msm_comm_set_extradata(inst,
		HFI_PROPERTY_PARAM_VDEC_STREAM_USERDATA_EXTRADATA, value);
		HFI_PROPERTY_PARAM_VDEC_STREAM_USERDATA_EXTRADATA, value);
+18 −19
Original line number Original line Diff line number Diff line
@@ -1075,6 +1075,7 @@ int msm_venc_inst_init(struct msm_vidc_inst *inst)
	inst->prop.height[OUTPUT_PORT] = DEFAULT_HEIGHT;
	inst->prop.height[OUTPUT_PORT] = DEFAULT_HEIGHT;
	inst->prop.width[OUTPUT_PORT] = DEFAULT_WIDTH;
	inst->prop.width[OUTPUT_PORT] = DEFAULT_WIDTH;
	inst->prop.bframe_changed = false;
	inst->prop.bframe_changed = false;
	inst->prop.extradata_ctrls = EXTRADATA_DEFAULT;
	inst->buffer_mode_set[OUTPUT_PORT] = HAL_BUFFER_MODE_DYNAMIC;
	inst->buffer_mode_set[OUTPUT_PORT] = HAL_BUFFER_MODE_DYNAMIC;
	inst->buffer_mode_set[CAPTURE_PORT] = HAL_BUFFER_MODE_STATIC;
	inst->buffer_mode_set[CAPTURE_PORT] = HAL_BUFFER_MODE_STATIC;
	inst->clk_data.frame_rate = (DEFAULT_FPS << 16);
	inst->clk_data.frame_rate = (DEFAULT_FPS << 16);
@@ -1116,7 +1117,7 @@ int msm_venc_inst_init(struct msm_vidc_inst *inst)
	}
	}


	buff_req_buffer->buffer_size =
	buff_req_buffer->buffer_size =
		msm_vidc_calculate_enc_input_extra_size(inst, 0);
		msm_vidc_calculate_enc_input_extra_size(inst);
	inst->bufq[OUTPUT_PORT].plane_sizes[1] =
	inst->bufq[OUTPUT_PORT].plane_sizes[1] =
		buff_req_buffer->buffer_size;
		buff_req_buffer->buffer_size;


@@ -1232,7 +1233,6 @@ int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
	int rc = 0;
	int rc = 0;
	int i = 0;
	int i = 0;
	struct msm_vidc_format *fmt = NULL;
	struct msm_vidc_format *fmt = NULL;
	struct v4l2_ctrl *extradata_ctrl;


	if (!inst || !f) {
	if (!inst || !f) {
		dprintk(VIDC_ERR,
		dprintk(VIDC_ERR,
@@ -1315,11 +1315,8 @@ int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		 */
		 */
		inst->bufq[fmt->type].plane_sizes[0] =
		inst->bufq[fmt->type].plane_sizes[0] =
			msm_vidc_calculate_enc_input_frame_size(inst);
			msm_vidc_calculate_enc_input_frame_size(inst);
		extradata_ctrl = get_ctrl(inst,
			V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA);
		inst->bufq[fmt->type].plane_sizes[1] =
		inst->bufq[fmt->type].plane_sizes[1] =
			msm_vidc_calculate_enc_input_extra_size(inst,
			msm_vidc_calculate_enc_input_extra_size(inst);
				extradata_ctrl->val);
		f->fmt.pix_mp.num_planes = inst->bufq[fmt->type].num_planes;
		f->fmt.pix_mp.num_planes = inst->bufq[fmt->type].num_planes;
		for (i = 0; i < inst->bufq[fmt->type].num_planes; i++) {
		for (i = 0; i < inst->bufq[fmt->type].num_planes; i++) {
			f->fmt.pix_mp.plane_fmt[i].sizeimage =
			f->fmt.pix_mp.plane_fmt[i].sizeimage =
@@ -1572,8 +1569,13 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
		}
		}
		break;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
		if ((ctrl->val & EXTRADATA_ENC_INPUT_ROI) ||
		if (ctrl->val == EXTRADATA_NONE)
			(ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS)) {
			inst->prop.extradata_ctrls = 0;
		else
			inst->prop.extradata_ctrls |= ctrl->val;

		if ((inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_ROI) ||
		(inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_HDR10PLUS)) {
			buff_req_buffer = get_buff_req_buffer(inst,
			buff_req_buffer = get_buff_req_buffer(inst,
						HAL_BUFFER_EXTRADATA_INPUT);
						HAL_BUFFER_EXTRADATA_INPUT);
			if (!buff_req_buffer) {
			if (!buff_req_buffer) {
@@ -1584,13 +1586,12 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
			}
			}


			buff_req_buffer->buffer_size =
			buff_req_buffer->buffer_size =
				msm_vidc_calculate_enc_input_extra_size(inst,
				msm_vidc_calculate_enc_input_extra_size(inst);
					ctrl->val);
			inst->bufq[OUTPUT_PORT].plane_sizes[1] =
			inst->bufq[OUTPUT_PORT].plane_sizes[1] =
					buff_req_buffer->buffer_size;
					buff_req_buffer->buffer_size;
		}
		}


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


			buff_req_buffer = get_buff_req_buffer(inst,
			buff_req_buffer = get_buff_req_buffer(inst,
@@ -3717,12 +3718,10 @@ int msm_venc_set_hdr_info(struct msm_vidc_inst *inst)
int msm_venc_set_extradata(struct msm_vidc_inst *inst)
int msm_venc_set_extradata(struct msm_vidc_inst *inst)
{
{
	int rc = 0;
	int rc = 0;
	struct v4l2_ctrl *ctrl;
	struct v4l2_ctrl *cvp_ctrl;
	struct v4l2_ctrl *cvp_ctrl;
	u32 value = 0x0;
	u32 value = 0x0;


	ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA);
	if (inst->prop.extradata_ctrls == EXTRADATA_NONE) {
	if (ctrl->val == EXTRADATA_NONE) {
		// Disable all Extradata
		// Disable all Extradata
		msm_comm_set_index_extradata(inst,
		msm_comm_set_index_extradata(inst,
			MSM_VIDC_EXTRADATA_ASPECT_RATIO, 0x0);
			MSM_VIDC_EXTRADATA_ASPECT_RATIO, 0x0);
@@ -3737,17 +3736,17 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst)
		}
		}
	}
	}


	if (ctrl->val & EXTRADATA_ADVANCED)
	if (inst->prop.extradata_ctrls & EXTRADATA_ADVANCED)
		// Enable Advanced Extradata - LTR Info
		// Enable Advanced Extradata - LTR Info
		msm_comm_set_extradata(inst,
		msm_comm_set_extradata(inst,
			HFI_PROPERTY_PARAM_VENC_LTR_INFO, 0x1);
			HFI_PROPERTY_PARAM_VENC_LTR_INFO, 0x1);


	if (ctrl->val & EXTRADATA_ENC_INPUT_ROI)
	if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_ROI)
		// Enable ROIQP Extradata
		// Enable ROIQP Extradata
		msm_comm_set_extradata(inst,
		msm_comm_set_extradata(inst,
			HFI_PROPERTY_PARAM_VENC_ROI_QP_EXTRADATA, 0x1);
			HFI_PROPERTY_PARAM_VENC_ROI_QP_EXTRADATA, 0x1);


	if (ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS) {
	if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_HDR10PLUS) {
		// Enable HDR10+ Extradata
		// Enable HDR10+ Extradata
		if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) {
		if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) {
			msm_comm_set_extradata(inst,
			msm_comm_set_extradata(inst,
@@ -3758,7 +3757,7 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst)


	cvp_ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VENC_CVP_DISABLE);
	cvp_ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VENC_CVP_DISABLE);
	if (cvp_ctrl->val == V4L2_MPEG_MSM_VIDC_ENABLE) {
	if (cvp_ctrl->val == V4L2_MPEG_MSM_VIDC_ENABLE) {
		if (ctrl->val & EXTRADATA_ENC_INPUT_CVP) {
		if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_CVP) {
			dprintk(VIDC_ERR,
			dprintk(VIDC_ERR,
				"%s: invalid params\n", __func__);
				"%s: invalid params\n", __func__);
			return -EINVAL;
			return -EINVAL;
@@ -3769,7 +3768,7 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst)
		 * Once the kernel-mode CVP metadata implementation
		 * Once the kernel-mode CVP metadata implementation
		 * is completed, this condition should be removed.
		 * is completed, this condition should be removed.
		 */
		 */
		if (ctrl->val & EXTRADATA_ENC_INPUT_CVP)
		if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_CVP)
			value = 0x1;
			value = 0x1;


	}
	}
+3 −0
Original line number Original line Diff line number Diff line
@@ -1412,6 +1412,9 @@ static int try_get_ctrl_for_instance(struct msm_vidc_inst *inst,
		dprintk(VIDC_DBG, "g_min: %x : hal_buffer %d min buffers %d\n",
		dprintk(VIDC_DBG, "g_min: %x : hal_buffer %d min buffers %d\n",
			hash32_ptr(inst->session), HAL_BUFFER_INPUT, ctrl->val);
			hash32_ptr(inst->session), HAL_BUFFER_INPUT, ctrl->val);
		break;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA:
		ctrl->val = inst->prop.extradata_ctrls;
		break;
	default:
	default:
		/*
		/*
		 * Other controls aren't really volatile, shouldn't need to
		 * Other controls aren't really volatile, shouldn't need to
+4 −10
Original line number Original line Diff line number Diff line
@@ -862,8 +862,7 @@ static inline u32 ROI_EXTRADATA_SIZE(
	return (((lcu_width + 7) >> 3) << 3) * lcu_height * 2;
	return (((lcu_width + 7) >> 3) << 3) * lcu_height * 2;
}
}


u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst,
u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst)
	u32 extra_types)
{
{
	u32 size = 0;
	u32 size = 0;
	u32 width = inst->prop.width[OUTPUT_PORT];
	u32 width = inst->prop.width[OUTPUT_PORT];
@@ -874,7 +873,7 @@ u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst,
	size += sizeof(struct msm_vidc_enc_cvp_metadata_payload);
	size += sizeof(struct msm_vidc_enc_cvp_metadata_payload);
	extradata_count++;
	extradata_count++;


	if (extra_types & EXTRADATA_ENC_INPUT_ROI) {
	if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_ROI) {
		u32 lcu_size = 16;
		u32 lcu_size = 16;


		if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC)
		if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC)
@@ -884,7 +883,7 @@ u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst,
		extradata_count++;
		extradata_count++;
	}
	}


	if (extra_types & EXTRADATA_ENC_INPUT_HDR10PLUS) {
	if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_HDR10PLUS) {
		size += HDR10PLUS_PAYLOAD_SIZE;
		size += HDR10PLUS_PAYLOAD_SIZE;
		extradata_count++;
		extradata_count++;
	}
	}
@@ -900,13 +899,8 @@ u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst,
u32 msm_vidc_calculate_enc_output_extra_size(struct msm_vidc_inst *inst)
u32 msm_vidc_calculate_enc_output_extra_size(struct msm_vidc_inst *inst)
{
{
	u32 size = 0;
	u32 size = 0;
	u32 extra_types;
	struct v4l2_ctrl *extradata_ctrl;


	extradata_ctrl = get_ctrl(inst,
	if (inst->prop.extradata_ctrls & EXTRADATA_ADVANCED)
			V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA);
	extra_types = extradata_ctrl->val;
	if (extra_types & EXTRADATA_ADVANCED)
		size += sizeof(struct msm_vidc_metadata_ltr_payload);
		size += sizeof(struct msm_vidc_metadata_ltr_payload);


	/* Add size for extradata none */
	/* Add size for extradata none */
+1 −2
Original line number Original line Diff line number Diff line
@@ -34,8 +34,7 @@ u32 msm_vidc_calculate_dec_output_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_dec_output_extra_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_dec_output_extra_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_input_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_input_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_output_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_output_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst,
u32 msm_vidc_calculate_enc_input_extra_size(struct msm_vidc_inst *inst);
	u32 extra_types);
u32 msm_vidc_calculate_enc_output_extra_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_output_extra_size(struct msm_vidc_inst *inst);
u32 msm_vidc_set_buffer_count_for_thumbnail(struct msm_vidc_inst *inst);
u32 msm_vidc_set_buffer_count_for_thumbnail(struct msm_vidc_inst *inst);


Loading