/*
 * filter registration
 * Copyright (c) 2008 Vitor Sessak
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "avfilter.h"


#define REGISTER_FILTER(X,x,y) { \
          extern AVFilter avfilter_##y##_##x ; \
          if(CONFIG_##X##_FILTER )  avfilter_register(&avfilter_##y##_##x ); }

void avfilter_register_all(void)
{
    static int initialized;

    if (initialized)
        return;
    initialized = 1;

    REGISTER_FILTER (ACONVERT,    aconvert,    af);
    REGISTER_FILTER (AFORMAT,     aformat,     af);
    REGISTER_FILTER (AMERGE,      amerge,      af);
    REGISTER_FILTER (ANULL,       anull,       af);
    REGISTER_FILTER (ARESAMPLE,   aresample,   af);
    REGISTER_FILTER (ASHOWINFO,   ashowinfo,   af);
    REGISTER_FILTER (ASPLIT,      asplit,      af);
    REGISTER_FILTER (ASTREAMSYNC, astreamsync, af);
    REGISTER_FILTER (EARWAX,      earwax,      af);
    REGISTER_FILTER (PAN,         pan,         af);
    REGISTER_FILTER (SILENCEDETECT, silencedetect, af);
    REGISTER_FILTER (VOLUME,      volume,      af);

    REGISTER_FILTER (ABUFFER,     abuffer,     asrc);
    REGISTER_FILTER (AEVALSRC,    aevalsrc,    asrc);
    REGISTER_FILTER (AMOVIE,      amovie,      asrc);
    REGISTER_FILTER (ANULLSRC,    anullsrc,    asrc);

    REGISTER_FILTER (ABUFFERSINK, abuffersink, asink);
    REGISTER_FILTER (ANULLSINK,   anullsink,   asink);

    REGISTER_FILTER (ASS,         ass,  vf);
    REGISTER_FILTER (BLACKFRAME,  blackframe,  vf);
    REGISTER_FILTER (BOXBLUR,     boxblur,     vf);
    REGISTER_FILTER (COPY,        copy,        vf);
    REGISTER_FILTER (CROP,        crop,        vf);
    REGISTER_FILTER (CROPDETECT,  cropdetect,  vf);
    REGISTER_FILTER (DELOGO,      delogo,      vf);
    REGISTER_FILTER (DESHAKE,     deshake,     vf);
    REGISTER_FILTER (DRAWBOX,     drawbox,     vf);
    REGISTER_FILTER (DRAWTEXT,    drawtext,    vf);
    REGISTER_FILTER (FADE,        fade,        vf);
    REGISTER_FILTER (FIELDORDER,  fieldorder,  vf);
    REGISTER_FILTER (FIFO,        fifo,        vf);
    REGISTER_FILTER (FORMAT,      format,      vf);
    REGISTER_FILTER (FREI0R,      frei0r,      vf);
    REGISTER_FILTER (GRADFUN,     gradfun,     vf);
    REGISTER_FILTER (HFLIP,       hflip,       vf);
    REGISTER_FILTER (HQDN3D,      hqdn3d,      vf);
    REGISTER_FILTER (LUT,         lut,         vf);
    REGISTER_FILTER (LUTRGB,      lutrgb,      vf);
    REGISTER_FILTER (LUTYUV,      lutyuv,      vf);
    REGISTER_FILTER (MP,          mp,          vf);
    REGISTER_FILTER (NEGATE,      negate,      vf);
    REGISTER_FILTER (NOFORMAT,    noformat,    vf);
    REGISTER_FILTER (NULL,        null,        vf);
    REGISTER_FILTER (OCV,         ocv,         vf);
    REGISTER_FILTER (OVERLAY,     overlay,     vf);
    REGISTER_FILTER (PAD,         pad,         vf);
    REGISTER_FILTER (PIXDESCTEST, pixdesctest, vf);
    REGISTER_FILTER (SCALE,       scale,       vf);
    REGISTER_FILTER (SELECT,      select,      vf);
    REGISTER_FILTER (SETDAR,      setdar,      vf);
    REGISTER_FILTER (SETPTS,      setpts,      vf);
    REGISTER_FILTER (SETSAR,      setsar,      vf);
    REGISTER_FILTER (SETTB,       settb,       vf);
    REGISTER_FILTER (SHOWINFO,    showinfo,    vf);
    REGISTER_FILTER (SLICIFY,     slicify,     vf);
    REGISTER_FILTER (SPLIT,       split,       vf);
    REGISTER_FILTER (THUMBNAIL,   thumbnail,   vf);
    REGISTER_FILTER (TINTERLACE,  tinterlace,  vf);
    REGISTER_FILTER (TRANSPOSE,   transpose,   vf);
    REGISTER_FILTER (UNSHARP,     unsharp,     vf);
    REGISTER_FILTER (VFLIP,       vflip,       vf);
    REGISTER_FILTER (YADIF,       yadif,       vf);

    REGISTER_FILTER (CELLAUTO,    cellauto,    vsrc);
    REGISTER_FILTER (COLOR,       color,       vsrc);
    REGISTER_FILTER (FREI0R,      frei0r_src,  vsrc);
    REGISTER_FILTER (LIFE,        life,        vsrc);
    REGISTER_FILTER (MANDELBROT,  mandelbrot,  vsrc);
    REGISTER_FILTER (MOVIE,       movie,       vsrc);
    REGISTER_FILTER (MPTESTSRC,   mptestsrc,   vsrc);
    REGISTER_FILTER (NULLSRC,     nullsrc,     vsrc);
    REGISTER_FILTER (RGBTESTSRC,  rgbtestsrc,  vsrc);
    REGISTER_FILTER (TESTSRC,     testsrc,     vsrc);

    REGISTER_FILTER (BUFFERSINK,  buffersink,  vsink);
    REGISTER_FILTER (NULLSINK,    nullsink,    vsink);

    /* vsrc_buffer is a part of public API => registered unconditionally */
    {
        extern AVFilter avfilter_vsrc_buffer;
        avfilter_register(&avfilter_vsrc_buffer);
    }
}
