tools/lavfi-showfiltfmts.c
e34d5db5
 /*
  * Copyright (c) 2009 Stefano Sabatini
  *
  * 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 "libavformat/avformat.h"
 #include "libavutil/pixdesc.h"
9c484d29
 #include "libavutil/samplefmt.h"
e34d5db5
 #include "libavfilter/avfilter.h"
43c7a01e
 #include "libavfilter/formats.h"
e34d5db5
 
9c484d29
 static void print_formats(AVFilterContext *filter_ctx)
 {
     int i, j;
 
 #define PRINT_FMTS(inout, outin, INOUT)                                 \
719a576f
     for (i = 0; i < filter_ctx->inout##put_count; i++) {                     \
9c484d29
         if (filter_ctx->inout##puts[i]->type == AVMEDIA_TYPE_VIDEO) {   \
             AVFilterFormats *fmts =                                     \
                 filter_ctx->inout##puts[i]->outin##_formats;            \
             for (j = 0; j < fmts->format_count; j++)                    \
1b84e062
                 if(av_get_pix_fmt_name(fmts->formats[j]))               \
9c484d29
                 printf(#INOUT "PUT[%d] %s: fmt:%s\n",                   \
                        i, filter_ctx->filter->inout##puts[i].name,      \
                        av_get_pix_fmt_name(fmts->formats[j]));          \
         } else if (filter_ctx->inout##puts[i]->type == AVMEDIA_TYPE_AUDIO) { \
             AVFilterFormats *fmts;                                      \
                                                                         \
             fmts = filter_ctx->inout##puts[i]->outin##_formats;         \
             for (j = 0; j < fmts->format_count; j++)                    \
                 printf(#INOUT "PUT[%d] %s: fmt:%s\n",                   \
                        i, filter_ctx->filter->inout##puts[i].name,      \
                        av_get_sample_fmt_name(fmts->formats[j]));       \
                                                                         \
1cbf7fb4
             fmts = filter_ctx->inout##puts[i]->outin##_channel_layouts; \
9c484d29
             for (j = 0; j < fmts->format_count; j++) {                  \
                 char buf[256];                                          \
                 av_get_channel_layout_string(buf, sizeof(buf), -1,      \
                                              fmts->formats[j]);         \
                 printf(#INOUT "PUT[%d] %s: chlayout:%s\n",              \
                        i, filter_ctx->filter->inout##puts[i].name, buf); \
             }                                                           \
         }                                                               \
     }                                                                   \
 
     PRINT_FMTS(in,  out, IN);
     PRINT_FMTS(out, in,  OUT);
 }
 
e34d5db5
 int main(int argc, char **argv)
 {
     AVFilter *filter;
     AVFilterContext *filter_ctx;
     const char *filter_name;
     const char *filter_args = NULL;
9c484d29
     int i;
e34d5db5
 
     av_log_set_level(AV_LOG_DEBUG);
 
     if (!argv[1]) {
         fprintf(stderr, "Missing filter name as argument\n");
         return 1;
     }
 
     filter_name = argv[1];
     if (argv[2])
         filter_args = argv[2];
 
     avfilter_register_all();
 
     /* get a corresponding filter and open it */
     if (!(filter = avfilter_get_by_name(filter_name))) {
         fprintf(stderr, "Unrecognized filter with name '%s'\n", filter_name);
         return 1;
     }
 
84c03869
     if (avfilter_open(&filter_ctx, filter, NULL) < 0) {
ffae713a
         fprintf(stderr, "Impossible to open filter with name '%s'\n",
4e81b5f5
                 filter_name);
e34d5db5
         return 1;
     }
     if (avfilter_init_filter(filter_ctx, filter_args, NULL) < 0) {
4e81b5f5
         fprintf(stderr, "Impossible to init filter '%s' with arguments '%s'\n",
                 filter_name, filter_args);
e34d5db5
         return 1;
     }
 
     /* create a link for each of the input pads */
     for (i = 0; i < filter_ctx->input_count; i++) {
c61f84bf
         AVFilterLink *link = av_mallocz(sizeof(AVFilterLink));
         link->type = filter_ctx->filter->inputs[i].type;
e34d5db5
         filter_ctx->inputs[i] = link;
     }
     for (i = 0; i < filter_ctx->output_count; i++) {
c61f84bf
         AVFilterLink *link = av_mallocz(sizeof(AVFilterLink));
a8542e43
         link->type = filter_ctx->filter->outputs[i].type;
e34d5db5
         filter_ctx->outputs[i] = link;
     }
 
     if (filter->query_formats)
         filter->query_formats(filter_ctx);
     else
43c7a01e
         ff_default_query_formats(filter_ctx);
e34d5db5
 
9c484d29
     print_formats(filter_ctx);
e34d5db5
 
24de0edb
     avfilter_free(filter_ctx);
e34d5db5
     fflush(stdout);
     return 0;
 }