Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
aom-rav1e
Commits
37241e6f
Commit
37241e6f
authored
Mar 29, 2016
by
Yaowu Xu
Committed by
Gerrit Code Review
Mar 29, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge "Merge branch 'masterbase' into nextgenv2" into nextgenv2
parents
78ee8312
c810740c
Changes
51
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
51 changed files
with
1876 additions
and
1348 deletions
+1876
-1348
CHANGELOG
CHANGELOG
+4
-0
examples/vp8_multi_resolution_encoder.c
examples/vp8_multi_resolution_encoder.c
+10
-8
test/altref_test.cc
test/altref_test.cc
+102
-1
test/cpu_speed_test.cc
test/cpu_speed_test.cc
+19
-1
test/datarate_test.cc
test/datarate_test.cc
+181
-17
test/lpf_8_test.cc
test/lpf_8_test.cc
+1
-1
test/resize_test.cc
test/resize_test.cc
+22
-0
test/test.mk
test/test.mk
+1
-1
third_party/x86inc/README.libvpx
third_party/x86inc/README.libvpx
+2
-6
third_party/x86inc/x86inc.asm
third_party/x86inc/x86inc.asm
+215
-179
vp10/common/mvref_common.h
vp10/common/mvref_common.h
+3
-4
vp10/encoder/encoder.c
vp10/encoder/encoder.c
+14
-0
vp8/encoder/denoising.c
vp8/encoder/denoising.c
+1
-1
vp8/encoder/denoising.h
vp8/encoder/denoising.h
+2
-2
vp8/encoder/ethreading.c
vp8/encoder/ethreading.c
+0
-1
vp8/encoder/onyx_if.c
vp8/encoder/onyx_if.c
+2
-32
vp8/encoder/onyx_int.h
vp8/encoder/onyx_int.h
+0
-1
vp8/encoder/pickinter.c
vp8/encoder/pickinter.c
+32
-11
vp9/decoder/vp9_decodeframe.c
vp9/decoder/vp9_decodeframe.c
+116
-114
vp9/decoder/vp9_decodemv.c
vp9/decoder/vp9_decodemv.c
+14
-23
vp9/decoder/vp9_decodemv.h
vp9/decoder/vp9_decodemv.h
+1
-1
vp9/encoder/vp9_aq_cyclicrefresh.c
vp9/encoder/vp9_aq_cyclicrefresh.c
+33
-17
vp9/encoder/vp9_denoiser.c
vp9/encoder/vp9_denoiser.c
+3
-1
vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_encodeframe.c
+51
-44
vp9/encoder/vp9_encodemv.c
vp9/encoder/vp9_encodemv.c
+44
-31
vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_encoder.c
+110
-17
vp9/encoder/vp9_encoder.h
vp9/encoder/vp9_encoder.h
+5
-0
vp9/encoder/vp9_firstpass.c
vp9/encoder/vp9_firstpass.c
+32
-0
vp9/encoder/vp9_mcomp.c
vp9/encoder/vp9_mcomp.c
+45
-0
vp9/encoder/vp9_mcomp.h
vp9/encoder/vp9_mcomp.h
+1
-0
vp9/encoder/vp9_noise_estimate.c
vp9/encoder/vp9_noise_estimate.c
+7
-1
vp9/encoder/vp9_pickmode.c
vp9/encoder/vp9_pickmode.c
+25
-12
vp9/encoder/vp9_ratectrl.c
vp9/encoder/vp9_ratectrl.c
+42
-23
vp9/encoder/vp9_rdopt.c
vp9/encoder/vp9_rdopt.c
+61
-38
vp9/encoder/vp9_skin_detection.c
vp9/encoder/vp9_skin_detection.c
+70
-35
vp9/encoder/vp9_skin_detection.h
vp9/encoder/vp9_skin_detection.h
+4
-2
vp9/encoder/vp9_speed_features.c
vp9/encoder/vp9_speed_features.c
+7
-2
vp9/encoder/vp9_speed_features.h
vp9/encoder/vp9_speed_features.h
+5
-1
vp9/encoder/vp9_svc_layercontext.c
vp9/encoder/vp9_svc_layercontext.c
+44
-0
vp9/encoder/vp9_svc_layercontext.h
vp9/encoder/vp9_svc_layercontext.h
+4
-0
vp9/encoder/vp9_temporal_filter.c
vp9/encoder/vp9_temporal_filter.c
+2
-2
vp9/encoder/vp9_tokenize.c
vp9/encoder/vp9_tokenize.c
+29
-0
vp9/encoder/vp9_tokenize.h
vp9/encoder/vp9_tokenize.h
+13
-0
vp9/vp9_cx_iface.c
vp9/vp9_cx_iface.c
+12
-3
vpx/src/svc_encodeframe.c
vpx/src/svc_encodeframe.c
+1
-1
vpx_dsp/vpx_dsp.mk
vpx_dsp/vpx_dsp.mk
+1
-1
vpx_dsp/vpx_dsp_rtcd_defs.pl
vpx_dsp/vpx_dsp_rtcd_defs.pl
+2
-2
vpx_dsp/x86/convolve.h
vpx_dsp/x86/convolve.h
+6
-20
vpx_dsp/x86/loopfilter_mmx.asm
vpx_dsp/x86/loopfilter_mmx.asm
+414
-574
vpx_dsp/x86/vpx_subpixel_8t_ssse3.asm
vpx_dsp/x86/vpx_subpixel_8t_ssse3.asm
+59
-99
vpxenc.c
vpxenc.c
+2
-18
No files found.
CHANGELOG
View file @
37241e6f
Next Release
- Incompatible changes:
The VP9 encoder's default keyframe interval changed to 128 from 9999.
2015-11-09 v1.5.0 "Javan Whistling Duck"
This release improves upon the VP9 encoder and speeds up the encoding and
decoding processes.
...
...
examples/vp8_multi_resolution_encoder.c
View file @
37241e6f
...
...
@@ -347,8 +347,7 @@ int main(int argc, char **argv)
double
psnr_totals
[
NUM_ENCODERS
][
4
]
=
{{
0
,
0
}};
int
psnr_count
[
NUM_ENCODERS
]
=
{
0
};
double
cx_time
=
0
;
struct
timeval
tv1
,
tv2
,
difftv
;
int64_t
cx_time
=
0
;
/* Set the required target bitrates for each resolution level.
* If target bitrate for highest-resolution level is set to 0,
...
...
@@ -582,6 +581,7 @@ int main(int argc, char **argv)
while
(
frame_avail
||
got_data
)
{
struct
vpx_usec_timer
timer
;
vpx_codec_iter_t
iter
[
NUM_ENCODERS
]
=
{
NULL
};
const
vpx_codec_cx_pkt_t
*
pkt
[
NUM_ENCODERS
];
...
...
@@ -636,18 +636,18 @@ int main(int argc, char **argv)
vpx_codec_control
(
&
codec
[
i
],
VP8E_SET_TEMPORAL_LAYER_ID
,
layer_id
);
}
gettimeofday
(
&
tv1
,
NULL
);
/* Encode each frame at multi-levels */
/* Note the flags must be set to 0 in the encode call if they are set
for each frame with the vpx_codec_control(), as done above. */
vpx_usec_timer_start
(
&
timer
);
if
(
vpx_codec_encode
(
&
codec
[
0
],
frame_avail
?
&
raw
[
0
]
:
NULL
,
frame_cnt
,
1
,
0
,
arg_deadline
))
{
die_codec
(
&
codec
[
0
],
"Failed to encode frame"
);
}
gettimeofday
(
&
tv2
,
NULL
);
timersub
(
&
tv2
,
&
tv1
,
&
difftv
);
cx_time
+=
(
double
)(
difftv
.
tv_sec
*
1000000
+
difftv
.
tv_usec
);
vpx_usec_timer_mark
(
&
timer
);
cx_time
+=
vpx_usec_timer_elapsed
(
&
timer
);
for
(
i
=
NUM_ENCODERS
-
1
;
i
>=
0
;
i
--
)
{
got_data
=
0
;
...
...
@@ -686,8 +686,10 @@ int main(int argc, char **argv)
frame_cnt
++
;
}
printf
(
"
\n
"
);
printf
(
"FPS for encoding %d %f %f
\n
"
,
frame_cnt
,
(
float
)
cx_time
/
1000000
,
1000000
*
(
double
)
frame_cnt
/
(
double
)
cx_time
);
printf
(
"Frame cnt and encoding time/FPS stats for encoding: %d %f %f
\n
"
,
frame_cnt
,
1000
*
(
float
)
cx_time
/
(
double
)(
frame_cnt
*
1000000
),
1000000
*
(
double
)
frame_cnt
/
(
double
)
cx_time
);
fclose
(
infile
);
...
...
test/altref_test.cc
View file @
37241e6f
...
...
@@ -14,6 +14,8 @@
#include "test/util.h"
namespace
{
#if CONFIG_VP8_ENCODER
// lookahead range: [kLookAheadMin, kLookAheadMax).
const
int
kLookAheadMin
=
5
;
const
int
kLookAheadMax
=
26
;
...
...
@@ -63,7 +65,106 @@ TEST_P(AltRefTest, MonotonicTimestamps) {
EXPECT_GE
(
altref_count
(),
1
);
}
VP8_INSTANTIATE_TEST_CASE
(
AltRefTest
,
::
testing
::
Range
(
kLookAheadMin
,
kLookAheadMax
));
#endif // CONFIG_VP8_ENCODER
class
AltRefForcedKeyTestLarge
:
public
::
libvpx_test
::
EncoderTest
,
public
::
libvpx_test
::
CodecTestWith2Params
<
libvpx_test
::
TestMode
,
int
>
{
protected:
AltRefForcedKeyTestLarge
()
:
EncoderTest
(
GET_PARAM
(
0
)),
encoding_mode_
(
GET_PARAM
(
1
)),
cpu_used_
(
GET_PARAM
(
2
)),
forced_kf_frame_num_
(
1
),
frame_num_
(
0
)
{}
virtual
~
AltRefForcedKeyTestLarge
()
{}
virtual
void
SetUp
()
{
InitializeConfig
();
SetMode
(
encoding_mode_
);
cfg_
.
rc_end_usage
=
VPX_VBR
;
cfg_
.
g_threads
=
0
;
}
virtual
void
PreEncodeFrameHook
(
::
libvpx_test
::
VideoSource
*
video
,
::
libvpx_test
::
Encoder
*
encoder
)
{
if
(
video
->
frame
()
==
0
)
{
encoder
->
Control
(
VP8E_SET_CPUUSED
,
cpu_used_
);
encoder
->
Control
(
VP8E_SET_ENABLEAUTOALTREF
,
1
);
// override test default for tile columns if necessary.
#if CONFIG_VP9_ENCODER
if
(
GET_PARAM
(
0
)
==
&
libvpx_test
::
kVP9
)
{
encoder
->
Control
(
VP9E_SET_TILE_COLUMNS
,
6
);
}
#endif
#if CONFIG_VP10_ENCODER
if
(
GET_PARAM
(
0
)
==
&
libvpx_test
::
kVP10
)
{
encoder
->
Control
(
VP9E_SET_TILE_COLUMNS
,
6
);
}
#endif
}
frame_flags_
=
(
video
->
frame
()
==
forced_kf_frame_num_
)
?
VPX_EFLAG_FORCE_KF
:
0
;
}
virtual
void
FramePktHook
(
const
vpx_codec_cx_pkt_t
*
pkt
)
{
if
(
frame_num_
==
forced_kf_frame_num_
)
{
ASSERT_TRUE
(
!!
(
pkt
->
data
.
frame
.
flags
&
VPX_FRAME_IS_KEY
))
<<
"Frame #"
<<
frame_num_
<<
" isn't a keyframe!"
;
}
++
frame_num_
;
}
::
libvpx_test
::
TestMode
encoding_mode_
;
int
cpu_used_
;
unsigned
int
forced_kf_frame_num_
;
unsigned
int
frame_num_
;
};
TEST_P
(
AltRefForcedKeyTestLarge
,
Frame1IsKey
)
{
const
vpx_rational
timebase
=
{
1
,
30
};
const
int
lag_values
[]
=
{
3
,
15
,
25
,
-
1
};
forced_kf_frame_num_
=
1
;
for
(
int
i
=
0
;
lag_values
[
i
]
!=
-
1
;
++
i
)
{
frame_num_
=
0
;
cfg_
.
g_lag_in_frames
=
lag_values
[
i
];
libvpx_test
::
I420VideoSource
video
(
"hantro_collage_w352h288.yuv"
,
352
,
288
,
timebase
.
den
,
timebase
.
num
,
0
,
30
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
}
}
TEST_P
(
AltRefForcedKeyTestLarge
,
ForcedFrameIsKey
)
{
const
vpx_rational
timebase
=
{
1
,
30
};
const
int
lag_values
[]
=
{
3
,
15
,
25
,
-
1
};
for
(
int
i
=
0
;
lag_values
[
i
]
!=
-
1
;
++
i
)
{
frame_num_
=
0
;
forced_kf_frame_num_
=
lag_values
[
i
]
-
1
;
cfg_
.
g_lag_in_frames
=
lag_values
[
i
];
libvpx_test
::
I420VideoSource
video
(
"hantro_collage_w352h288.yuv"
,
352
,
288
,
timebase
.
den
,
timebase
.
num
,
0
,
30
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
}
}
VP8_INSTANTIATE_TEST_CASE
(
AltRefForcedKeyTestLarge
,
::
testing
::
Values
(
::
libvpx_test
::
kOnePassGood
),
::
testing
::
Range
(
0
,
9
));
VP9_INSTANTIATE_TEST_CASE
(
AltRefForcedKeyTestLarge
,
::
testing
::
Values
(
::
libvpx_test
::
kOnePassGood
),
::
testing
::
Range
(
0
,
9
));
VP10_INSTANTIATE_TEST_CASE
(
AltRefForcedKeyTestLarge
,
::
testing
::
Values
(
::
libvpx_test
::
kOnePassGood
),
::
testing
::
Range
(
0
,
9
));
}
// namespace
test/cpu_speed_test.cc
View file @
37241e6f
...
...
@@ -26,7 +26,8 @@ class CpuSpeedTest
:
EncoderTest
(
GET_PARAM
(
0
)),
encoding_mode_
(
GET_PARAM
(
1
)),
set_cpu_used_
(
GET_PARAM
(
2
)),
min_psnr_
(
kMaxPSNR
)
{}
min_psnr_
(
kMaxPSNR
),
tune_content_
(
VP9E_CONTENT_DEFAULT
)
{}
virtual
~
CpuSpeedTest
()
{}
virtual
void
SetUp
()
{
...
...
@@ -49,6 +50,7 @@ class CpuSpeedTest
::
libvpx_test
::
Encoder
*
encoder
)
{
if
(
video
->
frame
()
==
1
)
{
encoder
->
Control
(
VP8E_SET_CPUUSED
,
set_cpu_used_
);
encoder
->
Control
(
VP9E_SET_TUNE_CONTENT
,
tune_content_
);
if
(
encoding_mode_
!=
::
libvpx_test
::
kRealTime
)
{
encoder
->
Control
(
VP8E_SET_ENABLEAUTOALTREF
,
1
);
encoder
->
Control
(
VP8E_SET_ARNR_MAXFRAMES
,
7
);
...
...
@@ -66,6 +68,7 @@ class CpuSpeedTest
::
libvpx_test
::
TestMode
encoding_mode_
;
int
set_cpu_used_
;
double
min_psnr_
;
int
tune_content_
;
};
TEST_P
(
CpuSpeedTest
,
TestQ0
)
{
...
...
@@ -103,6 +106,21 @@ TEST_P(CpuSpeedTest, TestScreencastQ0) {
EXPECT_GE
(
min_psnr_
,
kMaxPSNR
);
}
TEST_P
(
CpuSpeedTest
,
TestTuneScreen
)
{
::
libvpx_test
::
Y4mVideoSource
video
(
"screendata.y4m"
,
0
,
25
);
cfg_
.
g_timebase
=
video
.
timebase
();
cfg_
.
rc_2pass_vbr_minsection_pct
=
5
;
cfg_
.
rc_2pass_vbr_minsection_pct
=
2000
;
cfg_
.
rc_target_bitrate
=
2000
;
cfg_
.
rc_max_quantizer
=
63
;
cfg_
.
rc_min_quantizer
=
0
;
tune_content_
=
VP9E_CONTENT_SCREEN
;
init_flags_
=
VPX_CODEC_USE_PSNR
;
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
}
TEST_P
(
CpuSpeedTest
,
TestEncodeHighBitrate
)
{
// Validate that this non multiple of 64 wide clip encodes and decodes
// without a mismatch when passing in a very low max q. This pushes
...
...
test/datarate_test.cc
View file @
37241e6f
...
...
@@ -519,6 +519,9 @@ TEST_P(DatarateTestVP9Large, ChangingDropFrameThresh) {
cfg_
.
rc_end_usage
=
VPX_CBR
;
cfg_
.
rc_target_bitrate
=
200
;
cfg_
.
g_lag_in_frames
=
0
;
// TODO(marpan): Investigate datarate target failures with a smaller keyframe
// interval (128).
cfg_
.
kf_max_dist
=
9999
;
::
libvpx_test
::
I420VideoSource
video
(
"hantro_collage_w352h288.yuv"
,
352
,
288
,
30
,
1
,
0
,
140
);
...
...
@@ -774,10 +777,6 @@ class DatarateOnePassCbrSvc : public ::libvpx_test::EncoderTest,
svc_params_
.
max_quantizers
[
i
]
=
63
;
svc_params_
.
min_quantizers
[
i
]
=
0
;
}
svc_params_
.
scaling_factor_num
[
0
]
=
144
;
svc_params_
.
scaling_factor_den
[
0
]
=
288
;
svc_params_
.
scaling_factor_num
[
1
]
=
288
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
encoder
->
Control
(
VP9E_SET_SVC
,
1
);
encoder
->
Control
(
VP9E_SET_SVC_PARAMETERS
,
&
svc_params_
);
encoder
->
Control
(
VP8E_SET_CPUUSED
,
speed_setting_
);
...
...
@@ -814,8 +813,6 @@ class DatarateOnePassCbrSvc : public ::libvpx_test::EncoderTest,
if
(
bits_total_
)
{
const
double
file_size_in_kb
=
bits_total_
/
1000.
;
// bits per kilobit
duration_
=
(
last_pts_
+
1
)
*
timebase_
;
effective_datarate_
=
(
bits_total_
-
bits_in_last_frame_
)
/
1000.0
/
(
cfg_
.
rc_buf_initial_sz
/
1000.0
+
duration_
);
file_datarate_
=
file_size_in_kb
/
duration_
;
}
}
...
...
@@ -839,7 +836,6 @@ class DatarateOnePassCbrSvc : public ::libvpx_test::EncoderTest,
int64_t
bits_total_
;
double
duration_
;
double
file_datarate_
;
double
effective_datarate_
;
size_t
bits_in_last_frame_
;
vpx_svc_extra_cfg_t
svc_params_
;
int
speed_setting_
;
...
...
@@ -884,7 +880,7 @@ static void assign_layer_bitrates(vpx_codec_enc_cfg_t *const enc_cfg,
// Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and
// 3 temporal layers. Run CIF clip with 1 thread.
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc
)
{
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc
2SpatialLayers
)
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
500
;
cfg_
.
rc_buf_sz
=
1000
;
...
...
@@ -905,27 +901,70 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc) {
svc_params_
.
scaling_factor_num
[
1
]
=
288
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
cfg_
.
rc_dropframe_thresh
=
10
;
cfg_
.
kf_max_dist
=
9999
;
::
libvpx_test
::
I420VideoSource
video
(
"hantro_collage_w352h288.yuv"
,
352
,
288
,
30
,
1
,
0
,
200
);
// TODO(wonkap/marpan): Check that effective_datarate for each layer hits the
// layer target_bitrate.
Also check if test can pass at lower bitrate (~200k).
for
(
int
i
=
4
00
;
i
<=
800
;
i
+=
200
)
{
// layer target_bitrate.
for
(
int
i
=
2
00
;
i
<=
800
;
i
+=
200
)
{
cfg_
.
rc_target_bitrate
=
i
;
ResetModel
();
assign_layer_bitrates
(
&
cfg_
,
&
svc_params_
,
cfg_
.
ss_number_layers
,
cfg_
.
ts_number_layers
,
cfg_
.
temporal_layering_mode
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
effectiv
e_datarate_
*
0.85
)
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
fil
e_datarate_
*
0.85
)
<<
" The datarate for the file exceeds the target by too much!"
;
ASSERT_LE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
1.15
)
<<
" The datarate for the file is lower than the target by too much!"
;
EXPECT_EQ
(
GetMismatchFrames
(),
(
unsigned
int
)
0
);
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
}
// Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 3
// temporal layers. Run CIF clip with 1 thread, and few short key frame periods.
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc2SpatialLayersSmallKf
)
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
500
;
cfg_
.
rc_buf_sz
=
1000
;
cfg_
.
rc_min_quantizer
=
0
;
cfg_
.
rc_max_quantizer
=
63
;
cfg_
.
rc_end_usage
=
VPX_CBR
;
cfg_
.
g_lag_in_frames
=
0
;
cfg_
.
ss_number_layers
=
2
;
cfg_
.
ts_number_layers
=
3
;
cfg_
.
ts_rate_decimator
[
0
]
=
4
;
cfg_
.
ts_rate_decimator
[
1
]
=
2
;
cfg_
.
ts_rate_decimator
[
2
]
=
1
;
cfg_
.
g_error_resilient
=
1
;
cfg_
.
g_threads
=
1
;
cfg_
.
temporal_layering_mode
=
3
;
svc_params_
.
scaling_factor_num
[
0
]
=
144
;
svc_params_
.
scaling_factor_den
[
0
]
=
288
;
svc_params_
.
scaling_factor_num
[
1
]
=
288
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
cfg_
.
rc_dropframe_thresh
=
10
;
::
libvpx_test
::
I420VideoSource
video
(
"hantro_collage_w352h288.yuv"
,
352
,
288
,
30
,
1
,
0
,
200
);
cfg_
.
rc_target_bitrate
=
400
;
// For this 3 temporal layer case, pattern repeats every 4 frames, so choose
// 4 key neighboring key frame periods (so key frame will land on 0-2-1-2).
for
(
int
j
=
64
;
j
<=
67
;
j
++
)
{
cfg_
.
kf_max_dist
=
j
;
ResetModel
();
assign_layer_bitrates
(
&
cfg_
,
&
svc_params_
,
cfg_
.
ss_number_layers
,
cfg_
.
ts_number_layers
,
cfg_
.
temporal_layering_mode
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
0.85
)
<<
" The datarate for the file exceeds the target by too much!"
;
ASSERT_LE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
1.15
)
<<
" The datarate for the file is lower than the target by too much!"
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
}
// Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and
// 3 temporal layers. Run HD clip with 4 threads.
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc4threads
)
{
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc
2SpatialLayers
4threads
)
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
500
;
cfg_
.
rc_buf_sz
=
1000
;
...
...
@@ -946,6 +985,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc4threads) {
svc_params_
.
scaling_factor_num
[
1
]
=
288
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
cfg_
.
rc_dropframe_thresh
=
10
;
cfg_
.
kf_max_dist
=
9999
;
::
libvpx_test
::
I420VideoSource
video
(
"niklas_1280_720_30.y4m"
,
1280
,
720
,
30
,
1
,
0
,
300
);
cfg_
.
rc_target_bitrate
=
800
;
...
...
@@ -953,19 +993,143 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc4threads) {
assign_layer_bitrates
(
&
cfg_
,
&
svc_params_
,
cfg_
.
ss_number_layers
,
cfg_
.
ts_number_layers
,
cfg_
.
temporal_layering_mode
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
effectiv
e_datarate_
*
0.85
)
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
fil
e_datarate_
*
0.85
)
<<
" The datarate for the file exceeds the target by too much!"
;
ASSERT_LE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
1.15
)
<<
" The datarate for the file is lower than the target by too much!"
;
EXPECT_EQ
(
GetMismatchFrames
(),
(
unsigned
int
)
0
);
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
// Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
// 3 temporal layers. Run CIF clip with 1 thread.
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc3SpatialLayers
)
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
500
;
cfg_
.
rc_buf_sz
=
1000
;
cfg_
.
rc_min_quantizer
=
0
;
cfg_
.
rc_max_quantizer
=
63
;
cfg_
.
rc_end_usage
=
VPX_CBR
;
cfg_
.
g_lag_in_frames
=
0
;
cfg_
.
ss_number_layers
=
3
;
cfg_
.
ts_number_layers
=
3
;
cfg_
.
ts_rate_decimator
[
0
]
=
4
;
cfg_
.
ts_rate_decimator
[
1
]
=
2
;
cfg_
.
ts_rate_decimator
[
2
]
=
1
;
cfg_
.
g_error_resilient
=
1
;
cfg_
.
g_threads
=
1
;
cfg_
.
temporal_layering_mode
=
3
;
svc_params_
.
scaling_factor_num
[
0
]
=
72
;
svc_params_
.
scaling_factor_den
[
0
]
=
288
;
svc_params_
.
scaling_factor_num
[
1
]
=
144
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
svc_params_
.
scaling_factor_num
[
2
]
=
288
;
svc_params_
.
scaling_factor_den
[
2
]
=
288
;
cfg_
.
rc_dropframe_thresh
=
10
;
cfg_
.
kf_max_dist
=
9999
;
::
libvpx_test
::
I420VideoSource
video
(
"niklas_1280_720_30.y4m"
,
1280
,
720
,
30
,
1
,
0
,
300
);
cfg_
.
rc_target_bitrate
=
800
;
ResetModel
();
assign_layer_bitrates
(
&
cfg_
,
&
svc_params_
,
cfg_
.
ss_number_layers
,
cfg_
.
ts_number_layers
,
cfg_
.
temporal_layering_mode
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
0.85
)
<<
" The datarate for the file exceeds the target by too much!"
;
ASSERT_LE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
1.22
)
<<
" The datarate for the file is lower than the target by too much!"
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
// Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3
// temporal layers. Run CIF clip with 1 thread, and few short key frame periods.
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc3SpatialLayersSmallKf
)
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
500
;
cfg_
.
rc_buf_sz
=
1000
;
cfg_
.
rc_min_quantizer
=
0
;
cfg_
.
rc_max_quantizer
=
63
;
cfg_
.
rc_end_usage
=
VPX_CBR
;
cfg_
.
g_lag_in_frames
=
0
;
cfg_
.
ss_number_layers
=
3
;
cfg_
.
ts_number_layers
=
3
;
cfg_
.
ts_rate_decimator
[
0
]
=
4
;
cfg_
.
ts_rate_decimator
[
1
]
=
2
;
cfg_
.
ts_rate_decimator
[
2
]
=
1
;
cfg_
.
g_error_resilient
=
1
;
cfg_
.
g_threads
=
1
;
cfg_
.
temporal_layering_mode
=
3
;
svc_params_
.
scaling_factor_num
[
0
]
=
72
;
svc_params_
.
scaling_factor_den
[
0
]
=
288
;
svc_params_
.
scaling_factor_num
[
1
]
=
144
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
svc_params_
.
scaling_factor_num
[
2
]
=
288
;
svc_params_
.
scaling_factor_den
[
2
]
=
288
;
cfg_
.
rc_dropframe_thresh
=
10
;
::
libvpx_test
::
I420VideoSource
video
(
"niklas_1280_720_30.y4m"
,
1280
,
720
,
30
,
1
,
0
,
300
);
cfg_
.
rc_target_bitrate
=
800
;
// For this 3 temporal layer case, pattern repeats every 4 frames, so choose
// 4 key neighboring key frame periods (so key frame will land on 0-2-1-2).
for
(
int
j
=
32
;
j
<=
35
;
j
++
)
{
cfg_
.
kf_max_dist
=
j
;
ResetModel
();
assign_layer_bitrates
(
&
cfg_
,
&
svc_params_
,
cfg_
.
ss_number_layers
,
cfg_
.
ts_number_layers
,
cfg_
.
temporal_layering_mode
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
0.85
)
<<
" The datarate for the file exceeds the target by too much!"
;
ASSERT_LE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
1.30
)
<<
" The datarate for the file is lower than the target by too much!"
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
}
// Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
// 3 temporal layers. Run HD clip with 4 threads.
TEST_P
(
DatarateOnePassCbrSvc
,
OnePassCbrSvc3SpatialLayers4threads
)
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
500
;
cfg_
.
rc_buf_sz
=
1000
;
cfg_
.
rc_min_quantizer
=
0
;
cfg_
.
rc_max_quantizer
=
63
;
cfg_
.
rc_end_usage
=
VPX_CBR
;
cfg_
.
g_lag_in_frames
=
0
;
cfg_
.
ss_number_layers
=
3
;
cfg_
.
ts_number_layers
=
3
;
cfg_
.
ts_rate_decimator
[
0
]
=
4
;
cfg_
.
ts_rate_decimator
[
1
]
=
2
;
cfg_
.
ts_rate_decimator
[
2
]
=
1
;
cfg_
.
g_error_resilient
=
1
;
cfg_
.
g_threads
=
4
;
cfg_
.
temporal_layering_mode
=
3
;
svc_params_
.
scaling_factor_num
[
0
]
=
72
;
svc_params_
.
scaling_factor_den
[
0
]
=
288
;
svc_params_
.
scaling_factor_num
[
1
]
=
144
;
svc_params_
.
scaling_factor_den
[
1
]
=
288
;
svc_params_
.
scaling_factor_num
[
2
]
=
288
;
svc_params_
.
scaling_factor_den
[
2
]
=
288
;
cfg_
.
rc_dropframe_thresh
=
10
;
cfg_
.
kf_max_dist
=
9999
;
::
libvpx_test
::
I420VideoSource
video
(
"niklas_1280_720_30.y4m"
,
1280
,
720
,
30
,
1
,
0
,
300
);
cfg_
.
rc_target_bitrate
=
800
;
ResetModel
();
assign_layer_bitrates
(
&
cfg_
,
&
svc_params_
,
cfg_
.
ss_number_layers
,
cfg_
.
ts_number_layers
,
cfg_
.
temporal_layering_mode
);
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
ASSERT_GE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
0.85
)
<<
" The datarate for the file exceeds the target by too much!"
;
ASSERT_LE
(
cfg_
.
rc_target_bitrate
,
file_datarate_
*
1.22
)
<<
" The datarate for the file is lower than the target by too much!"
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
VP8_INSTANTIATE_TEST_CASE
(
DatarateTestLarge
,
ALL_TEST_MODES
);
VP9_INSTANTIATE_TEST_CASE
(
DatarateTestVP9Large
,
::
testing
::
Values
(
::
libvpx_test
::
kOnePassGood
,
::
libvpx_test
::
kRealTime
),
::
testing
::
Range
(
2
,
7
));
::
testing
::
Range
(
2
,
9
));
VP9_INSTANTIATE_TEST_CASE
(
DatarateOnePassCbrSvc
,
::
testing
::
Values
(
::
libvpx_test
::
kRealTime
),
::
testing
::
Range
(
5
,
8
));
::
testing
::
Range
(
5
,
9
));
}
// namespace
test/lpf_8_test.cc
View file @
37241e6f
...
...
@@ -430,7 +430,7 @@ TEST_P(Loop8Test9Param, ValueCheck) {
using
std
::
tr1
::
make_tuple
;
#if HAVE_MMX && !CONFIG_VP9_HIGHBITDEPTH
#if HAVE_MMX &&
CONFIG_USE_X86INC &&
!CONFIG_VP9_HIGHBITDEPTH
INSTANTIATE_TEST_CASE_P
(
MMX
,
Loop8Test6Param
,
::
testing
::
Values
(
...
...
test/resize_test.cc
View file @
37241e6f
...
...
@@ -463,6 +463,17 @@ class ResizeRealtimeTest : public ::libvpx_test::EncoderTest,
frame_info_list_
.
push_back
(
FrameInfo
(
pts
,
img
.
d_w
,
img
.
d_h
));
}
virtual
void
MismatchHook
(
const
vpx_image_t
*
img1
,
const
vpx_image_t
*
img2
)
{
double
mismatch_psnr
=
compute_psnr
(
img1
,
img2
);
mismatch_psnr_
+=
mismatch_psnr
;
++
mismatch_nframes_
;
}
unsigned
int
GetMismatchFrames
()
{
return
mismatch_nframes_
;
}
void
DefaultConfig
()
{
cfg_
.
rc_buf_initial_sz
=
500
;
cfg_
.
rc_buf_optimal_sz
=
600
;
...
...
@@ -488,6 +499,8 @@ class ResizeRealtimeTest : public ::libvpx_test::EncoderTest,
std
::
vector
<
FrameInfo
>
frame_info_list_
;
int
set_cpu_used_
;
bool
change_bitrate_
;
double
mismatch_psnr_
;
int
mismatch_nframes_
;
};
TEST_P
(
ResizeRealtimeTest
,
TestExternalResizeWorks
)
{
...
...
@@ -497,6 +510,8 @@ TEST_P(ResizeRealtimeTest, TestExternalResizeWorks) {
// Disable internal resize for this test.
cfg_
.
rc_resize_allowed
=
0
;
change_bitrate_
=
false
;
mismatch_psnr_
=
0.0
;
mismatch_nframes_
=
0
;
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
for
(
std
::
vector
<
FrameInfo
>::
const_iterator
info
=
frame_info_list_
.
begin
();
...
...
@@ -510,6 +525,7 @@ TEST_P(ResizeRealtimeTest, TestExternalResizeWorks) {
<<
"Frame "
<<
frame
<<
" had unexpected width"
;
EXPECT_EQ
(
expected_h
,
info
->
h
)
<<
"Frame "
<<
frame
<<
" had unexpected height"
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
}
...
...
@@ -523,6 +539,8 @@ TEST_P(ResizeRealtimeTest, TestInternalResizeDown) {
cfg_
.
g_w
=
352
;
cfg_
.
g_h
=
288
;
change_bitrate_
=
false
;
mismatch_psnr_
=
0.0
;
mismatch_nframes_
=
0
;
ASSERT_NO_FATAL_FAILURE
(
RunLoop
(
&
video
));
unsigned
int
last_w
=
cfg_
.
g_w
;
...
...
@@ -542,6 +560,7 @@ TEST_P(ResizeRealtimeTest, TestInternalResizeDown) {
// Verify that we get 1 resize down event in this test.
ASSERT_EQ
(
1
,
resize_count
)
<<
"Resizing should occur."
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
// Verify the dynamic resizer behavior for real time, 1 pass CBR mode.
...
...
@@ -554,6 +573,8 @@ TEST_P(ResizeRealtimeTest, TestInternalResizeDownUpChangeBitRate) {
cfg_
.
g_w
=
352
;
cfg_
.
g_h
=
288
;
change_bitrate_
=
true
;
mismatch_psnr_
=
0.0
;
mismatch_nframes_
=
0
;
// Disable dropped frames.
cfg_
.
rc_dropframe_thresh
=
0
;
// Starting bitrate low.
...
...
@@ -583,6 +604,7 @@ TEST_P(ResizeRealtimeTest, TestInternalResizeDownUpChangeBitRate) {
// Verify that we get 2 resize events in this test.
ASSERT_EQ
(
resize_count
,
2
)
<<
"Resizing should occur twice."
;
EXPECT_EQ
(
static_cast
<
unsigned
int
>
(
0
),
GetMismatchFrames
());
}
vpx_img_fmt_t
CspForFrameNumber
(
int
frame
)
{
...
...
test/test.mk
View file @
37241e6f
...
...
@@ -19,6 +19,7 @@ LIBVPX_TEST_SRCS-yes += transform_test_base.h
LIBVPX_TEST_SRCS-yes
+=
../md5_utils.h ../md5_utils.c
LIBVPX_TEST_SRCS-$(CONFIG_DECODERS)
+=
ivf_video_source.h
LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS)
+=
../y4minput.h ../y4minput.c
LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS)
+=
altref_test.cc