[FFmpeg-devel] [PATCH v4 2/3] avfilter/vf_overlay: add yuv420p10 and yuv422p10 10bit format support

lance.lmwang at gmail.com lance.lmwang at gmail.com
Thu Jun 18 16:30:43 EEST 2020


On Thu, Jun 18, 2020 at 01:34:52PM +0200, Paul B Mahol wrote:
> Is auto option still working with these formats?

No, overlay auto are using alpha format, it's always failed to work for auto.
So it's better to force the output.

> 
> On 6/5/20, lance.lmwang at gmail.com <lance.lmwang at gmail.com> wrote:
> > From: Limin Wang <lance.lmwang at gmail.com>
> >
> > Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> > ---
> >  doc/filters.texi         |  6 ++++
> >  libavfilter/vf_overlay.c | 79
> > ++++++++++++++++++++++++++++++++++++++++++++++++
> >  libavfilter/vf_overlay.h |  2 ++
> >  3 files changed, 87 insertions(+)
> >
> > diff --git a/doc/filters.texi b/doc/filters.texi
> > index f76604c..4c54325 100644
> > --- a/doc/filters.texi
> > +++ b/doc/filters.texi
> > @@ -14342,9 +14342,15 @@ It accepts the following values:
> >  @item yuv420
> >  force YUV420 output
> >
> > + at item yuv420p10
> > +force YUV420p10 output
> > +
> >  @item yuv422
> >  force YUV422 output
> >
> > + at item yuv422p10
> > +force YUV422p10 output
> > +
> >  @item yuv444
> >  force YUV444 output
> >
> > diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
> > index 7f73848..5ab3f3f 100644
> > --- a/libavfilter/vf_overlay.c
> > +++ b/libavfilter/vf_overlay.c
> > @@ -154,6 +154,7 @@ static int process_command(AVFilterContext *ctx, const
> > char *cmd, const char *ar
> >
> >  static const enum AVPixelFormat alpha_pix_fmts[] = {
> >      AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
> > +    AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10,
> >      AV_PIX_FMT_ARGB, AV_PIX_FMT_ABGR, AV_PIX_FMT_RGBA,
> >      AV_PIX_FMT_BGRA, AV_PIX_FMT_GBRAP, AV_PIX_FMT_NONE
> >  };
> > @@ -172,6 +173,14 @@ static int query_formats(AVFilterContext *ctx)
> >          AV_PIX_FMT_YUVA420P, AV_PIX_FMT_NONE
> >      };
> >
> > +    static const enum AVPixelFormat main_pix_fmts_yuv420p10[] = {
> > +        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUVA420P10,
> > +        AV_PIX_FMT_NONE
> > +    };
> > +    static const enum AVPixelFormat overlay_pix_fmts_yuv420p10[] = {
> > +        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_NONE
> > +    };
> > +
> >      static const enum AVPixelFormat main_pix_fmts_yuv422[] = {
> >          AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVA422P,
> > AV_PIX_FMT_NONE
> >      };
> > @@ -179,6 +188,13 @@ static int query_formats(AVFilterContext *ctx)
> >          AV_PIX_FMT_YUVA422P, AV_PIX_FMT_NONE
> >      };
> >
> > +    static const enum AVPixelFormat main_pix_fmts_yuv422p10[] = {
> > +        AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_NONE
> > +    };
> > +    static const enum AVPixelFormat overlay_pix_fmts_yuv422p10[] = {
> > +        AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_NONE
> > +    };
> > +
> >      static const enum AVPixelFormat main_pix_fmts_yuv444[] = {
> >          AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVA444P,
> > AV_PIX_FMT_NONE
> >      };
> > @@ -217,6 +233,13 @@ static int query_formats(AVFilterContext *ctx)
> >                  goto fail;
> >              }
> >          break;
> > +    case OVERLAY_FORMAT_YUV420P10:
> > +        if (!(main_formats    =
> > ff_make_format_list(main_pix_fmts_yuv420p10)) ||
> > +            !(overlay_formats =
> > ff_make_format_list(overlay_pix_fmts_yuv420p10))) {
> > +            ret = AVERROR(ENOMEM);
> > +            goto fail;
> > +        }
> > +        break;
> >      case OVERLAY_FORMAT_YUV422:
> >          if (!(main_formats    = ff_make_format_list(main_pix_fmts_yuv422))
> > ||
> >              !(overlay_formats =
> > ff_make_format_list(overlay_pix_fmts_yuv422))) {
> > @@ -224,6 +247,13 @@ static int query_formats(AVFilterContext *ctx)
> >                  goto fail;
> >              }
> >          break;
> > +    case OVERLAY_FORMAT_YUV422P10:
> > +        if (!(main_formats    =
> > ff_make_format_list(main_pix_fmts_yuv422p10)) ||
> > +            !(overlay_formats =
> > ff_make_format_list(overlay_pix_fmts_yuv422p10))) {
> > +                ret = AVERROR(ENOMEM);
> > +                goto fail;
> > +            }
> > +        break;
> >      case OVERLAY_FORMAT_YUV444:
> >          if (!(main_formats    = ff_make_format_list(main_pix_fmts_yuv444))
> > ||
> >              !(overlay_formats =
> > ff_make_format_list(overlay_pix_fmts_yuv444))) {
> > @@ -566,6 +596,7 @@ static av_always_inline void
> > blend_plane_##depth##_##nbits##bits(AVFilterContext
> >      }
> >                                \
> >  }
> >  DEFINE_BLEND_PLANE(8, 8);
> > +DEFINE_BLEND_PLANE(16, 10);
> >
> >  #define DEFINE_ALPHA_COMPOSITE(depth, nbits)
> >                                \
> >  static inline void alpha_composite_##depth##_##nbits##bits(const AVFrame
> > *src, const AVFrame *dst,         \
> > @@ -617,6 +648,7 @@ static inline void
> > alpha_composite_##depth##_##nbits##bits(const AVFrame *src, c
> >      }
> >                                \
> >  }
> >  DEFINE_ALPHA_COMPOSITE(8, 8);
> > +DEFINE_ALPHA_COMPOSITE(16, 10);
> >
> >  #define DEFINE_BLEND_SLICE_YUV(depth, nbits)
> >                                \
> >  static av_always_inline void
> > blend_slice_yuv_##depth##_##nbits##bits(AVFilterContext *ctx,
> >  \
> > @@ -648,6 +680,7 @@ static av_always_inline void
> > blend_slice_yuv_##depth##_##nbits##bits(AVFilterCon
> >                                                  jobnr, nb_jobs);
> >                                \
> >  }
> >  DEFINE_BLEND_SLICE_YUV(8, 8);
> > +DEFINE_BLEND_SLICE_YUV(16, 10);
> >
> >  static av_always_inline void blend_slice_planar_rgb(AVFilterContext *ctx,
> >                                                      AVFrame *dst, const
> > AVFrame *src,
> > @@ -694,6 +727,38 @@ static int blend_slice_yuva420(AVFilterContext *ctx,
> > void *arg, int jobnr, int n
> >      return 0;
> >  }
> >
> > +static int blend_slice_yuv420p10(AVFilterContext *ctx, void *arg, int
> > jobnr, int nb_jobs)
> > +{
> > +    OverlayContext *s = ctx->priv;
> > +    ThreadData *td = arg;
> > +    blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 1, 0, s->x, s->y,
> > 1, jobnr, nb_jobs);
> > +    return 0;
> > +}
> > +
> > +static int blend_slice_yuva420p10(AVFilterContext *ctx, void *arg, int
> > jobnr, int nb_jobs)
> > +{
> > +    OverlayContext *s = ctx->priv;
> > +    ThreadData *td = arg;
> > +    blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 1, 1, s->x, s->y,
> > 1, jobnr, nb_jobs);
> > +    return 0;
> > +}
> > +
> > +static int blend_slice_yuv422p10(AVFilterContext *ctx, void *arg, int
> > jobnr, int nb_jobs)
> > +{
> > +    OverlayContext *s = ctx->priv;
> > +    ThreadData *td = arg;
> > +    blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 0, 0, s->x, s->y,
> > 1, jobnr, nb_jobs);
> > +    return 0;
> > +}
> > +
> > +static int blend_slice_yuva422p10(AVFilterContext *ctx, void *arg, int
> > jobnr, int nb_jobs)
> > +{
> > +    OverlayContext *s = ctx->priv;
> > +    ThreadData *td = arg;
> > +    blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 0, 1, s->x, s->y,
> > 1, jobnr, nb_jobs);
> > +    return 0;
> > +}
> > +
> >  static int blend_slice_yuv422(AVFilterContext *ctx, void *arg, int jobnr,
> > int nb_jobs)
> >  {
> >      OverlayContext *s = ctx->priv;
> > @@ -857,9 +922,15 @@ static int config_input_main(AVFilterLink *inlink)
> >      case OVERLAY_FORMAT_YUV420:
> >          s->blend_slice = s->main_has_alpha ? blend_slice_yuva420 :
> > blend_slice_yuv420;
> >          break;
> > +    case OVERLAY_FORMAT_YUV420P10:
> > +        s->blend_slice = s->main_has_alpha ? blend_slice_yuva420p10 :
> > blend_slice_yuv420p10;
> > +        break;
> >      case OVERLAY_FORMAT_YUV422:
> >          s->blend_slice = s->main_has_alpha ? blend_slice_yuva422 :
> > blend_slice_yuv422;
> >          break;
> > +    case OVERLAY_FORMAT_YUV422P10:
> > +        s->blend_slice = s->main_has_alpha ? blend_slice_yuva422p10 :
> > blend_slice_yuv422p10;
> > +        break;
> >      case OVERLAY_FORMAT_YUV444:
> >          s->blend_slice = s->main_has_alpha ? blend_slice_yuva444 :
> > blend_slice_yuv444;
> >          break;
> > @@ -874,9 +945,15 @@ static int config_input_main(AVFilterLink *inlink)
> >          case AV_PIX_FMT_YUVA420P:
> >              s->blend_slice = blend_slice_yuva420;
> >              break;
> > +        case AV_PIX_FMT_YUVA420P10:
> > +            s->blend_slice = blend_slice_yuva420p10;
> > +            break;
> >          case AV_PIX_FMT_YUVA422P:
> >              s->blend_slice = blend_slice_yuva422;
> >              break;
> > +        case AV_PIX_FMT_YUVA422P10:
> > +            s->blend_slice = blend_slice_yuva422p10;
> > +            break;
> >          case AV_PIX_FMT_YUVA444P:
> >              s->blend_slice = blend_slice_yuva444;
> >              break;
> > @@ -1028,7 +1105,9 @@ static const AVOption overlay_options[] = {
> >      { "shortest", "force termination when the shortest input terminates",
> > OFFSET(fs.opt_shortest), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
> >      { "format", "set output format", OFFSET(format), AV_OPT_TYPE_INT,
> > {.i64=OVERLAY_FORMAT_YUV420}, 0, OVERLAY_FORMAT_NB-1, FLAGS, "format" },
> >          { "yuv420", "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_YUV420},
> > .flags = FLAGS, .unit = "format" },
> > +        { "yuv420p10", "", 0, AV_OPT_TYPE_CONST,
> > {.i64=OVERLAY_FORMAT_YUV420P10}, .flags = FLAGS, .unit = "format" },
> >          { "yuv422", "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_YUV422},
> > .flags = FLAGS, .unit = "format" },
> > +        { "yuv422p10", "", 0, AV_OPT_TYPE_CONST,
> > {.i64=OVERLAY_FORMAT_YUV422P10}, .flags = FLAGS, .unit = "format" },
> >          { "yuv444", "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_YUV444},
> > .flags = FLAGS, .unit = "format" },
> >          { "rgb",    "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_RGB},
> > .flags = FLAGS, .unit = "format" },
> >          { "gbrp",   "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_GBRP},
> > .flags = FLAGS, .unit = "format" },
> > diff --git a/libavfilter/vf_overlay.h b/libavfilter/vf_overlay.h
> > index 98b06ea..30a1a73 100644
> > --- a/libavfilter/vf_overlay.h
> > +++ b/libavfilter/vf_overlay.h
> > @@ -41,7 +41,9 @@ enum var_name {
> >
> >  enum OverlayFormat {
> >      OVERLAY_FORMAT_YUV420,
> > +    OVERLAY_FORMAT_YUV420P10,
> >      OVERLAY_FORMAT_YUV422,
> > +    OVERLAY_FORMAT_YUV422P10,
> >      OVERLAY_FORMAT_YUV444,
> >      OVERLAY_FORMAT_RGB,
> >      OVERLAY_FORMAT_GBRP,
> > --
> > 1.8.3.1
> >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel at ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".

-- 
Thanks,
Limin Wang


More information about the ffmpeg-devel mailing list