Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
9c3e1c19
Commit
9c3e1c19
authored
Aug 12, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avfilter: add sierpinski video source
parent
55b32584
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
230 additions
and
2 deletions
+230
-2
Changelog
Changelog
+1
-0
filters.texi
doc/filters.texi
+22
-0
Makefile
libavfilter/Makefile
+1
-0
allfilters.c
libavfilter/allfilters.c
+1
-0
version.h
libavfilter/version.h
+2
-2
vsrc_sierpinski.c
libavfilter/vsrc_sierpinski.c
+203
-0
No files found.
Changelog
View file @
9c3e1c19
...
...
@@ -11,6 +11,7 @@ version <next>:
- ZeroMQ protocol
- support Sipro ACELP.KELVIN decoding
- streamhash muxer
- sierpinski video source
version 4.2:
...
...
doc/filters.texi
View file @
9c3e1c19
...
...
@@ -21008,6 +21008,28 @@ __kernel void sierpinski_carpet(__write_only image2d_t dst,
@end itemize
@section sierpinski
Generate a Sierpinksi carpet fractal, and randomly pan around.
This source accepts the following options:
@table @option
@item size, s
Set frame size. For the syntax of this option, check the @ref{video size syntax,,"
Video
size
" section in the ffmpeg-utils manual,ffmpeg-utils}. Default value is "
640
x480
".
@item rate, r
Set frame rate, expressed as number of frames per second. Default
value is "
25
".
@item seed
Set seed which is used for random panning.
@item jump
Set max jump for single pan destination. Allowed range is from 1 to 10000.
@end table
@c man end VIDEO SOURCES
@chapter Video Sinks
...
...
libavfilter/Makefile
View file @
9c3e1c19
...
...
@@ -452,6 +452,7 @@ OBJS-$(CONFIG_OPENCLSRC_FILTER) += vf_program_opencl.o opencl.o
OBJS-$(CONFIG_PAL75BARS_FILTER)
+=
vsrc_testsrc.o
OBJS-$(CONFIG_PAL100BARS_FILTER)
+=
vsrc_testsrc.o
OBJS-$(CONFIG_RGBTESTSRC_FILTER)
+=
vsrc_testsrc.o
OBJS-$(CONFIG_SMPTEBARS_FILTER)
+=
vsrc_sierpinski.o
OBJS-$(CONFIG_SMPTEBARS_FILTER)
+=
vsrc_testsrc.o
OBJS-$(CONFIG_SMPTEHDBARS_FILTER)
+=
vsrc_testsrc.o
OBJS-$(CONFIG_TESTSRC_FILTER)
+=
vsrc_testsrc.o
...
...
libavfilter/allfilters.c
View file @
9c3e1c19
...
...
@@ -430,6 +430,7 @@ extern AVFilter ff_vsrc_openclsrc;
extern
AVFilter
ff_vsrc_pal75bars
;
extern
AVFilter
ff_vsrc_pal100bars
;
extern
AVFilter
ff_vsrc_rgbtestsrc
;
extern
AVFilter
ff_vsrc_sierpinski
;
extern
AVFilter
ff_vsrc_smptebars
;
extern
AVFilter
ff_vsrc_smptehdbars
;
extern
AVFilter
ff_vsrc_testsrc
;
...
...
libavfilter/version.h
View file @
9c3e1c19
...
...
@@ -30,8 +30,8 @@
#include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 7
#define LIBAVFILTER_VERSION_MINOR 5
8
#define LIBAVFILTER_VERSION_MICRO 10
2
#define LIBAVFILTER_VERSION_MINOR 5
9
#define LIBAVFILTER_VERSION_MICRO 10
0
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
...
...
libavfilter/vsrc_sierpinski.c
0 → 100644
View file @
9c3e1c19
/*
* Copyright (c) 2019 Paul B Mahol
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* Sierpinski carpet fractal renderer
*/
#include "avfilter.h"
#include "formats.h"
#include "video.h"
#include "internal.h"
#include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
#include "libavutil/lfg.h"
#include "libavutil/random_seed.h"
#include <float.h>
#include <math.h>
typedef
struct
SierpinskiContext
{
const
AVClass
*
class
;
int
w
,
h
;
AVRational
frame_rate
;
uint64_t
pts
;
unsigned
int
seed
;
int
jump
;
int
pos_x
,
pos_y
;
int
dest_x
,
dest_y
;
AVLFG
lfg
;
}
SierpinskiContext
;
#define OFFSET(x) offsetof(SierpinskiContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
static
const
AVOption
sierpinski_options
[]
=
{
{
"size"
,
"set frame size"
,
OFFSET
(
w
),
AV_OPT_TYPE_IMAGE_SIZE
,
{.
str
=
"640x480"
},
0
,
0
,
FLAGS
},
{
"s"
,
"set frame size"
,
OFFSET
(
w
),
AV_OPT_TYPE_IMAGE_SIZE
,
{.
str
=
"640x480"
},
0
,
0
,
FLAGS
},
{
"rate"
,
"set frame rate"
,
OFFSET
(
frame_rate
),
AV_OPT_TYPE_VIDEO_RATE
,
{.
str
=
"25"
},
0
,
0
,
FLAGS
},
{
"r"
,
"set frame rate"
,
OFFSET
(
frame_rate
),
AV_OPT_TYPE_VIDEO_RATE
,
{.
str
=
"25"
},
0
,
0
,
FLAGS
},
{
"seed"
,
"set the seed"
,
OFFSET
(
seed
),
AV_OPT_TYPE_INT
,
{.
i64
=-
1
},
-
1
,
UINT32_MAX
,
FLAGS
},
{
"jump"
,
"set the jump"
,
OFFSET
(
jump
),
AV_OPT_TYPE_INT
,
{.
i64
=
100
},
1
,
10000
,
FLAGS
},
{
NULL
},
};
AVFILTER_DEFINE_CLASS
(
sierpinski
);
static
int
query_formats
(
AVFilterContext
*
ctx
)
{
static
const
enum
AVPixelFormat
pix_fmts
[]
=
{
AV_PIX_FMT_0BGR32
,
AV_PIX_FMT_NONE
};
AVFilterFormats
*
fmts_list
=
ff_make_format_list
(
pix_fmts
);
if
(
!
fmts_list
)
return
AVERROR
(
ENOMEM
);
return
ff_set_common_formats
(
ctx
,
fmts_list
);
}
static
int
config_output
(
AVFilterLink
*
inlink
)
{
AVFilterContext
*
ctx
=
inlink
->
src
;
SierpinskiContext
*
s
=
ctx
->
priv
;
if
(
av_image_check_size
(
s
->
w
,
s
->
h
,
0
,
ctx
)
<
0
)
return
AVERROR
(
EINVAL
);
inlink
->
w
=
s
->
w
;
inlink
->
h
=
s
->
h
;
inlink
->
time_base
=
av_inv_q
(
s
->
frame_rate
);
inlink
->
sample_aspect_ratio
=
(
AVRational
)
{
1
,
1
};
if
(
s
->
seed
==
-
1
)
s
->
seed
=
av_get_random_seed
();
av_lfg_init
(
&
s
->
lfg
,
s
->
seed
);
return
0
;
}
static
int
fill_sierpinski
(
SierpinskiContext
*
s
,
int
x
,
int
y
)
{
int
pos_x
=
x
+
s
->
pos_x
;
int
pos_y
=
y
+
s
->
pos_y
;
while
(
pos_x
!=
0
&&
pos_y
!=
0
)
{
if
(
FFABS
(
pos_x
%
3
)
==
1
&&
FFABS
(
pos_y
%
3
)
==
1
)
return
1
;
pos_x
/=
3
;
pos_y
/=
3
;
}
return
0
;
}
static
int
draw_slice
(
AVFilterContext
*
ctx
,
void
*
arg
,
int
job
,
int
nb_jobs
)
{
SierpinskiContext
*
s
=
ctx
->
priv
;
AVFrame
*
frame
=
arg
;
const
int
width
=
frame
->
width
;
const
int
height
=
frame
->
height
;
const
int
start
=
(
height
*
job
)
/
nb_jobs
;
const
int
end
=
(
height
*
(
job
+
1
))
/
nb_jobs
;
uint8_t
*
dst
=
frame
->
data
[
0
]
+
start
*
frame
->
linesize
[
0
];
for
(
int
y
=
start
;
y
<
end
;
y
++
)
{
for
(
int
x
=
0
;
x
<
width
;
x
++
)
{
if
(
fill_sierpinski
(
s
,
x
,
y
))
{
AV_WL32
(
&
dst
[
x
*
4
],
0x00000000
);
}
else
{
AV_WL32
(
&
dst
[
x
*
4
],
0xFFFFFFFF
);
}
}
dst
+=
frame
->
linesize
[
0
];
}
return
0
;
}
static
void
draw_sierpinski
(
AVFilterContext
*
ctx
,
AVFrame
*
frame
)
{
SierpinskiContext
*
s
=
ctx
->
priv
;
AVFilterLink
*
outlink
=
ctx
->
outputs
[
0
];
if
(
s
->
pos_x
==
s
->
dest_x
&&
s
->
pos_y
==
s
->
dest_y
)
{
unsigned
int
rnd
=
av_lfg_get
(
&
s
->
lfg
);
int
mod
=
2
*
s
->
jump
+
1
;
s
->
dest_x
+=
(
int
)((
rnd
&
0xffff
)
%
mod
)
-
s
->
jump
;
s
->
dest_y
+=
(
int
)((
rnd
>>
16
)
%
mod
)
-
s
->
jump
;
}
else
{
if
(
s
->
pos_x
<
s
->
dest_x
)
s
->
pos_x
++
;
else
if
(
s
->
pos_x
>
s
->
dest_x
)
s
->
pos_x
--
;
if
(
s
->
pos_y
<
s
->
dest_y
)
s
->
pos_y
++
;
else
if
(
s
->
pos_y
>
s
->
dest_y
)
s
->
pos_y
--
;
}
ctx
->
internal
->
execute
(
ctx
,
draw_slice
,
frame
,
NULL
,
FFMIN
(
outlink
->
h
,
ff_filter_get_nb_threads
(
ctx
)));
}
static
int
sierpinski_request_frame
(
AVFilterLink
*
link
)
{
SierpinskiContext
*
s
=
link
->
src
->
priv
;
AVFrame
*
frame
=
ff_get_video_buffer
(
link
,
s
->
w
,
s
->
h
);
if
(
!
frame
)
return
AVERROR
(
ENOMEM
);
frame
->
sample_aspect_ratio
=
(
AVRational
)
{
1
,
1
};
frame
->
pts
=
s
->
pts
++
;
draw_sierpinski
(
link
->
src
,
frame
);
return
ff_filter_frame
(
link
,
frame
);
}
static
const
AVFilterPad
sierpinski_outputs
[]
=
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
request_frame
=
sierpinski_request_frame
,
.
config_props
=
config_output
,
},
{
NULL
}
};
AVFilter
ff_vsrc_sierpinski
=
{
.
name
=
"sierpinski"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Render a Sierpinski carpet fractal."
),
.
priv_size
=
sizeof
(
SierpinskiContext
),
.
priv_class
=
&
sierpinski_class
,
.
query_formats
=
query_formats
,
.
inputs
=
NULL
,
.
outputs
=
sierpinski_outputs
,
.
flags
=
AVFILTER_FLAG_SLICE_THREADS
,
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment