FFmpeg
filtfmts.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009 Stefano Sabatini
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <stdio.h>
22 
24 #include "libavutil/mem.h"
25 #include "libavutil/pixdesc.h"
26 #include "libavutil/samplefmt.h"
27 
28 #include "libavfilter/avfilter.h"
30 #include "libavfilter/formats.h"
31 #include "libavfilter/framequeue.h"
32 #include "libavfilter/internal.h"
33 
35  unsigned nb, size_t fmts_cfg_offset,
36  const char *inout_string)
37 {
38  for (unsigned i = 0; i < nb; i++) {
39  const AVFilterLink *const link = links[i];
40  const AVFilterFormatsConfig *const cfg = (AVFilterFormatsConfig*)((const char*)link + fmts_cfg_offset);
41  const char *pad_name = avfilter_pad_get_name(pads, i);
42 
43  if (link->type == AVMEDIA_TYPE_VIDEO) {
44  const AVFilterFormats *const fmts = cfg->formats;
45  for (unsigned j = 0; fmts && j < fmts->nb_formats; j++) {
46  printf("%s[%u] %s: fmt:%s\n",
47  inout_string, i, pad_name,
48  av_get_pix_fmt_name(fmts->formats[j]));
49  }
50  } else if (link->type == AVMEDIA_TYPE_AUDIO) {
51  const AVFilterFormats *const fmts = cfg->formats;
53 
54  for (unsigned j = 0; fmts && j < fmts->nb_formats; j++)
55  printf("%s[%u] %s: fmt:%s\n",
56  inout_string, i, pad_name,
58 
59  for (unsigned j = 0; layouts && j < layouts->nb_channel_layouts; j++) {
60  char buf[256];
61  av_channel_layout_describe(&layouts->channel_layouts[j], buf, sizeof(buf));
62  printf("%s[%u] %s: chlayout:%s\n",
63  inout_string, i, pad_name, buf);
64  }
65  }
66  }
67 }
68 
70 {
71  print_formats_internal(filter_ctx->inputs, filter_ctx->input_pads,
72  filter_ctx->nb_inputs,
73  offsetof(AVFilterLink, outcfg), "INPUT");
74  print_formats_internal(filter_ctx->outputs, filter_ctx->output_pads,
75  filter_ctx->nb_outputs,
76  offsetof(AVFilterLink, incfg), "OUTPUT");
77 }
78 
79 int main(int argc, char **argv)
80 {
81  const AVFilter *filter;
83  AVFilterGraph *graph_ctx;
84  const char *filter_name;
85  const char *filter_args = NULL;
86  int i;
87  int ret = 0;
88 
90 
91  if (argc < 2) {
92  fprintf(stderr, "Missing filter name as argument\n");
93  return 1;
94  }
95 
96  filter_name = argv[1];
97  if (argc > 2)
98  filter_args = argv[2];
99 
100  /* allocate graph */
101  graph_ctx = avfilter_graph_alloc();
102  if (!graph_ctx)
103  return 1;
104 
105  /* get a corresponding filter and open it */
106  if (!(filter = avfilter_get_by_name(filter_name))) {
107  fprintf(stderr, "Unrecognized filter with name '%s'\n", filter_name);
108  return 1;
109  }
110 
111  /* open filter and add it to the graph */
112  if (!(filter_ctx = avfilter_graph_alloc_filter(graph_ctx, filter, filter_name))) {
113  fprintf(stderr, "Impossible to open filter with name '%s'\n",
114  filter_name);
115  return 1;
116  }
117  if (avfilter_init_str(filter_ctx, filter_args) < 0) {
118  fprintf(stderr, "Impossible to init filter '%s' with arguments '%s'\n",
119  filter_name, filter_args);
120  return 1;
121  }
122 
123  /* create a link for each of the input pads */
124  for (i = 0; i < filter_ctx->nb_inputs; i++) {
126  if (!link) {
127  fprintf(stderr, "Unable to allocate memory for filter input link\n");
128  ret = 1;
129  goto fail;
130  }
131  link->type = avfilter_pad_get_type(filter_ctx->input_pads, i);
132  filter_ctx->inputs[i] = link;
133  }
134  for (i = 0; i < filter_ctx->nb_outputs; i++) {
136  if (!link) {
137  fprintf(stderr, "Unable to allocate memory for filter output link\n");
138  ret = 1;
139  goto fail;
140  }
141  link->type = avfilter_pad_get_type(filter_ctx->output_pads, i);
142  filter_ctx->outputs[i] = link;
143  }
144 
145  if (filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
146  ret = filter->formats.query_func(filter_ctx);
147  else
149 
151 
152 fail:
154  avfilter_graph_free(&graph_ctx);
155  fflush(stdout);
156  return ret;
157 }
AVFilterChannelLayouts
A list of supported channel layouts.
Definition: formats.h:85
avfilter_pad_get_name
const char * avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
Get the name of an AVFilterPad.
Definition: avfilter.c:972
AVFilterFormatsConfig::channel_layouts
AVFilterChannelLayouts * channel_layouts
Lists of supported channel layouts, only for audio.
Definition: avfilter.h:520
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:261
pixdesc.h
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
AVFilterFormats::formats
int * formats
list of media formats
Definition: formats.h:66
avfilter_graph_free
void avfilter_graph_free(AVFilterGraph **graph)
Free a graph, destroy its links, and set *graph to NULL.
Definition: avfiltergraph.c:116
FilterLinkInternal
Definition: avfilter_internal.h:33
AVFilterFormats
A list of supported formats for one end of a filter link.
Definition: formats.h:64
formats.h
avfilter_graph_alloc_filter
AVFilterContext * avfilter_graph_alloc_filter(AVFilterGraph *graph, const AVFilter *filter, const char *name)
Create a new filter instance in a filter graph.
Definition: avfiltergraph.c:164
fail
#define fail()
Definition: checkasm.h:179
avfilter_graph_alloc
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
Definition: avfiltergraph.c:82
samplefmt.h
filter_ctx
static FilteringContext * filter_ctx
Definition: transcode.c:51
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:33
av_channel_layout_describe
int av_channel_layout_describe(const AVChannelLayout *channel_layout, char *buf, size_t buf_size)
Get a human-readable string describing the channel layout properties.
Definition: channel_layout.c:644
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
print_formats
static void print_formats(AVFilterContext *filter_ctx)
Definition: filtfmts.c:69
av_get_sample_fmt_name
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
Definition: samplefmt.c:51
link
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
Definition: filter_design.txt:23
avfilter_get_by_name
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
Definition: allfilters.c:629
NULL
#define NULL
Definition: coverity.c:32
print_formats_internal
static void print_formats_internal(AVFilterLink **links, const AVFilterPad *pads, unsigned nb, size_t fmts_cfg_offset, const char *inout_string)
Definition: filtfmts.c:34
framequeue.h
AVFilterFormats::nb_formats
unsigned nb_formats
number of formats
Definition: formats.h:65
avfilter_internal.h
AVFilterGraph
Definition: avfilter.h:813
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:505
ff_default_query_formats
int ff_default_query_formats(AVFilterContext *ctx)
Sets all remaining unset filter lists for all inputs/outputs to their corresponding ff_all_*() lists.
Definition: formats.c:878
printf
printf("static const uint8_t my_array[100] = {\n")
internal.h
avfilter_init_str
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
Definition: avfilter.c:944
av_log_set_level
void av_log_set_level(int level)
Set the log level.
Definition: log.c:447
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
main
int main(int argc, char **argv)
Definition: filtfmts.c:79
AVFilter
Filter definition.
Definition: avfilter.h:166
ret
ret
Definition: filter_design.txt:187
links
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output links
Definition: filter_design.txt:14
avfilter_pad_get_type
enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
Get the type of an AVFilterPad.
Definition: avfilter.c:977
channel_layout.h
avfilter.h
AVFilterContext
An instance of a filter.
Definition: avfilter.h:407
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
AVFilterFormatsConfig::formats
AVFilterFormats * formats
List of supported formats (pixel or sample).
Definition: avfilter.h:510
avfilter_free
void avfilter_free(AVFilterContext *filter)
Free a filter context.
Definition: avfilter.c:780
FF_FILTER_FORMATS_QUERY_FUNC
@ FF_FILTER_FORMATS_QUERY_FUNC
formats.query active.
Definition: internal.h:152
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2882