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

Commit c0e6e7cb authored by Zhongbo Shi's avatar Zhongbo Shi
Browse files

msm: vidc: Add uncompressed format constraint setting



Add uncompressed format constraint property setting
especially for 10bit P010 format. The stride of P010
moves from 128 to 256 now.

Change-Id: I451fcb6d5979b904ce550c04e5b9e0c11bd5d4ed
Signed-off-by: default avatarZhongbo Shi <zhongbos@codeaurora.org>
parent ac121119
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -1025,7 +1025,35 @@ int create_pkt_cmd_session_set_property(
		break;
	}
	case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO:
	{
		struct hfi_uncompressed_plane_actual_constraints_info *hfi;
		struct hal_uncompressed_plane_actual_constraints_info *prop =
		(struct hal_uncompressed_plane_actual_constraints_info *) pdata;
		u32 buffer_type;
		u32 num_plane = prop->num_planes;
		u32 hfi_pkt_size =
			2 * sizeof(u32)
			+ num_plane
			* sizeof(struct hal_uncompressed_plane_constraints);

		pkt->rg_property_data[0] =
		HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO;

		hfi = (struct hfi_uncompressed_plane_actual_constraints_info *)
					&pkt->rg_property_data[1];
		buffer_type = get_hfi_buffer(prop->buffer_type);
		if (buffer_type)
			hfi->buffer_type = buffer_type;
		else
			return -EINVAL;

		hfi->num_planes = prop->num_planes;
		memcpy(hfi->rg_plane_format, prop->rg_plane_format,
			hfi->num_planes
			*sizeof(struct hal_uncompressed_plane_constraints));
		pkt->size += hfi_pkt_size;
		break;
	}
	case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO:
		break;
	case HAL_PARAM_FRAME_SIZE:
+38 −0
Original line number Diff line number Diff line
@@ -511,6 +511,21 @@ struct msm_vidc_format vdec_formats[] = {
	},
};

struct msm_vidc_format_constraint dec_pix_format_constraints[] = {
	{
		.fourcc = V4L2_PIX_FMT_SDE_Y_CBCR_H2V2_P010_VENUS,
		.num_planes = 2,
		.y_stride_multiples = 256,
		.y_max_stride = 8192,
		.y_min_plane_buffer_height_multiple = 32,
		.y_buffer_alignment = 256,
		.uv_stride_multiples = 256,
		.uv_max_stride = 8192,
		.uv_min_plane_buffer_height_multiple = 16,
		.uv_buffer_alignment = 256,
	},
};

