lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [RFC PATCH 3/8] media: hantro: Support format filtering by depth
    Date
    Dne torek, 05. april 2022 ob 18:09:03 CEST je Benjamin Gaignard napisal(a):
    > Le 27/02/2022 à 15:49, Jernej Skrabec a écrit :
    > > In preparation for supporting 10-bit formats, add mechanism which will
    > > filter formats based on pixel depth.
    > >
    > > Hantro G2 supports only one decoding format natively and that is based
    > > on bit depth of current video frame. Additionally, it makes no sense to
    > > upconvert bitness, so filter those out too.
    > >
    > > Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
    > > ---
    > >
    > > drivers/staging/media/hantro/hantro.h | 4 ++
    > > drivers/staging/media/hantro/hantro_v4l2.c | 48 ++++++++++++++++++++--
    > > drivers/staging/media/hantro/hantro_v4l2.h | 1 +
    > > 3 files changed, 50 insertions(+), 3 deletions(-)
    > >
    > > diff --git a/drivers/staging/media/hantro/hantro.h
    > > b/drivers/staging/media/hantro/hantro.h index 06d0f3597694..c6525ee8d89a
    > > 100644
    > > --- a/drivers/staging/media/hantro/hantro.h
    > > +++ b/drivers/staging/media/hantro/hantro.h
    > > @@ -227,6 +227,7 @@ struct hantro_dev {
    > >
    > > *
    > > * @ctrl_handler: Control handler used to register controls.
    > > * @jpeg_quality: User-specified JPEG compression quality.
    > >
    > > + * @bit_depth: Bit depth of current frame
    > >
    > > *
    > > * @codec_ops: Set of operations related to codec mode.
    > > * @postproc: Post-processing context.
    > >
    > > @@ -252,6 +253,7 @@ struct hantro_ctx {
    > >
    > > struct v4l2_ctrl_handler ctrl_handler;
    > > int jpeg_quality;
    > >
    > > + int bit_depth;
    > >
    > > const struct hantro_codec_ops *codec_ops;
    > > struct hantro_postproc_ctx postproc;
    > >
    > > @@ -278,6 +280,7 @@ struct hantro_ctx {
    > >
    > > * @enc_fmt: Format identifier for encoder registers.
    > > * @frmsize: Supported range of frame sizes (only for bitstream
    > > formats).
    > > * @postprocessed: Indicates if this format needs the post-processor.
    > >
    > > + * @match_depth: Indicates if format bit depth must match video bit depth
    > >
    > > */
    > >
    > > struct hantro_fmt {
    > >
    > > char *name;
    > >
    > > @@ -288,6 +291,7 @@ struct hantro_fmt {
    > >
    > > enum hantro_enc_fmt enc_fmt;
    > > struct v4l2_frmsize_stepwise frmsize;
    > > bool postprocessed;
    > >
    > > + bool match_depth;
    > >
    > > };
    > >
    > > struct hantro_reg {
    > >
    > > diff --git a/drivers/staging/media/hantro/hantro_v4l2.c
    > > b/drivers/staging/media/hantro/hantro_v4l2.c index
    > > e595905b3bd7..1214fa2f64ae 100644
    > > --- a/drivers/staging/media/hantro/hantro_v4l2.c
    > > +++ b/drivers/staging/media/hantro/hantro_v4l2.c
    > > @@ -64,6 +64,42 @@ hantro_get_postproc_formats(const struct hantro_ctx
    > > *ctx,>
    > > return ctx->dev->variant->postproc_fmts;
    > >
    > > }
    > >
    > > +int hantro_get_formath_depth(u32 fourcc)
    >
    > Just a typo here:
    >
    > s/hantro_get_formath_depth -> hantro_get_format_depth

    Good catch! I'll fix it in new series.

    Best regards,
    Jernej

    >
    > regards
    > Benjamin
    >
    > > +{
    > > + switch (fourcc) {
    > > + case V4L2_PIX_FMT_P010:
    > > + case V4L2_PIX_FMT_P010_4L4:
    > > + return 10;
    > > + default:
    > > + return 8;
    > > + }
    > > +}
    > > +
    > > +static bool
    > > +hantro_check_depth_match(const struct hantro_ctx *ctx,
    > > + const struct hantro_fmt *fmt)
    > > +{
    > > + int fmt_depth, ctx_depth = 8;
    > > +
    > > + if (!fmt->match_depth && !fmt->postprocessed)
    > > + return true;
    > > +
    > > + /* 0 means default depth, which is 8 */
    > > + if (ctx->bit_depth)
    > > + ctx_depth = ctx->bit_depth;
    > > +
    > > + fmt_depth = hantro_get_formath_depth(fmt->fourcc);
    > > +
    > > + /*
    > > + * Allow only downconversion for postproc formats for now.
    > > + * It may be possible to relax that on some HW.
    > > + */
    > > + if (!fmt->match_depth)
    > > + return fmt_depth <= ctx_depth;
    > > +
    > > + return fmt_depth == ctx_depth;
    > > +}
    > > +
    > >
    > > static const struct hantro_fmt *
    > > hantro_find_format(const struct hantro_ctx *ctx, u32 fourcc)
    > > {
    > >
    > > @@ -91,7 +127,8 @@ hantro_get_default_fmt(const struct hantro_ctx *ctx,
    > > bool bitstream)>
    > > formats = hantro_get_formats(ctx, &num_fmts);
    > > for (i = 0; i < num_fmts; i++) {
    > >
    > > if (bitstream == (formats[i].codec_mode !=
    > >
    > > - HANTRO_MODE_NONE))
    > > + HANTRO_MODE_NONE) &&
    > > + hantro_check_depth_match(ctx, &formats[i]))
    > >
    > > return &formats[i];
    > >
    > > }
    > > return NULL;
    > >
    > > @@ -163,11 +200,13 @@ static int vidioc_enum_fmt(struct file *file, void
    > > *priv,>
    > > formats = hantro_get_formats(ctx, &num_fmts);
    > > for (i = 0; i < num_fmts; i++) {
    > >
    > > bool mode_none = formats[i].codec_mode ==
    HANTRO_MODE_NONE;
    > >
    > > + fmt = &formats[i];
    > >
    > > if (skip_mode_none == mode_none)
    > >
    > > continue;
    > >
    > > + if (!hantro_check_depth_match(ctx, fmt))
    > > + continue;
    > >
    > > if (j == f->index) {
    > >
    > > - fmt = &formats[i];
    > >
    > > f->pixelformat = fmt->fourcc;
    > > return 0;
    > >
    > > }
    > >
    > > @@ -183,8 +222,11 @@ static int vidioc_enum_fmt(struct file *file, void
    > > *priv,>
    > > return -EINVAL;
    > >
    > > formats = hantro_get_postproc_formats(ctx, &num_fmts);
    > > for (i = 0; i < num_fmts; i++) {
    > >
    > > + fmt = &formats[i];
    > > +
    > > + if (!hantro_check_depth_match(ctx, fmt))
    > > + continue;
    > >
    > > if (j == f->index) {
    > >
    > > - fmt = &formats[i];
    > >
    > > f->pixelformat = fmt->fourcc;
    > > return 0;
    > >
    > > }
    > >
    > > diff --git a/drivers/staging/media/hantro/hantro_v4l2.h
    > > b/drivers/staging/media/hantro/hantro_v4l2.h index
    > > 18bc682c8556..f4a5905ed518 100644
    > > --- a/drivers/staging/media/hantro/hantro_v4l2.h
    > > +++ b/drivers/staging/media/hantro/hantro_v4l2.h
    > > @@ -22,5 +22,6 @@ extern const struct v4l2_ioctl_ops hantro_ioctl_ops;
    > >
    > > extern const struct vb2_ops hantro_queue_ops;
    > >
    > > void hantro_reset_fmts(struct hantro_ctx *ctx);
    > >
    > > +int hantro_get_formath_depth(u32 fourcc);
    > >
    > > #endif /* HANTRO_V4L2_H_ */




    \
     
     \ /
      Last update: 2022-04-06 07:21    [W:7.469 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site