/*
 * Copyright (c) 2016 Paul B Mahol
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avfilter.h"
#include "formats.h"
#include "internal.h"
#include "video.h"

typedef struct AverageBlurContext {
    const AVClass *class;

    int radius;
    int radiusV;
    int planes;

    int depth;
    int planewidth[4];
    int planeheight[4];
    float *buffer;
    int nb_planes;

    int (*filter_horizontally)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
    int (*filter_vertically)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
} AverageBlurContext;

#define OFFSET(x) offsetof(AverageBlurContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM

static const AVOption avgblur_options[] = {
    { "sizeX",  "set horizontal size",  OFFSET(radius),  AV_OPT_TYPE_INT, {.i64=1},   1, 1024, FLAGS },
    { "planes", "set planes to filter", OFFSET(planes),  AV_OPT_TYPE_INT, {.i64=0xF}, 0,  0xF, FLAGS },
    { "sizeY",  "set vertical size",    OFFSET(radiusV), AV_OPT_TYPE_INT, {.i64=0},   0, 1024, FLAGS },
    { NULL }
};

AVFILTER_DEFINE_CLASS(avgblur);

typedef struct ThreadData {
    int height;
    int width;
    uint8_t *ptr;
    int linesize;
} ThreadData;

#define HORIZONTAL_FILTER(name, type)                                                         \
static int filter_horizontally_##name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)\
{                                                                                             \
    AverageBlurContext *s = ctx->priv;                                                        \
    ThreadData *td = arg;                                                                     \
    const int height = td->height;                                                            \
    const int width = td->width;                                                              \
    const int slice_start = (height *  jobnr   ) / nb_jobs;                                   \
    const int slice_end   = (height * (jobnr+1)) / nb_jobs;                                   \
    const int radius = FFMIN(s->radius, width / 2);                                           \
    const int linesize = td->linesize / sizeof(type);                                         \
    float *buffer = s->buffer;                                                                \
    const type *src;                                                                          \
    float *ptr;                                                                               \
    int y, x;                                                                                 \
                                                                                              \
    /* Filter horizontally along each row */                                                  \
    for (y = slice_start; y < slice_end; y++) {                                               \
        float acc = 0;                                                                        \
        int count = 0;                                                                        \
                                                                                              \
        src = (const type *)td->ptr + linesize * y;                                           \
        ptr = buffer + width * y;                                                             \
                                                                                              \
        for (x = 0; x < radius; x++) {                                                        \
            acc += src[x];                                                                    \
        }                                                                                     \
        count += radius;                                                                      \
                                                                                              \
        for (x = 0; x <= radius; x++) {                                                       \
            acc += src[x + radius];                                                           \
            count++;                                                                          \
            ptr[x] = acc / count;                                                             \
        }                                                                                     \
                                                                                              \
        for (; x < width - radius; x++) {                                                     \
            acc += src[x + radius] - src[x - radius - 1];                                     \
            ptr[x] = acc / count;                                                             \
        }                                                                                     \
                                                                                              \
        for (; x < width; x++) {                                                              \
            acc -= src[x - radius];                                                           \
            count--;                                                                          \
            ptr[x] = acc / count;                                                             \
        }                                                                                     \
    }                                                                                         \
                                                                                              \
    return 0;                                                                                 \
}

HORIZONTAL_FILTER(8, uint8_t)
HORIZONTAL_FILTER(16, uint16_t)

#define VERTICAL_FILTER(name, type)                                                           \
static int filter_vertically_##name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)  \
{                                                                                             \
    AverageBlurContext *s = ctx->priv;                                                        \
    ThreadData *td = arg;                                                                     \
    const int height = td->height;                                                            \
    const int width = td->width;                                                              \
    const int slice_start = (width *  jobnr   ) / nb_jobs;                                    \
    const int slice_end   = (width * (jobnr+1)) / nb_jobs;                                    \
    const int radius = FFMIN(s->radiusV, height / 2);                                         \
    const int linesize = td->linesize / sizeof(type);                                         \
    type *buffer = (type *)td->ptr;                                                           \
    const float *src;                                                                         \
    type *ptr;                                                                                \
    int i, x;                                                                                 \
                                                                                              \
    /* Filter vertically along each column */                                                 \
    for (x = slice_start; x < slice_end; x++) {                                               \
        float acc = 0;                                                                        \
        int count = 0;                                                                        \
                                                                                              \
        ptr = buffer + x;                                                                     \
        src = s->buffer + x;                                                                  \
                                                                                              \
        for (i = 0; i < radius; i++) {                                                        \
            acc += src[0];                                                                    \
            src += width;                                                                     \
        }                                                                                     \
        count += radius;                                                                      \
                                                                                              \
        src = s->buffer + x;                                                                  \
        ptr = buffer + x;                                                                     \
        for (i = 0; i <= radius; i++) {                                                       \
            acc += src[(i + radius) * width];                                                 \
            count++;                                                                          \
            ptr[i * linesize] = acc / count;                                                  \
        }                                                                                     \
                                                                                              \
        for (; i < height - radius; i++) {                                                    \
            acc += src[(i + radius) * width] - src[(i - radius - 1) * width];                 \
            ptr[i * linesize] = acc / count;                                                  \
        }                                                                                     \
                                                                                              \
        for (; i < height; i++) {                                                             \
            acc -= src[(i - radius) * width];                                                 \
            count--;                                                                          \
            ptr[i * linesize] = acc / count;                                                  \
        }                                                                                     \
    }                                                                                         \
                                                                                              \
    return 0;                                                                                 \
}

