Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Guillaume Martres
aom-rav1e
Commits
f9d1e66f
Commit
f9d1e66f
authored
Jun 12, 2014
by
Yunqing Wang
Committed by
Gerrit Code Review
Jun 12, 2014
Browse files
Merge "skip un-neccessary motion search in the first pass"
parents
686b54ad
5daef90e
Changes
1
Hide whitespace changes
Inline
Side-by-side
vp9/encoder/vp9_firstpass.c
View file @
f9d1e66f
...
...
@@ -597,73 +597,91 @@ void vp9_first_pass(VP9_COMP *cpi) {
if
(
cm
->
current_video_frame
>
0
)
{
int
tmp_err
,
motion_error
;
int_mv
mv
,
tmp_mv
;
int
raw_motion_error
;
struct
buf_2d
unscaled_last_source_buf_2d
;
xd
->
plane
[
0
].
pre
[
0
].
buf
=
first_ref_buf
->
y_buffer
+
recon_yoffset
;
motion_error
=
get_prediction_error
(
bsize
,
&
x
->
plane
[
0
].
src
,
&
xd
->
plane
[
0
].
pre
[
0
]);
// Assume 0,0 motion with no mv overhead.
mv
.
as_int
=
tmp_mv
.
as_int
=
0
;
// Test last reference frame using the previous best mv as the
// starting point (best reference) for the search.
first_pass_motion_search
(
cpi
,
x
,
&
best_ref_mv
.
as_mv
,
&
mv
.
as_mv
,
&
motion_error
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
motion_error
=
(
int
)(
motion_error
*
error_weight
);
}
// If the current best reference mv is not centered on 0,0 then do a 0,0
// based search as well.
if
(
best_ref_mv
.
as_int
)
{
tmp_err
=
INT_MAX
;
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
.
as_mv
,
&
tmp_err
);
// compute the motion error of the zero motion vector using the last
// source frame as the reference
// skip the further motion search on reconstructed frame
// if this error is small
unscaled_last_source_buf_2d
.
buf
=
cpi
->
unscaled_last_source
->
y_buffer
+
recon_yoffset
;
unscaled_last_source_buf_2d
.
stride
=
cpi
->
unscaled_last_source
->
y_stride
;
raw_motion_error
=
get_prediction_error
(
bsize
,
&
x
->
plane
[
0
].
src
,
&
unscaled_last_source_buf_2d
);
// TODO(pengchong): Replace the hard-coded threshold
if
(
raw_motion_error
>
25
)
{
// Assume 0,0 motion with no mv overhead.
mv
.
as_int
=
tmp_mv
.
as_int
=
0
;
// Test last reference frame using the previous best mv as the
// starting point (best reference) for the search.
first_pass_motion_search
(
cpi
,
x
,
&
best_ref_mv
.
as_mv
,
&
mv
.
as_mv
,
&
motion_error
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
tmp
_err
=
(
int
)(
tmp
_err
*
error_weight
);
motion
_err
or
=
(
int
)(
motion
_err
or
*
error_weight
);
}
if
(
tmp_err
<
motion_error
)
{
motion_error
=
tmp_err
;
mv
.
as_int
=
tmp_mv
.
as_int
;
// If the current best reference mv is not centered on 0,0
// then do a 0,0
// based search as well.
if
(
best_ref_mv
.
as_int
)
{
tmp_err
=
INT_MAX
;
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
.
as_mv
,
&
tmp_err
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
tmp_err
=
(
int
)(
tmp_err
*
error_weight
);
}
if
(
tmp_err
<
motion_error
)
{
motion_error
=
tmp_err
;
mv
.
as_int
=
tmp_mv
.
as_int
;
}
}
}
// Search in an older reference frame.
if
(
cm
->
current_video_frame
>
1
&&
gld_yv12
!=
NULL
)
{
// Assume 0,0 motion with no mv overhead.
int
gf_motion_error
;
// Search in an older reference frame.
if
(
cm
->
current_video_frame
>
1
&&
gld_yv12
!=
NULL
)
{
// Assume 0,0 motion with no mv overhead.
int
gf_motion_error
;
xd
->
plane
[
0
].
pre
[
0
].
buf
=
gld_yv12
->
y_buffer
+
recon_yoffset
;
gf_motion_error
=
get_prediction_error
(
bsize
,
&
x
->
plane
[
0
].
src
,
&
xd
->
plane
[
0
].
pre
[
0
]);
xd
->
plane
[
0
].
pre
[
0
].
buf
=
gld_yv12
->
y_buffer
+
recon_yoffset
;
gf_motion_error
=
get_prediction_error
(
bsize
,
&
x
->
plane
[
0
].
src
,
&
xd
->
plane
[
0
].
pre
[
0
]);
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
.
as_mv
,
&
gf_motion_error
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
gf_motion_error
=
(
int
)(
gf_motion_error
*
error_weight
);
}
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
.
as_mv
,
&
gf_motion_error
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
gf_motion_error
=
(
int
)(
gf_motion_error
*
error_weight
);
}
if
(
gf_motion_error
<
motion_error
&&
gf_motion_error
<
this_error
)
++
second_ref_count
;
// Reset to last frame as reference buffer.
xd
->
plane
[
0
].
pre
[
0
].
buf
=
first_ref_buf
->
y_buffer
+
recon_yoffset
;
xd
->
plane
[
1
].
pre
[
0
].
buf
=
first_ref_buf
->
u_buffer
+
recon_uvoffset
;
xd
->
plane
[
2
].
pre
[
0
].
buf
=
first_ref_buf
->
v_buffer
+
recon_uvoffset
;
// In accumulating a score for the older reference frame take the
// best of the motion predicted score and the intra coded error
// (just as will be done for) accumulation of "coded_error" for
// the last frame.
if
(
gf_motion_error
<
this_error
)
sr_coded_error
+=
gf_motion_error
;
else
sr_coded_error
+=
this_error
;
}
else
{
sr_coded_error
+=
motion_error
;
if
(
gf_motion_error
<
motion_error
&&
gf_motion_error
<
this_error
)
++
second_ref_count
;
// Reset to last frame as reference buffer.
xd
->
plane
[
0
].
pre
[
0
].
buf
=
first_ref_buf
->
y_buffer
+
recon_yoffset
;
xd
->
plane
[
1
].
pre
[
0
].
buf
=
first_ref_buf
->
u_buffer
+
recon_uvoffset
;
xd
->
plane
[
2
].
pre
[
0
].
buf
=
first_ref_buf
->
v_buffer
+
recon_uvoffset
;
// In accumulating a score for the older reference frame take the
// best of the motion predicted score and the intra coded error
// (just as will be done for) accumulation of "coded_error" for
// the last frame.
if
(
gf_motion_error
<
this_error
)
sr_coded_error
+=
gf_motion_error
;
else
sr_coded_error
+=
this_error
;
}
else
{
sr_coded_error
+=
motion_error
;
}
}
// Start by assuming that intra mode is best.
best_ref_mv
.
as_int
=
0
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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