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_get_channel_layout_string(buf, sizeof(buf), -1,
63  layouts->channel_layouts[j]);
64  printf("%s[%u] %s: chlayout:%s\n",
65  inout_string, i, pad_name, buf);
66  }
67  }
68  }
69 }
70 
72 {
73  print_formats_internal(filter_ctx->inputs, filter_ctx->input_pads,
74  filter_ctx->nb_inputs,
75  offsetof(AVFilterLink, outcfg), "INPUT");
76  print_formats_internal(filter_ctx->outputs, filter_ctx->output_pads,
77  filter_ctx->nb_outputs,
78  offsetof(AVFilterLink, incfg), "OUTPUT");
79 }
80 
81 int main(int argc, char **argv)
82 {
83  const AVFilter *filter;
85  AVFilterGraph *graph_ctx;
86  const char *filter_name;
87  const char *filter_args = NULL;
88  int i;
89  int ret = 0;
90 
92 
93  if (argc < 2) {
94  fprintf(stderr, "Missing filter name as argument\n");
95  return 1;
96  }
97 
98  filter_name = argv[1];
99  if (argc > 2)
100  filter_args = argv[2];
101 
102  /* allocate graph */
103  graph_ctx = avfilter_graph_alloc();
104  if (!graph_ctx)
105  return 1;
106 
107  /* get a corresponding filter and open it */
108  if (!(filter = avfilter_get_by_name(filter_name))) {
109  fprintf(stderr, "Unrecognized filter with name '%s'\n", filter_name);
110  return 1;
111  }
112 
113  /* open filter and add it to the graph */
114  if (!(filter_ctx = avfilter_graph_alloc_filter(graph_ctx, filter, filter_name))) {
115  fprintf(stderr, "Impossible to open filter with name '%s'\n",
116  filter_name);
117  return 1;
118  }
119  if (avfilter_init_str(filter_ctx, filter_args) < 0) {
120  fprintf(stderr, "Impossible to init filter '%s' with arguments '%s'\n",
121  filter_name, filter_args);
122  return 1;
123  }
124 
125  /* create a link for each of the input pads */
126  for (i = 0; i < filter_ctx->nb_inputs; i++) {
128  if (!link) {
129  fprintf(stderr, "Unable to allocate memory for filter input link\n");
130  ret = 1;
131  goto fail;
132  }
133  link->type = avfilter_pad_get_type(filter_ctx->input_pads, i);
134  filter_ctx->inputs[i] = link;
135  }
136  for (i = 0; i < filter_ctx->nb_outputs; i++) {
138  if (!link) {
139  fprintf(stderr, "Unable to allocate memory for filter output link\n");
140  ret = 1;
141  goto fail;
142  }
143  link->type = avfilter_pad_get_type(filter_ctx->output_pads, i);
144  filter_ctx->outputs[i] = link;
145  }
146 
147  if (filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
148  ret = filter->formats.query_func(filter_ctx);
149  else
151 
153 
154 fail:
156  avfilter_graph_free(&graph_ctx);
157  fflush(stdout);
158  return ret;
159 }
AVFilterChannelLayouts
A list of supported channel layouts.
Definition: formats.h:85
filter_ctx
static FilteringContext * filter_ctx
Definition: transcoding.c:49
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:500
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:434
av_get_channel_layout_string
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
Definition: channel_layout.c:217
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:121
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:167
fail
#define fail()
Definition: checkasm.h:127
avfilter_graph_alloc
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
Definition: avfiltergraph.c:84
samplefmt.h
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:50
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:71
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:49
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:565
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:845
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:485
ff_default_query_formats
int ff_default_query_formats(AVFilterContext *ctx)
Definition: formats.c:710
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:938
av_log_set_level
void av_log_set_level(int level)
Set the log level.
Definition: log.c:440
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
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:263
main
int main(int argc, char **argv)
Definition: filtfmts.c:81
AVFilter
Filter definition.
Definition: avfilter.h:149
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:386
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:490
avfilter_free
void avfilter_free(AVFilterContext *filter)
Free a filter context.
Definition: avfilter.c:757
FF_FILTER_FORMATS_QUERY_FUNC
@ FF_FILTER_FORMATS_QUERY_FUNC
formats.query active.
Definition: internal.h:161
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:2484