VERTICAL_FILTER(8, uint8_t)
VERTICAL_FILTER(16, uint16_t)

static int config_input(AVFilterLink *inlink)
{
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
    AverageBlurContext *s = inlink->dst->priv;

    s->depth = desc->comp[0].depth;
    s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
    s->planewidth[0] = s->planewidth[3] = inlink->w;
    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
    s->planeheight[0] = s->planeheight[3] = inlink->h;

    s->nb_planes = av_pix_fmt_count_planes(inlink->format);

    s->buffer = av_malloc_array(inlink->w, inlink->h * sizeof(*s->buffer));
    if (!s->buffer)
        return AVERROR(ENOMEM);

    if (s->radiusV <= 0) {
        s->radiusV = s->radius;
    }

    if (s->depth == 8) {
        s->filter_horizontally = filter_horizontally_8;
        s->filter_vertically = filter_vertically_8;
    } else {
        s->filter_horizontally = filter_horizontally_16;
        s->filter_vertically = filter_vertically_16;
    }

    return 0;
}

static void averageiir2d(AVFilterContext *ctx, AVFrame *in, AVFrame *out, int plane)
{
    AverageBlurContext *s = ctx->priv;
    const int width = s->planewidth[plane];
    const int height = s->planeheight[plane];
    const int nb_threads = ff_filter_get_nb_threads(ctx);
    ThreadData td;

    td.width = width;
    td.height = height;
    td.ptr = in->data[plane];
    td.linesize = in->linesize[plane];
    ctx->internal->execute(ctx, s->filter_horizontally, &td, NULL, FFMIN(height, nb_threads));
    td.ptr = out->data[plane];
    td.linesize = out->linesize[plane];
    ctx->internal->execute(ctx, s->filter_vertically, &td, NULL, FFMIN(width, nb_threads));
}

static int query_formats(AVFilterContext *ctx)
{
    static const enum AVPixelFormat pix_fmts[] = {
        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
        AV_PIX_FMT_NONE
    };

    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
}

static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
    AVFilterContext *ctx = inlink->dst;
    AverageBlurContext *s = ctx->priv;
    AVFilterLink *outlink = ctx->outputs[0];
    AVFrame *out;
    int plane;

    if (av_frame_is_writable(in)) {
        out = in;
    } else {
        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
        if (!out) {
            av_frame_free(&in);
            return AVERROR(ENOMEM);
        }
        av_frame_copy_props(out, in);
    }

    for (plane = 0; plane < s->nb_planes; plane++) {
        const int height = s->planeheight[plane];
        const int width = s->planewidth[plane];

        if (!(s->planes & (1 << plane))) {
            if (out != in)
                av_image_copy_plane(out->data[plane], out->linesize[plane],
                                    in->data[plane], in->linesize[plane],
                                    width * ((s->depth + 7) / 8), height);
            continue;
        }

        averageiir2d(ctx, in, out, plane);
    }

    if (out != in)
        av_frame_free(&in);
    return ff_filter_frame(outlink, out);
}

static av_cold void uninit(AVFilterContext *ctx)
{
    AverageBlurContext *s = ctx->priv;

    av_freep(&s->buffer);
}

static const AVFilterPad avgblur_inputs[] = {
    {
        .name         = "default",
        .type         = AVMEDIA_TYPE_VIDEO,
        .config_props = config_input,
        .filter_frame = filter_frame,
    },
    { NULL }
};

static const AVFilterPad avgblur_outputs[] = {
    {
        .name = "default",
        .type = AVMEDIA_TYPE_VIDEO,
    },
    { NULL }
};

AVFilter ff_vf_avgblur = {
    .name          = "avgblur",
    .description   = NULL_IF_CONFIG_SMALL("Apply Average Blur filter."),
    .priv_size     = sizeof(AverageBlurContext),
    .priv_class    = &avgblur_class,
    .uninit        = uninit,
    .query_formats = query_formats,
    .inputs        = avgblur_inputs,
    .outputs       = avgblur_outputs,
    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
};
