Skip to content
GitLab
Menu
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
bb2a9abb
Commit
bb2a9abb
authored
Aug 28, 2014
by
Deb Mukherjee
Committed by
Gerrit Code Review
Aug 28, 2014
Browse files
Merge "Updates vp9_pattern search to return integer sads"
parents
c4c0b2e7
04b100b2
Changes
9
Hide whitespace changes
Inline
Side-by-side
vp9/encoder/vp9_encoder.h
View file @
bb2a9abb
...
...
@@ -523,6 +523,10 @@ static INLINE int get_chessboard_index(const int frame_index) {
return
frame_index
&
0x1
;
}
static
INLINE
int
*
cond_sad_list
(
const
struct
VP9_COMP
*
cpi
,
int
*
sad_list
)
{
return
cpi
->
sf
.
mv
.
subpel_search_method
!=
SUBPEL_TREE
?
sad_list
:
NULL
;
}
#ifdef __cplusplus
}
// extern "C"
#endif
...
...
vp9/encoder/vp9_mbgraph.c
View file @
bb2a9abb
...
...
@@ -34,6 +34,7 @@ static unsigned int do_16x16_motion_iteration(VP9_COMP *cpi,
const
int
tmp_row_min
=
x
->
mv_row_min
;
const
int
tmp_row_max
=
x
->
mv_row_max
;
MV
ref_full
;
int
sad_list
[
5
];
// Further step/diamond searches as necessary
int
step_param
=
mv_sf
->
reduce_first_step_size
;
...
...
@@ -45,8 +46,9 @@ static unsigned int do_16x16_motion_iteration(VP9_COMP *cpi,
ref_full
.
row
=
ref_mv
->
row
>>
3
;
/*cpi->sf.search_method == HEX*/
vp9_hex_search
(
x
,
&
ref_full
,
step_param
,
x
->
errorperbit
,
0
,
&
v_fn_ptr
,
0
,
ref_mv
,
dst_mv
);
vp9_hex_search
(
x
,
&
ref_full
,
step_param
,
x
->
errorperbit
,
0
,
cond_sad_list
(
cpi
,
sad_list
),
&
v_fn_ptr
,
0
,
ref_mv
,
dst_mv
);
// Try sub-pixel MC
// if (bestsme > error_thresh && bestsme < INT_MAX)
...
...
@@ -55,8 +57,10 @@ static unsigned int do_16x16_motion_iteration(VP9_COMP *cpi,
unsigned
int
sse
;
cpi
->
find_fractional_mv_step
(
x
,
dst_mv
,
ref_mv
,
cpi
->
common
.
allow_high_precision_mv
,
x
->
errorperbit
,
&
v_fn_ptr
,
0
,
mv_sf
->
subpel_iters_per_step
,
NULL
,
NULL
,
&
distortion
,
&
sse
,
NULL
,
0
,
0
);
&
v_fn_ptr
,
0
,
mv_sf
->
subpel_iters_per_step
,
cond_sad_list
(
cpi
,
sad_list
),
NULL
,
NULL
,
&
distortion
,
&
sse
,
NULL
,
0
,
0
);
}
xd
->
mi
[
0
]
->
mbmi
.
mode
=
NEWMV
;
...
...
vp9/encoder/vp9_mcomp.c
View file @
bb2a9abb
...
...
@@ -256,6 +256,137 @@ static INLINE const uint8_t *pre(const uint8_t *buf, int stride, int r, int c) {
} \
}
#define SETUP_SUBPEL_SEARCH \
const uint8_t *const z = x->plane[0].src.buf; \
const int src_stride = x->plane[0].src.stride; \
const MACROBLOCKD *xd = &x->e_mbd; \
unsigned int besterr = INT_MAX; \
unsigned int sse; \
unsigned int whichdir; \
int thismse; \
const unsigned int halfiters = iters_per_step; \
const unsigned int quarteriters = iters_per_step; \
const unsigned int eighthiters = iters_per_step; \
const int y_stride = xd->plane[0].pre[0].stride; \
const int offset = bestmv->row * y_stride + bestmv->col; \
const uint8_t *const y = xd->plane[0].pre[0].buf; \
\
int rr = ref_mv->row; \
int rc = ref_mv->col; \
int br = bestmv->row * 8; \
int bc = bestmv->col * 8; \
int hstep = 4; \
const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX); \
const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX); \
const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX); \
const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX); \
int tr = br; \
int tc = bc; \
\
bestmv->row *= 8; \
bestmv->col *= 8; \
if (second_pred != NULL) { \
DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64); \
vp9_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride); \
besterr = vfp->vf(comp_pred, w, z, src_stride, sse1); \
} else { \
besterr = vfp->vf(y + offset, y_stride, z, src_stride, sse1); \
} \
*distortion = besterr; \
besterr += mv_err_cost(bestmv, ref_mv, mvjcost, mvcost, error_per_bit);
int
vp9_find_best_sub_pixel_tree_pruned
(
const
MACROBLOCK
*
x
,
MV
*
bestmv
,
const
MV
*
ref_mv
,
int
allow_hp
,
int
error_per_bit
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
forced_stop
,
int
iters_per_step
,
int
*
sad_list
,
int
*
mvjcost
,
int
*
mvcost
[
2
],
int
*
distortion
,
unsigned
int
*
sse1
,
const
uint8_t
*
second_pred
,
int
w
,
int
h
)
{
SETUP_SUBPEL_SEARCH
;
if
(
sad_list
&&
sad_list
[
0
]
!=
INT_MAX
&&
sad_list
[
1
]
!=
INT_MAX
&&
sad_list
[
2
]
!=
INT_MAX
&&
sad_list
[
3
]
!=
INT_MAX
&&
sad_list
[
4
]
!=
INT_MAX
)
{
unsigned
int
left
,
right
,
up
,
down
,
diag
;
whichdir
=
(
sad_list
[
1
]
<
sad_list
[
3
]
?
0
:
1
)
+
(
sad_list
[
2
]
<
sad_list
[
4
]
?
0
:
2
);
switch
(
whichdir
)
{
case
0
:
CHECK_BETTER
(
left
,
tr
,
tc
-
hstep
);
CHECK_BETTER
(
up
,
tr
-
hstep
,
tc
);
CHECK_BETTER
(
diag
,
tr
-
hstep
,
tc
-
hstep
);
break
;
case
1
:
CHECK_BETTER
(
right
,
tr
,
tc
+
hstep
);
CHECK_BETTER
(
up
,
tr
-
hstep
,
tc
);
CHECK_BETTER
(
diag
,
tr
-
hstep
,
tc
+
hstep
);
break
;
case
2
:
CHECK_BETTER
(
left
,
tr
,
tc
-
hstep
);
CHECK_BETTER
(
down
,
tr
+
hstep
,
tc
);
CHECK_BETTER
(
diag
,
tr
+
hstep
,
tc
-
hstep
);
break
;
case
3
:
CHECK_BETTER
(
right
,
tr
,
tc
+
hstep
);
CHECK_BETTER
(
down
,
tr
+
hstep
,
tc
);
CHECK_BETTER
(
diag
,
tr
+
hstep
,
tc
+
hstep
);
break
;
}
}
else
{
FIRST_LEVEL_CHECKS
;
if
(
halfiters
>
1
)
{
SECOND_LEVEL_CHECKS
;
}
}
tr
=
br
;
tc
=
bc
;
// Each subsequent iteration checks at least one point in common with
// the last iteration could be 2 ( if diag selected) 1/4 pel
// Note forced_stop: 0 - full, 1 - qtr only, 2 - half only
if
(
forced_stop
!=
2
)
{
hstep
>>=
1
;
FIRST_LEVEL_CHECKS
;
if
(
quarteriters
>
1
)
{
SECOND_LEVEL_CHECKS
;
}
tr
=
br
;
tc
=
bc
;
}
if
(
allow_hp
&&
vp9_use_mv_hp
(
ref_mv
)
&&
forced_stop
==
0
)
{
hstep
>>=
1
;
FIRST_LEVEL_CHECKS
;
if
(
eighthiters
>
1
)
{
SECOND_LEVEL_CHECKS
;
}
tr
=
br
;
tc
=
bc
;
}
// These lines insure static analysis doesn't warn that
// tr and tc aren't used after the above point.
(
void
)
tr
;
(
void
)
tc
;
bestmv
->
row
=
br
;
bestmv
->
col
=
bc
;
if
((
abs
(
bestmv
->
col
-
ref_mv
->
col
)
>
(
MAX_FULL_PEL_VAL
<<
3
))
||
(
abs
(
bestmv
->
row
-
ref_mv
->
row
)
>
(
MAX_FULL_PEL_VAL
<<
3
)))
return
INT_MAX
;
return
besterr
;
}
int
vp9_find_best_sub_pixel_tree
(
const
MACROBLOCK
*
x
,
MV
*
bestmv
,
const
MV
*
ref_mv
,
int
allow_hp
,
...
...
@@ -263,55 +394,14 @@ int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
forced_stop
,
int
iters_per_step
,
int
*
sad_list
,
int
*
mvjcost
,
int
*
mvcost
[
2
],
int
*
distortion
,
unsigned
int
*
sse1
,
const
uint8_t
*
second_pred
,
int
w
,
int
h
)
{
const
uint8_t
*
const
z
=
x
->
plane
[
0
].
src
.
buf
;
const
int
src_stride
=
x
->
plane
[
0
].
src
.
stride
;
const
MACROBLOCKD
*
xd
=
&
x
->
e_mbd
;
unsigned
int
besterr
=
INT_MAX
;
unsigned
int
sse
;
unsigned
int
whichdir
;
int
thismse
;
const
unsigned
int
halfiters
=
iters_per_step
;
const
unsigned
int
quarteriters
=
iters_per_step
;
const
unsigned
int
eighthiters
=
iters_per_step
;
const
int
y_stride
=
xd
->
plane
[
0
].
pre
[
0
].
stride
;
const
int
offset
=
bestmv
->
row
*
y_stride
+
bestmv
->
col
;
const
uint8_t
*
const
y
=
xd
->
plane
[
0
].
pre
[
0
].
buf
;
int
rr
=
ref_mv
->
row
;
int
rc
=
ref_mv
->
col
;
int
br
=
bestmv
->
row
*
8
;
int
bc
=
bestmv
->
col
*
8
;
int
hstep
=
4
;
const
int
minc
=
MAX
(
x
->
mv_col_min
*
8
,
ref_mv
->
col
-
MV_MAX
);
const
int
maxc
=
MIN
(
x
->
mv_col_max
*
8
,
ref_mv
->
col
+
MV_MAX
);
const
int
minr
=
MAX
(
x
->
mv_row_min
*
8
,
ref_mv
->
row
-
MV_MAX
);
const
int
maxr
=
MIN
(
x
->
mv_row_max
*
8
,
ref_mv
->
row
+
MV_MAX
);
int
tr
=
br
;
int
tc
=
bc
;
// central mv
bestmv
->
row
*=
8
;
bestmv
->
col
*=
8
;
// calculate central point error
// TODO(yunqingwang): central pointer error was already calculated in full-
// pixel search, and can be passed in this function.
if
(
second_pred
!=
NULL
)
{
DECLARE_ALIGNED_ARRAY
(
16
,
uint8_t
,
comp_pred
,
64
*
64
);
vp9_comp_avg_pred
(
comp_pred
,
second_pred
,
w
,
h
,
y
+
offset
,
y_stride
);
besterr
=
vfp
->
vf
(
comp_pred
,
w
,
z
,
src_stride
,
sse1
);
}
else
{
besterr
=
vfp
->
vf
(
y
+
offset
,
y_stride
,
z
,
src_stride
,
sse1
);
}
*
distortion
=
besterr
;
besterr
+=
mv_err_cost
(
bestmv
,
ref_mv
,
mvjcost
,
mvcost
,
error_per_bit
);
SETUP_SUBPEL_SEARCH
;
(
void
)
sad_list
;
// to silence compiler warning
// Each subsequent iteration checks at least one point in
// common with the last iteration could be 2 ( if diag selected)
...
...
@@ -398,14 +488,17 @@ static INLINE int is_mv_in(const MACROBLOCK *x, const MV *mv) {
// Each scale can have a different number of candidates and shape of
// candidates as indicated in the num_candidates and candidates arrays
// passed into this function
//
static
int
vp9_pattern_search
(
const
MACROBLOCK
*
x
,
MV
*
ref_mv
,
int
search_param
,
int
sad_per_bit
,
int
do_init_search
,
int
do_refine
,
int
do_init_search
,
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
use_mvcost
,
const
MV
*
center_mv
,
MV
*
best_mv
,
const
MV
*
center_mv
,
MV
*
best_mv
,
const
int
num_candidates
[
MAX_PATTERN_SCALES
],
const
MV
candidates
[
MAX_PATTERN_SCALES
]
[
MAX_PATTERN_CANDIDATES
])
{
...
...
@@ -413,7 +506,7 @@ static int vp9_pattern_search(const MACROBLOCK *x,
static
const
int
search_param_to_steps
[
MAX_MVSEARCH_STEPS
]
=
{
10
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
,
};
int
i
,
j
,
s
,
t
;
int
i
,
s
,
t
;
const
struct
buf_2d
*
const
what
=
&
x
->
plane
[
0
].
src
;
const
struct
buf_2d
*
const
in_what
=
&
xd
->
plane
[
0
].
pre
[
0
];
int
br
,
bc
;
...
...
@@ -552,47 +645,38 @@ static int vp9_pattern_search(const MACROBLOCK *x,
}
while
(
s
--
);
}
// Check 4 1-away neighbors if do_refine is true.
// For most well-designed schemes do_refine will not be necessary.
if
(
do_refine
)
{
static
const
MV
neighbors
[
4
]
=
{{
0
,
-
1
},
{
-
1
,
0
},
{
1
,
0
},
{
0
,
1
}};
for
(
j
=
0
;
j
<
16
;
j
++
)
{
int
best_site
=
-
1
;
if
(
check_bounds
(
x
,
br
,
bc
,
1
))
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
MV
this_mv
=
{
br
+
neighbors
[
i
].
row
,
bc
+
neighbors
[
i
].
col
};
thissad
=
vfp
->
sdf
(
what
->
buf
,
what
->
stride
,
get_buf_from_mv
(
in_what
,
&
this_mv
),
in_what
->
stride
);
CHECK_BETTER
}
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
MV
this_mv
=
{
br
+
neighbors
[
i
].
row
,
bc
+
neighbors
[
i
].
col
};
if
(
!
is_mv_in
(
x
,
&
this_mv
))
continue
;
thissad
=
vfp
->
sdf
(
what
->
buf
,
what
->
stride
,
get_buf_from_mv
(
in_what
,
&
this_mv
),
in_what
->
stride
);
CHECK_BETTER
}
// Returns the one-away integer pel sad values around the best as follows:
// sad_list[0]: sad at the best integer pel
// sad_list[1]: sad at delta {0, -1} (left) from the best integer pel
// sad_list[2]: sad at delta {-1, 0} (top) from the best integer pel
// sad_list[3]: sad at delta { 0, 1} (right) from the best integer pel
// sad_list[4]: sad at delta { 1, 0} (bottom) from the best integer pel
if
(
sad_list
)
{
static
const
MV
neighbors
[
4
]
=
{{
0
,
-
1
},
{
-
1
,
0
},
{
0
,
1
},
{
1
,
0
}};
sad_list
[
0
]
=
bestsad
;
if
(
check_bounds
(
x
,
br
,
bc
,
1
))
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
MV
this_mv
=
{
br
+
neighbors
[
i
].
row
,
bc
+
neighbors
[
i
].
col
};
sad_list
[
i
+
1
]
=
vfp
->
sdf
(
what
->
buf
,
what
->
stride
,
get_buf_from_mv
(
in_what
,
&
this_mv
),
in_what
->
stride
);
}
if
(
best_site
==
-
1
)
{
break
;
}
else
{
br
+=
neighbors
[
best_site
].
row
;
bc
+=
neighbors
[
best_site
].
col
;
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
const
MV
this_mv
=
{
br
+
neighbors
[
i
].
row
,
bc
+
neighbors
[
i
].
col
};
if
(
!
is_mv_in
(
x
,
&
this_mv
))
sad_list
[
i
+
1
]
=
INT_MAX
;
else
sad_list
[
i
+
1
]
=
vfp
->
sdf
(
what
->
buf
,
what
->
stride
,
get_buf_from_mv
(
in_what
,
&
this_mv
),
in_what
->
stride
);
}
}
}
best_mv
->
row
=
br
;
best_mv
->
col
=
bc
;
return
bestsad
;
}
...
...
@@ -634,6 +718,7 @@ int vp9_hex_search(const MACROBLOCK *x,
int
search_param
,
int
sad_per_bit
,
int
do_init_search
,
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
use_mvcost
,
const
MV
*
center_mv
,
MV
*
best_mv
)
{
...
...
@@ -658,7 +743,7 @@ int vp9_hex_search(const MACROBLOCK *x,
{
-
1024
,
0
}},
};
return
vp9_pattern_search
(
x
,
ref_mv
,
search_param
,
sad_per_bit
,
do_init_search
,
0
,
vfp
,
use_mvcost
,
do_init_search
,
sad_list
,
vfp
,
use_mvcost
,
center_mv
,
best_mv
,
hex_num_candidates
,
hex_candidates
);
}
...
...
@@ -668,6 +753,7 @@ int vp9_bigdia_search(const MACROBLOCK *x,
int
search_param
,
int
sad_per_bit
,
int
do_init_search
,
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
use_mvcost
,
const
MV
*
center_mv
,
...
...
@@ -699,7 +785,7 @@ int vp9_bigdia_search(const MACROBLOCK *x,
{
-
512
,
512
},
{
-
1024
,
0
}},
};
return
vp9_pattern_search
(
x
,
ref_mv
,
search_param
,
sad_per_bit
,
do_init_search
,
0
,
vfp
,
use_mvcost
,
do_init_search
,
sad_list
,
vfp
,
use_mvcost
,
center_mv
,
best_mv
,
bigdia_num_candidates
,
bigdia_candidates
);
}
...
...
@@ -709,6 +795,7 @@ int vp9_square_search(const MACROBLOCK *x,
int
search_param
,
int
sad_per_bit
,
int
do_init_search
,
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
use_mvcost
,
const
MV
*
center_mv
,
...
...
@@ -740,7 +827,7 @@ int vp9_square_search(const MACROBLOCK *x,
{
0
,
1024
},
{
-
1024
,
1024
},
{
-
1024
,
0
}},
};
return
vp9_pattern_search
(
x
,
ref_mv
,
search_param
,
sad_per_bit
,
do_init_search
,
0
,
vfp
,
use_mvcost
,
do_init_search
,
sad_list
,
vfp
,
use_mvcost
,
center_mv
,
best_mv
,
square_num_candidates
,
square_candidates
);
}
...
...
@@ -750,12 +837,13 @@ int vp9_fast_hex_search(const MACROBLOCK *x,
int
search_param
,
int
sad_per_bit
,
int
do_init_search
,
// must be zero for fast_hex
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
use_mvcost
,
const
MV
*
center_mv
,
MV
*
best_mv
)
{
return
vp9_hex_search
(
x
,
ref_mv
,
MAX
(
MAX_MVSEARCH_STEPS
-
2
,
search_param
),
sad_per_bit
,
do_init_search
,
vfp
,
use_mvcost
,
sad_per_bit
,
do_init_search
,
sad_list
,
vfp
,
use_mvcost
,
center_mv
,
best_mv
);
}
...
...
@@ -764,13 +852,14 @@ int vp9_fast_dia_search(const MACROBLOCK *x,
int
search_param
,
int
sad_per_bit
,
int
do_init_search
,
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vfp
,
int
use_mvcost
,
const
MV
*
center_mv
,
MV
*
best_mv
)
{
return
vp9_bigdia_search
(
x
,
ref_mv
,
MAX
(
MAX_MVSEARCH_STEPS
-
2
,
search_param
),
sad_per_bit
,
do_init_search
,
vfp
,
use_mvcost
,
center_mv
,
best_mv
);
sad_per_bit
,
do_init_search
,
sad_list
,
vfp
,
use_mvcost
,
center_mv
,
best_mv
);
}
#undef CHECK_BETTER
...
...
@@ -1368,33 +1457,41 @@ int vp9_refining_search_8p_c(const MACROBLOCK *x,
int
vp9_full_pixel_search
(
VP9_COMP
*
cpi
,
MACROBLOCK
*
x
,
BLOCK_SIZE
bsize
,
MV
*
mvp_full
,
int
step_param
,
int
error_per_bit
,
int
*
sad_list
,
const
MV
*
ref_mv
,
MV
*
tmp_mv
,
int
var_max
,
int
rd
)
{
const
SPEED_FEATURES
*
const
sf
=
&
cpi
->
sf
;
const
SEARCH_METHODS
method
=
sf
->
mv
.
search_method
;
vp9_variance_fn_ptr_t
*
fn_ptr
=
&
cpi
->
fn_ptr
[
bsize
];
int
var
=
0
;
if
(
sad_list
)
{
sad_list
[
0
]
=
INT_MAX
;
sad_list
[
1
]
=
INT_MAX
;
sad_list
[
2
]
=
INT_MAX
;
sad_list
[
3
]
=
INT_MAX
;
sad_list
[
4
]
=
INT_MAX
;
}
switch
(
method
)
{
case
FAST_DIAMOND
:
var
=
vp9_fast_dia_search
(
x
,
mvp_full
,
step_param
,
error_per_bit
,
0
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
sad_list
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
break
;
case
FAST_HEX
:
var
=
vp9_fast_hex_search
(
x
,
mvp_full
,
step_param
,
error_per_bit
,
0
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
sad_list
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
break
;
case
HEX
:
var
=
vp9_hex_search
(
x
,
mvp_full
,
step_param
,
error_per_bit
,
1
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
sad_list
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
break
;
case
SQUARE
:
var
=
vp9_square_search
(
x
,
mvp_full
,
step_param
,
error_per_bit
,
1
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
sad_list
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
break
;
case
BIGDIA
:
var
=
vp9_bigdia_search
(
x
,
mvp_full
,
step_param
,
error_per_bit
,
1
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
sad_list
,
fn_ptr
,
1
,
ref_mv
,
tmp_mv
);
break
;
case
NSTEP
:
var
=
vp9_full_pixel_diamond
(
cpi
,
x
,
mvp_full
,
step_param
,
error_per_bit
,
...
...
vp9/encoder/vp9_mcomp.h
View file @
bb2a9abb
...
...
@@ -79,6 +79,7 @@ typedef int (integer_mv_pattern_search_fn) (
int
search_param
,
int
error_per_bit
,
int
do_init_search
,
int
*
sad_list
,
const
vp9_variance_fn_ptr_t
*
vf
,
int
use_mvcost
,
const
MV
*
center_mv
,
...
...
@@ -98,12 +99,14 @@ typedef int (fractional_mv_step_fp) (
const
vp9_variance_fn_ptr_t
*
vfp
,
int
forced_stop
,
// 0 - full, 1 - qtr only, 2 - half only
int
iters_per_step
,
int
*
sad_list
,
int
*
mvjcost
,
int
*
mvcost
[
2
],
int
*
distortion
,
unsigned
int
*
sse1
,
const
uint8_t
*
second_pred
,
int
w
,
int
h
);
extern
fractional_mv_step_fp
vp9_find_best_sub_pixel_tree
;
extern
fractional_mv_step_fp
vp9_find_best_sub_pixel_tree_pruned
;
typedef
int
(
*
vp9_full_search_fn_t
)(
const
MACROBLOCK
*
x
,
const
MV
*
ref_mv
,
int
sad_per_bit
,
...
...
@@ -136,8 +139,10 @@ struct VP9_COMP;
int
vp9_full_pixel_search
(
struct
VP9_COMP
*
cpi
,
MACROBLOCK
*
x
,
BLOCK_SIZE
bsize
,
MV
*
mvp_full
,
int
step_param
,
int
error_per_bit
,
int
*
sad_list
,
const
MV
*
ref_mv
,
MV
*
tmp_mv
,
int
var_max
,
int
rd
);
#ifdef __cplusplus
}
// extern "C"
#endif
...
...
vp9/encoder/vp9_pickmode.c
View file @
bb2a9abb
...
...
@@ -126,6 +126,7 @@ static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
const
int
tmp_row_min
=
x
->
mv_row_min
;
const
int
tmp_row_max
=
x
->
mv_row_max
;
int
rv
=
0
;
int
sad_list
[
5
];
const
YV12_BUFFER_CONFIG
*
scaled_ref_frame
=
vp9_get_scaled_ref_frame
(
cpi
,
ref
);
if
(
cpi
->
common
.
show_frame
&&
...
...
@@ -152,8 +153,9 @@ static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
mvp_full
.
col
>>=
3
;
mvp_full
.
row
>>=
3
;
vp9_full_pixel_search
(
cpi
,
x
,
bsize
,
&
mvp_full
,
step_param
,
sadpb
,
&
ref_mv
,
&
tmp_mv
->
as_mv
,
INT_MAX
,
0
);
vp9_full_pixel_search
(
cpi
,
x
,
bsize
,
&
mvp_full
,
step_param
,
sadpb
,
cond_sad_list
(
cpi
,
sad_list
),
&
ref_mv
,
&
tmp_mv
->
as_mv
,
INT_MAX
,
0
);
x
->
mv_col_min
=
tmp_col_min
;
x
->
mv_col_max
=
tmp_col_max
;
...
...
@@ -179,6 +181,7 @@ static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
&
cpi
->
fn_ptr
[
bsize
],
cpi
->
sf
.
mv
.
subpel_force_stop
,
cpi
->
sf
.
mv
.
subpel_iters_per_step
,
cond_sad_list
(
cpi
,
sad_list
),
x
->
nmvjointcost
,
x
->
mvcost
,
&
dis
,
&
x
->
pred_sse
[
ref
],
NULL
,
0
,
0
);
x
->
pred_mv
[
ref
]
=
tmp_mv
->
as_mv
;
...
...
vp9/encoder/vp9_rdopt.c
View file @
bb2a9abb
...
...
@@ -1378,6 +1378,7 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x,
int
sadpb
=
x
->
sadperbit4
;
MV
mvp_full
;
int
max_mv
;
int
sad_list
[
5
];
/* Is the best so far sufficiently good that we cant justify doing
* and new motion search. */
...
...
@@ -1421,9 +1422,11 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x,
vp9_set_mv_search_range
(
x
,
&
bsi
->
ref_mv
[
0
]
->
as_mv
);
bestsme
=
vp9_full_pixel_search
(
cpi
,
x
,
bsize
,
&
mvp_full
,
step_param
,
sadpb
,
&
bsi
->
ref_mv
[
0
]
->
as_mv
,
new_mv
,
INT_MAX
,
1
);
bestsme
=
vp9_full_pixel_search
(
cpi
,
x
,
bsize
,
&
mvp_full
,
step_param
,
sadpb
,
cpi
->
sf
.
mv
.
subpel_search_method
!=
SUBPEL_TREE
?
sad_list
:
NULL
,
&
bsi
->
ref_mv
[
0
]
->
as_mv
,
new_mv
,
INT_MAX
,
1
);
// Should we do a full search (best quality only)
if
(
cpi
->
oxcf
.
mode
==
BEST
)
{
...
...
@@ -1435,6 +1438,7 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x,
sadpb
,
16
,
&
cpi
->
fn_ptr
[
bsize
],
&
bsi
->
ref_mv
[
0
]
->
as_mv
,
&
best_mv
->
as_mv
);
sad_list
[
1
]
=
sad_list
[
2
]
=
sad_list
[
3
]
=
sad_list
[
4
]
=
INT_MAX
;
if
(
thissme
<
bestsme
)
{
bestsme
=
thissme
;
*
new_mv
=
best_mv
->
as_mv
;
...
...
@@ -1447,17 +1451,19 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x,
if
(
bestsme
<
INT_MAX
)
{
int
distortion
;
cpi
->
find_fractional_mv_step
(
x
,
new_mv
,
&
bsi
->
ref_mv
[
0
]
->
as_mv
,
cm
->
allow_high_precision_mv
,
x
->
errorperbit
,
&
cpi
->
fn_ptr
[
bsize
],
cpi
->
sf
.
mv
.
subpel_force_stop
,
cpi
->
sf
.
mv
.
subpel_iters_per_step
,
x
->
nmvjointcost
,
x
->
mvcost
,
&
distortion
,
&
x
->
pred_sse
[
mbmi
->
ref_frame
[
0
]],
NULL
,
0
,
0
);
cpi
->
find_fractional_mv_step
(
x
,
new_mv
,
&
bsi
->
ref_mv
[
0
]
->
as_mv
,
cm
->
allow_high_precision_mv
,
x
->
errorperbit
,
&
cpi
->
fn_ptr
[
bsize
],
cpi
->
sf
.
mv
.
subpel_force_stop
,
cpi
->
sf
.
mv
.
subpel_iters_per_step
,
cond_sad_list
(
cpi
,
sad_list
),
x
->
nmvjointcost
,
x
->
mvcost
,
&
distortion
,
&
x
->
pred_sse
[
mbmi
->
ref_frame
[
0
]],
NULL
,
0
,
0
);
// save motion search result for use in compound prediction
seg_mvs
[
i
][
mbmi
->
ref_frame
[
0
]].
as_mv
=
*
new_mv
;
...
...
@@ -1785,6 +1791,7 @@ static void single_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
int
tmp_col_max
=
x
->
mv_col_max
;
int
tmp_row_min
=
x
->
mv_row_min
;
int
tmp_row_max
=
x
->
mv_row_max
;
int
sad_list
[
5
];
const
YV12_BUFFER_CONFIG
*
scaled_ref_frame
=
vp9_get_scaled_ref_frame
(
cpi
,
ref
);
...
...
@@ -1857,6 +1864,7 @@ static void single_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
mvp_full
.
row
>>=
3
;
bestsme
=
vp9_full_pixel_search
(
cpi
,
x
,
bsize
,
&
mvp_full
,
step_param
,
sadpb
,
cond_sad_list
(
cpi
,
sad_list
),
&
ref_mv
,
&
tmp_mv
->
as_mv
,
INT_MAX
,
1
);