Commit cef92b14 authored by Stanimir Varbanov's avatar Stanimir Varbanov Committed by Mauro Carvalho Chehab
Browse files

media: venus: Add a handling of QC10C compressed format



This adds QC10C compressed pixel format in the Venus driver, and
make it possible to discover from v4l2 clients.

Note: The QC10C format will be enumerable via VIDIOC_ENUM_FMT when
the bitstream is 10-bits and the headers are parsed.

Signed-off-by: default avatarStanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 1af7d8da
Loading
Loading
Loading
Loading
+4 −22
Original line number Diff line number Diff line
@@ -610,6 +610,8 @@ static u32 to_hfi_raw_fmt(u32 v4l2_fmt)
		return HFI_COLOR_FORMAT_NV21;
	case V4L2_PIX_FMT_QC08C:
		return HFI_COLOR_FORMAT_NV12_UBWC;
	case V4L2_PIX_FMT_QC10C:
		return HFI_COLOR_FORMAT_YUV420_TP10_UBWC;
	default:
		break;
	}
@@ -1192,7 +1194,8 @@ int venus_helper_set_format_constraints(struct venus_inst *inst)
	if (!IS_V6(inst->core))
		return 0;

	if (inst->opb_fmt == HFI_COLOR_FORMAT_NV12_UBWC)
	if (inst->opb_fmt == HFI_COLOR_FORMAT_NV12_UBWC ||
	    inst->opb_fmt == HFI_COLOR_FORMAT_YUV420_TP10_UBWC)
		return 0;

	pconstraint.buffer_type = HFI_BUFFER_OUTPUT2;
@@ -1763,27 +1766,6 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 v4l2_fmt,
	if (!caps)
		return -EINVAL;

	if (inst->bit_depth == VIDC_BITDEPTH_10 &&
	    inst->session_type == VIDC_SESSION_TYPE_DEC) {
		found_ubwc =
			find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
					   HFI_COLOR_FORMAT_YUV420_TP10_UBWC);
		found = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT2,
					   HFI_COLOR_FORMAT_NV12);
		if (found_ubwc && found) {
			/*
			 * Hard-code DPB buffers to be 10bit UBWC and decoder
			 * output buffers in 8bit NV12 until V4L2 is able to
			 * expose compressed/tiled formats to applications.
			 */
			*out_fmt = HFI_COLOR_FORMAT_YUV420_TP10_UBWC;
			*out2_fmt = HFI_COLOR_FORMAT_NV12;
			return 0;
		}

		return -EINVAL;
	}

	if (ubwc) {
		ubwc_fmt = fmt | HFI_COLOR_FORMAT_UBWC_BASE;
		found_ubwc = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
+16 −3
Original line number Diff line number Diff line
@@ -34,6 +34,10 @@ static const struct venus_format vdec_formats[] = {
		.pixfmt = V4L2_PIX_FMT_QC08C,
		.num_planes = 1,
		.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
	}, {
		.pixfmt = V4L2_PIX_FMT_QC10C,
		.num_planes = 1,
		.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
	},{
		.pixfmt = V4L2_PIX_FMT_NV12,
		.num_planes = 1,
@@ -114,6 +118,10 @@ find_format(struct venus_inst *inst, u32 pixfmt, u32 type)
	    !venus_helper_check_format(inst, fmt[i].pixfmt))
		return NULL;

	if (V4L2_TYPE_IS_CAPTURE(type) && fmt[i].pixfmt == V4L2_PIX_FMT_QC10C &&
	    !(inst->bit_depth == VIDC_BITDEPTH_10))
		return NULL;

	return &fmt[i];
}

@@ -133,11 +141,16 @@ find_format_by_index(struct venus_inst *inst, unsigned int index, u32 type)
		if (fmt[i].type != type)
			continue;

		if (V4L2_TYPE_IS_OUTPUT(type))
		if (V4L2_TYPE_IS_OUTPUT(type)) {
			valid = venus_helper_check_codec(inst, fmt[i].pixfmt);
		else if (V4L2_TYPE_IS_CAPTURE(type))
		} else if (V4L2_TYPE_IS_CAPTURE(type)) {
			valid = venus_helper_check_format(inst, fmt[i].pixfmt);

			if (fmt[i].pixfmt == V4L2_PIX_FMT_QC10C &&
			    !(inst->bit_depth == VIDC_BITDEPTH_10))
				valid = false;
		}

		if (k == index && valid)
			break;
		if (valid)
@@ -1539,7 +1552,7 @@ static const struct hfi_inst_ops vdec_hfi_ops = {
static void vdec_inst_init(struct venus_inst *inst)
{
	inst->hfi_codec = HFI_VIDEO_CODEC_H264;
	inst->fmt_out = &vdec_formats[7];
	inst->fmt_out = &vdec_formats[8];
	inst->fmt_cap = &vdec_formats[0];
	inst->width = frame_width_min(inst);
	inst->height = ALIGN(frame_height_min(inst), 32);