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
0a6d5547
Commit
0a6d5547
authored
Mar 28, 2014
by
Dmitry Kovalev
Browse files
Adding vp9_speed_features.{h, c}.
Change-Id: I7d9874da8ff78a2d7e0cf11073af9c30538bc9a6
parent
2b58730a
Changes
5
Hide whitespace changes
Inline
Side-by-side
vp9/encoder/vp9_onyx_if.c
View file @
0a6d5547
...
...
@@ -44,12 +44,6 @@
#include
"vp9/encoder/vp9_resize.h"
#include
"vp9/encoder/vp9_svc_layercontext.h"
#define ALL_INTRA_MODES 0x3FF
#define INTRA_DC_ONLY 0x01
#define INTRA_DC_TM ((1 << TM_PRED) | (1 << DC_PRED))
#define INTRA_DC_H_V ((1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED))
#define INTRA_DC_TM_H_V (INTRA_DC_TM | (1 << V_PRED) | (1 << H_PRED))
void
vp9_coef_tree_initialize
();
#define DEFAULT_INTERP_FILTER SWITCHABLE
...
...
@@ -63,12 +57,6 @@ void vp9_coef_tree_initialize();
// now so that HIGH_PRECISION is always
// chosen.
// Masks for partially or completely disabling split mode
#define DISABLE_ALL_SPLIT 0x3F
#define DISABLE_ALL_INTER_SPLIT 0x1F
#define DISABLE_COMPOUND_SPLIT 0x18
#define LAST_AND_INTRA_SPLIT_ONLY 0x1E
// Max rate target for 1080P and below encodes under normal circumstances
// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
#define MAX_MB_RATE 250
...
...
@@ -547,377 +535,23 @@ static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
cpi
->
rd_thresh_mult_sub8x8
[
THR_COMP_GA
]
=
INT_MAX
;
}
// Intra only frames, golden frames (except alt ref overlays) and
// alt ref frames tend to be coded at a higher than ambient quality
static
INLINE
int
frame_is_boosted
(
const
VP9_COMP
*
cpi
)
{
return
frame_is_intra_only
(
&
cpi
->
common
)
||
cpi
->
refresh_alt_ref_frame
||
(
cpi
->
refresh_golden_frame
&&
!
cpi
->
rc
.
is_src_frame_alt_ref
);
}
static
void
set_good_speed_feature
(
VP9_COMP
*
cpi
,
VP9_COMMON
*
cm
,
SPEED_FEATURES
*
sf
,
int
speed
)
{
int
i
;
sf
->
adaptive_rd_thresh
=
1
;
sf
->
recode_loop
=
((
speed
<
1
)
?
ALLOW_RECODE
:
ALLOW_RECODE_KFMAXBW
);
sf
->
allow_skip_recode
=
1
;
if
(
speed
>=
1
)
{
sf
->
use_square_partition_only
=
!
frame_is_intra_only
(
cm
);
sf
->
less_rectangular_check
=
1
;
sf
->
tx_size_search_method
=
frame_is_boosted
(
cpi
)
?
USE_FULL_RD
:
USE_LARGESTALL
;
if
(
MIN
(
cm
->
width
,
cm
->
height
)
>=
720
)
sf
->
disable_split_mask
=
cm
->
show_frame
?
DISABLE_ALL_SPLIT
:
DISABLE_ALL_INTER_SPLIT
;
else
sf
->
disable_split_mask
=
DISABLE_COMPOUND_SPLIT
;
sf
->
use_rd_breakout
=
1
;
sf
->
adaptive_motion_search
=
1
;
sf
->
auto_mv_step_size
=
1
;
sf
->
adaptive_rd_thresh
=
2
;
sf
->
subpel_iters_per_step
=
1
;
sf
->
mode_skip_start
=
10
;
sf
->
adaptive_pred_interp_filter
=
1
;
sf
->
recode_loop
=
ALLOW_RECODE_KFARFGF
;
sf
->
intra_y_mode_mask
[
TX_32X32
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
TX_32X32
]
=
INTRA_DC_H_V
;
sf
->
intra_y_mode_mask
[
TX_16X16
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
TX_16X16
]
=
INTRA_DC_H_V
;
}
// Additions or changes from speed 1 for speed >= 2.
if
(
speed
>=
2
)
{
sf
->
tx_size_search_method
=
frame_is_boosted
(
cpi
)
?
USE_FULL_RD
:
USE_LARGESTALL
;
if
(
MIN
(
cm
->
width
,
cm
->
height
)
>=
720
)
sf
->
disable_split_mask
=
cm
->
show_frame
?
DISABLE_ALL_SPLIT
:
DISABLE_ALL_INTER_SPLIT
;
else
sf
->
disable_split_mask
=
LAST_AND_INTRA_SPLIT_ONLY
;
sf
->
adaptive_pred_interp_filter
=
2
;
sf
->
reference_masking
=
1
;
sf
->
mode_search_skip_flags
=
FLAG_SKIP_INTRA_DIRMISMATCH
|
FLAG_SKIP_INTRA_BESTINTER
|
FLAG_SKIP_COMP_BESTINTRA
|
FLAG_SKIP_INTRA_LOWVAR
;
sf
->
disable_filter_search_var_thresh
=
100
;
sf
->
comp_inter_joint_search_thresh
=
BLOCK_SIZES
;
sf
->
auto_min_max_partition_size
=
RELAXED_NEIGHBORING_MIN_MAX
;
sf
->
use_lastframe_partitioning
=
LAST_FRAME_PARTITION_LOW_MOTION
;
sf
->
adjust_partitioning_from_last_frame
=
1
;
sf
->
last_partitioning_redo_frequency
=
3
;
}
// Additions or changes for speed 3 and above
if
(
speed
>=
3
)
{
if
(
MIN
(
cm
->
width
,
cm
->
height
)
>=
720
)
sf
->
disable_split_mask
=
DISABLE_ALL_SPLIT
;
else
sf
->
disable_split_mask
=
DISABLE_ALL_INTER_SPLIT
;
sf
->
recode_loop
=
ALLOW_RECODE_KFMAXBW
;
sf
->
adaptive_rd_thresh
=
3
;
sf
->
mode_skip_start
=
6
;
sf
->
use_fast_coef_updates
=
2
;
sf
->
use_fast_coef_costing
=
1
;
}
// Additions or changes for speed 3 and above
if
(
speed
>=
4
)
{
sf
->
use_square_partition_only
=
1
;
sf
->
tx_size_search_method
=
USE_LARGESTALL
;
sf
->
disable_split_mask
=
DISABLE_ALL_SPLIT
;
sf
->
adaptive_rd_thresh
=
4
;
// Add a couple more skip flags
sf
->
mode_search_skip_flags
|=
FLAG_SKIP_COMP_REFMISMATCH
|
FLAG_EARLY_TERMINATE
;
sf
->
disable_filter_search_var_thresh
=
200
;
sf
->
use_lastframe_partitioning
=
LAST_FRAME_PARTITION_ALL
;
sf
->
use_lp32x32fdct
=
1
;
}
if
(
speed
>=
5
)
{
sf
->
partition_search_type
=
FIXED_PARTITION
;
sf
->
optimize_coefficients
=
0
;
sf
->
search_method
=
HEX
;
sf
->
disable_filter_search_var_thresh
=
500
;
for
(
i
=
0
;
i
<
TX_SIZES
;
i
++
)
{
sf
->
intra_y_mode_mask
[
i
]
=
INTRA_DC_ONLY
;
sf
->
intra_uv_mode_mask
[
i
]
=
INTRA_DC_ONLY
;
}
cpi
->
allow_encode_breakout
=
ENCODE_BREAKOUT_ENABLED
;
}
}
static
void
set_rt_speed_feature
(
VP9_COMMON
*
cm
,
SPEED_FEATURES
*
sf
,
int
speed
)
{
sf
->
static_segmentation
=
0
;
sf
->
adaptive_rd_thresh
=
1
;
sf
->
encode_breakout_thresh
=
1
;
sf
->
use_fast_coef_costing
=
1
;
if
(
speed
==
1
)
{
sf
->
use_square_partition_only
=
!
frame_is_intra_only
(
cm
);
sf
->
less_rectangular_check
=
1
;
sf
->
tx_size_search_method
=
frame_is_intra_only
(
cm
)
?
USE_FULL_RD
:
USE_LARGESTALL
;
if
(
MIN
(
cm
->
width
,
cm
->
height
)
>=
720
)
sf
->
disable_split_mask
=
cm
->
show_frame
?
DISABLE_ALL_SPLIT
:
DISABLE_ALL_INTER_SPLIT
;
else
sf
->
disable_split_mask
=
DISABLE_COMPOUND_SPLIT
;
sf
->
use_rd_breakout
=
1
;
sf
->
adaptive_motion_search
=
1
;
sf
->
adaptive_pred_interp_filter
=
1
;
sf
->
auto_mv_step_size
=
1
;
sf
->
adaptive_rd_thresh
=
2
;
sf
->
intra_y_mode_mask
[
TX_32X32
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
TX_32X32
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
TX_16X16
]
=
INTRA_DC_H_V
;
sf
->
encode_breakout_thresh
=
8
;
}
if
(
speed
>=
2
)
{
sf
->
use_square_partition_only
=
!
frame_is_intra_only
(
cm
);
sf
->
less_rectangular_check
=
1
;
sf
->
tx_size_search_method
=
frame_is_intra_only
(
cm
)
?
USE_FULL_RD
:
USE_LARGESTALL
;
if
(
MIN
(
cm
->
width
,
cm
->
height
)
>=
720
)
sf
->
disable_split_mask
=
cm
->
show_frame
?
DISABLE_ALL_SPLIT
:
DISABLE_ALL_INTER_SPLIT
;
else
sf
->
disable_split_mask
=
LAST_AND_INTRA_SPLIT_ONLY
;
sf
->
mode_search_skip_flags
=
FLAG_SKIP_INTRA_DIRMISMATCH
|
FLAG_SKIP_INTRA_BESTINTER
|
FLAG_SKIP_COMP_BESTINTRA
|
FLAG_SKIP_INTRA_LOWVAR
;
sf
->
use_rd_breakout
=
1
;
sf
->
adaptive_motion_search
=
1
;
sf
->
adaptive_pred_interp_filter
=
2
;
sf
->
auto_mv_step_size
=
1
;
sf
->
reference_masking
=
1
;
sf
->
disable_filter_search_var_thresh
=
50
;
sf
->
comp_inter_joint_search_thresh
=
BLOCK_SIZES
;
sf
->
auto_min_max_partition_size
=
RELAXED_NEIGHBORING_MIN_MAX
;
sf
->
use_lastframe_partitioning
=
LAST_FRAME_PARTITION_LOW_MOTION
;
sf
->
adjust_partitioning_from_last_frame
=
1
;
sf
->
last_partitioning_redo_frequency
=
3
;
sf
->
adaptive_rd_thresh
=
2
;
sf
->
use_lp32x32fdct
=
1
;
sf
->
mode_skip_start
=
11
;
sf
->
intra_y_mode_mask
[
TX_32X32
]
=
INTRA_DC_H_V
;
sf
->
intra_y_mode_mask
[
TX_16X16
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
TX_32X32
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
TX_16X16
]
=
INTRA_DC_H_V
;
sf
->
encode_breakout_thresh
=
200
;
}
if
(
speed
>=
3
)
{
sf
->
use_square_partition_only
=
1
;
if
(
MIN
(
cm
->
width
,
cm
->
height
)
>=
720
)
sf
->
disable_split_mask
=
DISABLE_ALL_SPLIT
;
else
sf
->
disable_split_mask
=
DISABLE_ALL_INTER_SPLIT
;
sf
->
mode_search_skip_flags
=
FLAG_SKIP_INTRA_DIRMISMATCH
|
FLAG_SKIP_INTRA_BESTINTER
|
FLAG_SKIP_COMP_BESTINTRA
|
FLAG_SKIP_INTRA_LOWVAR
;
sf
->
disable_filter_search_var_thresh
=
100
;
sf
->
use_lastframe_partitioning
=
LAST_FRAME_PARTITION_ALL
;
sf
->
use_uv_intra_rd_estimate
=
1
;
sf
->
skip_encode_sb
=
1
;
sf
->
subpel_iters_per_step
=
1
;
sf
->
use_fast_coef_updates
=
2
;
sf
->
adaptive_rd_thresh
=
4
;
sf
->
mode_skip_start
=
6
;
sf
->
encode_breakout_thresh
=
400
;
sf
->
allow_skip_recode
=
0
;
}
if
(
speed
>=
4
)
{
sf
->
optimize_coefficients
=
0
;
sf
->
disable_split_mask
=
DISABLE_ALL_SPLIT
;
sf
->
lpf_pick
=
LPF_PICK_FROM_Q
;
sf
->
encode_breakout_thresh
=
700
;
}
if
(
speed
>=
5
)
{
int
i
;
sf
->
last_partitioning_redo_frequency
=
4
;
sf
->
adaptive_rd_thresh
=
5
;
sf
->
use_fast_coef_costing
=
0
;
sf
->
auto_min_max_partition_size
=
STRICT_NEIGHBORING_MIN_MAX
;
sf
->
adjust_partitioning_from_last_frame
=
cm
->
last_frame_type
!=
cm
->
frame_type
||
(
0
==
(
cm
->
current_video_frame
+
1
)
%
sf
->
last_partitioning_redo_frequency
);
sf
->
subpel_force_stop
=
1
;
for
(
i
=
0
;
i
<
TX_SIZES
;
i
++
)
{
sf
->
intra_y_mode_mask
[
i
]
=
INTRA_DC_H_V
;
sf
->
intra_uv_mode_mask
[
i
]
=
INTRA_DC_ONLY
;
}
sf
->
intra_y_mode_mask
[
TX_32X32
]
=
INTRA_DC_ONLY
;
sf
->
frame_parameter_update
=
0
;
sf
->
encode_breakout_thresh
=
1000
;
sf
->
search_method
=
FAST_HEX
;
sf
->
disable_inter_mode_mask
[
BLOCK_32X32
]
=
1
<<
INTER_OFFSET
(
ZEROMV
);
sf
->
disable_inter_mode_mask
[
BLOCK_32X64
]
=
~
(
1
<<
INTER_OFFSET
(
NEARESTMV
));
sf
->
disable_inter_mode_mask
[
BLOCK_64X32
]
=
~
(
1
<<
INTER_OFFSET
(
NEARESTMV
));
sf
->
disable_inter_mode_mask
[
BLOCK_64X64
]
=
~
(
1
<<
INTER_OFFSET
(
NEARESTMV
));
sf
->
max_intra_bsize
=
BLOCK_32X32
;
sf
->
allow_skip_recode
=
1
;
}
if
(
speed
>=
6
)
{
sf
->
max_partition_size
=
BLOCK_32X32
;
sf
->
min_partition_size
=
BLOCK_8X8
;
sf
->
partition_check
=
(
cm
->
current_video_frame
%
sf
->
last_partitioning_redo_frequency
==
1
);
sf
->
partition_search_type
=
REFERENCE_PARTITION
;
sf
->
use_nonrd_pick_mode
=
1
;
sf
->
search_method
=
FAST_DIAMOND
;
sf
->
allow_skip_recode
=
0
;
}
if
(
speed
>=
7
)
{
sf
->
partition_search_type
=
VAR_BASED_FIXED_PARTITION
;
sf
->
use_nonrd_pick_mode
=
1
;
sf
->
search_method
=
FAST_DIAMOND
;
}
if
(
speed
>=
8
)
{
int
i
;
for
(
i
=
0
;
i
<
BLOCK_SIZES
;
++
i
)
sf
->
disable_inter_mode_mask
[
i
]
=
14
;
// only search NEARESTMV (0)
}
}
void
vp9_set_speed_features
(
VP9_COMP
*
cpi
)
{
SPEED_FEATURES
*
sf
=
&
cpi
->
sf
;
VP9_COMMON
*
cm
=
&
cpi
->
common
;
int
speed
=
cpi
->
speed
;
int
i
;
// Convert negative speed to positive
if
(
speed
<
0
)
speed
=
-
speed
;
static
void
set_speed_features
(
VP9_COMP
*
cpi
)
{
#if CONFIG_INTERNAL_STATS
int
i
;
for
(
i
=
0
;
i
<
MAX_MODES
;
++
i
)
cpi
->
mode_chosen_counts
[
i
]
=
0
;
#endif
// best quality defaults
sf
->
frame_parameter_update
=
1
;
sf
->
search_method
=
NSTEP
;
sf
->
recode_loop
=
ALLOW_RECODE
;
sf
->
subpel_search_method
=
SUBPEL_TREE
;
sf
->
subpel_iters_per_step
=
2
;
sf
->
subpel_force_stop
=
0
;
sf
->
optimize_coefficients
=
!
cpi
->
oxcf
.
lossless
;
sf
->
reduce_first_step_size
=
0
;
sf
->
auto_mv_step_size
=
0
;
sf
->
max_step_search_steps
=
MAX_MVSEARCH_STEPS
;
sf
->
comp_inter_joint_search_thresh
=
BLOCK_4X4
;
sf
->
adaptive_rd_thresh
=
0
;
sf
->
use_lastframe_partitioning
=
LAST_FRAME_PARTITION_OFF
;
sf
->
tx_size_search_method
=
USE_FULL_RD
;
sf
->
use_lp32x32fdct
=
0
;
sf
->
adaptive_motion_search
=
0
;
sf
->
adaptive_pred_interp_filter
=
0
;
sf
->
reference_masking
=
0
;
sf
->
partition_search_type
=
SEARCH_PARTITION
;
sf
->
less_rectangular_check
=
0
;
sf
->
use_square_partition_only
=
0
;
sf
->
auto_min_max_partition_size
=
NOT_IN_USE
;
sf
->
max_partition_size
=
BLOCK_64X64
;
sf
->
min_partition_size
=
BLOCK_4X4
;
sf
->
adjust_partitioning_from_last_frame
=
0
;
sf
->
last_partitioning_redo_frequency
=
4
;
sf
->
disable_split_mask
=
0
;
sf
->
mode_search_skip_flags
=
0
;
sf
->
disable_split_var_thresh
=
0
;
sf
->
disable_filter_search_var_thresh
=
0
;
for
(
i
=
0
;
i
<
TX_SIZES
;
i
++
)
{
sf
->
intra_y_mode_mask
[
i
]
=
ALL_INTRA_MODES
;
sf
->
intra_uv_mode_mask
[
i
]
=
ALL_INTRA_MODES
;
}
sf
->
use_rd_breakout
=
0
;
sf
->
skip_encode_sb
=
0
;
sf
->
use_uv_intra_rd_estimate
=
0
;
sf
->
allow_skip_recode
=
0
;
sf
->
lpf_pick
=
LPF_PICK_FROM_FULL_IMAGE
;
sf
->
use_fast_coef_updates
=
0
;
sf
->
use_fast_coef_costing
=
0
;
sf
->
mode_skip_start
=
MAX_MODES
;
// Mode index at which mode skip mask set
sf
->
use_nonrd_pick_mode
=
0
;
sf
->
encode_breakout_thresh
=
0
;
for
(
i
=
0
;
i
<
BLOCK_SIZES
;
++
i
)
sf
->
disable_inter_mode_mask
[
i
]
=
0
;
sf
->
max_intra_bsize
=
BLOCK_64X64
;
// This setting only takes effect when partition_search_type is set
// to FIXED_PARTITION.
sf
->
always_this_block_size
=
BLOCK_16X16
;
switch
(
cpi
->
oxcf
.
mode
)
{
case
MODE_BESTQUALITY
:
case
MODE_SECONDPASS_BEST
:
// This is the best quality mode.
cpi
->
diamond_search_sad
=
vp9_full_range_search
;
break
;
case
MODE_FIRSTPASS
:
case
MODE_GOODQUALITY
:
case
MODE_SECONDPASS
:
set_good_speed_feature
(
cpi
,
cm
,
sf
,
speed
);
break
;
case
MODE_REALTIME
:
set_rt_speed_feature
(
cm
,
sf
,
speed
);
break
;
};
/* switch */
vp9_set_speed_features
(
cpi
);
// Set rd thresholds based on mode and speed setting
set_rd_speed_thresholds
(
cpi
);
set_rd_speed_thresholds_sub8x8
(
cpi
);
// Slow quant, dct and trellis not worthwhile for first pass
// so make sure they are always turned off.
if
(
cpi
->
pass
==
1
)
{
sf
->
optimize_coefficients
=
0
;
}
// No recode for 1 pass.
if
(
cpi
->
pass
==
0
)
{
sf
->
recode_loop
=
DISALLOW_RECODE
;
sf
->
optimize_coefficients
=
0
;
}
cpi
->
mb
.
fwd_txm4x4
=
vp9_fdct4x4
;
if
(
cpi
->
oxcf
.
lossless
||
cpi
->
mb
.
e_mbd
.
lossless
)
{
cpi
->
mb
.
fwd_txm4x4
=
vp9_fwht4x4
;
}
if
(
cpi
->
sf
.
subpel_search_method
==
SUBPEL_TREE
)
{
cpi
->
find_fractional_mv_step
=
vp9_find_best_sub_pixel_tree
;
cpi
->
find_fractional_mv_step_comp
=
vp9_find_best_sub_pixel_comp_tree
;
}
cpi
->
mb
.
optimize
=
cpi
->
sf
.
optimize_coefficients
==
1
&&
cpi
->
pass
!=
1
;
if
(
cpi
->
encode_breakout
&&
cpi
->
oxcf
.
mode
==
MODE_REALTIME
&&
sf
->
encode_breakout_thresh
>
cpi
->
encode_breakout
)
cpi
->
encode_breakout
=
sf
->
encode_breakout_thresh
;
if
(
sf
->
disable_split_mask
==
DISABLE_ALL_SPLIT
)
sf
->
adaptive_pred_interp_filter
=
0
;
}
static
void
alloc_raw_frame_buffers
(
VP9_COMP
*
cpi
)
{
...
...
@@ -1736,7 +1370,7 @@ VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) {
vp9_init_second_pass
(
cpi
);
}
vp9_
set_speed_features
(
cpi
);
set_speed_features
(
cpi
);
// Default rd threshold factors for mode selection
for
(
i
=
0
;
i
<
BLOCK_SIZES
;
++
i
)
{
...
...
@@ -3042,7 +2676,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
set_high_precision_mv
(
cpi
,
q
<
HIGH_PRECISION_MV_QTHRESH
);
}
vp9_
set_speed_features
(
cpi
);
set_speed_features
(
cpi
);
if
(
cpi
->
sf
.
recode_loop
==
DISALLOW_RECODE
)
{
encode_without_recode_loop
(
cpi
,
size
,
dest
,
q
);
...
...
vp9/encoder/vp9_onyx_int.h
View file @
0a6d5547
...
...
@@ -31,6 +31,7 @@
#include
"vp9/encoder/vp9_mcomp.h"
#include
"vp9/encoder/vp9_quantize.h"
#include
"vp9/encoder/vp9_ratectrl.h"
#include
"vp9/encoder/vp9_speed_features.h"
#include
"vp9/encoder/vp9_svc_layercontext.h"
#include
"vp9/encoder/vp9_tokenize.h"
#include
"vp9/encoder/vp9_variance.h"
...
...
@@ -114,75 +115,6 @@ typedef enum {
THR_INTRA
,
}
THR_MODES_SUB8X8
;
typedef
enum
{
DIAMOND
=
0
,
NSTEP
=
1
,
HEX
=
2
,
BIGDIA
=
3
,
SQUARE
=
4
,
FAST_HEX
=
5
,
FAST_DIAMOND
=
6
}
SEARCH_METHODS
;
typedef
enum
{
USE_FULL_RD
=
0
,
USE_LARGESTINTRA
,
USE_LARGESTINTRA_MODELINTER
,
USE_LARGESTALL
}
TX_SIZE_SEARCH_METHOD
;
typedef
enum
{
NOT_IN_USE
=
0
,
RELAXED_NEIGHBORING_MIN_MAX
=
1
,
STRICT_NEIGHBORING_MIN_MAX
=
2
}
AUTO_MIN_MAX_MODE
;
typedef
enum
{
// Terminate search early based on distortion so far compared to
// qp step, distortion in the neighborhood of the frame, etc.
FLAG_EARLY_TERMINATE
=
1
<<
0
,
// Skips comp inter modes if the best so far is an intra mode.
FLAG_SKIP_COMP_BESTINTRA
=
1
<<
1
,
// Skips comp inter modes if the best single intermode so far does
// not have the same reference as one of the two references being
// tested.
FLAG_SKIP_COMP_REFMISMATCH
=
1
<<
2
,
// Skips oblique intra modes if the best so far is an inter mode.
FLAG_SKIP_INTRA_BESTINTER
=
1
<<
3
,
// Skips oblique intra modes at angles 27, 63, 117, 153 if the best
// intra so far is not one of the neighboring directions.
FLAG_SKIP_INTRA_DIRMISMATCH
=
1
<<
4
,
// Skips intra modes other than DC_PRED if the source variance is small
FLAG_SKIP_INTRA_LOWVAR
=
1
<<
5
,
}
MODE_SEARCH_SKIP_LOGIC
;
typedef
enum
{
SUBPEL_TREE
=
0
,
// Other methods to come
}
SUBPEL_SEARCH_METHODS
;
typedef
enum
{
LAST_FRAME_PARTITION_OFF
=
0
,
LAST_FRAME_PARTITION_LOW_MOTION
=
1
,
LAST_FRAME_PARTITION_ALL
=
2
}
LAST_FRAME_PARTITION_METHOD
;
typedef
enum
{
// No recode.
DISALLOW_RECODE
=
0
,
// Allow recode for KF and exceeding maximum frame bandwidth.
ALLOW_RECODE_KFMAXBW
=
1
,
// Allow recode only for KF/ARF/GF frames.
ALLOW_RECODE_KFARFGF
=
2
,
// Allow recode for all frames based on bitrate constraints.
ALLOW_RECODE
=
3
,
}
RECODE_LOOP_TYPE
;
typedef
enum
{
// encode_breakout is disabled.
ENCODE_BREAKOUT_DISABLED
=
0
,
...
...
@@ -192,227 +124,6 @@ typedef enum {
ENCODE_BREAKOUT_LIMITED
=
2
}
ENCODE_BREAKOUT_TYPE
;
typedef
enum
{
// Search partitions using RD/NONRD criterion
SEARCH_PARTITION
=
0
,
// Always use a fixed size partition
FIXED_PARTITION
=
1
,
// Use a fixed size partition in every 64X64 SB, where the size is
// determined based on source variance
VAR_BASED_FIXED_PARTITION
=
2
,
REFERENCE_PARTITION
=
3
,
// Use an arbitrary partitioning scheme based on source variance within
// a 64X64 SB
VAR_BASED_PARTITION
}
PARTITION_SEARCH_TYPE
;
typedef
enum
{
// Try the full image with different values.
LPF_PICK_FROM_FULL_IMAGE
,
// Try a small portion of the image with different values.
LPF_PICK_FROM_SUBIMAGE
,
// Estimate the level based on quantizer and frame type
LPF_PICK_FROM_Q
,
}
LPF_PICK_METHOD
;
typedef
struct
{
// Frame level coding parameter update
int
frame_parameter_update
;
// Motion search method (Diamond, NSTEP, Hex, Big Diamond, Square, etc).
SEARCH_METHODS
search_method
;
RECODE_LOOP_TYPE
recode_loop
;
// Subpel_search_method can only be subpel_tree which does a subpixel
// logarithmic search that keeps stepping at 1/2 pixel units until
// you stop getting a gain, and then goes on to 1/4 and repeats
// the same process. Along the way it skips many diagonals.
SUBPEL_SEARCH_METHODS
subpel_search_method
;
// Maximum number of steps in logarithmic subpel search before giving up.
int
subpel_iters_per_step
;
// Control when to stop subpel search
int
subpel_force_stop
;
// This parameter controls the number of steps we'll do in a diamond
// search.
int
max_step_search_steps
;
// This parameter controls which step in the n-step process we start at.
// It's changed adaptively based on circumstances.
int
reduce_first_step_size
;
// If this is set to 1, we limit the motion search range to 2 times the
// largest motion vector found in the last frame.
int
auto_mv_step_size
;
// Trellis (dynamic programming) optimization of quantized values (+1, 0).
int
optimize_coefficients
;
// Always set to 0. If on it enables 0 cost background transmission
// (except for the initial transmission of the segmentation). The feature is
// disabled because the addition of very large block sizes make the
// backgrounds very to cheap to encode, and the segmentation we have
// adds overhead.
int
static_segmentation
;
// If 1 we iterate finding a best reference for 2 ref frames together - via
// a log search that iterates 4 times (check around mv for last for best
// error of combined predictor then check around mv for alt). If 0 we
// we just use the best motion vector found for each frame by itself.
int
comp_inter_joint_search_thresh
;
// This variable is used to cap the maximum number of times we skip testing a
// mode to be evaluated. A high value means we will be faster.
int
adaptive_rd_thresh
;
// Enables skipping the reconstruction step (idct, recon) in the
// intermediate steps assuming the last frame didn't have too many intra
// blocks and the q is less than a threshold.
int
skip_encode_sb
;
int
skip_encode_frame
;
// Speed feature to allow or disallow skipping of recode at block
// level within a frame.
int
allow_skip_recode
;
// This variable allows us to reuse the last frames partition choices
// (64x64 v 32x32 etc) for this frame. It can be set to only use the last
// frame as a starting point in low motion scenes or always use it. If set
// we use last partitioning_redo frequency to determine how often to redo
// the partitioning from scratch. Adjust_partitioning_from_last_frame
// enables us to adjust up or down one partitioning from the last frames
// partitioning.
LAST_FRAME_PARTITION_METHOD
use_lastframe_partitioning
;
// Determine which method we use to determine transform size. We can choose
// between options like full rd, largest for prediction size, largest
// for intra and model coefs for the rest.
TX_SIZE_SEARCH_METHOD
tx_size_search_method
;
// Low precision 32x32 fdct keeps everything in 16 bits and thus is less
// precise but significantly faster than the non lp version.