Skip to content

Commit

Permalink
media: hantro: Introduce G2/HEVC decoder
Browse files Browse the repository at this point in the history
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: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Co-developed-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Co-developed-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
  • Loading branch information
Benjamin Gaignard authored and Mauro Carvalho Chehab committed Jun 8, 2021
1 parent b7782b3 commit cb5dd5a
Show file tree
Hide file tree
Showing 7 changed files with 1,208 additions and 0 deletions.
2 changes: 2 additions & 0 deletions drivers/staging/media/hantro/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 2 additions & 0 deletions drivers/staging/media/hantro/hantro.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
};
};

Expand Down
36 changes: 36 additions & 0 deletions drivers/staging/media/hantro/hantro_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand All @@ -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,
Expand Down Expand Up @@ -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,
},
},
};

Expand Down
Loading

0 comments on commit cb5dd5a

Please sign in to comment.