[FFmpeg-devel] [PATCH] avfilter/vf_chromakey: The chromakey filter preserves non-opaque alpha transparency.
Gavin Smith
gcs584 at yahoo.com
Thu Jun 11 01:36:56 EEST 2020
On 10/06/2020 22:33, Gavin Smith wrote:
> From: Gavin Smith <gcs584 at yahoo.com>
Sorry, new to all this. A description would have been helpful. I'll work
on getting it right.
So this patch is to address Trac ticket #8724:
https://trac.ffmpeg.org/ticket/8724
>
> ---
> libavfilter/vf_chromakey.c | 43 ++++++++++++++++++++++----------------
> 1 file changed, 25 insertions(+), 18 deletions(-)
>
> diff --git a/libavfilter/vf_chromakey.c b/libavfilter/vf_chromakey.c
> index 4b1669d084..7206f44441 100644
> --- a/libavfilter/vf_chromakey.c
> +++ b/libavfilter/vf_chromakey.c
> @@ -47,7 +47,7 @@ typedef struct ChromakeyContext {
> int jobnr, int nb_jobs);
> } ChromakeyContext;
>
> -static uint8_t do_chromakey_pixel(ChromakeyContext *ctx, uint8_t u[9], uint8_t v[9])
> +static uint8_t do_chromakey_pixel(ChromakeyContext *ctx, uint8_t a, uint8_t u[9], uint8_t v[9])
> {
> double diff = 0.0;
> int du, dv, i;
> @@ -62,13 +62,13 @@ static uint8_t do_chromakey_pixel(ChromakeyContext *ctx, uint8_t u[9], uint8_t v
> diff /= 9.0;
>
> if (ctx->blend > 0.0001) {
> - return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * 255.0;
> + return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * (float)a;
> } else {
> - return (diff > ctx->similarity) ? 255 : 0;
> + return (diff > ctx->similarity) ? a : 0;
> }
> }
>
> -static uint16_t do_chromakey_pixel16(ChromakeyContext *ctx, uint16_t u[9], uint16_t v[9])
> +static uint16_t do_chromakey_pixel16(ChromakeyContext *ctx, uint16_t a, uint16_t u[9], uint16_t v[9])
> {
> double max = ctx->max;
> double diff = 0.0;
> @@ -84,9 +84,9 @@ static uint16_t do_chromakey_pixel16(ChromakeyContext *ctx, uint16_t u[9], uint1
> diff /= 9.0;
>
> if (ctx->blend > 0.0001) {
> - return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * max;
> + return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * (float)a;
> } else {
> - return (diff > ctx->similarity) ? max : 0;
> + return (diff > ctx->similarity) ? a : 0;
> }
> }
>
> @@ -131,13 +131,17 @@ static int do_chromakey_slice(AVFilterContext *avctx, void *arg, int jobnr, int
>
> for (y = slice_start; y < slice_end; ++y) {
> for (x = 0; x < frame->width; ++x) {
> - for (yo = 0; yo < 3; ++yo) {
> - for (xo = 0; xo < 3; ++xo) {
> - get_pixel_uv(frame, ctx->hsub_log2, ctx->vsub_log2, x + xo - 1, y + yo - 1, &u[yo * 3 + xo], &v[yo * 3 + xo]);
> + uint8_t *a = frame->data[3] + frame->linesize[3] * y;
> + const uint8_t ao = a[x];
> +
> + if (ao != 0) {
> + for (yo = 0; yo < 3; ++yo) {
> + for (xo = 0; xo < 3; ++xo) {
> + get_pixel_uv(frame, ctx->hsub_log2, ctx->vsub_log2, x + xo - 1, y + yo - 1, &u[yo * 3 + xo], &v[yo * 3 + xo]);
> + }
> }
> + a[x] = do_chromakey_pixel(ctx, ao, u, v);
> }
> -
> - frame->data[3][frame->linesize[3] * y + x] = do_chromakey_pixel(ctx, u, v);
> }
> }
>
> @@ -163,15 +167,18 @@ static int do_chromakey16_slice(AVFilterContext *avctx, void *arg, int jobnr, in
>
> for (y = slice_start; y < slice_end; ++y) {
> for (x = 0; x < frame->width; ++x) {
> - uint16_t *dst = (uint16_t *)(frame->data[3] + frame->linesize[3] * y);
> -
> - for (yo = 0; yo < 3; ++yo) {
> - for (xo = 0; xo < 3; ++xo) {
> - get_pixel16_uv(frame, ctx->hsub_log2, ctx->vsub_log2, x + xo - 1, y + yo - 1, &u[yo * 3 + xo], &v[yo * 3 + xo]);
> + uint16_t *a = (uint16_t *)(frame->data[3] + frame->linesize[3] * y);
> + const uint16_t ao = a[x];
> +
> + if (ao != 0) {
> + for (yo = 0; yo < 3; ++yo) {
> + for (xo = 0; xo < 3; ++xo) {
> + get_pixel16_uv(frame, ctx->hsub_log2, ctx->vsub_log2, x + xo - 1, y + yo - 1, &u[yo * 3 + xo], &v[yo * 3 + xo]);
> + }
> }
> - }
>
> - dst[x] = do_chromakey_pixel16(ctx, u, v);
> + a[x] = do_chromakey_pixel16(ctx, ao, u, v);
> + }
> }
> }
>
More information about the ffmpeg-devel
mailing list