Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
aom-rav1e
Commits
445a492f
Commit
445a492f
authored
Apr 19, 2013
by
Paul Wilkins
Committed by
Gerrit Code Review
Apr 19, 2013
Browse files
Merge "Adjustments to key frame sizing." into experimental
parents
e714b366
21ff7bdc
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
59 deletions
+67
-59
vp9/encoder/vp9_firstpass.c
vp9/encoder/vp9_firstpass.c
+23
-27
vp9/encoder/vp9_onyx_if.c
vp9/encoder/vp9_onyx_if.c
+44
-32
No files found.
vp9/encoder/vp9_firstpass.c
View file @
445a492f
...
...
@@ -38,7 +38,7 @@
#define IIFACTOR 12.5
#define IIKFACTOR1 12.5
#define IIKFACTOR2 15.0
#define RMAX 12
8
.0
#define RMAX
5
12.0
#define GF_RMAX 96.0
#define ERR_DIVISOR 150.0
#define MIN_DECAY_FACTOR 0.1
...
...
@@ -2352,7 +2352,6 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
double
decay_accumulator
=
1
.
0
;
double
zero_motion_accumulator
=
1
.
0
;
double
boost_score
=
0
;
double
old_boost_score
=
0
.
0
;
double
loop_decay_rate
;
double
kf_mod_err
=
0
.
0
;
...
...
@@ -2524,22 +2523,13 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
boost_score
=
0
.
0
;
loop_decay_rate
=
1
.
00
;
// Starting decay rate
// Scan through the kf group collating various stats.
for
(
i
=
0
;
i
<
cpi
->
twopass
.
frames_to_key
;
i
++
)
{
double
r
;
if
(
EOF
==
input_stats
(
cpi
,
&
next_frame
))
break
;
if
(
next_frame
.
intra_error
>
cpi
->
twopass
.
kf_intra_err_min
)
r
=
(
IIKFACTOR2
*
next_frame
.
intra_error
/
DOUBLE_DIVIDE_CHECK
(
next_frame
.
coded_error
));
else
r
=
(
IIKFACTOR2
*
cpi
->
twopass
.
kf_intra_err_min
/
DOUBLE_DIVIDE_CHECK
(
next_frame
.
coded_error
));
if
(
r
>
RMAX
)
r
=
RMAX
;
// Monitor for static sections.
if
((
next_frame
.
pcnt_inter
-
next_frame
.
pcnt_motion
)
<
zero_motion_accumulator
)
{
...
...
@@ -2547,22 +2537,28 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
(
next_frame
.
pcnt_inter
-
next_frame
.
pcnt_motion
);
}
// How fast is prediction quality decaying
if
(
!
detect_flash
(
cpi
,
0
))
{
loop_decay_rate
=
get_prediction_decay_rate
(
cpi
,
&
next_frame
);
decay_accumulator
=
decay_accumulator
*
loop_decay_rate
;
decay_accumulator
=
decay_accumulator
<
MIN_DECAY_FACTOR
?
MIN_DECAY_FACTOR
:
decay_accumulator
;
}
// For the first few frames collect data to decide kf boost.
if
(
i
<=
(
cpi
->
max_gf_interval
*
2
))
{
if
(
next_frame
.
intra_error
>
cpi
->
twopass
.
kf_intra_err_min
)
r
=
(
IIKFACTOR2
*
next_frame
.
intra_error
/
DOUBLE_DIVIDE_CHECK
(
next_frame
.
coded_error
));
else
r
=
(
IIKFACTOR2
*
cpi
->
twopass
.
kf_intra_err_min
/
DOUBLE_DIVIDE_CHECK
(
next_frame
.
coded_error
));
boost_score
+=
(
decay_accumulator
*
r
);
if
(
r
>
RMAX
)
r
=
RMAX
;
if
((
i
>
MIN_GF_INTERVAL
)
&&
((
boost_score
-
old_boost_score
)
<
6
.
25
))
{
break
;
}
// How fast is prediction quality decaying
if
(
!
detect_flash
(
cpi
,
0
))
{
loop_decay_rate
=
get_prediction_decay_rate
(
cpi
,
&
next_frame
);
decay_accumulator
=
decay_accumulator
*
loop_decay_rate
;
decay_accumulator
=
decay_accumulator
<
MIN_DECAY_FACTOR
?
MIN_DECAY_FACTOR
:
decay_accumulator
;
}
old_boost_score
=
boost_score
;
boost_score
+=
(
decay_accumulator
*
r
);
}
}
{
...
...
@@ -2592,8 +2588,8 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
int
allocation_chunks
;
int
alt_kf_bits
;
if
(
kf_boost
<
(
cpi
->
twopass
.
frames_to_key
*
5
))
kf_boost
=
(
cpi
->
twopass
.
frames_to_key
*
5
);
if
(
kf_boost
<
(
cpi
->
twopass
.
frames_to_key
*
3
))
kf_boost
=
(
cpi
->
twopass
.
frames_to_key
*
3
);
if
(
kf_boost
<
300
)
// Min KF boost
kf_boost
=
300
;
...
...
vp9/encoder/vp9_onyx_if.c
View file @
445a492f
...
...
@@ -177,15 +177,16 @@ static void init_minq_luts(void) {
kf_low_motion_minq
[
i
]
=
calculate_minq_index
(
maxq
,
0
.
00000
03
,
-
0
.
000
015
,
0
.
074
,
0
.
00000
1
,
-
0
.
000
4
,
0
.
15
,
0
.
0
);
kf_high_motion_minq
[
i
]
=
calculate_minq_index
(
maxq
,
0
.
00000
04
,
-
0
.
00
0
12
5
,
0
.
14
,
0
.
00000
2
,
-
0
.
0012
,
0
.
5
,
0
.
0
);
gf_low_motion_minq
[
i
]
=
calculate_minq_index
(
maxq
,
0
.
0000015
,
-
0
.
000
9
,
...
...
@@ -2757,31 +2758,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
q
=
cpi
->
active_worst_quality
;
if
(
cm
->
frame_type
==
KEY_FRAME
)
{
#if CONFIG_MULTIPLE_ARF
double
current_q
;
#endif
int
high
=
2000
;
int
low
=
400
;
if
(
cpi
->
kf_boost
>
high
)
{
cpi
->
active_best_quality
=
kf_low_motion_minq
[
q
];
}
else
if
(
cpi
->
kf_boost
<
low
)
{
cpi
->
active_best_quality
=
kf_high_motion_minq
[
q
];
}
else
{
const
int
gap
=
high
-
low
;
const
int
offset
=
high
-
cpi
->
kf_boost
;
const
int
qdiff
=
kf_high_motion_minq
[
q
]
-
kf_low_motion_minq
[
q
];
const
int
adjustment
=
((
offset
*
qdiff
)
+
(
gap
>>
1
))
/
gap
;
cpi
->
active_best_quality
=
kf_low_motion_minq
[
q
]
+
adjustment
;
}
// Make an adjustment based on the % static
// The main impact of this is at lower Q to prevent overly large key
// frames unless a lot of the image is static.
if
(
cpi
->
kf_zeromotion_pct
<
64
)
cpi
->
active_best_quality
+=
4
-
(
cpi
->
kf_zeromotion_pct
>>
4
);
#if !CONFIG_MULTIPLE_ARF
// Special case for key frames forced because we have reached
// the maximum key frame interval. Here force the Q to a range
// based on the ambient Q to reduce the risk of popping
...
...
@@ -2794,8 +2771,43 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
(
last_boosted_q
*
0
.
75
));
cpi
->
active_best_quality
=
MAX
(
qindex
+
delta_qindex
,
cpi
->
best_quality
);
}
else
{
int
high
=
5000
;
int
low
=
400
;
double
q_adj_factor
=
1
.
0
;
double
q_val
;
// Baseline value derived from cpi->active_worst_quality and kf boost
if
(
cpi
->
kf_boost
>
high
)
{
cpi
->
active_best_quality
=
kf_low_motion_minq
[
q
];
}
else
if
(
cpi
->
kf_boost
<
low
)
{
cpi
->
active_best_quality
=
kf_high_motion_minq
[
q
];
}
else
{
const
int
gap
=
high
-
low
;
const
int
offset
=
high
-
cpi
->
kf_boost
;
const
int
qdiff
=
kf_high_motion_minq
[
q
]
-
kf_low_motion_minq
[
q
];
const
int
adjustment
=
((
offset
*
qdiff
)
+
(
gap
>>
1
))
/
gap
;
cpi
->
active_best_quality
=
kf_low_motion_minq
[
q
]
+
adjustment
;
}
// Allow somewhat lower kf minq with small image formats.
if
((
cm
->
width
*
cm
->
height
)
<=
(
352
*
288
))
{
q_adj_factor
-=
0
.
25
;
}
// Make a further adjustment based on the kf zero motion measure.
q_adj_factor
+=
0
.
05
-
(
0
.
001
*
(
double
)
cpi
->
kf_zeromotion_pct
);
// Convert the adjustment factor to a qindex delta on active_best_quality.
q_val
=
vp9_convert_qindex_to_q
(
cpi
->
active_best_quality
);
cpi
->
active_best_quality
+=
compute_qdelta
(
cpi
,
q_val
,
(
q_val
*
q_adj_factor
));
}
#if CONFIG_MULTIPLE_ARF
#else
double
current_q
;
// Force the KF quantizer to be 30% of the active_worst_quality.
current_q
=
vp9_convert_qindex_to_q
(
cpi
->
active_worst_quality
);
cpi
->
active_best_quality
=
cpi
->
active_worst_quality
...
...
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