Commit cb5dd5a0 authored by Benjamin Gaignard's avatar Benjamin Gaignard Committed by Mauro Carvalho Chehab
Browse files

media: hantro: Introduce G2/HEVC decoder



Implement all the logic to get G2 hardware decoding HEVC frames.
It supports up level 5.1 HEVC stream.
It doesn't support yet 10 bits formats or the scaling feature.

Add HANTRO HEVC dedicated control to skip some bits at the beginning
of the slice header. That is very specific to this hardware so can't
go into uapi structures. Computing the needed value is complex and requires
information from the stream that only the userland knows so let it
provide the correct value to the driver.

Signed-off-by: default avatarBenjamin Gaignard <benjamin.gaignard@collabora.com>
Co-developed-by: default avatarAdrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: default avatarAdrian Ratiu <adrian.ratiu@collabora.com>
Co-developed-by: default avatarEzequiel Garcia <ezequiel@collabora.com>
Signed-off-by: default avatarEzequiel Garcia <ezequiel@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent b7782b34
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -10,12 +10,14 @@ hantro-vpu-y += \
		hantro_g1.o \
		hantro_g1_h264_dec.o \
		hantro_g1_mpeg2_dec.o \
		hantro_g2_hevc_dec.o \
		hantro_g1_vp8_dec.o \
		rk3399_vpu_hw_jpeg_enc.o \
		rk3399_vpu_hw_mpeg2_dec.o \
		rk3399_vpu_hw_vp8_dec.o \
		hantro_jpeg.o \
		hantro_h264.o \
		hantro_hevc.o \
		hantro_mpeg2.o \
		hantro_vp8.o

+2 −0
Original line number Diff line number Diff line
@@ -221,6 +221,7 @@ struct hantro_dev {
 * @jpeg_enc:		JPEG-encoding context.
 * @mpeg2_dec:		MPEG-2-decoding context.
 * @vp8_dec:		VP8-decoding context.
 * @hevc_dec:		HEVC-decoding context.
 */
struct hantro_ctx {
	struct hantro_dev *dev;
@@ -247,6 +248,7 @@ struct hantro_ctx {
		struct hantro_jpeg_enc_hw_ctx jpeg_enc;
		struct hantro_mpeg2_dec_hw_ctx mpeg2_dec;
		struct hantro_vp8_dec_hw_ctx vp8_dec;
		struct hantro_hevc_dec_hw_ctx hevc_dec;
	};
};

+36 −0
Original line number Diff line number Diff line
@@ -290,6 +290,26 @@ static int hantro_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
	return 0;
}

static int hantro_hevc_s_ctrl(struct v4l2_ctrl *ctrl)
{
	struct hantro_ctx *ctx;

	ctx = container_of(ctrl->handler,
			   struct hantro_ctx, ctrl_handler);

	vpu_debug(1, "s_ctrl: id = %d, val = %d\n", ctrl->id, ctrl->val);

	switch (ctrl->id) {
	case V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP:
		ctx->hevc_dec.ctrls.hevc_hdr_skip_length = ctrl->val;
		break;
	default:
		return -EINVAL;
	}

	return 0;
}

static const struct v4l2_ctrl_ops hantro_ctrl_ops = {
	.try_ctrl = hantro_try_ctrl,
};
@@ -298,6 +318,10 @@ static const struct v4l2_ctrl_ops hantro_jpeg_ctrl_ops = {
	.s_ctrl = hantro_jpeg_s_ctrl,
};

static const struct v4l2_ctrl_ops hantro_hevc_ctrl_ops = {
	.s_ctrl = hantro_hevc_s_ctrl,
};

static const struct hantro_ctrl controls[] = {
	{
		.codec = HANTRO_JPEG_ENCODER,
@@ -423,6 +447,18 @@ static const struct hantro_ctrl controls[] = {
		.cfg = {
			.id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS,
		},
	}, {
		.codec = HANTRO_HEVC_DECODER,
		.cfg = {
			.id = V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP,
			.name = "Hantro HEVC slice header skip bytes",
			.type = V4L2_CTRL_TYPE_INTEGER,
			.min = 0,
			.def = 0,
			.max = 0x100,
			.step = 1,
			.ops = &hantro_hevc_ctrl_ops,
		},
	},
};

+586 −0

File added.

Preview size limit exceeded, changes collapsed.

+198 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading