From patchwork Fri May 24 09:36:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 13272 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 72B11449A69 for ; Fri, 24 May 2019 12:37:07 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5FA7E68A6B2; Fri, 24 May 2019 12:37:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 170A568A6C5 for ; Fri, 24 May 2019 12:37:00 +0300 (EEST) Received: by mail-pl1-f195.google.com with SMTP id g9so3948888plm.6 for ; Fri, 24 May 2019 02:37:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Be2S+JeN7TTCZIg1sTv3z9xsQLLRB3+4Erg48yROvJE=; b=UjqL3e4Ckya91Y1YpFq+8Lq/s4zmTC1NT+JkJ9rWLFXJ6SkvcaLeUTtG7glrZyI1ot uPhBhQKMMCvwODJo8Tdaeix1o0SQ775ZARUroZ0uOKuSLE43AnUzNV9Nn1H3KkEjbTgC xNLRwp2A8iQu0g6+rd2gLiZXJdtXf6MSTGljqVowCyxF1vQuQoREJdQntPdNb8ZPBIGG NqXDzGKh0Hn8xGIknHiCJNGkKrEthS/H+Wp0UqF4XlfyiblAeklrmW+dOxYEacMjqhtw +vHnUn6VrOdWT3dhvCVY/V9a4UMBrXKP5V5mIFsdMVTBsJdj1GiI4ZYuhMu5PUODUcBQ IsGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Be2S+JeN7TTCZIg1sTv3z9xsQLLRB3+4Erg48yROvJE=; b=ObNHFs7OkDb9eEWW5wq+WuFmgULylohysPBi8YlOR0PQfYvd4rg4voMEsjJugmFq5r u7Ar1zFxO9Vc1SI3zfuVctvW1liCx91g+02zI2H3vYx6/o1Yn8xQC+eaxZeXZc+oadMi qTWeoEpA51AUBREHV0fnmxsbA8Sl74uL/E+Vth/Oq8r+2SCfMdBJBKdUPh2kWLSniihW jXqkWrkS+slCB7269t4xXAOWclllSfJOdwlFOqLvMV0YzcngHG3IY28yX29mvSIibI2S vOW/bW3ov1xc63JHhSecME4bQ883fdEd/nfzy6K9mmRj12JzyqNJdePIYsmHvkQLU4zw 78jg== X-Gm-Message-State: APjAAAVEdoBZABEPaXpQKXcXitvDKn50WJ+FB3LMvLFHAu4HyHv8Qu7w zl8HfLEFB0uQ/I22MrYyFDkYmFmtftw= X-Google-Smtp-Source: APXvYqy1IujAXsE72TOyA+jkQI+51IleGfkJz42DJOPhzvVlhICTS4yjiZn6bSjq/2AtbJbRyRDs6A== X-Received: by 2002:a17:902:7581:: with SMTP id j1mr20975783pll.23.1558690618261; Fri, 24 May 2019 02:36:58 -0700 (PDT) Received: from localhost.localdomain ([47.90.99.151]) by smtp.gmail.com with ESMTPSA id x7sm1951254pfm.82.2019.05.24.02.36.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 24 May 2019 02:36:57 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 24 May 2019 17:36:16 +0800 Message-Id: <20190524093616.74647-7-lance.lmwang@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190524093616.74647-1-lance.lmwang@gmail.com> References: <20190524093616.74647-1-lance.lmwang@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/7] libavfilter/vf_overlay.c: add the yuv420p10 10bit support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: onemda@gmail.com, Limin Wang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Limin Wang The test ffmpeg command in iMAC: ./ffmpeg -y -i input.ts -i ./logo.png -filter_complex overlay=50:50:format=yuv420p10 -c:v hevc_videotoolbox ./test.ts Now I have tested with 8bit and check the result is OK --- libavfilter/vf_overlay.c | 54 ++++++++++++++++++++++++++++++++++------ libavfilter/vf_overlay.h | 1 + 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index 8376494efc..48e6a90f8b 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -153,7 +153,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_YUVA420P, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P, 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 +172,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_YUV420P10LE, AV_PIX_FMT_YUVA420P10LE, + AV_PIX_FMT_NONE + }; + static const enum AVPixelFormat overlay_pix_fmts_yuv420p10[] = { + AV_PIX_FMT_YUVA420P10LE, 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 }; @@ -217,6 +225,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))) { @@ -494,7 +509,7 @@ static av_always_inline void blend_plane_##depth##_##nbits##bits(AVFilterContext kmax = FFMIN(-xp + dst_wp, src_wp); \ \ if (nbits == 8 && ((vsub && j+1 < src_hp) || !vsub) && octx->blend_row[i]) { \ - int c = octx->blend_row[i](d, da, s, a, kmax - k, src->linesize[3]); \ + int c = octx->blend_row[i]((uint8_t*)d, (uint8_t*)da, (uint8_t*)s, (uint8_t*)a, kmax - k, src->linesize[3]); \ \ s += c; \ d += dst_step * c; \ @@ -539,18 +554,18 @@ static av_always_inline void blend_plane_##depth##_##nbits##bits(AVFilterContext if (nbits > 8) \ *d = (*d * (max - alpha) + *s * alpha) / max; \ else \ - *d = FAST_DIV255(*d * (255 - alpha) + *s * alpha); \ + *d = FAST_DIV255(*d * (max - alpha) + *s * alpha); \ } else { \ if (nbits > 8) { \ if (i && yuv) \ - *d = av_clip((*d * (max - alpha) + *s * alpha) / max + *s - 128, -128, 128) + 128; \ + *d = av_clip((*d * (max - alpha) + *s * alpha) / max + *s - mid, -mid, mid) + mid; \ else \ - *d = FFMIN((*d * (max - alpha) + *s * alpha) / max + *s, 255); \ + *d = FFMIN((*d * (max - alpha) + *s * alpha) / max + *s, max); \ } else { \ if (i && yuv) \ - *d = av_clip(FAST_DIV255((*d - 128) * (255 - alpha)) + *s - 128, -128, 128) + 128; \ + *d = av_clip(FAST_DIV255((*d - mid) * (max - alpha)) + *s - mid, -mid, mid) + mid; \ else \ - *d = FFMIN(FAST_DIV255(*d * (255 - alpha)) + *s, 255); \ + *d = FFMIN(FAST_DIV255(*d * (max - alpha)) + *s, max); \ } \ } \ s++; \ @@ -565,6 +580,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, \ @@ -620,6 +636,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, \ @@ -650,6 +667,7 @@ static av_always_inline void blend_slice_yuv_##depth##_##nbits##bits(AVFilterCon alpha_composite_##depth##_##nbits##bits(src, dst, src_w, src_h, dst_w, dst_h, x, y, 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, @@ -696,6 +714,21 @@ 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_yuv422(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) { OverlayContext *s = ctx->priv; @@ -859,6 +892,9 @@ 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; @@ -876,6 +912,9 @@ 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; @@ -1030,6 +1069,7 @@ 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" }, { "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" }, diff --git a/libavfilter/vf_overlay.h b/libavfilter/vf_overlay.h index 98b06eaacf..d68c4f931b 100644 --- a/libavfilter/vf_overlay.h +++ b/libavfilter/vf_overlay.h @@ -41,6 +41,7 @@ enum var_name { enum OverlayFormat { OVERLAY_FORMAT_YUV420, + OVERLAY_FORMAT_YUV420P10, OVERLAY_FORMAT_YUV422, OVERLAY_FORMAT_YUV444, OVERLAY_FORMAT_RGB,