Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
aom-rav1e
Commits
a7f86244
Commit
a7f86244
authored
Feb 17, 2014
by
Dmitry Kovalev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cleaning up vp9_onyx_if.c.
Change-Id: I389790f1ad0dd40816a7ae1ddad4a5c46278cff3
parent
35bd8868
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
71 additions
and
70 deletions
+71
-70
vp9/encoder/vp9_onyx_if.c
vp9/encoder/vp9_onyx_if.c
+71
-70
No files found.
vp9/encoder/vp9_onyx_if.c
View file @
a7f86244
...
...
@@ -154,20 +154,22 @@ void vp9_initialize_enc() {
}
static
void
dealloc_compressor_data
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
// Delete sementation map
vpx_free
(
cpi
->
segmentation_map
);
cpi
->
segmentation_map
=
0
;
vpx_free
(
c
pi
->
common
.
last_frame_seg_map
);
c
pi
->
common
.
last_frame_seg_map
=
0
;
cpi
->
segmentation_map
=
NULL
;
vpx_free
(
c
m
->
last_frame_seg_map
);
c
m
->
last_frame_seg_map
=
NULL
;
vpx_free
(
cpi
->
coding_context
.
last_frame_seg_map_copy
);
cpi
->
coding_context
.
last_frame_seg_map_copy
=
0
;
cpi
->
coding_context
.
last_frame_seg_map_copy
=
NULL
;
vpx_free
(
cpi
->
complexity_map
);
cpi
->
complexity_map
=
0
;
vpx_free
(
cpi
->
active_map
);
cpi
->
active_map
=
0
;
vp9_free_frame_buffers
(
&
cpi
->
common
);
vp9_free_frame_buffers
(
cm
);
vp9_free_frame_buffer
(
&
cpi
->
last_frame_uf
);
vp9_free_frame_buffer
(
&
cpi
->
scaled_source
);
...
...
@@ -194,19 +196,20 @@ static void dealloc_compressor_data(VP9_COMP *cpi) {
// to a target value
// target q value
int
vp9_compute_qdelta
(
const
VP9_COMP
*
cpi
,
double
qstart
,
double
qtarget
)
{
const
RATE_CONTROL
*
const
rc
=
&
cpi
->
rc
;
int
start_index
=
rc
->
worst_quality
;
int
target_index
=
rc
->
worst_quality
;
int
i
;
int
start_index
=
cpi
->
rc
.
worst_quality
;
int
target_index
=
cpi
->
rc
.
worst_quality
;
// Convert the average q value to an index.
for
(
i
=
cpi
->
rc
.
best_quality
;
i
<
cpi
->
rc
.
worst_quality
;
i
++
)
{
for
(
i
=
rc
->
best_quality
;
i
<
rc
->
worst_quality
;
++
i
)
{
start_index
=
i
;
if
(
vp9_convert_qindex_to_q
(
i
)
>=
qstart
)
break
;
}
// Convert the q target to an index
for
(
i
=
cpi
->
rc
.
best_quality
;
i
<
cpi
->
rc
.
worst_quality
;
i
++
)
{
for
(
i
=
rc
->
best_quality
;
i
<
rc
->
worst_quality
;
++
i
)
{
target_index
=
i
;
if
(
vp9_convert_qindex_to_q
(
i
)
>=
qtarget
)
break
;
...
...
@@ -221,25 +224,20 @@ int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
static
int
compute_qdelta_by_rate
(
VP9_COMP
*
cpi
,
int
base_q_index
,
double
rate_target_ratio
)
{
int
i
;
int
base_bits_per_mb
;
int
target_bits_per_mb
;
int
target_index
=
cpi
->
rc
.
worst_quality
;
// Make SURE use of floating point in this function is safe.
vp9_clear_system_state
();
// Look up the current projected bits per block for the base index
base_bits_per_mb
=
vp9_rc_bits_per_mb
(
cpi
->
common
.
frame_type
,
base_q_index
,
1
.
0
);
const
int
base_bits_per_mb
=
vp9_rc_bits_per_mb
(
cpi
->
common
.
frame_type
,
base_q_index
,
1
.
0
);
// Find the target bits per mb based on the base value and given ratio.
target_bits_per_mb
=
(
int
)(
rate_target_ratio
*
base_bits_per_mb
);
const
int
target_bits_per_mb
=
(
int
)(
rate_target_ratio
*
base_bits_per_mb
);
// Convert the q target to an index
for
(
i
=
cpi
->
rc
.
best_quality
;
i
<
cpi
->
rc
.
worst_quality
;
i
++
)
{
for
(
i
=
cpi
->
rc
.
best_quality
;
i
<
cpi
->
rc
.
worst_quality
;
++
i
)
{
target_index
=
i
;
if
(
vp9_rc_bits_per_mb
(
cpi
->
common
.
frame_type
,
i
,
1
.
0
)
<=
target_bits_per_mb
)
if
(
vp9_rc_bits_per_mb
(
cpi
->
common
.
frame_type
,
i
,
1
.
0
)
<=
target_bits_per_mb
)
break
;
}
...
...
@@ -249,11 +247,8 @@ static int compute_qdelta_by_rate(VP9_COMP *cpi, int base_q_index,
// This function sets up a set of segments with delta Q values around
// the baseline frame quantizer.
static
void
setup_in_frame_q_adj
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
cm
=
&
cpi
->
common
;
struct
segmentation
*
seg
=
&
cm
->
seg
;
// double q_ratio;
int
segment
;
int
qindex_delta
;
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
struct
segmentation
*
const
seg
=
&
cm
->
seg
;
// Make SURE use of floating point in this function is safe.
vp9_clear_system_state
();
...
...
@@ -261,6 +256,8 @@ static void setup_in_frame_q_adj(VP9_COMP *cpi) {
if
(
cm
->
frame_type
==
KEY_FRAME
||
cpi
->
refresh_alt_ref_frame
||
(
cpi
->
refresh_golden_frame
&&
!
cpi
->
rc
.
is_src_frame_alt_ref
))
{
int
segment
;
// Clear down the segment map
vpx_memset
(
cpi
->
segmentation_map
,
0
,
cm
->
mi_rows
*
cm
->
mi_cols
);
...
...
@@ -278,16 +275,16 @@ static void setup_in_frame_q_adj(VP9_COMP *cpi) {
// Use some of the segments for in frame Q adjustment
for
(
segment
=
1
;
segment
<
2
;
segment
++
)
{
qindex_delta
=
compute_qdelta_by_rate
(
cpi
,
cm
->
base_qindex
,
in_frame_q_adj_ratio
[
segment
]);
const
int
qindex_delta
=
compute_qdelta_by_rate
(
cpi
,
cm
->
base_qindex
,
in_frame_q_adj_ratio
[
segment
]);
vp9_enable_segfeature
(
seg
,
segment
,
SEG_LVL_ALT_Q
);
vp9_set_segdata
(
seg
,
segment
,
SEG_LVL_ALT_Q
,
qindex_delta
);
}
}
}
static
void
configure_static_seg_features
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
cm
=
&
cpi
->
common
;
struct
segmentation
*
seg
=
&
cm
->
seg
;
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
struct
segmentation
*
const
seg
=
&
cm
->
seg
;
int
high_q
=
(
int
)(
cpi
->
rc
.
avg_q
>
48
.
0
);
int
qi_delta
;
...
...
@@ -431,13 +428,13 @@ static void print_seg_map(VP9_COMP *cpi) {
static
void
update_reference_segmentation_map
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
MODE_INFO
**
mi_8x8_ptr
=
cm
->
mi_grid_visible
;
uint8_t
*
cache_ptr
=
cm
->
last_frame_seg_map
;
int
row
,
col
;
MODE_INFO
**
mi_8x8
,
**
mi_8x8_ptr
=
cm
->
mi_grid_visible
;
uint8_t
*
cache_ptr
=
cm
->
last_frame_seg_map
,
*
cache
;
for
(
row
=
0
;
row
<
cm
->
mi_rows
;
row
++
)
{
mi_8x8
=
mi_8x8_ptr
;
cache
=
cache_ptr
;
MODE_INFO
**
mi_8x8
=
mi_8x8_ptr
;
uint8_t
*
cache
=
cache_ptr
;
for
(
col
=
0
;
col
<
cm
->
mi_cols
;
col
++
,
mi_8x8
++
,
cache
++
)
cache
[
0
]
=
mi_8x8
[
0
]
->
mbmi
.
segment_id
;
mi_8x8_ptr
+=
cm
->
mode_info_stride
;
...
...
@@ -975,16 +972,17 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
static
void
alloc_raw_frame_buffers
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
cm
=
&
cpi
->
common
;
const
VP9_CONFIG
*
oxcf
=
&
cpi
->
oxcf
;
cpi
->
lookahead
=
vp9_lookahead_init
(
cpi
->
oxcf
.
width
,
cpi
->
oxcf
.
height
,
cpi
->
lookahead
=
vp9_lookahead_init
(
oxcf
->
width
,
oxcf
->
height
,
cm
->
subsampling_x
,
cm
->
subsampling_y
,
cpi
->
oxcf
.
lag_in_frames
);
oxcf
->
lag_in_frames
);
if
(
!
cpi
->
lookahead
)
vpx_internal_error
(
&
cm
->
error
,
VPX_CODEC_MEM_ERROR
,
"Failed to allocate lag buffers"
);
if
(
vp9_realloc_frame_buffer
(
&
cpi
->
alt_ref_buffer
,
cpi
->
oxcf
.
width
,
cpi
->
oxcf
.
height
,
oxcf
->
width
,
oxcf
->
height
,
cm
->
subsampling_x
,
cm
->
subsampling_y
,
VP9_ENC_BORDER_IN_PIXELS
,
NULL
,
NULL
,
NULL
))
vpx_internal_error
(
&
cm
->
error
,
VPX_CODEC_MEM_ERROR
,
...
...
@@ -2838,6 +2836,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
int
bottom_index
,
int
top_index
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
RATE_CONTROL
*
const
rc
=
&
cpi
->
rc
;
int
loop_count
=
0
;
int
loop
=
0
;
int
overshoot_seen
=
0
;
...
...
@@ -2847,7 +2846,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
int
frame_under_shoot_limit
;
// Decide frame size bounds
vp9_rc_compute_frame_size_bounds
(
cpi
,
cpi
->
rc
.
this_frame_target
,
vp9_rc_compute_frame_size_bounds
(
cpi
,
rc
->
this_frame_target
,
&
frame_under_shoot_limit
,
&
frame_over_shoot_limit
);
...
...
@@ -2898,7 +2897,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
if
(
!
cpi
->
sf
.
use_pick_mode
)
vp9_pack_bitstream
(
cpi
,
dest
,
size
);
cpi
->
rc
.
projected_frame_size
=
(
int
)(
*
size
)
<<
3
;
rc
->
projected_frame_size
=
(
int
)(
*
size
)
<<
3
;
vp9_restore_coding_context
(
cpi
);
if
(
frame_over_shoot_limit
==
0
)
...
...
@@ -2909,8 +2908,8 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
loop
=
0
;
}
else
{
if
((
cm
->
frame_type
==
KEY_FRAME
)
&&
cpi
->
rc
.
this_key_frame_forced
&&
(
cpi
->
rc
.
projected_frame_size
<
cpi
->
rc
.
max_frame_bandwidth
))
{
rc
->
this_key_frame_forced
&&
(
rc
->
projected_frame_size
<
rc
->
max_frame_bandwidth
))
{
int
last_q
=
q
;
int
kf_err
=
vp9_calc_ss_err
(
cpi
->
Source
,
get_frame_new_buffer
(
cm
));
...
...
@@ -2923,9 +2922,9 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
// The key frame is not good enough or we can afford
// to make it better without undue risk of popping.
if
((
kf_err
>
high_err_target
&&
cpi
->
rc
.
projected_frame_size
<=
frame_over_shoot_limit
)
||
rc
->
projected_frame_size
<=
frame_over_shoot_limit
)
||
(
kf_err
>
low_err_target
&&
cpi
->
rc
.
projected_frame_size
<=
frame_under_shoot_limit
))
{
rc
->
projected_frame_size
<=
frame_under_shoot_limit
))
{
// Lower q_high
q_high
=
q
>
q_low
?
q
-
1
:
q_low
;
...
...
@@ -2933,7 +2932,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
q
=
(
q
*
high_err_target
)
/
kf_err
;
q
=
MIN
(
q
,
(
q_high
+
q_low
)
>>
1
);
}
else
if
(
kf_err
<
low_err_target
&&
cpi
->
rc
.
projected_frame_size
>=
frame_under_shoot_limit
)
{
rc
->
projected_frame_size
>=
frame_under_shoot_limit
)
{
// The key frame is much better than the previous frame
// Raise q_low
q_low
=
q
<
q_high
?
q
+
1
:
q_high
;
...
...
@@ -2959,10 +2958,10 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
// Update correction factor & compute new Q to try...
// Frame is too large
if
(
cpi
->
rc
.
projected_frame_size
>
cpi
->
rc
.
this_frame_target
)
{
if
(
rc
->
projected_frame_size
>
rc
->
this_frame_target
)
{
// Special case if the projected size is > the max allowed.
if
(
cpi
->
rc
.
projected_frame_size
>=
cpi
->
rc
.
max_frame_bandwidth
)
q_high
=
cpi
->
rc
.
worst_quality
;
if
(
rc
->
projected_frame_size
>=
rc
->
max_frame_bandwidth
)
q_high
=
rc
->
worst_quality
;
// Raise Qlow as to at least the current value
q_low
=
q
<
q_high
?
q
+
1
:
q_high
;
...
...
@@ -2976,12 +2975,12 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
// Update rate_correction_factor unless
vp9_rc_update_rate_correction_factors
(
cpi
,
0
);
q
=
vp9_rc_regulate_q
(
cpi
,
cpi
->
rc
.
this_frame_target
,
q
=
vp9_rc_regulate_q
(
cpi
,
rc
->
this_frame_target
,
bottom_index
,
MAX
(
q_high
,
top_index
));
while
(
q
<
q_low
&&
retries
<
10
)
{
vp9_rc_update_rate_correction_factors
(
cpi
,
0
);
q
=
vp9_rc_regulate_q
(
cpi
,
cpi
->
rc
.
this_frame_target
,
q
=
vp9_rc_regulate_q
(
cpi
,
rc
->
this_frame_target
,
bottom_index
,
MAX
(
q_high
,
top_index
));
retries
++
;
}
...
...
@@ -2997,7 +2996,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
q
=
(
q_high
+
q_low
)
/
2
;
}
else
{
vp9_rc_update_rate_correction_factors
(
cpi
,
0
);
q
=
vp9_rc_regulate_q
(
cpi
,
cpi
->
rc
.
this_frame_target
,
q
=
vp9_rc_regulate_q
(
cpi
,
rc
->
this_frame_target
,
bottom_index
,
top_index
);
// Special case reset for qlow for constrained quality.
// This should only trigger where there is very substantial
...
...
@@ -3010,7 +3009,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
while
(
q
>
q_high
&&
retries
<
10
)
{
vp9_rc_update_rate_correction_factors
(
cpi
,
0
);
q
=
vp9_rc_regulate_q
(
cpi
,
cpi
->
rc
.
this_frame_target
,
q
=
vp9_rc_regulate_q
(
cpi
,
rc
->
this_frame_target
,
bottom_index
,
top_index
);
retries
++
;
}
...
...
@@ -3029,8 +3028,8 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
}
// Special case for overlay frame.
if
(
cpi
->
rc
.
is_src_frame_alt_ref
&&
(
cpi
->
rc
.
projected_frame_size
<
cpi
->
rc
.
max_frame_bandwidth
)
)
if
(
rc
->
is_src_frame_alt_ref
&&
rc
->
projected_frame_size
<
rc
->
max_frame_bandwidth
)
loop
=
0
;
if
(
loop
)
{
...
...
@@ -3098,8 +3097,8 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
int
top_index
;
int
bottom_index
;
SPEED_FEATURES
*
const
sf
=
&
cpi
->
sf
;
unsigned
int
max_mv_def
=
MIN
(
cm
->
width
,
cm
->
height
);
const
SPEED_FEATURES
*
const
sf
=
&
cpi
->
sf
;
const
unsigned
int
max_mv_def
=
MIN
(
cm
->
width
,
cm
->
height
);
struct
segmentation
*
const
seg
=
&
cm
->
seg
;
set_ext_overrides
(
cpi
);
...
...
@@ -3238,7 +3237,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
if
(
!
frame_is_intra_only
(
cm
))
{
cm
->
interp_filter
=
DEFAULT_INTERP_FILTER
;
/* TODO: Decide this more intelligently */
set_high_precision_mv
(
cpi
,
(
q
<
HIGH_PRECISION_MV_QTHRESH
)
)
;
set_high_precision_mv
(
cpi
,
q
<
HIGH_PRECISION_MV_QTHRESH
);
}
if
(
cpi
->
sf
.
recode_loop
==
DISALLOW_RECODE
)
{
...
...
@@ -3431,6 +3430,7 @@ static void Pass2Encode(VP9_COMP *cpi, size_t *size,
static
void
check_initial_width
(
VP9_COMP
*
cpi
,
int
subsampling_x
,
int
subsampling_y
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
if
(
!
cpi
->
initial_width
)
{
cm
->
subsampling_x
=
subsampling_x
;
cm
->
subsampling_y
=
subsampling_y
;
...
...
@@ -3444,12 +3444,12 @@ static void check_initial_width(VP9_COMP *cpi, int subsampling_x,
int
vp9_receive_raw_frame
(
VP9_PTR
ptr
,
unsigned
int
frame_flags
,
YV12_BUFFER_CONFIG
*
sd
,
int64_t
time_stamp
,
int64_t
end_time
)
{
VP9_COMP
*
cpi
=
(
VP9_COMP
*
)
ptr
;
VP9_COMMON
*
cm
=
&
cpi
->
common
;
struct
vpx_usec_timer
timer
;
int
res
=
0
;
const
int
subsampling_x
=
sd
->
uv_width
<
sd
->
y_width
;
const
int
subsampling_y
=
sd
->
uv_height
<
sd
->
y_height
;
VP9_COMP
*
cpi
=
(
VP9_COMP
*
)
ptr
;
VP9_COMMON
*
cm
=
&
cpi
->
common
;
struct
vpx_usec_timer
timer
;
int
res
=
0
;
const
int
subsampling_x
=
sd
->
uv_width
<
sd
->
y_width
;
const
int
subsampling_y
=
sd
->
uv_height
<
sd
->
y_height
;
check_initial_width
(
cpi
,
subsampling_x
,
subsampling_y
);
vpx_usec_timer_start
(
&
timer
);
...
...
@@ -3843,22 +3843,23 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
int
vp9_get_preview_raw_frame
(
VP9_PTR
comp
,
YV12_BUFFER_CONFIG
*
dest
,
vp9_ppflags_t
*
flags
)
{
VP9_COMP
*
cpi
=
(
VP9_COMP
*
)
comp
;
VP9_COMP
*
cpi
=
(
VP9_COMP
*
)
comp
;
VP9_COMMON
*
cm
=
&
cpi
->
common
;
if
(
!
c
pi
->
common
.
show_frame
)
{
if
(
!
c
m
->
show_frame
)
{
return
-
1
;
}
else
{
int
ret
;
#if CONFIG_VP9_POSTPROC
ret
=
vp9_post_proc_frame
(
&
cpi
->
common
,
dest
,
flags
);
ret
=
vp9_post_proc_frame
(
cm
,
dest
,
flags
);
#else
if
(
c
pi
->
common
.
frame_to_show
)
{
*
dest
=
*
c
pi
->
common
.
frame_to_show
;
dest
->
y_width
=
c
pi
->
common
.
width
;
dest
->
y_height
=
c
pi
->
common
.
height
;
dest
->
uv_width
=
c
pi
->
common
.
width
>>
cpi
->
common
.
subsampling_x
;
dest
->
uv_height
=
c
pi
->
common
.
height
>>
cpi
->
common
.
subsampling_y
;
if
(
c
m
->
frame_to_show
)
{
*
dest
=
*
c
m
->
frame_to_show
;
dest
->
y_width
=
c
m
->
width
;
dest
->
y_height
=
c
m
->
height
;
dest
->
uv_width
=
c
m
->
width
>>
cm
->
subsampling_x
;
dest
->
uv_height
=
c
m
->
height
>>
cm
->
subsampling_y
;
ret
=
0
;
}
else
{
ret
=
-
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