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.lmw...@gmail.com <lance.lmw...@gmail.com> wrote: > > From: Limin Wang <lance.lmw...@gmail.com> > > > > Signed-off-by: Limin Wang <lance.lmw...@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 > > > > +@item yuv420p10 > > +force YUV420p10 output > > + > > @item yuv422 > > force YUV422 output > > > > +@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@ffmpeg.org > > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > To unsubscribe, visit link above, or email > > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". -- Thanks, Limin Wang _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".