60 #define OFFSET(x) offsetof(CellAutoContext, x)
61 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
75 {
"random_seed",
"set the seed for filling the initial grid randomly",
OFFSET(random_seed),
AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX,
FLAGS },
76 {
"seed",
"set the seed for filling the initial grid randomly",
OFFSET(random_seed),
AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX,
FLAGS },
96 for (
i = 0;
i <
s->w;
i++)
97 line[
i] = row[
i] ?
'@' :
' ';
110 w = strlen(
s->pattern);
116 "The specified width is %d which cannot contain the provided string width of %d\n",
132 for (
i = (
s->w -
w)/2;;
i++) {
134 if (*p ==
'\n' || !*p)
149 &
s->file_buf, &
s->file_bufsize, 0,
ctx);
157 memcpy(
s->pattern,
s->file_buf,
s->file_bufsize);
158 s->pattern[
s->file_bufsize] = 0;
168 if (!
s->w && !
s->filename && !
s->pattern)
171 if (
s->filename &&
s->pattern) {
179 }
else if (
s->pattern) {
189 if (
s->random_seed == -1)
194 for (
i = 0;
i <
s->w;
i++) {
196 if (r <= s->random_fill_ratio)
202 "s:%dx%d r:%d/%d rule:%d stitch:%d scroll:%d full:%d seed:%"PRId64
"\n",
203 s->w,
s->h,
s->frame_rate.num,
s->frame_rate.den,
204 s->rule,
s->stitch,
s->scroll,
s->start_full,
233 uint8_t *row, *prev_row =
s->buf +
s->buf_row_idx *
s->w;
236 s->buf_prev_row_idx =
s->buf_row_idx;
237 s->buf_row_idx =
s->buf_row_idx ==
s->h-1 ? 0 :
s->buf_row_idx+1;
238 row =
s->buf +
s->w *
s->buf_row_idx;
240 for (
i = 0;
i <
s->w;
i++) {
242 pos[NW] =
i-1 < 0 ?
s->w-1 :
i-1;
244 pos[NE] =
i+1 ==
s->w ? 0 :
i+1;
245 v = prev_row[
pos[NW]]<<2 | prev_row[
pos[
N]]<<1 | prev_row[
pos[NE]];
248 v|=
i-1 >= 0 ? prev_row[
i-1]<<2 : 0;
249 v|= prev_row[
i ]<<1 ;
250 v|=
i+1 <
s->w ? prev_row[
i+1] : 0;
252 row[
i] = !!(
s->rule & (1<<v));
253 ff_dlog(
ctx,
"i:%d context:%c%c%c -> cell:%d\n",
i,
254 v&4?
'@':
' ', v&2?
'@':
' ', v&1?
'@':
' ', row[
i]);
263 int i, j, k, row_idx = 0;
266 if (
s->scroll &&
s->generation >=
s->h)
268 row_idx = (
s->buf_row_idx + 1) %
s->h;
275 for (k = 0, j = 0; j <
s->w; j++) {
276 byte |= row[j]<<(7-k++);
277 if (k==8 || j ==
s->w-1) {
283 row_idx = (row_idx + 1) %
s->h;
295 if (
s->generation == 0 &&
s->start_full) {
297 for (
i = 0;
i <
s->h-1;
i++)
303 picref->
pts =
s->pts++;
306 show_cellauto_row(outlink->
src);
332 .description =
NULL_IF_CONFIG_SMALL(
"Create pattern generated by an elementary cellular automaton."),
334 .priv_class = &cellauto_class,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
@ AV_OPT_TYPE_IMAGE_SIZE
offset must point to two consecutive integers
@ AV_OPT_TYPE_VIDEO_RATE
offset must point to AVRational
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
static av_const int av_isgraph(int c)
Locale-independent conversion of ASCII isgraph.
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
void av_file_unmap(uint8_t *bufptr, size_t size)
Unmap or free the buffer bufptr created by 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...
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_MONOBLACK
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb.
Describe the class of an AVClass context structure.
void * priv
private data for use by the filter
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Context structure for the Lagged Fibonacci PRNG.
Rational number (pair of numerator and denominator).
int64_t generation
the generation number, starting from 0
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
static int init_pattern_from_file(AVFilterContext *ctx)
static int config_props(AVFilterLink *outlink)
static void evolve(AVFilterContext *ctx)
static const AVOption cellauto_options[]
static int query_formats(AVFilterContext *ctx)
AVFILTER_DEFINE_CLASS(cellauto)
static int request_frame(AVFilterLink *outlink)
static int init_pattern_from_string(AVFilterContext *ctx)
static const AVFilterPad cellauto_outputs[]
static void fill_picture(AVFilterContext *ctx, AVFrame *picref)
static av_cold int init(AVFilterContext *ctx)
static av_cold void uninit(AVFilterContext *ctx)
AVFilter ff_vsrc_cellauto