Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
00ce1ec6
Commit
00ce1ec6
authored
Mar 31, 2020
by
Carl Eugen Hoyos
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi/deshake_opencl: Do not use bool, powerpc does not like it.
Fixes ticket #8591.
parent
afa5e380
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
31 deletions
+30
-31
vf_deshake_opencl.c
libavfilter/vf_deshake_opencl.c
+30
-31
No files found.
libavfilter/vf_deshake_opencl.c
View file @
00ce1ec6
...
@@ -45,7 +45,6 @@
...
@@ -45,7 +45,6 @@
* the use of this software, even if advised of the possibility of such damage.
* the use of this software, even if advised of the possibility of such damage.
*/
*/
#include <stdbool.h>
#include <float.h>
#include <float.h>
#include <libavutil/lfg.h>
#include <libavutil/lfg.h>
#include "libavutil/opt.h"
#include "libavutil/opt.h"
...
@@ -205,7 +204,7 @@ typedef struct DeshakeOpenCLContext {
...
@@ -205,7 +204,7 @@ typedef struct DeshakeOpenCLContext {
// These variables are used in the activate callback
// These variables are used in the activate callback
int64_t
duration
;
int64_t
duration
;
bool
eof
;
int
eof
;
// State for random number generation
// State for random number generation
AVLFG
alfg
;
AVLFG
alfg
;
...
@@ -233,7 +232,7 @@ typedef struct DeshakeOpenCLContext {
...
@@ -233,7 +232,7 @@ typedef struct DeshakeOpenCLContext {
CropInfo
crop_uv
;
CropInfo
crop_uv
;
// Whether or not we are processing YUV input (as oppposed to RGB)
// Whether or not we are processing YUV input (as oppposed to RGB)
bool
is_yuv
;
int
is_yuv
;
// The underlying format of the hardware surfaces
// The underlying format of the hardware surfaces
int
sw_format
;
int
sw_format
;
...
@@ -357,7 +356,7 @@ static void run_estimate_kernel(const MotionVector *point_pairs, double *model)
...
@@ -357,7 +356,7 @@ static void run_estimate_kernel(const MotionVector *point_pairs, double *model)
}
}
// Checks that the 3 points in the given array are not collinear
// Checks that the 3 points in the given array are not collinear
static
bool
points_not_collinear
(
const
cl_float2
**
points
)
static
int
points_not_collinear
(
const
cl_float2
**
points
)
{
{
int
j
,
k
,
i
=
2
;
int
j
,
k
,
i
=
2
;
...
@@ -373,17 +372,17 @@ static bool points_not_collinear(const cl_float2 **points)
...
@@ -373,17 +372,17 @@ static bool points_not_collinear(const cl_float2 **points)
// (3839, 2159), this prevents a third point from being within roughly
// (3839, 2159), this prevents a third point from being within roughly
// 0.5 of a pixel of the line connecting the two on both axes
// 0.5 of a pixel of the line connecting the two on both axes
if
(
fabs
(
dx2
*
dy1
-
dy2
*
dx1
)
<=
1
.
0
)
{
if
(
fabs
(
dx2
*
dy1
-
dy2
*
dx1
)
<=
1
.
0
)
{
return
false
;
return
0
;
}
}
}
}
}
}
return
true
;
return
1
;
}
}
// Checks a subset of 3 point pairs to make sure that the points are not collinear
// Checks a subset of 3 point pairs to make sure that the points are not collinear
// and not too close to each other
// and not too close to each other
static
bool
check_subset
(
const
MotionVector
*
pairs_subset
)
static
int
check_subset
(
const
MotionVector
*
pairs_subset
)
{
{
const
cl_float2
*
prev_points
[]
=
{
const
cl_float2
*
prev_points
[]
=
{
&
pairs_subset
[
0
].
p
.
p1
,
&
pairs_subset
[
0
].
p
.
p1
,
...
@@ -401,7 +400,7 @@ static bool check_subset(const MotionVector *pairs_subset)
...
@@ -401,7 +400,7 @@ static bool check_subset(const MotionVector *pairs_subset)
}
}
// Selects a random subset of 3 points from point_pairs and places them in pairs_subset
// Selects a random subset of 3 points from point_pairs and places them in pairs_subset
static
bool
get_subset
(
static
int
get_subset
(
AVLFG
*
alfg
,
AVLFG
*
alfg
,
const
MotionVector
*
point_pairs
,
const
MotionVector
*
point_pairs
,
const
int
num_point_pairs
,
const
int
num_point_pairs
,
...
@@ -482,10 +481,10 @@ static int find_inliers(
...
@@ -482,10 +481,10 @@ static int find_inliers(
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
err
[
i
]
<=
t
)
{
if
(
err
[
i
]
<=
t
)
{
// This is an inlier
// This is an inlier
point_pairs
[
i
].
should_consider
=
true
;
point_pairs
[
i
].
should_consider
=
1
;
num_inliers
+=
1
;
num_inliers
+=
1
;
}
else
{
}
else
{
point_pairs
[
i
].
should_consider
=
false
;
point_pairs
[
i
].
should_consider
=
0
;
}
}
}
}
...
@@ -525,7 +524,7 @@ static int ransac_update_num_iters(double confidence, double num_outliers, int m
...
@@ -525,7 +524,7 @@ static int ransac_update_num_iters(double confidence, double num_outliers, int m
// Estimates an affine transform between the given pairs of points using RANdom
// Estimates an affine transform between the given pairs of points using RANdom
// SAmple Consensus
// SAmple Consensus
static
bool
estimate_affine_2d
(
static
int
estimate_affine_2d
(
DeshakeOpenCLContext
*
deshake_ctx
,
DeshakeOpenCLContext
*
deshake_ctx
,
MotionVector
*
point_pairs
,
MotionVector
*
point_pairs
,
DebugMatches
*
debug_matches
,
DebugMatches
*
debug_matches
,
...
@@ -535,7 +534,7 @@ static bool estimate_affine_2d(
...
@@ -535,7 +534,7 @@ static bool estimate_affine_2d(
const
int
max_iters
,
const
int
max_iters
,
const
double
confidence
const
double
confidence
)
{
)
{
bool
result
=
false
;
int
result
=
0
;
double
best_model
[
6
],
model
[
6
];
double
best_model
[
6
],
model
[
6
];
MotionVector
pairs_subset
[
3
],
best_pairs
[
3
];
MotionVector
pairs_subset
[
3
],
best_pairs
[
3
];
...
@@ -544,24 +543,24 @@ static bool estimate_affine_2d(
...
@@ -544,24 +543,24 @@ static bool estimate_affine_2d(
// We need at least 3 points to build a model from
// We need at least 3 points to build a model from
if
(
num_point_pairs
<
3
)
{
if
(
num_point_pairs
<
3
)
{
return
false
;
return
0
;
}
else
if
(
num_point_pairs
==
3
)
{
}
else
if
(
num_point_pairs
==
3
)
{
// There are only 3 points, so RANSAC doesn't apply here
// There are only 3 points, so RANSAC doesn't apply here
run_estimate_kernel
(
point_pairs
,
model_out
);
run_estimate_kernel
(
point_pairs
,
model_out
);
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
point_pairs
[
i
].
should_consider
=
true
;
point_pairs
[
i
].
should_consider
=
1
;
}
}
return
true
;
return
1
;
}
}
for
(
iter
=
0
;
iter
<
niters
;
++
iter
)
{
for
(
iter
=
0
;
iter
<
niters
;
++
iter
)
{
bool
found
=
get_subset
(
&
deshake_ctx
->
alfg
,
point_pairs
,
num_point_pairs
,
pairs_subset
,
10000
);
int
found
=
get_subset
(
&
deshake_ctx
->
alfg
,
point_pairs
,
num_point_pairs
,
pairs_subset
,
10000
);
if
(
!
found
)
{
if
(
!
found
)
{
if
(
iter
==
0
)
{
if
(
iter
==
0
)
{
return
false
;
return
0
;
}
}
break
;
break
;
...
@@ -600,7 +599,7 @@ static bool estimate_affine_2d(
...
@@ -600,7 +599,7 @@ static bool estimate_affine_2d(
// Find the inliers again for the best model for debugging
// Find the inliers again for the best model for debugging
find_inliers
(
point_pairs
,
num_point_pairs
,
best_model
,
deshake_ctx
->
ransac_err
,
threshold
);
find_inliers
(
point_pairs
,
num_point_pairs
,
best_model
,
deshake_ctx
->
ransac_err
,
threshold
);
result
=
true
;
result
=
1
;
}
}
return
result
;
return
result
;
...
@@ -618,7 +617,7 @@ static void optimize_model(
...
@@ -618,7 +617,7 @@ static void optimize_model(
)
{
)
{
float
move_x_val
=
0
.
01
;
float
move_x_val
=
0
.
01
;
float
move_y_val
=
0
.
01
;
float
move_y_val
=
0
.
01
;
bool
move_x
=
true
;
int
move_x
=
1
;
float
old_move_x_val
=
0
;
float
old_move_x_val
=
0
;
double
model
[
6
];
double
model
[
6
];
int
last_changed
=
0
;
int
last_changed
=
0
;
...
@@ -668,9 +667,9 @@ static void optimize_model(
...
@@ -668,9 +667,9 @@ static void optimize_model(
}
}
if
(
old_move_x_val
<
0
)
{
if
(
old_move_x_val
<
0
)
{
move_x
=
false
;
move_x
=
0
;
}
else
{
}
else
{
move_x
=
true
;
move_x
=
1
;
}
}
}
}
}
}
...
@@ -681,7 +680,7 @@ static void optimize_model(
...
@@ -681,7 +680,7 @@ static void optimize_model(
//
//
// (Pick random subsets, compute model, find total error, iterate until error
// (Pick random subsets, compute model, find total error, iterate until error
// is minimized.)
// is minimized.)
static
bool
minimize_error
(
static
int
minimize_error
(
DeshakeOpenCLContext
*
deshake_ctx
,
DeshakeOpenCLContext
*
deshake_ctx
,
MotionVector
*
inliers
,
MotionVector
*
inliers
,
DebugMatches
*
debug_matches
,
DebugMatches
*
debug_matches
,
...
@@ -689,18 +688,18 @@ static bool minimize_error(
...
@@ -689,18 +688,18 @@ static bool minimize_error(
double
*
model_out
,
double
*
model_out
,
const
int
max_iters
const
int
max_iters
)
{
)
{
bool
result
=
false
;
int
result
=
0
;
float
best_err
=
FLT_MAX
;
float
best_err
=
FLT_MAX
;
double
best_model
[
6
],
model
[
6
];
double
best_model
[
6
],
model
[
6
];
MotionVector
pairs_subset
[
3
],
best_pairs
[
3
];
MotionVector
pairs_subset
[
3
],
best_pairs
[
3
];
for
(
int
i
=
0
;
i
<
max_iters
;
i
++
)
{
for
(
int
i
=
0
;
i
<
max_iters
;
i
++
)
{
float
total_err
=
0
;
float
total_err
=
0
;
bool
found
=
get_subset
(
&
deshake_ctx
->
alfg
,
inliers
,
num_inliers
,
pairs_subset
,
10000
);
int
found
=
get_subset
(
&
deshake_ctx
->
alfg
,
inliers
,
num_inliers
,
pairs_subset
,
10000
);
if
(
!
found
)
{
if
(
!
found
)
{
if
(
i
==
0
)
{
if
(
i
==
0
)
{
return
false
;
return
0
;
}
}
break
;
break
;
...
@@ -734,7 +733,7 @@ static bool minimize_error(
...
@@ -734,7 +733,7 @@ static bool minimize_error(
debug_matches
->
model_matches
[
pi
]
=
best_pairs
[
pi
];
debug_matches
->
model_matches
[
pi
]
=
best_pairs
[
pi
];
}
}
debug_matches
->
num_model_matches
=
3
;
debug_matches
->
num_model_matches
=
3
;
result
=
true
;
result
=
1
;
optimize_model
(
deshake_ctx
,
best_pairs
,
inliers
,
num_inliers
,
best_err
,
model_out
);
optimize_model
(
deshake_ctx
,
best_pairs
,
inliers
,
num_inliers
,
best_err
,
model_out
);
return
result
;
return
result
;
...
@@ -1170,7 +1169,7 @@ static int deshake_opencl_init(AVFilterContext *avctx)
...
@@ -1170,7 +1169,7 @@ static int deshake_opencl_init(AVFilterContext *avctx)
ff_framequeue_global_init
(
&
fqg
);
ff_framequeue_global_init
(
&
fqg
);
ff_framequeue_init
(
&
ctx
->
fq
,
&
fqg
);
ff_framequeue_init
(
&
ctx
->
fq
,
&
fqg
);
ctx
->
eof
=
false
;
ctx
->
eof
=
0
;
ctx
->
smooth_window
=
(
int
)(
av_q2d
(
avctx
->
inputs
[
0
]
->
frame_rate
)
*
ctx
->
smooth_window_multiplier
);
ctx
->
smooth_window
=
(
int
)(
av_q2d
(
avctx
->
inputs
[
0
]
->
frame_rate
)
*
ctx
->
smooth_window_multiplier
);
ctx
->
curr_frame
=
0
;
ctx
->
curr_frame
=
0
;
...
@@ -1262,9 +1261,9 @@ static int deshake_opencl_init(AVFilterContext *avctx)
...
@@ -1262,9 +1261,9 @@ static int deshake_opencl_init(AVFilterContext *avctx)
}
}
if
(
desc
->
flags
&
AV_PIX_FMT_FLAG_RGB
)
{
if
(
desc
->
flags
&
AV_PIX_FMT_FLAG_RGB
)
{
ctx
->
is_yuv
=
false
;
ctx
->
is_yuv
=
0
;
}
else
{
}
else
{
ctx
->
is_yuv
=
true
;
ctx
->
is_yuv
=
1
;
}
}
ctx
->
sw_format
=
hw_frames_ctx
->
sw_format
;
ctx
->
sw_format
=
hw_frames_ctx
->
sw_format
;
...
@@ -1971,7 +1970,7 @@ no_motion_data:
...
@@ -1971,7 +1970,7 @@ no_motion_data:
new_vals
[
RingbufScaleY
]
=
1
.
0
f
;
new_vals
[
RingbufScaleY
]
=
1
.
0
f
;
for
(
int
i
=
0
;
i
<
num_vectors
;
i
++
)
{
for
(
int
i
=
0
;
i
<
num_vectors
;
i
++
)
{
deshake_ctx
->
matches_contig_host
[
i
].
should_consider
=
false
;
deshake_ctx
->
matches_contig_host
[
i
].
should_consider
=
0
;
}
}
debug_matches
.
num_model_matches
=
0
;
debug_matches
.
num_model_matches
=
0
;
...
@@ -2085,7 +2084,7 @@ static int activate(AVFilterContext *ctx)
...
@@ -2085,7 +2084,7 @@ static int activate(AVFilterContext *ctx)
if
(
!
deshake_ctx
->
eof
&&
ff_inlink_acknowledge_status
(
inlink
,
&
status
,
&
pts
))
{
if
(
!
deshake_ctx
->
eof
&&
ff_inlink_acknowledge_status
(
inlink
,
&
status
,
&
pts
))
{
if
(
status
==
AVERROR_EOF
)
{
if
(
status
==
AVERROR_EOF
)
{
deshake_ctx
->
eof
=
true
;
deshake_ctx
->
eof
=
1
;
}
}
}
}
...
...
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