On 01/04/2021 18:00, Benjamin Gaignard wrote: > > Implement all the logic to get G2 hardware decoding HEVC frames. > > It support up level 5.1 HEVC stream. support -> supports > > It doesn't support yet 10 bits formats or scaling feature. scaling -> the scaling > > > > 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. Compute the needed value is complex and require Compute -> Computing require -> 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@xxxxxxxxxxxxx> > > Co-developed-by: Adrian Ratiu <adrian.ratiu@xxxxxxxxxxxxx> > > Signed-off-by: Adrian Ratiu <adrian.ratiu@xxxxxxxxxxxxx> > > Co-developed-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx> > > Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx> > > --- > > version 8: > > - Fix compilation warnings > > > > version 7: > > - Improve motion vectors requested memory size computation. > > > > drivers/staging/media/hantro/Makefile | 2 + > > drivers/staging/media/hantro/hantro.h | 2 + > > drivers/staging/media/hantro/hantro_drv.c | 36 ++ > > .../staging/media/hantro/hantro_g2_hevc_dec.c | 587 ++++++++++++++++++ > > drivers/staging/media/hantro/hantro_g2_regs.h | 198 ++++++ > > drivers/staging/media/hantro/hantro_hevc.c | 325 ++++++++++ > > drivers/staging/media/hantro/hantro_hw.h | 49 ++ > > 7 files changed, 1199 insertions(+) > > create mode 100644 drivers/staging/media/hantro/hantro_g2_hevc_dec.c > > create mode 100644 drivers/staging/media/hantro/hantro_g2_regs.h > > create mode 100644 drivers/staging/media/hantro/hantro_hevc.c > > > > diff --git a/drivers/staging/media/hantro/Makefile b/drivers/staging/media/hantro/Makefile > > index 743ce08eb184..0357f1772267 100644 > > --- a/drivers/staging/media/hantro/Makefile > > +++ b/drivers/staging/media/hantro/Makefile > > @@ -9,12 +9,14 @@ hantro-vpu-y += \ > > hantro_h1_jpeg_enc.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 > > > > diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h > > index 7a5ad93466c8..6a21d1e95b34 100644 > > --- a/drivers/staging/media/hantro/hantro.h > > +++ b/drivers/staging/media/hantro/hantro.h > > @@ -222,6 +222,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; > > @@ -248,6 +249,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; > > }; > > }; > > > > diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c > > index d9a3a5ef9330..33b8bd38eac1 100644 > > --- a/drivers/staging/media/hantro/hantro_drv.c > > +++ b/drivers/staging/media/hantro/hantro_drv.c > > @@ -281,6 +281,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, > > }; > > @@ -289,6 +309,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, > > @@ -409,6 +433,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 = 0x7fffffff, This seems an insanely high number. > > + .step = 1, > > + .ops = &hantro_hevc_ctrl_ops, > > + }, > > }, > > }; Regards, Hans