static bool msm_vidc_check_for_vp9d_overload(struct msm_vidc_core *core)
{
	u32 vp9d_instance_count = 0;
@@ -532,6 +547,7 @@ static bool msm_vidc_check_for_vp9d_overload(struct msm_vidc_core *core)
int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
{
	struct msm_vidc_format *fmt = NULL;
	struct msm_vidc_format_constraint *fmt_constraint = NULL;
	struct hal_frame_size frame_sz;
	unsigned int extra_idx = 0;
	int rc = 0;
@@ -579,6 +595,28 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
				msm_comm_get_hal_output_buffer(inst),
				f->fmt.pix_mp.pixelformat);

		fmt_constraint =
		msm_comm_get_pixel_fmt_constraints(dec_pix_format_constraints,
			ARRAY_SIZE(dec_pix_format_constraints),
			f->fmt.pix_mp.pixelformat);

		if (!fmt_constraint) {
			dprintk(VIDC_INFO,
				"Format constraint not required for %d on CAPTURE port\n",
				f->fmt.pix_mp.pixelformat);
		} else {
			rc = msm_comm_set_color_format_constraints(inst,
				msm_comm_get_hal_output_buffer(inst),
				fmt_constraint);
			if (rc) {
				dprintk(VIDC_ERR,
					"Set constraint for %d failed on CAPTURE port\n",
					f->fmt.pix_mp.pixelformat);
				rc = -EINVAL;
				goto err_invalid_fmt;
			}
		}

		inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat;
		if (msm_comm_get_stream_output_mode(inst) ==
			HAL_VIDEO_DECODER_SECONDARY) {
+40 −0
Original line number Diff line number Diff line
@@ -1205,6 +1205,22 @@ static struct msm_vidc_format venc_formats[] = {
	},
};

struct msm_vidc_format_constraint enc_pix_format_constraints[] = {
	{
		.fourcc = V4L2_PIX_FMT_SDE_Y_CBCR_H2V2_P010_VENUS,
		.num_planes = 2,
		.y_stride_multiples = 256,
		.y_max_stride = 8192,
		.y_min_plane_buffer_height_multiple = 32,
		.y_buffer_alignment = 256,
		.uv_stride_multiples = 256,
		.uv_max_stride = 8192,
		.uv_min_plane_buffer_height_multiple = 16,
		.uv_buffer_alignment = 256,
	},
};


static int msm_venc_set_csc(struct msm_vidc_inst *inst,
					u32 color_primaries, u32 custom_matrix);

@@ -2506,6 +2522,7 @@ static int msm_venc_set_csc(struct msm_vidc_inst *inst,
int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
{
	struct msm_vidc_format *fmt = NULL;
	struct msm_vidc_format_constraint *fmt_constraint = NULL;
	int rc = 0;
	struct hfi_device *hdev;
	int extra_idx = 0, i = 0;
@@ -2693,6 +2710,29 @@ int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		}

		msm_comm_set_color_format(inst, HAL_BUFFER_INPUT, fmt->fourcc);

		fmt_constraint =
		msm_comm_get_pixel_fmt_constraints(enc_pix_format_constraints,
			ARRAY_SIZE(enc_pix_format_constraints),
			f->fmt.pix_mp.pixelformat);

		if (!fmt_constraint) {
			dprintk(VIDC_ERR,
				"Format constraint not required for %d on OUTPUT port\n",
				f->fmt.pix_mp.pixelformat);
		} else {
			rc = msm_comm_set_color_format_constraints(inst,
				HAL_BUFFER_INPUT,
				fmt_constraint);
			if (rc) {
				dprintk(VIDC_ERR,
					"Set constraint for %d failed on CAPTURE port\n",
					f->fmt.pix_mp.pixelformat);
				rc = -EINVAL;
				goto exit;
			}
		}

	} else {
		dprintk(VIDC_ERR, "%s - Unsupported buf type: %d\n",
			__func__, f->type);
+90 −0
Original line number Diff line number Diff line
@@ -991,6 +991,26 @@ struct msm_vidc_format *msm_comm_get_pixel_fmt_fourcc(
	return &fmt[i];
}

struct msm_vidc_format_constraint *msm_comm_get_pixel_fmt_constraints(
	struct msm_vidc_format_constraint fmt[], int size, int fourcc)
{
	int i;

	if (!fmt) {
		dprintk(VIDC_ERR, "Invalid inputs, fmt = %pK\n", fmt);
		return NULL;
	}
	for (i = 0; i < size; i++) {
		if (fmt[i].fourcc == fourcc)
			break;
	}
	if (i == size) {
		dprintk(VIDC_INFO, "Format constraint not found.\n");
		return NULL;
	}
	return &fmt[i];
}

struct buf_queue *msm_comm_get_vb2q(
		struct msm_vidc_inst *inst, enum v4l2_buf_type type)
{
@@ -6518,3 +6538,73 @@ int msm_comm_release_mark_data(struct msm_vidc_inst *inst)
	return 0;
}

int msm_comm_set_color_format_constraints(struct msm_vidc_inst *inst,
		enum hal_buffer buffer_type,
		struct msm_vidc_format_constraint *pix_constraint)
{
	struct hal_uncompressed_plane_actual_constraints_info
		*pconstraint = NULL;
	u32 num_planes = 2;
	u32 size = 0;
	int rc = 0;
	struct hfi_device *hdev;

	if (!inst || !inst->core || !inst->core->device) {
		dprintk(VIDC_ERR, "%s - invalid param\n", __func__);
		return -EINVAL;
	}

	hdev = inst->core->device;

	size = sizeof(buffer_type)
			+ sizeof(u32)
			+ num_planes
			* sizeof(struct hal_uncompressed_plane_constraints);

	pconstraint = kzalloc(size, GFP_KERNEL);
	if (!pconstraint) {
		dprintk(VIDC_ERR, "No memory cannot alloc constrain\n");
		rc = -ENOMEM;
		goto exit;
	}

	pconstraint->buffer_type = buffer_type;
	pconstraint->num_planes = pix_constraint->num_planes;
	//set Y plan constraints
	dprintk(VIDC_INFO, "Set Y plan constraints.\n");
	pconstraint->rg_plane_format[0].stride_multiples =
			pix_constraint->y_stride_multiples;
	pconstraint->rg_plane_format[0].max_stride =
			pix_constraint->y_max_stride;
	pconstraint->rg_plane_format[0].min_plane_buffer_height_multiple =
			pix_constraint->y_min_plane_buffer_height_multiple;
	pconstraint->rg_plane_format[0].buffer_alignment =
			pix_constraint->y_buffer_alignment;

	//set UV plan constraints
	dprintk(VIDC_INFO, "Set UV plan constraints.\n");
	pconstraint->rg_plane_format[1].stride_multiples =
			pix_constraint->uv_stride_multiples;
	pconstraint->rg_plane_format[1].max_stride =
			pix_constraint->uv_max_stride;
	pconstraint->rg_plane_format[1].min_plane_buffer_height_multiple =
			pix_constraint->uv_min_plane_buffer_height_multiple;
	pconstraint->rg_plane_format[1].buffer_alignment =
			pix_constraint->uv_buffer_alignment;

	rc = call_hfi_op(hdev,
			session_set_property,
			inst->session,
			HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO,
			pconstraint);
	if (rc)
		dprintk(VIDC_ERR,
			"Failed to set input color format constraint\n");
	else
		dprintk(VIDC_DBG, "Set color format constraint success\n");

exit:
	if (!pconstraint)
		kfree(pconstraint);
	return rc;
}
+5 −0
Original line number Diff line number Diff line
@@ -92,6 +92,11 @@ const struct msm_vidc_format *msm_comm_get_pixel_fmt_index(
	const struct msm_vidc_format fmt[], int size, int index, int fmt_type);
struct msm_vidc_format *msm_comm_get_pixel_fmt_fourcc(
	struct msm_vidc_format fmt[], int size, int fourcc, int fmt_type);
struct msm_vidc_format_constraint *msm_comm_get_pixel_fmt_constraints(
	struct msm_vidc_format_constraint fmt[], int size, int fourcc);
int msm_comm_set_color_format_constraints(struct msm_vidc_inst *inst,
		enum hal_buffer buffer_type,
		struct msm_vidc_format_constraint *pix_constraint);
struct buf_queue *msm_comm_get_vb2q(
		struct msm_vidc_inst *inst, enum v4l2_buf_type type);
int msm_comm_try_state(struct msm_vidc_inst *inst, int state);
Loading