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
098af260
Commit
098af260
authored
Sep 01, 2014
by
Reimar Döffinger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vf_deshake: Avoid doing a malloc+free for every single frame.
Signed-off-by:
Reimar Döffinger
<
Reimar.Doeffinger@gmx.de
>
parent
4ea8406e
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
8 additions
and
4 deletions
+8
-4
deshake.h
libavfilter/deshake.h
+2
-0
vf_deshake.c
libavfilter/vf_deshake.c
+6
-4
No files found.
libavfilter/deshake.h
View file @
098af260
...
...
@@ -76,6 +76,8 @@ typedef struct {
typedef
struct
{
const
AVClass
*
class
;
int
counts
[
2
*
MAX_R
+
1
][
2
*
MAX_R
+
1
];
/// < Scratch buffer for motion search
double
*
angles
;
///< Scratch buffer for block angles
unsigned
angles_size
;
AVFrame
*
ref
;
///< Previous frame
int
rx
;
///< Maximum horizontal shift
int
ry
;
///< Maximum vertical shift
...
...
libavfilter/vf_deshake.c
View file @
098af260
...
...
@@ -244,10 +244,11 @@ static void find_motion(DeshakeContext *deshake, uint8_t *src1, uint8_t *src2,
int
contrast
;
int
pos
;
double
*
angles
=
av_malloc_array
(
width
*
height
/
(
16
*
deshake
->
blocksize
),
sizeof
(
*
angles
));
int
center_x
=
0
,
center_y
=
0
;
double
p_x
,
p_y
;
av_fast_malloc
(
&
deshake
->
angles
,
&
deshake
->
angles_size
,
width
*
height
/
(
16
*
deshake
->
blocksize
)
*
sizeof
(
*
deshake
->
angles
));
// Reset counts to zero
for
(
x
=
0
;
x
<
deshake
->
rx
*
2
+
1
;
x
++
)
{
for
(
y
=
0
;
y
<
deshake
->
ry
*
2
+
1
;
y
++
)
{
...
...
@@ -269,7 +270,7 @@ static void find_motion(DeshakeContext *deshake, uint8_t *src1, uint8_t *src2,
if
(
mv
.
x
!=
-
1
&&
mv
.
y
!=
-
1
)
{
deshake
->
counts
[
mv
.
x
+
deshake
->
rx
][
mv
.
y
+
deshake
->
ry
]
+=
1
;
if
(
x
>
deshake
->
rx
&&
y
>
deshake
->
ry
)
angles
[
pos
++
]
=
block_angle
(
x
,
y
,
0
,
0
,
&
mv
);
deshake
->
angles
[
pos
++
]
=
block_angle
(
x
,
y
,
0
,
0
,
&
mv
);
center_x
+=
mv
.
x
;
center_y
+=
mv
.
y
;
...
...
@@ -281,7 +282,7 @@ static void find_motion(DeshakeContext *deshake, uint8_t *src1, uint8_t *src2,
if
(
pos
)
{
center_x
/=
pos
;
center_y
/=
pos
;
t
->
angle
=
clean_mean
(
angles
,
pos
);
t
->
angle
=
clean_mean
(
deshake
->
angles
,
pos
);
if
(
t
->
angle
<
0
.
001
)
t
->
angle
=
0
;
}
else
{
...
...
@@ -312,7 +313,6 @@ static void find_motion(DeshakeContext *deshake, uint8_t *src1, uint8_t *src2,
t
->
angle
=
av_clipf
(
t
->
angle
,
-
0
.
1
,
0
.
1
);
//av_log(NULL, AV_LOG_ERROR, "%d x %d\n", avg->x, avg->y);
av_free
(
angles
);
}
static
int
deshake_transform_c
(
AVFilterContext
*
ctx
,
...
...
@@ -422,6 +422,8 @@ static av_cold void uninit(AVFilterContext *ctx)
ff_opencl_deshake_uninit
(
ctx
);
}
av_frame_free
(
&
deshake
->
ref
);
av_freep
(
&
deshake
->
angles
);
deshake
->
angles_size
=
0
;
if
(
deshake
->
fp
)
fclose
(
deshake
->
fp
);
}
...
...
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