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
Xiph.Org
aom-rav1e
Commits
a459e582
Commit
a459e582
authored
Aug 22, 2014
by
Dmitry Kovalev
Browse files
Replacing int_mv with MV inside the first pass code.
Change-Id: Ia3be6b5a18e1ff6cc5c5f4d37e4a5d0972388308
parent
310f5a76
Changes
2
Hide whitespace changes
Inline
Side-by-side
vp9/common/vp9_mv.h
View file @
a459e582
...
...
@@ -34,6 +34,14 @@ typedef struct mv32 {
int32_t
col
;
}
MV32
;
static
INLINE
int
is_zero_mv
(
const
MV
*
mv
)
{
return
*
((
const
uint32_t
*
)
mv
)
==
0
;
}
static
INLINE
int
is_equal_mv
(
const
MV
*
a
,
const
MV
*
b
)
{
return
*
((
const
uint32_t
*
)
a
)
==
*
((
const
uint32_t
*
)
b
);
}
static
INLINE
void
clamp_mv
(
MV
*
mv
,
int
min_col
,
int
max_col
,
int
min_row
,
int
max_row
)
{
mv
->
col
=
clamp
(
mv
->
col
,
min_col
,
max_col
);
...
...
vp9/encoder/vp9_firstpass.c
View file @
a459e582
...
...
@@ -428,7 +428,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
int
neutral_count
=
0
;
int
new_mv_count
=
0
;
int
sum_in_vectors
=
0
;
uint32_t
lastmv_as_int
=
0
;
MV
lastmv
=
{
0
,
0
}
;
TWO_PASS
*
twopass
=
&
cpi
->
twopass
;
const
MV
zero_mv
=
{
0
,
0
};
const
YV12_BUFFER_CONFIG
*
first_ref_buf
=
lst_yv12
;
...
...
@@ -512,9 +512,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
vp9_tile_init
(
&
tile
,
cm
,
0
,
0
);
for
(
mb_row
=
0
;
mb_row
<
cm
->
mb_rows
;
++
mb_row
)
{
int_mv
best_ref_mv
;
best_ref_mv
.
as_int
=
0
;
MV
best_ref_mv
=
{
0
,
0
};
// Reset above block coeffs.
xd
->
up_available
=
(
mb_row
!=
0
);
...
...
@@ -594,14 +592,13 @@ void vp9_first_pass(VP9_COMP *cpi) {
// Other than for the first frame do a motion search.
if
(
cm
->
current_video_frame
>
0
)
{
int
tmp_err
,
motion_error
,
raw_motion_error
;
int_mv
mv
,
tmp_mv
;
// Assume 0,0 motion with no mv overhead.
MV
mv
=
{
0
,
0
}
,
tmp_mv
=
{
0
,
0
};
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
;
// Compute the motion error of the 0,0 motion using the last source
// frame as the reference. Skip the further motion search on
...
...
@@ -617,8 +614,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
if
(
raw_motion_error
>
25
||
lc
!=
NULL
)
{
// 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
);
first_pass_motion_search
(
cpi
,
x
,
&
best_ref_mv
,
&
mv
,
&
motion_error
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
motion_error
=
(
int
)(
motion_error
*
error_weight
);
...
...
@@ -626,9 +622,9 @@ void vp9_first_pass(VP9_COMP *cpi) {
// 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
)
{
if
(
!
is_zero_mv
(
&
best_ref_mv
)
)
{
tmp_err
=
INT_MAX
;
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
.
as_mv
,
&
tmp_err
);
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
,
&
tmp_err
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
tmp_err
=
(
int
)(
tmp_err
*
error_weight
);
...
...
@@ -636,7 +632,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
if
(
tmp_err
<
motion_error
)
{
motion_error
=
tmp_err
;
mv
.
as_int
=
tmp_mv
.
as_int
;
mv
=
tmp_mv
;
}
}
...
...
@@ -649,7 +645,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
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
,
first_pass_motion_search
(
cpi
,
x
,
&
zero_mv
,
&
tmp_mv
,
&
gf_motion_error
);
if
(
cpi
->
oxcf
.
aq_mode
==
VARIANCE_AQ
)
{
vp9_clear_system_state
();
...
...
@@ -680,7 +676,8 @@ void vp9_first_pass(VP9_COMP *cpi) {
}
// Start by assuming that intra mode is best.
best_ref_mv
.
as_int
=
0
;
best_ref_mv
.
row
=
0
;
best_ref_mv
.
col
=
0
;
#if CONFIG_FP_MB_STATS
if
(
cpi
->
use_fp_mb_stats
)
{
...
...
@@ -704,25 +701,25 @@ void vp9_first_pass(VP9_COMP *cpi) {
this_error
<
2
*
intrapenalty
)
++
neutral_count
;
mv
.
as_
mv
.
row
*=
8
;
mv
.
as_
mv
.
col
*=
8
;
mv
.
row
*=
8
;
mv
.
col
*=
8
;
this_error
=
motion_error
;
xd
->
mi
[
0
]
->
mbmi
.
mode
=
NEWMV
;
xd
->
mi
[
0
]
->
mbmi
.
mv
[
0
]
=
mv
;
xd
->
mi
[
0
]
->
mbmi
.
mv
[
0
]
.
as_mv
=
mv
;
xd
->
mi
[
0
]
->
mbmi
.
tx_size
=
TX_4X4
;
xd
->
mi
[
0
]
->
mbmi
.
ref_frame
[
0
]
=
LAST_FRAME
;
xd
->
mi
[
0
]
->
mbmi
.
ref_frame
[
1
]
=
NONE
;
vp9_build_inter_predictors_sby
(
xd
,
mb_row
<<
1
,
mb_col
<<
1
,
bsize
);
vp9_encode_sby_pass1
(
x
,
bsize
);
sum_mvr
+=
mv
.
as_
mv
.
row
;
sum_mvr_abs
+=
abs
(
mv
.
as_mv
.
row
);
sum_mvc
+=
mv
.
as_
mv
.
col
;
sum_mvc_abs
+=
abs
(
mv
.
as_mv
.
col
);
sum_mvrs
+=
mv
.
as_mv
.
row
*
mv
.
as_
mv
.
row
;
sum_mvcs
+=
mv
.
as_mv
.
col
*
mv
.
as_
mv
.
col
;
sum_mvr
+=
mv
.
row
;
sum_mvr_abs
+=
abs
(
mv
.
row
);
sum_mvc
+=
mv
.
col
;
sum_mvc_abs
+=
abs
(
mv
.
col
);
sum_mvrs
+=
mv
.
row
*
mv
.
row
;
sum_mvcs
+=
mv
.
col
*
mv
.
col
;
++
intercount
;
best_ref_mv
.
as_int
=
mv
.
as_int
;
best_ref_mv
=
mv
;
#if CONFIG_FP_MB_STATS
if
(
cpi
->
use_fp_mb_stats
)
{
...
...
@@ -740,7 +737,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
}
#endif
if
(
mv
.
as_int
)
{
if
(
!
is_zero_mv
(
&
mv
)
)
{
++
mvcount
;
#if CONFIG_FP_MB_STATS
...
...
@@ -771,33 +768,33 @@ void vp9_first_pass(VP9_COMP *cpi) {
#endif
// Non-zero vector, was it different from the last non zero vector?
if
(
mv
.
as_int
!=
lastmv_as_int
)
if
(
!
is_equal_mv
(
&
mv
,
&
lastmv
)
)
++
new_mv_count
;
lastmv
_as_int
=
mv
.
as_int
;
lastmv
=
mv
;
// Does the row vector point inwards or outwards?
if
(
mb_row
<
cm
->
mb_rows
/
2
)
{
if
(
mv
.
as_mv
.
row
>
0
)
if
(
mv
.
row
>
0
)
--
sum_in_vectors
;
else
if
(
mv
.
as_mv
.
row
<
0
)
else
if
(
mv
.
row
<
0
)
++
sum_in_vectors
;
}
else
if
(
mb_row
>
cm
->
mb_rows
/
2
)
{
if
(
mv
.
as_mv
.
row
>
0
)
if
(
mv
.
row
>
0
)
++
sum_in_vectors
;
else
if
(
mv
.
as_mv
.
row
<
0
)
else
if
(
mv
.
row
<
0
)
--
sum_in_vectors
;
}
// Does the col vector point inwards or outwards?
if
(
mb_col
<
cm
->
mb_cols
/
2
)
{
if
(
mv
.
as_mv
.
col
>
0
)
if
(
mv
.
col
>
0
)
--
sum_in_vectors
;
else
if
(
mv
.
as_mv
.
col
<
0
)
else
if
(
mv
.
col
<
0
)
++
sum_in_vectors
;
}
else
if
(
mb_col
>
cm
->
mb_cols
/
2
)
{
if
(
mv
.
as_mv
.
col
>
0
)
if
(
mv
.
col
>
0
)
++
sum_in_vectors
;
else
if
(
mv
.
as_mv
.
col
<
0
)
else
if
(
mv
.
col
<
0
)
--
sum_in_vectors
;
}
}
...
...
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