2 * Copyright (c) 2007 Bobby Bingham
4 * This file is part of FFmpeg.
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.
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.
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
23 * format and noformat video filters
28 #include "libavutil/internal.h"
29 #include "libavutil/mem.h"
30 #include "libavutil/pixdesc.h"
31 #include "libavutil/opt.h"
38 typedef struct FormatContext
{
43 * pix_fmts parsed into AVPixelFormats and terminated with
46 enum AVPixelFormat
*formats
;
49 static av_cold
void uninit(AVFilterContext
*ctx
)
51 FormatContext
*s
= ctx
->priv
;
52 av_freep(&s
->formats
);
55 static av_cold
int init(AVFilterContext
*ctx
)
57 FormatContext
*s
= ctx
->priv
;
64 av_log(ctx
, AV_LOG_ERROR
, "Empty output format string.\n");
65 return AVERROR(EINVAL
);
68 /* count the formats */
70 while ((cur
= strchr(cur
, '|'))) {
76 s
->formats
= av_malloc_array(nb_formats
+ 1, sizeof(*s
->formats
));
78 return AVERROR(ENOMEM
);
80 /* parse the list of formats */
82 for (i
= 0; i
< nb_formats
; i
++) {
83 sep
= strchr(cur
, '|');
87 if ((ret
= ff_parse_pixel_format(&s
->formats
[i
], cur
, ctx
)) < 0)
92 s
->formats
[nb_formats
] = AV_PIX_FMT_NONE
;
94 if (!strcmp(ctx
->filter
->name
, "noformat")) {
95 const AVPixFmtDescriptor
*desc
= NULL
;
96 enum AVPixelFormat
*formats_allowed
;
97 int nb_formats_lavu
= 0, nb_formats_allowed
= 0;
99 /* count the formats known to lavu */
100 while ((desc
= av_pix_fmt_desc_next(desc
)))
103 formats_allowed
= av_malloc_array(nb_formats_lavu
+ 1, sizeof(*formats_allowed
));
104 if (!formats_allowed
)
105 return AVERROR(ENOMEM
);
107 /* for each format known to lavu, check if it's in the list of
108 * forbidden formats */
109 while ((desc
= av_pix_fmt_desc_next(desc
))) {
110 enum AVPixelFormat pix_fmt
= av_pix_fmt_desc_get_id(desc
);
112 for (i
= 0; i
< nb_formats
; i
++) {
113 if (s
->formats
[i
] == pix_fmt
)
119 formats_allowed
[nb_formats_allowed
++] = pix_fmt
;
121 formats_allowed
[nb_formats_allowed
] = AV_PIX_FMT_NONE
;
122 av_freep(&s
->formats
);
123 s
->formats
= formats_allowed
;
129 static int query_formats(AVFilterContext
*ctx
)
131 FormatContext
*s
= ctx
->priv
;
132 AVFilterFormats
*formats
= ff_make_format_list(s
->formats
);
135 return AVERROR(ENOMEM
);
137 ff_set_common_formats(ctx
, formats
);
142 #define OFFSET(x) offsetof(FormatContext, x)
143 static const AVOption options
[] = {
144 { "pix_fmts", "A '|'-separated list of pixel formats", OFFSET(pix_fmts
), AV_OPT_TYPE_STRING
, .flags
= AV_OPT_FLAG_VIDEO_PARAM
},
148 #if CONFIG_FORMAT_FILTER
150 #define format_options options
151 AVFILTER_DEFINE_CLASS(format
);
153 static const AVFilterPad avfilter_vf_format_inputs
[] = {
156 .type
= AVMEDIA_TYPE_VIDEO
,
157 .get_video_buffer
= ff_null_get_video_buffer
,
162 static const AVFilterPad avfilter_vf_format_outputs
[] = {
165 .type
= AVMEDIA_TYPE_VIDEO
170 AVFilter ff_vf_format
= {
172 .description
= NULL_IF_CONFIG_SMALL("Convert the input video to one of the specified pixel formats."),
177 .query_formats
= query_formats
,
179 .priv_size
= sizeof(FormatContext
),
180 .priv_class
= &format_class
,
182 .inputs
= avfilter_vf_format_inputs
,
183 .outputs
= avfilter_vf_format_outputs
,
185 #endif /* CONFIG_FORMAT_FILTER */
187 #if CONFIG_NOFORMAT_FILTER
189 #define noformat_options options
190 AVFILTER_DEFINE_CLASS(noformat
);
192 static const AVFilterPad avfilter_vf_noformat_inputs
[] = {
195 .type
= AVMEDIA_TYPE_VIDEO
,
196 .get_video_buffer
= ff_null_get_video_buffer
,
201 static const AVFilterPad avfilter_vf_noformat_outputs
[] = {
204 .type
= AVMEDIA_TYPE_VIDEO
209 AVFilter ff_vf_noformat
= {
211 .description
= NULL_IF_CONFIG_SMALL("Force libavfilter not to use any of the specified pixel formats for the input to the next filter."),
216 .query_formats
= query_formats
,
218 .priv_size
= sizeof(FormatContext
),
219 .priv_class
= &noformat_class
,
221 .inputs
= avfilter_vf_noformat_inputs
,
222 .outputs
= avfilter_vf_noformat_outputs
,
224 #endif /* CONFIG_NOFORMAT_FILTER */