FFmpeg
vsrc_cellauto.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) Stefano Sabatini 2011
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 /**
22  * @file
23  * cellular automaton video source, based on Stephen Wolfram "experimentus crucis"
24  */
25 
26 /* #define DEBUG */
27 
28 #include "libavutil/file.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/lfg.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/random_seed.h"
34 #include "libavutil/avstring.h"
35 #include "avfilter.h"
36 #include "filters.h"
37 #include "video.h"
38 
39 typedef struct CellAutoContext {
40  const AVClass *class;
41  int w, h;
42  char *filename;
43  char *rule_str;
44  uint8_t *file_buf;
45  size_t file_bufsize;
46  uint8_t *buf;
48  uint8_t rule;
49  uint64_t pts;
54  int64_t generation; ///< the generation number, starting from 0
56  char *pattern;
58 
59 #define OFFSET(x) offsetof(CellAutoContext, x)
60 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
61 
62 static const AVOption cellauto_options[] = {
63  { "filename", "read initial pattern from file", OFFSET(filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
64  { "f", "read initial pattern from file", OFFSET(filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
65  { "pattern", "set initial pattern", OFFSET(pattern), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
66  { "p", "set initial pattern", OFFSET(pattern), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
67  { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
68  { "r", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
69  { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, FLAGS },
70  { "s", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, FLAGS },
71  { "rule", "set rule", OFFSET(rule), AV_OPT_TYPE_INT, {.i64 = 110}, 0, 255, FLAGS },
72  { "random_fill_ratio", "set fill ratio for filling initial grid randomly", OFFSET(random_fill_ratio), AV_OPT_TYPE_DOUBLE, {.dbl = 1/M_PHI}, 0, 1, FLAGS },
73  { "ratio", "set fill ratio for filling initial grid randomly", OFFSET(random_fill_ratio), AV_OPT_TYPE_DOUBLE, {.dbl = 1/M_PHI}, 0, 1, FLAGS },
74  { "random_seed", "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
75  { "seed", "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
76  { "scroll", "scroll pattern downward", OFFSET(scroll), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
77  { "start_full", "start filling the whole video", OFFSET(start_full), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
78  { "full", "start filling the whole video", OFFSET(start_full), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
79  { "stitch", "stitch boundaries", OFFSET(stitch), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
80  { NULL }
81 };
82 
83 AVFILTER_DEFINE_CLASS(cellauto);
84 
85 #ifdef DEBUG
86 static void show_cellauto_row(AVFilterContext *ctx)
87 {
88  CellAutoContext *s = ctx->priv;
89  int i;
90  uint8_t *row = s->buf + s->w * s->buf_row_idx;
91  char *line = av_malloc(s->w + 1);
92  if (!line)
93  return;
94 
95  for (i = 0; i < s->w; i++)
96  line[i] = row[i] ? '@' : ' ';
97  line[i] = 0;
98  av_log(ctx, AV_LOG_DEBUG, "generation:%"PRId64" row:%s|\n", s->generation, line);
99  av_free(line);
100 }
101 #endif
102 
104 {
105  CellAutoContext *s = ctx->priv;
106  char *p;
107  int i, w = 0;
108 
109  w = strlen(s->pattern);
110  av_log(ctx, AV_LOG_DEBUG, "w:%d\n", w);
111 
112  if (s->w) {
113  if (w > s->w) {
115  "The specified width is %d which cannot contain the provided string width of %d\n",
116  s->w, w);
117  return AVERROR(EINVAL);
118  }
119  } else {
120  /* width was not specified, set it to width of the provided row */
121  s->w = w;
122  s->h = (double)s->w * M_PHI;
123  }
124 
125  s->buf = av_calloc(s->w, s->h * sizeof(*s->buf));
126  if (!s->buf)
127  return AVERROR(ENOMEM);
128 
129  /* fill buf */
130  p = s->pattern;
131  for (i = (s->w - w)/2;; i++) {
132  av_log(ctx, AV_LOG_DEBUG, "%d %c\n", i, *p == '\n' ? 'N' : *p);
133  if (*p == '\n' || !*p)
134  break;
135  else
136  s->buf[i] = !!av_isgraph(*(p++));
137  }
138 
139  return 0;
140 }
141 
143 {
144  CellAutoContext *s = ctx->priv;
145  int ret;
146 
147  ret = av_file_map(s->filename,
148  &s->file_buf, &s->file_bufsize, 0, ctx);
149  if (ret < 0)
150  return ret;
151 
152  /* create a string based on the read file */
153  s->pattern = av_malloc(s->file_bufsize + 1);
154  if (!s->pattern)
155  return AVERROR(ENOMEM);
156  memcpy(s->pattern, s->file_buf, s->file_bufsize);
157  s->pattern[s->file_bufsize] = 0;
158 
160 }
161 
163 {
164  CellAutoContext *s = ctx->priv;
165  int ret;
166 
167  if (!s->w && !s->filename && !s->pattern)
168  av_opt_set(s, "size", "320x518", 0);
169 
170  if (s->filename && s->pattern) {
171  av_log(ctx, AV_LOG_ERROR, "Only one of the filename or pattern options can be used\n");
172  return AVERROR(EINVAL);
173  }
174 
175  if (s->filename) {
176  if ((ret = init_pattern_from_file(ctx)) < 0)
177  return ret;
178  } else if (s->pattern) {
179  if ((ret = init_pattern_from_string(ctx)) < 0)
180  return ret;
181  } else {
182  /* fill the first row randomly */
183  int i;
184 
185  s->buf = av_calloc(s->w, s->h * sizeof(*s->buf));
186  if (!s->buf)
187  return AVERROR(ENOMEM);
188  if (s->random_seed == -1)
189  s->random_seed = av_get_random_seed();
190 
191  av_lfg_init(&s->lfg, s->random_seed);
192 
193  for (i = 0; i < s->w; i++) {
194  double r = (double)av_lfg_get(&s->lfg) / UINT32_MAX;
195  if (r <= s->random_fill_ratio)
196  s->buf[i] = 1;
197  }
198  }
199 
201  "s:%dx%d r:%d/%d rule:%d stitch:%d scroll:%d full:%d seed:%"PRId64"\n",
202  s->w, s->h, s->frame_rate.num, s->frame_rate.den,
203  s->rule, s->stitch, s->scroll, s->start_full,
204  s->random_seed);
205  return 0;
206 }
207 
209 {
210  CellAutoContext *s = ctx->priv;
211 
212  av_file_unmap(s->file_buf, s->file_bufsize);
213  av_freep(&s->buf);
214  av_freep(&s->pattern);
215 }
216 
217 static int config_props(AVFilterLink *outlink)
218 {
219  CellAutoContext *s = outlink->src->priv;
220  FilterLink *l = ff_filter_link(outlink);
221 
222  outlink->w = s->w;
223  outlink->h = s->h;
224  outlink->time_base = av_inv_q(s->frame_rate);
225  l->frame_rate = s->frame_rate;
226 
227  return 0;
228 }
229 
231 {
232  CellAutoContext *s = ctx->priv;
233  int i, v, pos[3];
234  uint8_t *row, *prev_row = s->buf + s->buf_row_idx * s->w;
235  enum { NW, N, NE };
236 
237  s->buf_prev_row_idx = s->buf_row_idx;
238  s->buf_row_idx = s->buf_row_idx == s->h-1 ? 0 : s->buf_row_idx+1;
239  row = s->buf + s->w * s->buf_row_idx;
240 
241  for (i = 0; i < s->w; i++) {
242  if (s->stitch) {
243  pos[NW] = i-1 < 0 ? s->w-1 : i-1;
244  pos[N] = i;
245  pos[NE] = i+1 == s->w ? 0 : i+1;
246  v = prev_row[pos[NW]]<<2 | prev_row[pos[N]]<<1 | prev_row[pos[NE]];
247  } else {
248  v = 0;
249  v|= i-1 >= 0 ? prev_row[i-1]<<2 : 0;
250  v|= prev_row[i ]<<1 ;
251  v|= i+1 < s->w ? prev_row[i+1] : 0;
252  }
253  row[i] = !!(s->rule & (1<<v));
254  ff_dlog(ctx, "i:%d context:%c%c%c -> cell:%d\n", i,
255  v&4?'@':' ', v&2?'@':' ', v&1?'@':' ', row[i]);
256  }
257 
258  s->generation++;
259 }
260 
261 static void fill_picture(AVFilterContext *ctx, AVFrame *picref)
262 {
263  CellAutoContext *s = ctx->priv;
264  int i, j, k, row_idx = 0;
265  uint8_t *p0 = picref->data[0];
266 
267  if (s->scroll && s->generation >= s->h)
268  /* show on top the oldest row */
269  row_idx = (s->buf_row_idx + 1) % s->h;
270 
271  /* fill the output picture with the whole buffer */
272  for (i = 0; i < s->h; i++) {
273  uint8_t byte = 0;
274  uint8_t *row = s->buf + row_idx*s->w;
275  uint8_t *p = p0;
276  for (k = 0, j = 0; j < s->w; j++) {
277  byte |= row[j]<<(7-k++);
278  if (k==8 || j == s->w-1) {
279  k = 0;
280  *p++ = byte;
281  byte = 0;
282  }
283  }
284  row_idx = (row_idx + 1) % s->h;
285  p0 += picref->linesize[0];
286  }
287 }
288 
289 static int request_frame(AVFilterLink *outlink)
290 {
291  CellAutoContext *s = outlink->src->priv;
292  AVFrame *picref = ff_get_video_buffer(outlink, s->w, s->h);
293  if (!picref)
294  return AVERROR(ENOMEM);
295  picref->sample_aspect_ratio = (AVRational) {1, 1};
296  if (s->generation == 0 && s->start_full) {
297  int i;
298  for (i = 0; i < s->h-1; i++)
299  evolve(outlink->src);
300  }
301  fill_picture(outlink->src, picref);
302  evolve(outlink->src);
303 
304  picref->pts = s->pts++;
305  picref->duration = 1;
306 
307 #ifdef DEBUG
308  show_cellauto_row(outlink->src);
309 #endif
310  return ff_filter_frame(outlink, picref);
311 }
312 
313 static const AVFilterPad cellauto_outputs[] = {
314  {
315  .name = "default",
316  .type = AVMEDIA_TYPE_VIDEO,
317  .request_frame = request_frame,
318  .config_props = config_props,
319  },
320 };
321 
323  .name = "cellauto",
324  .description = NULL_IF_CONFIG_SMALL("Create pattern generated by an elementary cellular automaton."),
325  .priv_size = sizeof(CellAutoContext),
326  .priv_class = &cellauto_class,
327  .init = init,
328  .uninit = uninit,
329  .inputs = NULL,
332 };
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:116
CellAutoContext::generation
int64_t generation
the generation number, starting from 0
Definition: vsrc_cellauto.c:54
OFFSET
#define OFFSET(x)
Definition: vsrc_cellauto.c:59
r
const char * r
Definition: vf_curves.c:127
AVERROR
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 all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
M_PHI
#define M_PHI
Definition: mathematics.h:61
av_lfg_init
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition: lfg.c:32
FLAGS
#define FLAGS
Definition: vsrc_cellauto.c:60
CellAutoContext::frame_rate
AVRational frame_rate
Definition: vsrc_cellauto.c:50
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1062
AVFrame::duration
int64_t duration
Duration of the frame, in the same units as pts.
Definition: frame.h:795
AV_OPT_TYPE_VIDEO_RATE
@ AV_OPT_TYPE_VIDEO_RATE
Underlying C type is AVRational.
Definition: opt.h:315
int64_t
long long int64_t
Definition: coverity.c:34
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:501
w
uint8_t w
Definition: llviddspenc.c:38
CellAutoContext::rule
uint8_t rule
Definition: vsrc_cellauto.c:48
AVOption
AVOption.
Definition: opt.h:429
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:205
video.h
init_pattern_from_file
static int init_pattern_from_file(AVFilterContext *ctx)
Definition: vsrc_cellauto.c:142
CellAutoContext::random_fill_ratio
double random_fill_ratio
Definition: vsrc_cellauto.c:51
init
static av_cold int init(AVFilterContext *ctx)
Definition: vsrc_cellauto.c:162
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:410
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
av_get_random_seed
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
Definition: random_seed.c:167
CellAutoContext
Definition: vsrc_cellauto.c:39
av_file_map
int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, int log_offset, void *log_ctx)
Read the file with name filename, and put its content in a newly allocated buffer or map it with mmap...
Definition: file.c:55
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:472
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:827
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:38
CellAutoContext::pts
uint64_t pts
Definition: vsrc_cellauto.c:49
CellAutoContext::random_seed
int64_t random_seed
Definition: vsrc_cellauto.c:52
config_props
static int config_props(AVFilterLink *outlink)
Definition: vsrc_cellauto.c:217
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
CellAutoContext::lfg
AVLFG lfg
Definition: vsrc_cellauto.c:55
av_cold
#define av_cold
Definition: attributes.h:90
request_frame
static int request_frame(AVFilterLink *outlink)
Definition: vsrc_cellauto.c:289
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_lfg_get
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition: lfg.h:53
AV_OPT_TYPE_DOUBLE
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
Definition: opt.h:267
lfg.h
AV_OPT_TYPE_INT64
@ AV_OPT_TYPE_INT64
Underlying C type is int64_t.
Definition: opt.h:263
filters.h
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
ctx
AVFormatContext * ctx
Definition: movenc.c:49
CellAutoContext::file_bufsize
size_t file_bufsize
Definition: vsrc_cellauto.c:45
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:263
av_file_unmap
void av_file_unmap(uint8_t *bufptr, size_t size)
Unmap or free the buffer bufptr created by av_file_map().
Definition: file.c:142
CellAutoContext::pattern
char * pattern
Definition: vsrc_cellauto.c:56
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
NULL
#define NULL
Definition: coverity.c:32
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV_PIX_FMT_MONOBLACK
@ AV_PIX_FMT_MONOBLACK
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb.
Definition: pixfmt.h:83
AV_OPT_TYPE_IMAGE_SIZE
@ AV_OPT_TYPE_IMAGE_SIZE
Underlying C type is two consecutive integers.
Definition: opt.h:303
evolve
static void evolve(AVFilterContext *ctx)
Definition: vsrc_cellauto.c:230
double
double
Definition: af_crystalizer.c:132
CellAutoContext::scroll
int scroll
Definition: vsrc_cellauto.c:53
inputs
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
Definition: filter_design.txt:243
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:197
cellauto_outputs
static const AVFilterPad cellauto_outputs[]
Definition: vsrc_cellauto.c:313
CellAutoContext::rule_str
char * rule_str
Definition: vsrc_cellauto.c:43
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
AVLFG
Context structure for the Lagged Fibonacci PRNG.
Definition: lfg.h:33
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(cellauto)
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
scroll
static void scroll(AVFilterContext *ctx, AVFrame *in, AVFrame *out)
Definition: vf_scroll.c:103
byte
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL byte
Definition: bytestream.h:99
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
CellAutoContext::file_buf
uint8_t * file_buf
Definition: vsrc_cellauto.c:44
av_isgraph
static av_const int av_isgraph(int c)
Locale-independent conversion of ASCII isgraph.
Definition: avstring.h:210
fill_picture
static void fill_picture(AVFilterContext *ctx, AVFrame *picref)
Definition: vsrc_cellauto.c:261
line
Definition: graph2dot.c:48
N
#define N
Definition: af_mcompand.c:54
ff_vsrc_cellauto
const AVFilter ff_vsrc_cellauto
Definition: vsrc_cellauto.c:322
CellAutoContext::buf_prev_row_idx
int buf_prev_row_idx
Definition: vsrc_cellauto.c:47
CellAutoContext::stitch
int stitch
Definition: vsrc_cellauto.c:53
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
internal.h
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
CellAutoContext::h
int h
Definition: vsrc_cellauto.c:41
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:44
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
AVFilter
Filter definition.
Definition: avfilter.h:201
ret
ret
Definition: filter_design.txt:187
CellAutoContext::w
int w
Definition: vsrc_cellauto.c:41
pos
unsigned int pos
Definition: spdifenc.c:414
AVFrame::sample_aspect_ratio
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:496
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: vsrc_cellauto.c:208
random_seed.h
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
avfilter.h
init_pattern_from_string
static int init_pattern_from_string(AVFilterContext *ctx)
Definition: vsrc_cellauto.c:103
file.h
AVFilterContext
An instance of a filter.
Definition: avfilter.h:457
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
CellAutoContext::buf_row_idx
int buf_row_idx
Definition: vsrc_cellauto.c:47
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
CellAutoContext::start_full
int start_full
Definition: vsrc_cellauto.c:53
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
CellAutoContext::filename
char * filename
Definition: vsrc_cellauto.c:42
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:434
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
cellauto_options
static const AVOption cellauto_options[]
Definition: vsrc_cellauto.c:62
CellAutoContext::buf
uint8_t * buf
Definition: vsrc_cellauto.c:46
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
FILTER_SINGLE_PIXFMT
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition: filters.h:252