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 #define FF_INTERNAL_FIELDS 1
29 #include "libavfilter/framequeue.h"
30 
31 #include "libavfilter/avfilter.h"
32 #include "libavfilter/formats.h"
33 #include "libavfilter/internal.h"
34 
36  unsigned nb, size_t fmts_cfg_offset,
37  const char *inout_string)
38 {
39  for (unsigned i = 0; i < nb; i++) {
40  const AVFilterLink *const link = links[i];
41  const AVFilterFormatsConfig *const cfg = (AVFilterFormatsConfig*)((const char*)link + fmts_cfg_offset);
42  const char *pad_name = avfilter_pad_get_name(pads, i);
43 
44  if (link->type == AVMEDIA_TYPE_VIDEO) {
45  const AVFilterFormats *const fmts = cfg->formats;
46  for (unsigned j = 0; fmts && j < fmts->nb_formats; j++) {
47  printf("%s[%u] %s: fmt:%s\n",
48  inout_string, i, pad_name,
49  av_get_pix_fmt_name(fmts->formats[j]));
50  }
51  } else if (link->type == AVMEDIA_TYPE_AUDIO) {
52  const AVFilterFormats *const fmts = cfg->formats;
54 
55  for (unsigned j = 0; fmts && j < fmts->nb_formats; j++)
56  printf("%s[%u] %s: fmt:%s\n",
57  inout_string, i, pad_name,
59 
60  for (unsigned j = 0; layouts && j < layouts->nb_channel_layouts; j++) {
61  char buf[256];
62  av_channel_layout_describe(&layouts->channel_layouts[j], buf, sizeof(buf));
63  printf("%s[%u] %s: chlayout:%s\n",
64  inout_string, i, pad_name, buf);
65  }
66  }
67  }
68 }
69 
71 {
72  print_formats_internal(filter_ctx->inputs, filter_ctx->input_pads,
73  filter_ctx->nb_inputs,
74  offsetof(AVFilterLink, outcfg), "INPUT");
75  print_formats_internal(filter_ctx->outputs, filter_ctx->output_pads,
76  filter_ctx->nb_outputs,
77  offsetof(AVFilterLink, incfg), "OUTPUT");
78 }
79 
80 int main(int argc, char **argv)
81 {
82  const AVFilter *filter;
84  AVFilterGraph *graph_ctx;
85  const char *filter_name;
86  const char *filter_args = NULL;
87  int i;
88  int ret = 0;
89 
91 
92  if (argc < 2) {
93  fprintf(stderr, "Missing filter name as argument\n");
94  return 1;
95  }
96 
97  filter_name = argv[1];
98  if (argc > 2)
99  filter_args = argv[2];
100 
101  /* allocate graph */
102  graph_ctx = avfilter_graph_alloc();
103  if (!graph_ctx)
104  return 1;
105 
106  /* get a corresponding filter and open it */
107  if (!(filter = avfilter_get_by_name(filter_name))) {
108  fprintf(stderr, "Unrecognized filter with name '%s'\n", filter_name);
109  return 1;
110  }
111 
112  /* open filter and add it to the graph */
113  if (!(filter_ctx = avfilter_graph_alloc_filter(graph_ctx, filter, filter_name))) {
114  fprintf(stderr, "Impossible to open filter with name '%s'\n",
115  filter_name);
116  return 1;
117  }
118  if (avfilter_init_str(filter_ctx, filter_args) < 0) {
119  fprintf(stderr, "Impossible to init filter '%s' with arguments '%s'\n",
120  filter_name, filter_args);
121  return 1;
122  }
123 
124  /* create a link for each of the input pads */
125  for (i = 0; i < filter_ctx->nb_inputs; i++) {
127  if (!link) {
128  fprintf(stderr, "Unable to allocate memory for filter input link\n");
129  ret = 1;
130  goto fail;
131  }
132  link->type = avfilter_pad_get_type(filter_ctx->input_pads, i);
133  filter_ctx->inputs[i] = link;
134  }
135  for (i = 0; i < filter_ctx->nb_outputs; i++) {
137  if (!link) {
138  fprintf(stderr, "Unable to allocate memory for filter output link\n");
139  ret = 1;
140  goto fail;
141  }
142  link->type = avfilter_pad_get_type(filter_ctx->output_pads, i);
143  filter_ctx->outputs[i] = link;
144  }
145 
146  if (filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
147  ret = filter->formats.query_func(filter_ctx);
148  else
150 
152 
153 fail:
155  avfilter_graph_free(&graph_ctx);
156  fflush(stdout);
157  return ret;
158 }
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:932
AVFilterFormatsConfig::channel_layouts
AVFilterChannelLayouts * channel_layouts
Lists of supported channel layouts, only for audio.
Definition: avfilter.h:515
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:326
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:119
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:165
fail
#define fail()
Definition: checkasm.h:138
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:47
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:786
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:70
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:625
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:35
framequeue.h
AVFilterFormats::nb_formats
unsigned nb_formats
number of formats
Definition: formats.h:65
AVFilterGraph
Definition: avfilter.h:864
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:500
ff_default_query_formats
int ff_default_query_formats(AVFilterContext *ctx)
Definition: formats.c:781
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:904
av_log_set_level
void av_log_set_level(int level)
Set the log level.
Definition: log.c:442
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:80
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:937
channel_layout.h
avfilter.h
AVFilterContext
An instance of a filter.
Definition: avfilter.h:397
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:505
avfilter_free
void avfilter_free(AVFilterContext *filter)
Free a filter context.
Definition: avfilter.c:740
FF_FILTER_FORMATS_QUERY_FUNC
@ FF_FILTER_FORMATS_QUERY_FUNC
formats.query active.
Definition: internal.h:162
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:2884