diff options
author | Paul B Mahol <onemda@gmail.com> | 2017-06-25 12:07:50 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-06-25 12:32:53 +0200 |
commit | f269a1e0b8816737d421afce2908977c3e26fa7c (patch) | |
tree | 91449a77af8631bd1b1be784a42a1ee2395f9d2b | |
parent | 89f8bff7983f375e3f0638c0af8d12520a478808 (diff) | |
download | ffmpeg-f269a1e0b8816737d421afce2908977c3e26fa7c.tar.gz |
avfilter/vf_overlay: separate functions with main alpha
~5-15% faster overall with main input without alpha.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | libavfilter/vf_overlay.c | 71 |
1 files changed, 46 insertions, 25 deletions
diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index beb61c1497..ad292a61c1 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -416,7 +416,7 @@ static int config_output(AVFilterLink *outlink) static void blend_image_packed_rgb(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, - int x, int y) + int main_has_alpha, int x, int y) { OverlayContext *s = ctx->priv; int i, imax, j, jmax; @@ -435,7 +435,6 @@ static void blend_image_packed_rgb(AVFilterContext *ctx, const int sb = s->overlay_rgba_map[B]; const int sa = s->overlay_rgba_map[A]; const int sstep = s->overlay_pix_step[0]; - const int main_has_alpha = s->main_has_alpha; uint8_t *S, *sp, *d, *dp; i = FFMAX(-y, 0); @@ -634,11 +633,11 @@ static av_always_inline void blend_image_yuv(AVFilterContext *ctx, s->main_desc->comp[2].plane, s->main_desc->comp[2].offset, s->main_desc->comp[2].step); } -static av_always_inline void blend_image_rgb(AVFilterContext *ctx, - AVFrame *dst, const AVFrame *src, - int hsub, int vsub, - int main_has_alpha, - int x, int y) +static av_always_inline void blend_image_planar_rgb(AVFilterContext *ctx, + AVFrame *dst, const AVFrame *src, + int hsub, int vsub, + int main_has_alpha, + int x, int y) { OverlayContext *s = ctx->priv; const int src_w = src->width; @@ -659,30 +658,52 @@ static av_always_inline void blend_image_rgb(AVFilterContext *ctx, static void blend_image_yuv420(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) { - OverlayContext *s = ctx->priv; + blend_image_yuv(ctx, dst, src, 1, 1, 0, x, y); +} - blend_image_yuv(ctx, dst, src, 1, 1, s->main_has_alpha, x, y); +static void blend_image_yuva420(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) +{ + blend_image_yuv(ctx, dst, src, 1, 1, 1, x, y); } static void blend_image_yuv422(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) { - OverlayContext *s = ctx->priv; + blend_image_yuv(ctx, dst, src, 1, 0, 0, x, y); +} - blend_image_yuv(ctx, dst, src, 1, 0, s->main_has_alpha, x, y); +static void blend_image_yuva422(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) +{ + blend_image_yuv(ctx, dst, src, 1, 0, 1, x, y); } static void blend_image_yuv444(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) { - OverlayContext *s = ctx->priv; + blend_image_yuv(ctx, dst, src, 0, 0, 0, x, y); +} - blend_image_yuv(ctx, dst, src, 0, 0, s->main_has_alpha, x, y); +static void blend_image_yuva444(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) +{ + blend_image_yuv(ctx, dst, src, 0, 0, 1, x, y); } static void blend_image_gbrp(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) { - OverlayContext *s = ctx->priv; + blend_image_planar_rgb(ctx, dst, src, 0, 0, 0, x, y); +} - blend_image_rgb(ctx, dst, src, 0, 0, s->main_has_alpha, x, y); +static void blend_image_gbrap(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) +{ + blend_image_planar_rgb(ctx, dst, src, 0, 0, 1, x, y); +} + +static void blend_image_rgb(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) +{ + blend_image_packed_rgb(ctx, dst, src, 0, x, y); +} + +static void blend_image_rgba(AVFilterContext *ctx, AVFrame *dst, const AVFrame *src, int x, int y) +{ + blend_image_packed_rgb(ctx, dst, src, 1, x, y); } static int config_input_main(AVFilterLink *inlink) @@ -702,39 +723,39 @@ static int config_input_main(AVFilterLink *inlink) s->main_has_alpha = ff_fmt_is_in(inlink->format, alpha_pix_fmts); switch (s->format) { case OVERLAY_FORMAT_YUV420: - s->blend_image = blend_image_yuv420; + s->blend_image = s->main_has_alpha ? blend_image_yuva420 : blend_image_yuv420; break; case OVERLAY_FORMAT_YUV422: - s->blend_image = blend_image_yuv422; + s->blend_image = s->main_has_alpha ? blend_image_yuva422 : blend_image_yuv422; break; case OVERLAY_FORMAT_YUV444: - s->blend_image = blend_image_yuv444; + s->blend_image = s->main_has_alpha ? blend_image_yuva444 : blend_image_yuv444; break; case OVERLAY_FORMAT_RGB: - s->blend_image = blend_image_packed_rgb; + s->blend_image = s->main_has_alpha ? blend_image_rgba : blend_image_rgb; break; case OVERLAY_FORMAT_GBRP: - s->blend_image = blend_image_gbrp; + s->blend_image = s->main_has_alpha ? blend_image_gbrap : blend_image_gbrp; break; case OVERLAY_FORMAT_AUTO: switch (inlink->format) { case AV_PIX_FMT_YUVA420P: - s->blend_image = blend_image_yuv420; + s->blend_image = blend_image_yuva420; break; case AV_PIX_FMT_YUVA422P: - s->blend_image = blend_image_yuv422; + s->blend_image = blend_image_yuva422; break; case AV_PIX_FMT_YUVA444P: - s->blend_image = blend_image_yuv444; + s->blend_image = blend_image_yuva444; break; case AV_PIX_FMT_ARGB: case AV_PIX_FMT_RGBA: case AV_PIX_FMT_BGRA: case AV_PIX_FMT_ABGR: - s->blend_image = blend_image_packed_rgb; + s->blend_image = blend_image_rgba; break; case AV_PIX_FMT_GBRAP: - s->blend_image = blend_image_gbrp; + s->blend_image = blend_image_gbrap; break; default: av_assert0(0); |